月考之面向对象
1.富文本编辑器
2.月考之面向对象
. 基础题(40分)
- 定义一个变量有三个特性,分别为?(1分)
id、type、 变量值
相关解释:
1. 标识符(id):变量的标识符是给变量命名的名称,它用于在程序中引用变量。标识符遵循一定的命名规则,通常由字母、数字、下划线组成的,但必须以字母或者下划线开头。
2. 类型(type):变量的类型决定了他可以储存的数据种类和所支持的操作。不同的类型具有不同的内存大小和表示形式。常见的变量类型包括整数(int)、浮点数(float)、字符串(str)、布尔值(bool)等。
3.变量值(value):变量的值是储存在内存中的实际诗句。他可以是任何与变量类型相符合的数据。变量的值可以被读取、修改和赋予新的值。
这个三个特性共同定义了一个变量。标识符用于引用变量,类型决定了变量可以存储的数据类型,而值是变量当前所持有的实际数据。通过这些特性,我们可以在程序中创建和操作,以便存储和处理数据。
1.2. 等号比较的是什么?(1分)
比较的是变量值
相关解释:
当使用等号比较操作时,比较的是变量的值。
比较操作通常使用双等于号(==)来表示相等性比较,例如:x == y表示判断变量x和变量y的值是否相等。
请注意等号(=)和双等于号(==)在语义上有不同含义:
- 赋值操作使用等号(=),将右侧的值赋予给变量x。
- 相等性比较使用双等于号(==),用于判断两个变量的值是否相等,列如:x==y表示判断变量x和变量y的值是否相等。
因此,在赋值操作中,等号比较的是右侧的值(变量值),将其分配给左侧的变量。而在相等性比较操作中,等号比较的收两个变量的值是否相等。
1.3. is比较的是什么?(1分)
比较的是内存地址
相关解释:
当使用is操作符进行比较时,它会检查两个对象是否引用了内存中的同一块地址,而不是仅仅是比较对象的值。如果两个对象具有相同的内存地址,
is操作符会返回True,表示这两个对象是同一个对象;否则返回False,表示这两个对象时不同的对象。
- 使用链式赋值的方式将10赋值给变量x、y、z(1分)
x=y=z=10
相关解释:
这行代码将变量x、y、z都赋予了值10,在链式赋值中,首先将右侧的值(10)赋给最右侧的变量z,然后将这个值传递给最左边的变量x,
因此,所有的变量x、y、z都被赋予了相同的值10.
- 有一个工资列表[3.1,2.1,4.3,2.2,1.3,9.3],请取出前两个月的工资,分别赋值给两个变量名,用一行代码实现(1分)
a,b,*_=[3.1,2.1,4.3,2.2,1.3,9.3]
相关解释:
以上a和b分别接收了列表中前两个元素(3.1,2.1),而*_则表示忽略列表中剩余的元素,它将匹配并接收前两个元素之外的所有其他元素
- 可变的数据类型有哪些,不可变的数据类型有哪些(1分)
可变类型:
列表(list):列表是有一些列可变的元素组成的,可以通过索引来访问、修改、添加、或者删除元素。
字典(dict):字典是键值对的集合,可以通过键来访问、修改、添加或者删除对应的值。
集合(set):集合是一组唯一的元素的无序集合,可以添加、删除元素,并支持集合间的交集并集差集等操作。
不可变类型:
整型(int):
浮点型(float):也是不可变的
布尔值(bool):布尔值有两个值:True和Fase,一旦创建了布尔对象,其取值是不可变的,无法修改
字符串(str):字符串创建后也不能修改。
- 容器类型有?序列类型有?(1分)
容器的类型有:列表、字典、集合、元组
解释:
容器类型是指可以容纳其他对象的数据类型。常见的容器类型包括:
列表(list):有序可变序列,可以容纳不同类型的元素。
元组(tuple):有序不可变序列,可以容纳不同类型的元素。
字典(dict):键值对不可变序列,可以容纳不同类型的元素。
集合(set):无序唯一元素的集合。
序列类型有:字符串
- 请说明python2与python3中的默认编码是什么?(1分)
python2:ASCII
python3:utf8
相关解释:
这两个版本之间的重要差异之一,特别是在处理ASCII字符和国际化应用时需要注意
- 如何保证程序不出现乱码问题?(1分)
保证编码一致性,用什么格式编码,就用什么解码
- unicode,utf-8,gbk,ascii用个几个字节表示英文,用几个字节表示中文(0.5分)#--coding:utf-8-- 的作用是什么?(0.5分)
unicode:用2个字节表示英文、用2个字节表示中文
utf-8:用1个字节表示英文、用3个字节表示中文
gbk:用1个字节表示英文、用2个字节表示中文
ascii:用1个字节表示英文
相关解释:
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
1字节 = 8 位位(bit),数据存储是以“字节”(Byte)为单位,
数据传输是以大多是以“位”(bit,又名“比特”)为单位,
一个位就代表一个0或1(即一个二进制),
二进制是构成存储器的最小单位,
每8个位(bit,简写为b)组成一个字节(Byte,简写为B),
字节是最小一级的信息单位
utf-8编码:一个中文包含繁体字等于三个字节,一个英文字符等于一个字节。
gbk编码:一个中文包含繁体字等于二个字节,一个英文字符等于一个字节。
python2内容进行编码(默认ascii),而python3对内容进行编码的默认为utf-8。
ascii 最多只能用8位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
unicode 万国码,任何一个字符==两个字节
utf-8 万国码的升级版 一个中文字符==三个字节 英文是一个字节 欧洲的是 2个字节
gbk 国内版本 一个中文字符==2个字节 英文是一个字节
gbk 转 utf-8 需通过媒介 unicode
相关解释:
-*-coding:utf-8-*- 的作用是:
通常我们在pycharm中写程序的时候会加上#-*coding: UTF-8 -*-
如:
#!/usr/bin/env python3
#-*-coding: UTF-8 -*-
#Author xiaoxing
print ("Hello world!")
因为我们在pycharm中编写代码有时候会用到中文,这时候如果你使用的python的版本是python2,代码头部未加上这句话,你在运行程序的时候就会报错即使你输入的注释是中文也不行,
为了解决这个问题就需要把文件的编码格式改成utf-8,输入这个代码就可以让py的源码有中文了。
注意:python3已经默认支持中文了,因此如果你的版本是python3不加这句话也是可以的,但是为了程序的可移植性,所以建议在编写程序的时候加上
- 在python3中的str是什么编码的,如何把python3中的str转成utf-8格式的bytes(1分)
1. utf8
2. 可以使用encode(方法)
- 在python3中如何把utf-8格式的bytes解码成str(1分)
可以通过调用decode(utf8)方法将其解码
- 什么是名称空间?名称空间的加载顺序是?查找名字的顺序是?(1分)
1.什么是名称空间:保存变量值和变量名绑定关系的地方
2. 名称空间的加载顺序:内置----全局----局部
3. 查找名字的顺序:
要看你在什么地方
如果你在内置:内置----局部----全局
如果你在全局:全局---内置
- 多重继承的执行顺序,请解答以下输出结果是什么?并解释。(3分)
class A(object):
def __init__(self):
print('A')
super(A, self).__init__()
class B(object):
def __init__(self):
print('B')
super(B, self).__init__()
class C(A):
def __init__(self):
print('C')
super(C, self).__init__()
class D(A):
def __init__(self):
print('D')
super(D, self).__init__()
class E(B, C):
def __init__(self):
print('E')
super(E, self).__init__()
class F(C, B, D):
def __init__(self):
print('F')
super(F, self).__init__()
class G(D, B):
def __init__(self):
print('G')
super(G, self).__init__()
if __name__ == '__main__':
g = G()
f = F()
# 执行顺序顺序是:
G
D
A
B
F
C
B
D
A
# 首先创建一个G的实例g,执行顺序是G -> D -> B -> A。然后创建一个F的实例f,执行顺序是F -> C -> B -> D -> A。
- 什么是可迭代对象,什么是迭代器对象?(1分)
1.内置有iter方法的,列表,字典,文件,元组
2.可迭代对象调用iter方法
- 迭代器对象有什么优点(1分)
# 不依赖于索引取值,但是当取值完元素的时候,再去next就会报错 待考察
- 简述for循环的原理(1分)
1.先把关键字in后面的可迭代对象调用__iter__()方法
2. while循环,next取值
3. for的内部出现异常的时候,用捕捉处理,结束迭代
- 简述面向过程编程(1分)
面向过程的核心就是过程二字,简述的是先干什么,在干什么,最后干什么的一个过程
- 比较两个值得大小,获得较大的一个值,用一行代码实现(1分)
res = x if x > y else y
- 使用列表生成式或生成器表达式解决下列问题
1、将names=[‘kevin’,'jack','tony','tank']中的名字全部变大写(1分)
print([i.upper() for i in names])
2、将names=[‘kevin’,’ 'jack_sb’, 'tank', 'tony']中以sb结尾的名字过滤掉,然后保存剩下的名字长度(1分)
print([i.upper() for i in names if not i.endswith('sb')])
3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数)(1分)
with open('a.txt','r',encoding='utf8')as f:
user = f.readlines()
print(len(max(user)))
4、求文件a.txt中总共包含的字符个数?(1分)
with open('a.txt', 'r', encoding='utf8') as f:
user = f.read()
print(len(user))
5、思考(1分)
with open('a.txt') as f:
g=(len(line) for line in f)
print(sum(g)) #为何报错?
6、文件shopping.txt内容如下
mac,20000,3
lenovo,3000,10
tesla,1000000,10
chicken,200,1
6.1 求总共花了多少钱?(2分)
total_cost = 0
with open('shopping.txt', 'r') as file:
for line in file:
items = line.strip().split(',')
cost = int(items[1]) * int(items[2])
total_cost += cost
print(total_cost)
6.2 打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]
with open('shopping.txt', 'r') as file:
products = [{'name': items[0], 'price': int(items[1]), 'count': int(items[2])} for line in file for items in [line.strip().split(',')]]
for product in products:
print(product)
6.3 求单价大于10000的商品信息,格式同上(2分)
with open('shopping.txt', 'r') as file:
products = [{'name': items[0], 'price': int(items[1]), 'count': int(items[2])} for line in file for items in [line.strip().split(',')] if int(items[1]) > 10000]
for product in products:
print(product)
- 有一个存放员工名与其月薪的字典如下
salaries={
'kevin':3000,
'jack':100000000,
'tony':10000,
'tank':2000
}
请用一行代码实现
1、求薪资最高的那名员工姓名(2分)
print(max(salaries,key=lambda key:salaries['key']))
2、将字典映射成一个列表,[(‘kevin', 36000), ('jack', 1200000000), ('tony', 120000), ('tank’, 24000)],列表内每一个元素是员工姓名、员工的年薪(1分)
res = [(k,v)for k, k in (salaries)] 000
3、过滤出薪资大于10000的员工姓名(1分)
filtered_names = [name for name, salary in salaries.items() if salary > 10000]
- 简述yield与return的相同点与不同点(1分)
相同点:都是返回值,可以返回多个值,以元组的形式返回
不同点:
1. yield:代码做到yield就会停下,会等遇到下一个yield才会执行下去
而return不会停下,直接返回,
2. yield可以把函数变成生成器,而且还支持传参
- 下面这段代码的输出结果将是什么?请解释。(1分)
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
# 结果:
1 1 1
1 2 1
3 2 3
# 首先,打印语句print(Parent.x, Child1.x, Child2.x)会输出父类Parent和两个子类Child1和Child2的静态变量x的值,它们都是初始值1。
# 然后,赋值语句Child1.x = 2将子类Child1的静态变量x的值修改为2。这时,父类Parent和子类Child2的静态变量x仍然保持为初始值1。
# 接着,赋值语句Parent.x = 3将父类Parent的静态变量x的值修改为3。这时,父类Parent和子类Child2的静态变量x的值都变成了3,而子类Child1的静态变量x的值仍然是2。
# 所以最终的输出结果为3 2 3。
- 类的属性和对象的属性有什么区别?(1分)
类属性是在类的名称空间中,对象的属性是在对象的名称空间中,对象中拥有生成他的类属性 00待考察
- 什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?(1分)
新式类解释继承了object类的子孙类
经典类就是没有继承object的子孙类
二者有什么区别:
新式类,只能在python3中
什么是深度优先:分支完全直接到顶点
什么是广度优先:从最后分支到顶点
0.5
- 什么是绑定到对象的方法,、如何定义,如何调用,给谁用?有什么特性(1分)
1. 绑定到对象的方法是与特定对象关联的方法。
2. 通过定义一个类和其方法,对象可以继承这些方法并与其相关联。
3. 调用绑定到对象的方法需要使用对象名称后跟一个点和方法名称的形式。
4. 绑定到对象的方法允许对象访问和修改自己的属性,并执行与自身相关的操作。
5. 它提供了封装性、代码简洁性和对象之间的交互能力。
- 有字符串'email1:378533872@qq.com email2:333312312@163.com eamil3:jacksb123@gmail.com'
匹配出所有的邮箱地址:['378533872@qq.com', '333312312@163.com', 'alexsb123@gmail.com'](1分)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人