# _*_ coding:utf-8 _*_"""老男孩教育python学院第二次考试(基础数据类型与函数部分)考试时长:3个小时 满分:100分一,选择题(每题2分,共30分)一、如下说法正确的是: DA、Python中str的单引号与双引号有区别B、python3x版本默认编码方式为unicode。C、Python设置变量能够为and。D、Python3x版本中的input输入的字符串类型。二、此代码的运行结果为:while flag: A 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........三、下面代码的结果为:Dname = ‘alex’a = ‘3’print(name*a)A、alexalexalex B、 alex3 C、3alex D、TypeError四、如下说法错误的是:DA、ASCII码只包含数字,字母,特殊字符。B、unicode有两个版本,第一个版本是一个字符用两个字节表示,第二个版本是一个字符用四个字节表示。C、utf-8中,一个字节用三个字符表示。D、gbk只包含英文,数字,特殊字符,和中文。五、计算一下这个不等式的结果: D1 > 2 and 3 or 6A、True B.False C. 3 D.6六、‘老男孩’用utf-8编码须要几个字节表示? CA、3 B、6 C、9 D、12七、在Python3x中:a = b‘alex’,如何将a转化成 ‘alex’? BA、a.encode(‘utf-8’) B、a.decode() C、bytes(a) D、str(a)八、count在内存中最终等于: Ccount = 1 while count < 9: print(count) count += 1A.7 B.8 C.9 D.6九、如下叙述正确的是:BA、continue语句的做用是结束整个循环的执行B、只能在循环体内使用break语句C、在循环体内使用break语句或continue语句的做用相同D、从多层循环嵌套中退出时,只能使用quit语句十、a = ‘老男孩教育’,a[:6]的结果为: AA、‘老男孩教育’ B、‘’ C、TypeError D、‘老男孩教育老男’十一、下列说法正确的是(多选) : A BA,字符串的capitalize()为首字母大写,其他字母小写。B,列表的pop为经过索引删除,且有返回值。C,字典的remove为经过键删除字典的键值对。D,元组为只读列表,只能进行增和查。十二、下列表达正确的是(多选):B C DA、字典中的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’。1三、下列表达正确的是(多选):B CA、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、集合是无序的不重复的,里面的元素要求是不可哈希的。1四、选出你认为正确的答案(多选):B DA、在文件操做中,r+模式只能读写,不能写读。B、函数是以功能为导向的。C、文件操做中,将光标移动至末尾是seek(0,1)。D、函数的*args在默认参数前面。1五、下列说法正确的是(多选):B DA、函数的return的是将值返回给函数名。B、函数的实参的位置参数在关键字参数前面。C、全局做用域包含内置名称空间和局部名称空间。D、函数名被视为第一类对象。二,填空题(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))__TypeError__print(calc(e=4, c=5, a=2, b=3))___5print(calc(1, 2, 3))_____3print(calc(1, 2, 3, d=5, 4))____SyntaxError_获取list的元素个数,和向末尾追加元素所用的方法是___append_, ____.extend不依赖中间变量,交换变量a和b的值得表达式是________a, b = b, a_________________.list = [1, 2, 3, 4, 5]print(list[10:])答案是什么?______[]______.如何经过一行语句建立一个这样的字典{1: 'alex', 2: 'alex', 3: 'alex'}?不能直接写dic = {1: 'alex', 2: 'alex', 3: 'alex'})____________________________.dd = eval("{1: 'alex', 2: 'alex', 3: 'alex'}")三,简答题(共20分)一、 is 和 == 的区别 (1分)== 值is对象二、Python如何实现tuple和list的转换。(1分)tl = tuple(l1)lt = list(tl)三、list和tuple有什么不一样 (1分)list可变,不可哈希,不可比较,tuple不可变,可哈希,可比较,查询速度较快四、*args和 ** kwargs在什么状况下会使到?请给出使 ** kwargs的事例(2分)*args位置参数不肯定数量, ** kwargs默认参数不肯定数量五、Python中什么数据类型存在小数据池?小数据池有什么做用?(1分)str: 1)不能含有特殊字符2)单个元素 * int不能超过21, 节省内存六、在Python3x版本中,s1 = ‘老男孩’,如何将s1转化成utf - 8的bytes类型?转化成功以后,获得了s2,如何将s2转化成gbk的bytes类型(请写出具体代码)?(2分)s1 = '老男孩's2 = s1.encode(encoding='utf-8')print(s2)s3 = s2.decode(encoding='utf-8').encode(encoding='gbk')print(s3)七、下面代码有没有问题?若是有问题请指出来(2分)?f = open('a.txt', encoding='utf-8')f.write('666')默认读模式打开文件,不能写入,不然会抛出异常八、l = [1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8]将此列表去重。(1分)l = list(set(l))九、有以下代码,写出最后结果,并解释为何。(2分)l1 = [1, [22, 33, 44], 3, 4, ]l2 = l1l3 = 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]l2和l1指向同一个对象故l2和l1结果同样l3和l1是浅COPY,因此666没有添加成功十、‘1, 2, 3’如何变成[‘1’, ’2’, ’3’]? [‘1’, ’2’, ’3’]如何变成[1, 2, 3]?(写具体代码)(2分)"""print('1,2,3'.split(','))print(','.join(['1', '2', '3']))"""十一、什么是闭包(closure),为何要用它?(2分)闭包:内层函数对外层函数非全局变量的引用12,global有什么用?nonlocal又是干什么的?(2分)global 实现引用并修改全局变量nonlocal不能操做全局变量从哪层引用的从那层开始所有改变"""#13,如何终止while循环?(1分)#break"""四,编程题。一、有文件t1.txt里面的内容为:(6分)1, alex, 22, 13651054608, IT2, wusir, 23, 13304320533, Tearcher3, taibai, 18, 1333235322, IT利用文件操做,将其构形成以下数据类型。[{'id': '1', 'name': 'alex', 'age': '22', 'phone': '13651054608', 'job': 'IT'}, ......]"""with open('t1.txt') as ff: l1 = [] for l in ff.readlines(): d = {} s = l.strip().split(',') print(s) for n in range(len(s)): d[s[n]] = s[n] l1.append(d)print(l1)"""二、写函数,完成如下功能:(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, text=None): try: f = open(path, mode) except: print('Can not find file') dirc = { 'w': f.write, 'r': f.read, 'a': f.write } if (mode in list(dirc.keys())): if (dirc.get(mode)): return dirc.get(mode)(text) if text else dirc.get(mode)() f.close() else: print('not support mode')print(func('a.txt', 'w', '老男孩教育'))print(func('a.txt', 'a', '老男孩教育'))print(func('a.txt', 'r'))"""三、写函数完成如下功能:(6分)给函数传入一个列表(此列表里面的元素必须所有是str类型),将列表中的每一个元素按照顺序依次加上他们的索引,造成新的元素,并添加到一个新列表,将新列表返回。例如:给函数传入一个列表[‘alex’, ’太白’],返回值为[‘alex0’, ’太白1’]"""def indexlist(s): return [str(i) + s[i] for i in range(len(s))]#4,写一个函数,完成注册的功能,将用户名,密码写入到文件中(用户名不能重复,若是重复提示他从新输入)。再写一个函数,完成三次登陆功能,帐号密码从注册的文件中获取。(12#分)import timestatus_dict={ 'username':None, 'status':False,}def wrapper_log(l): #日志装饰器,用于打印用户访问3~6功能日志。 def inner_log(*args,**kwargs): re = l(*args,**kwargs) while True: with open("log", encoding="utf-8", mode="a") as f2: f2.write("\n用户: %s 在 %s 执行了 %s 函数,访问页面时,页面内容为:欢迎%s用户访问 %s" % \ (status_dict["username"], time.strftime("%Y-%m-%d %H:%M:%S"),l.__name__,status_dict["username"],choice_dict[choice][0])) return True return re return inner_logdef wrapper_login(loging): #登录认证装饰器,用于若是用户没有登录选择3~6功能会提醒用户进行登录。 def inner_loging(*args,**kwargs): reg = loging(*args, **kwargs) if status_dict["username"] is not None and status_dict["status"] == True: print("欢迎"+status_dict["username"]+"用户,访问"+choice_dict[choice][0]+"") else: print("您尚未登录,不能使用此模块。") return False return reg return inner_logingdef login(): #登录函数 i = 0 while i < 3: username = input('请输入用户名:').strip() password = input('请输入密码:').strip() if status_dict["username"] is not None and status_dict["status"] == True: print("用户"+status_dict["username"]+"已登录,请注销后从新登录。") break with open('register',encoding='utf-8') as f1: for line in f1: line_list = line.strip().replace(',', ',').split(',') if username == line_list[0] and password==line_list[1]: print('登陆成功...') status_dict['username'] = username status_dict['status'] = True return True else: print('帐号或者密码不正确,请从新输入') i += 1 if i == 3: exit()def regiter(*args,**kwargs): #注册函数 while True: username = input('请输入注册用户名:').strip() password = input('请输入用户名密码:').strip() with open('register',encoding='utf-8') as f1: for line in f1: line_list = line.strip().replace(',', ',').split(',') if username == line_list[0]: print('用户名存在,请从新输入!') break else: with open('register',encoding='utf-8',mode='a') as f2: f2.write('\n{},{}'.format(username,password)) print('注册成功') return True#调用装饰器@wrapper_login@wrapper_logdef article_page(): #文章页面函数 print("请编辑文章。")@wrapper_login@wrapper_logdef diary_page(): #日志页面函数 print("请编辑日志。")@wrapper_login@wrapper_logdef comment_page(): #评论页面函数 print("请评论。")@wrapper_login@wrapper_logdef collection_page(): #收藏页面函数 print("请收藏")def logout(): #注销函数 print("确认注销%s用户?输入y注销用户,输入n返回。" % status_dict["username"]) while True: user_choice = input("请输入选项:") if user_choice == "y": status_dict["username"] = None status_dict["status"] = False print("注销成功,已返回登录界面。") login() return True elif user_choice == "n": return False else: print("您输入的选项不正确,请从新输入。")def exit_program(): #退出程序函数 print("确认要退出程序?输入y退出,输入n返回。" % status_dict["username"]) while True: user = input("请输入选项:") if user == "y": print("退出程序成功。") exit() elif user == "n": return False else: print("您输入的选项不正确,请从新输入。")choice_dict = { 1: ['登陆', login], 2: ['注册', regiter], 3: ['文章页面',article_page], 4: ['日记页面', diary_page], 5: ['评论页面', comment_page], 6: ['收藏页面', collection_page], 7: ['注销', logout], 8: ['退出程序',exit_program],}while True: print("欢迎来到博客园") for (k, v) in choice_dict.items(): print(k, v[0]) choice = input("请输入选项:") if choice.isdigit(): choice = int(choice) if 0 < choice< len(choice_dict)+1: choice_dict[choice][-1]() continue else: print("超出范围,请从新输入!")