老男孩教育 python 学院第二次考试(基础数据类型与函数部分)
考试时长:3 个小时 满分:100 分
一,选择题(每题 2 分,共 30 分)
1、以下说法正确的是:D
A、Python 中 str 的单引号与双引号有区别
B、python3x 版本默认编码方式为 unicode。
C、Python 设置变量可以为 and。
D、Python3x 版本中的 input 输入的字符串类型。
2、此代码的运行结果为:C
while flag:
print(1)
print(2)
flag = False#走完再判断
print(4)
A、1 2 B、1 2 1 2..... C、1 2 4 D、1 2 4 1 2 4........
3、下面代码的结果为:D
name = ‘alex’
a = ‘3’
print(name*a)#字符串和字符串不能相乘
A、alexalexalex B、 alex3 C、3alex D、TypeError
4、以下说法正确的是:ABD
A、ASCII 码只包含数字,字母,特殊字符。
B、unicode 有两个版本,第一个版本是一个字符用两个字节表示,第二
个版本是一个字符用四个字节表示。
C、utf-8 中,一个字节用三个字符表示。
D、gbk 只包含英文,数字,特殊字符,和中文。
5、计算一下这个不等式的结果:D
1 > 2 and 3 or 6
A、True B.False C. 3 D.6
6、‘老男孩’用 utf-8 编码需要几个字节表示?C
A、3 B、6 C、9 D、12
7、在 Python3x 中:a = b‘alex’,如何将 a 转化成 ‘alex’ B a.decode()在python3 中可以不写utf-8
A、a.encode(‘utf-8’) B、a.decode() C、bytes(a) D、str(a)
8、count 在内存中最终等于:C
count = 1
while count < 9:
print(count)
count += 1
A.7 B.8 C.9 D.6
9、以下叙述正确的是:B
A、continue 语句的作用是结束整个循环的执行
B、只能在循环体内使用 break 语句
C、在循环体内使用 break 语句或 continue 语句的作用相同
D、从多层循环嵌套中退出时,只能使用 quit 语句
10、a = ‘老男孩教育’,a[:6]的结果为:A print(a[10:])结果是[],print(a[10])结果是Error
A、‘老男孩教育’ B、‘’ C、TypeError D、‘老男孩教育老男’
11、下列说法正确的是(多选):A B
A,字符串的 capitalize()为首字母大写,其余字母小写。
B,列表的 pop 为按通过删除,且有返回值。
C,字典的 remove 为通过键删除字典的键值对。#字典中没有remove方法删除键值对
D,元组为只读列表,只能进行增和查。
12、下列表达正确的是(多选):B D
A、字典中的 keys()方法是将字典的所有键都存放至一个列表中。#类似列表但不是列表
B、给一个列表 extend(‘ab3’)实际上是添加了 a,b,3 三个字符串。
C、s1=‘alex@’,s2=‘alex@’,print(s1 is s2) 为 True。#包含特殊字符的字符串没有小数据池
D、‘abc’.encode(‘utf-8’).decode(‘gbk’) 结果为‘abc’。#utf-8 和gbk对于英文来说,用的都是ASCII
13、下列表达正确的是(多选):B C
A、a =(1,) a 为 int 类型。
B、l1 = [1,2,3] l2 = l1 l1.append(666) print(l2)结果为[1,2,3,666]#赋值运算公用一个内存地址
C、l1 = [22,33,44] l2 = l1[:] l1 与 l2 的关系为浅 copy。
D、集合是无序的不重复的,里面的元素要求是不可哈希的。
14、选出你认为正确的答案(多选):B D
A、在文件操作中,r+模式只能读写,不能写读。#可以写读,但是文件内容可能会变
B、函数是以功能为导向的。
C、文件操作中,将光标移动至末尾是 seek(0,1)。
D、函数的*args 在默认参数前面。
15、下列说法正确的是(多选):B D
A、函数的 return 的是将值返回给函数名。
B、函数的实参的位置参数在关键字参数前面。
C、全局作用域包含内置名称空间和局部名称空间。
D、函数名被视为第一类对象。
在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、
可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的
二,填空题(10 分)。
def calc(a,b,c,d=1,e=2):
return a+b+c-d-e
请分别写出下列标号代码的输出结果,如果出错请写出 Error。
print(calc(1,2,3,4,5))__-3___
print(calc(1,2))__Error__
print(calc(e=4,c=5,a=2,b=3))_5__
print(calc(1,2,3))__3___
print(calc(1,2,3,d=5,4))___Error___
获取 list 的元素个数,和向末尾追加元素所用的方法是__len(list)__,__list.append()__.
不依赖中间变量,交换变量 a 和 b 的值得表达式是___a,b=b,a______________________.
分别赋值概念
a, b = 1, 2
a, b = ('alex', '34')
a, b = ['alex', '34']
有 如下 a = 1 b = 3,用一行代码将a b值互换。#面试题
a=1
b=3
a,b=b,a
print(a,b)
list = [1,2,3,4,5] print(list[10:]) 答案是什么?___[]_________. #print(list[10]) 会报错
如何通过一行语句创建一个这样的字典{1: 'alex', 2: 'alex', 3: 'alex'}?
不能直接写 dic={1:'alex',2:'alex',3: 'alex'})
____________________________.
print(dict.fromkeys([1,2,3],'alex'))#要多练
print({i:'alex' for i in range(1,4)})#要多练
三,简答题(共 20 分)
1、is 和 == 的区别 (1 分)
is是内存空间的比较,==是数值大小的比较
2、Python 如何实现 tuple 和 list 的转换。(1 分)
list(tuple)
3、list 和 tuple 有什么不同 (1 分)
列表可变,元祖不可变
4、*args 和**kwargs 在什么情况下会使到?请给出使 **kwargs 的事例(2 分)#写出万能装饰器
当实参数目不确定时候可以用到
def wrapper(f): def inner(*args,**kwargs): '''执行函数之前的操作''' ret=f(*args,**kwargs) '''执行函数之后的操作''' return ret return inner
5、Python 中什么数据类型存在小数据池?小数据池有什么作用?(1 分)
str int 节省内存空间
6、在 Python3x 版本中,s1 = ‘老男孩’,如何将 s1 转化成 utf-8 的 bytes
类型?转化成功之后,得到了 s2,如何将 s2 转化成 gbk 的 bytes 类型(请写出
具体代码)?(2 分)#要多练
s1 = '老男孩' s2=s1.encode('utf-8') print(s2) s3=s2.decode('utf-8').encode('gbk') print(s3)
7、下面代码有没有问题?如果有问题请指出来(2 分)?
f = open('a.txt',encoding='utf-8')
f.write('666')
(1)没写mode,是'w还是'r’
(2)没写f.close()
8、l = [1,1,2,2,3,4,5,5,6,6,7,8]将此列表去重。(1 分)集合可以去重,for 循环也可以
l = [1,1,2,2,3,4,5,5,6,6,7,8] print(list(set(l))) l = [1,1,2,2,3,4,5,5,6,6,7,8] l1=[] for i in l: if i not in l1: l1.append(i) print(l1)
9、有如下代码,写出最后结果,并解释为什么。(2 分)
l1 = [1,[22,33,44],3,4,] l2 = l1#赋值运算,同一个地址 l3 = l1.copy()#浅copy 第一层地址不同,第二层之后地址相同 l1.append(666)#l1,l2都多了个666 l1[1].append('55')#l1,l2都多了个555 print(l1,l2,l3) l1=[1,[22,33,44,55],3,4,666] l2=[1,[22,33,44,55],3,4,666] l3=[1,[22,33,44,55],3,4]
10、‘1,2,3’如何变成[‘1’,’2’,’3’]? [‘1’,’2’,’3’]如何
变成[1,2,3]?(写具体代码)(2 分)
s1='1,2,3' l1=s1.split(',') print(l1) r l2=[] for i in l1: i=int(i) l2.append(i) print(l2) print([int(i) fo i in l1])
11、什么是闭包(closure),为什么要用它?(2 分)
内层函数对外层函数非全局变量的引用,叫做闭包
当执行一个函数时,如果解释器判断函数中内部有闭包存在,python有一个机制,当函数执行完毕时,
闭包所在的临时命名空间不会关闭。
12,global 有什么用?nonlocal 又是干什么的?(2 分)
global 可以声明或者改变一个全局变量 nonlocal可以引用或者改变一个局部变量,自引用那层起,全部发生改变
13,如何终止 while 循环?(1 分)
标志符flag break
四,编程题。
1、有文件 t1.txt 里面的内容为:(6 分)
1,alex,22,13651054608,IT
2,wusir,23,13304320533,Tearcher
3,taibai,18,1333235322,IT
利用文件操作,将其构造成如下数据类型。
[{'id':'1','name':'alex','age':'22','phone':'13651054608','job':'IT'},......]
l1=['id','name','age','phone','job']#这样写的目的是把代码写活。 l2=[] with open ('t1.txt',encoding='utf-8') as f1: for line in f1: new_line=line.strip().replace(',',',').split(',') dic = {}#如果dic = {}放到for i in 下面,则每创建一个元素,就会对一个字典,不符合题意。 for i in range(len(l1)): dic[l1[i]]=new_line[i]#为字典添加一个键值对 l2.append(dic)#一定要和for循环对齐,这样答案是三个字典组成的列表。不然答案会重复。 print(l2)
2、写函数,完成以下功能:(6 分)
用户将文件名(文件前提必须存在),操作方法(只有 r,w,a 三种)传入此
函数,此函数按照传入的参数完成相应的操作。
例如:
def func(path,mode,*args):
pass
func(‘a.txt’,’r’) 此函数完成的就是以读的模式打开 a.txt 文件,并
打印出来。
func(‘a.txt’,’w’,’老男孩教育’)此函数完成的就是以写的模式打
开 a.txt 文件,将内容写入。
func(‘a.txt’,’a’,’老男孩教育’)此函数完成的就是以追加的模式
打开 a.txt 文件,将内容追加。
def func(path,mode,concent=None):#灵活运用动态传参将函数写活 with open (path,encoding='utf-8',mode=mode) as f1: if mode=='r': return f1.read()#函数内部最好用return,文件小的时候可以直接读完 # for line in f1:#文件大的时候用for 循环 # print(line) else: return f1.write(concent) def func(path,mode,concent=None): with open (path,encoding='utf-8',mode=mode)as f1: return f1.read() if mode=='r' else f1.write(concent)#else后面不能加return ,和前面重复了。 func('a.txt','r') func('a.txt','w','老男孩教育') func('a.txt','a','老男孩教育')
3、写函数完成以下功能:(6 分)
给函数传入一个列表(此列表里面的元素必须全部是 str 类型),将列
表中的每个元素按照顺序依次加上他们的索引,形成新的元素,并添加到一
个新列表,将新列表返回。
例如:给函数传入一个列表[‘alex’,’太白’],
返回值为[‘alex0’,’太白 1’]
def func(l): list = [] for i in l: i= i+str(l.index(i)) list.append(i) return list print(func(['alex','太白'])) print([i+str(['alex','太白'].index(i)) for i in ['alex','太白']])#str.index(i)
4,写一个函数,完成注册的功能,将用户名,密码写入到文件中(用户名
不能重复,如果重复提示他重新输入)。再写一个函数,完成三次登录功能,
账号密码从注册的文件中获取。(12 分)
def register(): while True: username=input('请输入你的账号').strip() password=input('请输入你的密码').strip() with open('register',encoding='utf-8') as f1: for line in f1: line=line.strip().replace(',',',').split(',') if username==line[0]: print('您输入的账户已经存在,请重新输入') break #打断for循环 else:#for else 组合 with open('register', encoding='utf-8', mode='a') as f1: f1.write('{},{}\n'.format(username, password)) print('恭喜你注册成功') return True#结束整个循环 register() def login(): i=0 while i<3: username = input('请输入你的账号').strip() password = input('请输入你的密码').strip() with open('register', encoding='utf-8') as f1: for line in f1: line = line.strip().replace(',', ',').split(',') if username == line[0] and password==line[1]: print('恭喜你登录成功') return True else: print('你输入的账号或者密码错误,还剩余%s次机会' % (2 - i)) i+=1 login()
5、编写装饰器,为多个函数加上认的功能(用户名密码存在文件中,只
有一个),要求登录成功一次(给三次机会),后续的函数都无需再输入用
户名和密码。(10 分)
dic={'username':None, 'status':False } def register(f): def inner(*args, **kwargs): if dic['status']: ret = f(*args, **kwargs) return ret else: i = 0 while i < 3: username = input('请输入你的账号').strip() password = input('请输入你的密码').strip() with open('register', encoding='utf-8') as f1: for line in f1: # line = line.strip().split(',')#在写文件时一定要注意,不要掺杂着中文的逗号进去。 line = line.strip().replace(',',',').split(',')#可以用.replace(',',',')去解决。 if username == line[0] and password == line[1]: print('恭喜你登录成功') dic['username'] = line[0] dic['status'] = True ret = f(*args, **kwargs) return ret else: print('您输入的账号或者密码错误,还剩%s次机会' % (2 - i)) i += 1 return inner @register def func1(): print(111) @register def func2(): print(222) @register def func3(): print(333) func1() func2() func3()