- # Python11 期第二次考试(基础数据类型与函数部分)
- # 考试时长: 3 个小时 满分: 105 分
- # 一, 选择题(每题 2 分, 共 24 分)
- # 1,python 不支持的数据类型有
- #
- # A,char
- #
- # B,int
- #
- # C,float
- #
- # D,list
- # 2,
- #
- # x = "foo"
- #
- # y = 2
- #
- # print(x+y)
- #
- # A.foo B.foofoo C.foo2 D.2 E.TypeError
- # 3, 关于字符串下列说法错误的是
- #
- # A, 字符串应该视为长度为 1 的字符串
- #
- # B, 字符串可以转化成数字
- #
- # C, 既可以用单引号, 也可以用双引号创建字符串
- #
- # D, 在三引号字符串中可以包含换行回车等特殊字符
- #
- # 4, 以下不能创建一个字典的语句是
- #
- # A,dic1 = {}
- #
- # B,dic2 = {123:345}
- #
- # C,dic3 = {[1,2,3]:'uestc'}
- #
- # D,dic3 = {(1,2,3):'uestc'}
- #
- # 5,Kvps = {'1':1,'2':2}
- #
- # theCopy = kvps
- #
- # kvps['1'] = 5
- #
- # sum = kvps['1'] + theCopy['1']
- #
- # print(sum)
- #
- # A.1 B.2 C.7 D.10
- #
- # 6, 已知 x=43,ch='A',y = 1, 则表达式 (x>=y and ch <'b' and y) 的值是
- # A,0 B,1 C, 出错 D,True
- # 7, 下列 Python 语句正确的事(多选)
- #
- # A,min = x if x <y else y
- #
- # B,max = x> y ? x : y
- #
- # C,if(x>y) print(x)
- #
- # D,while True:pass
- #
- # 8, 若 k 为整形, 下述 while 循环执 的次数为:
- #
- # k=1000
- # while k>1:
- # print(k)
- # k=k/2
- #
- # A.9 B.10 C.11 D.100
- # 9, 以下叙述正确的是:
- # A,continue 语句的作用是结束整个循环的执行
- # B, 只能在循环体内使用 break 语句
- # C, 在循环体内使用 break 语句或 continue 语句的作用相同
- # D, 从多层循环嵌套中退出时, 只能使用 goto 语句
- # 10, 下面的语句哪个会无限循环下去:
- #
- # A,for a in range(10):
- # time.sleep(10)
- #
- # B,while 1<10:
- # time.sleep(10)
- #
- # C,while True:
- # break
- #
- # D,a = [3,-1,',']
- # for i in a[:]:
- # if not a: break
- # 11, 下列说法正确的是(多选, 选错不得分):# 这题有争议
- # A,
- # a = [1,2,3]
- # b = [1,2,3]
- # a 与 b 指向同一个内存地址.
- # B,
- # i1 = 356
- # I2 = 356
- # i1 与 i2 是同一个内存地址.
- # C,
- # s1 = 'laonanhai'
- # s2 = 'laonanhai'
- # s1 与 s2 是同一个内存地址.
- # D,tu = (1) tu 是元组类型.
- # 12, 下面的代码, 哪些会输出 1,2,3 三个数字(多选, 选错不得分):
- # A,
- # for i in range(3):
- #
- # print(i)
- #
- # print(i+1)
- # B,
- # aList = [0,1,2]
- # for i in aList:
- # print(i+1)
- # C,
- # i = 1
- # while i <3:
- # print(i)
- # i+=1
- # D,
- # for i in range(3):
- # print(i+1)
- # 答案 1.A 2.E 3.A 4.C 5.D 6.B 7.AD 8.B 9.B 10.B 11.C 12.ABD
- # 二, 简答题(共 42 分)
- # 1,is 和 == 的区别 (2 分)
- # 答: is 是内存地址的比较,'=='是数值比较
- # 2,Python 如何实现 tuple 和 list 的转换.(2 分)
- # 答:
- # # 元祖转换列表:
- # tu=(1,2,3)
- # li=list(tu)
- # print(li)
- # # 列表转换元祖:
- # li=[1,2,4]
- # tu1=tuple(li)
- # print(tu1)
- # 3,list 和 tuple 有什么不同 (2 分)
- # 答: 1,list 列表属于可变数据类型, tuple 属于不可变数据类型; 2,list 可以进行增删改查的动作, tuple 一般不能动, 儿
- # 子不能改, 孙子可以改. tuple 只可以查看
- # 4,*args 和 **kwargs 在什么情况下会使到? 请给出使 **kwargs 的事例(2 分)
- # 答: 在传参不确定有几个参数的时候会使用到,(动态传参)
- # def func(*args,**kwargs):
- # print(111)
- # print(func(1,2,3,a=4,b=5))
- # 5,Python 中什么数据类型存在小数据池? 小数据池有什么作用?(2 分)
- # 答: int,-5---256 以内有小数据池, str 有特殊字符不存在小数据池. 作用: 节省内存空间
- # 6, 在 Python3x 版本中, s1 = '老男孩', 如何将 s1 转化成 utf-8 的 bytes 类型? 转化成功之后, 得到了 s2, 如何将 s2 转化成
- # gbk 的 bytes 类型(请写出具体代码)?(3 分)
- # 答:
- # s1='老男孩'
- # s2=s1.encode('utf-8')
- # print(s2)
- # s3=s2.decode('utf-8')
- # s4=s3.encode('gbk')
- # print(s4)
- # 7, 有如下操作, 最后 dic 的结果是什么? 为什么?(2 分)
- # dic = dict.fromkeys(['barry','alex',],[])
- # dic['barry'].append(666)
- # print(dic)
- # 答:{'barry': [666], 'alex': [666]} 因为字典里两个 K 对应的列表是同一个列表. 默认参数为可变数据类型
- # 8, 请描述 unicode,utf-8,gbk 等编码之间的关系?(2 分)
- #unicode 为非 bytes 类型, python3 默认此编码, utf-8 和 gbk 编码为 bytes 类型, 三者之间可以转换, 解码用 encode, 编码用 decode
- # 9,l = [1,1,2,2,3,4,5,5,6,6,7,8]将此列表去重.(2 分)
- # 答: list(set(l))
- # 10, 有如下代码, 写出最后结果, 并解释为什么.(3 分)
- # l1 = [1,[22,33,44],3,4,]
- # l2 = l1
- # l3 = l1.copy()
- # l1.append(666)
- # l1[1].append('55')
- # Print(l1,l2,l3)
- # 答:[1, [22, 33, 44, '55'], 3, 4, 666] [1, [22, 33, 44, '55'], 3, 4, 666] [1, [22, 33, 44, '55'], 3, 4]
- # 原因: 赋值运算公用一个内存地址, python 执行顺序为从上到下依次执行, l1 增加了两个元素, l2 跟 l1 一样, 浅 copy,l3 不增加 666
- # 11, 有如下代码, 说出 l1 与 l2 的关系?(2 分)
- # l1 = [1,2,3,4,5]
- # l2 = l1[:]
- # 答: l2 对 1 进行切片操作, 结果为[1, 2, 3, 4, 5], 浅 copy
- # 12,'1,2,3'如何变成 ['1','2','3']? ['1','2','3'] 如何变成[1,2,3]?(写具体代码)(4 分)
- # 答:
- # s= '1,2,3'
- # l1 = s.strip().split(',')
- # print(l1)
- # l2=[]
- # for i in l1:
- # l2.append(eval(i))
- # print(l2)
- # 13, 如何生成 [1,4,9,16,25,36,64,81,100] 尽量用一行实现.(2 分)
- # 答:
- # l=[i**2 for i in range(1,11)]
- # print(l)
- # 14,map(str,[1,2,3,4,5,6,7,8,9])输出什么?(2 分)
- # 答: 迭代器或者迭代器地址或者 map 对象
- # 15, 下面代码输出结果是什么? 两次 list1 的结果相同么? 为什么?(4 分)
- # def extendList(val,list=[]):
- # list.append(val)
- # return list
- # list1 = extendList(10)
- # print('list1=%s'%list1)
- # list2 = extendList(123,[])
- # print('list2=%s'%list2)
- # list3 = extendList('a')
- # print('list3=%s'%list3)
- # print('list1=%s'%list1)
- # 答: list1=[10]
- # list2=[123]
- # list3=[10, 'a']
- # list1=[10, 'a']
- # 不相同, 默认参数为可变数据类型, 指向的是同一个
- # 16, 下面代码的执行结果是什么? 为什么?(4 分)
- # a = 1
- # def func1():
- # global a
- # a += 1
- # print(a)
- # func1()
- # 答: 报错
- # 这段代码呢?
- # def wrapper():
- # a = 1
- # def inner():
- # nonlocal a
- # a += 1
- # print(a)
- # inner()
- # wrapper()
- # 答: 内部作用域不能对外部作用域的变量进行改变.
- # 17, 什么是闭包(closure), 为什么要用它?(2 分)
- # 答: 闭包就是内层函数对外层函数 (非全局) 变量的引用.
- # 闭包有节省内存空间的作用, 能开辟一个特殊的空间, 保存变量数据, 还能方便函数调用, 可以作为装饰器的一部分装饰函数, 所以要用他
- # 三, 代码题.
- #
- # 1, 用 map 来处理字符串列表, 把列表中所有人都变成 sb, 比方 alex_sb
- # name=['oldboy','alex','wusir'](4 分)map lambda
- # name=['oldboy','alex','wusir']
- # ret = map(lambda x:x+'_sb',['oldboy','alex','wusir'])
- # for i in ret:
- # print(i)
- # 2, 用 filter 函数过滤出单价大于 100 的股票.(4 分)
- # portfolio = [
- # {'name': 'IBM', 'shares': 100, 'price': 91.1},
- # {'name': 'AAPL', 'shares': 50, 'price': 543.22},
- # {'name': 'FB', 'shares': 200, 'price': 21.09},
- # {'name': 'HPQ', 'shares': 35, 'price': 31.75},
- # {'name': 'YHOO', 'shares': 45, 'price': 16.35},
- # {'name': 'ACME', 'shares': 75, 'price': 115.65}]
- # 答:
- # m = filter(lambda k: k['price']> 100, portfolio)
- # print(list(m))
- #
- # 3, 有文件 t1.txt 里面的内容为:(6 分)
- # id,name,age,phone,job
- # 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 = []
- # with open('t1.txt',encoding='utf-8') as f1:
- # l2 = f1.readline().strip().split(',')
- # for i in f1:
- # l3 = i.strip().split(',')
- # dic = {}
- # for j in range(len(l3)):
- # dic[l2[j]] = l3[j]
- # l1.append(dic)
- # print(l1)
- #
- # 4, 写程序完成下列功能:(20 分, 有 5 分加分项, 共计 25 分)
- #
- # 1), 启动程序, 首页面应该显示成如下格式:
- # 欢迎来到博客园首页
- # 1: 请登录
- # 2: 请注册
- # 3: 文章页面
- # 4: 日记页面
- # 5: 评论页面
- # 6: 收藏页面
- # 7: 注销
- # 8: 退出程序
- # 2), 用户输入选项, 3~6 选项必须在用户登录成功之后, 才能访问成功.
- # 3), 用户选择登录, 用户名密码从 register 文件中读取验证, 三次机会, 没成功则结束整个程序运行,
- # 成功之后, 可以选择访问 3~6 项, 访问页面之前, 必须要在 log 文件中打印日志,
- # 日志格式为 -->用户: xx 在 xx 年 xx 月 xx 日 执行了 %s 函数, 访问页面时, 页面内容为: 欢 迎 xx 用户访问评论
- # (文章, 日记, 收藏)页面
- # 4), 如果用户没有注册, 则可以选择注册, 注册成功之后, 可以自动完成登录(完成自动登录 + 5 分),
- # 然后进入首页选择.
- # 5), 注销用户是指注销用户的登录状态, 使其在访问任何页面时, 必须重新登录.
- # 6), 退出程序为结束整个程序运行.
- # 答:
- status_dic = {
- 'username': None,
- 'status': False,
- }
- flag1 = True
- def login(*args,**kwargs):
- i = 0
- while i < 3:
- if args:
- status_dic['username'] = args[0]
- status_dic['status'] = True
- return True
- else:
- username = input('请输入用户名:').strip()
- password = input('请输入密码:').strip()
- with open('register',encoding='utf-8') as f1:
- for line in f1:
- line_list = line.strip().split()
- if username == line_list[0] and password == line_list[1]:
- print('登录成功')
- status_dic['username'] = username
- status_dic['status'] = True
- return True
- else:
- print('输入不正确, 请重新输入, 还剩 %s 机会' % (2-i))
- if i == 2: return Quit()
- i += 1
- def register(*args, **kwargs):
- flag = True
- while flag:
- username = input('请输入要注册的用户名:')
- f1 = open('register',encoding='utf-8')
- for i in f1:
- if username in i:
- print('用户名重复, 请重新输入')
- f1.close()
- break
- else:
- f1.close()
- password = input('请输入要注册的密码:').strip()
- f2 = open('register', encoding='utf-8', mode='a')
- f2.write('\n{}\t{}'.format(username, password))
- f2.close()
- print('恭喜你, 注册成功, 已经自动为您登录, 现在跳转到首页...')
- return login(username,password)
- def wrapper(func): #func 函数名
- def inner(*args,**kwargs): #2
- if status_dic['status']:
- ret = func(*args,**kwargs) #4
- return ret
- else:
- print('请先进行登录')
- if login():
- ret = func(*args, **kwargs)
- return ret
- return inner
- import time
- def log_record(func): #func==inner1
- def inner(*args,**kwargs): #1
- struct_time = time.localtime()
- time_now = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
- with open('log_func','a',encoding='utf-8') as f1:
- f1.write('用户:%s 在 %s 执行了 %s 函数 \ n'%(status_dic['username'],time_now,func.__name__))
- ret = func(*args,**kwargs) #5
- return ret
- return inner
- @wrapper #article = wrapper(article) 里 article==inner1 外 article==inner2
- @log_record # article=log_record(article) 里 article, 函数名 外 article==inner1
- def article(): #3
- print('欢迎 %s 访问文章页面' % status_dic['username'])
- @wrapper
- @log_record
- def diary():
- print('欢迎 %s 访问日记页面' % status_dic['username'])
- @wrapper
- @log_record
- def comment():
- print('欢迎 %s 访问评论页面' % status_dic['username'])
- @wrapper
- @log_record
- def enshrine():
- print('欢迎 %s 访问收藏页面' % status_dic['username'])
- def login_out():
- status_dic['username'] = None
- status_dic['status'] = False
- print('注销成功')
- def Quit():
- global flag1
- flag1 = False
- return flag1
- choice_dict = {1: login,2: register,3: article,4: diary,5: comment,6: enshrine,7: login_out,8: Quit,}
- while flag1:
- print('欢迎来到博客园首页 \ n1: 请登录 \ n2: 请注册 \ n3: 文章页面 \ n4: 日记页面 \ n5: 评论页面 \ n6: 收藏页面 \ n7: 注销 \ n8: 退出程序')
- choice = input('请输入您选择的序号:').strip()
- if choice.isdigit():
- choice = int(choice)
- if 0 < choice <= len(choice_dict):
- choice_dict[choice]()
- else:
- print('您输入的超出范围, 请重新输入')
- else:
- print('您输入的选项有非法字符, 请重新输入.')
来源: http://www.bubuko.com/infodetail-2556264.html