二,考试题
前面的简答题,,,,,后面的答题,,,,小伙伴们加油!!!!
''' 1.列举Python2与Python3之间的区别(5条)?(4分) ''' #python2中: #1.默认编码:ASCll #2.range返回的是列表,xrange返回的是可迭代对象 #3.整数分为:int和lang #4.代码重复 #5.语言不统一 #6.不支持中文 #python3中: # 1默认编码:Unicode # 2.返回的是可迭代对象 # 3.整数统一是:int # 4.代码重复 # 5.语言统一 # 6.支持中文 #更多python2和Python3的区别 see also: # https://wiki.python.org/moin/Python2orPython3 # https://www.cnblogs.com/Neeo/p/8033520.html ''' 2.有整数3.14 如何去掉小数位? 请一行代码实现不能使⽤切⽚ (1分) ''' print(round(3.14)) print(int(3.14)) print('%.0f'%3.14) ''' 3.文件件操作有哪些模式?请简述各模式的作用 (3分) ''' #Character Meaning # 'r' open for reading (default) # 'w' open for writing, truncating the file first # 'x' open for exclusive creation, failing if the file already exists # 'a' open for writing, appending t #'a' open for writing, appending to the end of the file if it exists # 'b' binary mode # 't' text mode (default) # '+' open a disk file for updating (reading and writing) # 'U' universal newlines mode (deprecated) # see also: https://docs.python.org/3/library/functions.html#open # 'r' 打开文件,以读的方式,默认的方式 # 'w' 打开文件,写入文件,如果原文件存在则会被覆盖,如果没有此文件就会创建,前提是 #该模式下必须保证文件目录的存在 # 'x' 创建一个新文件并打开以写入,如果文件已存在则抛出FileExistsError错误 # 'a' 以追加的方式打开文件,如果文件存在则从原文件的末尾写入,否则会创建文件 # 'b' 二进制模式,可以搭配其他的模式使用,如'rb', # 't' 文本模式,默认 # '+' 读/写模式,用于更新 # 'U' 通用的换行模式,现已弃用 # 'rt' 文本读模式,默认模式 # 'wt' 以文本写模式打开,打开前原文件会被清空 # 'rb' 打开文件,以二进制的形式读文件 # 'ab' 以二进制追加模式打开文件 # 'wb' 以二进制写模式打开,打开前原文件会被清空 #'r+' 以文本读写模式打开文件,可以控制写入到文件任何位置,默认写的指针开始指在文件 #开头,所以会复写文件 # 'w+' 以文本读写模式打开文件 # 'a+' 以文本读写模式打开文件,如果写那么指针将从文件末尾开始 # 'rb+' 以二进制读写模式打开文件 # 'wb+' 以二进制读写模式打开文件,原文件会被清空 # 'ab+' 以二进制读写模式打开文件 ''' 4.字符串和列表如何互相转换?(2分) ''' a='aaaa' print(list(a)) l=['a','b'] s=''.join(l) print(s) ''' 5. ... 及 pass在Python中是否是占位 ? (1分) ''' # 表示为了程序的完成性,而又不能立即实现其功能或者不需要实 # 现其功能,故采用pass或者...语句 ''' 6.a=10; b=20 用一行代码实现a,b数值交换:(1分) ''' a=10 b=20 # def func(a,b): # print(a,b) ##函数方法 # func(b,a) a,b=b,a #简单方法 print(a,b) ''' 7.读代码写结论为什么? (2分) result = 1.2-1 while True: if round(result,1) == 0.2: print('hi guys!') else: print(False) ''' # 结论是result的结果是0.19999999999999996,round保留一位小数四舍五入后是0.2,符 # 合while循环中的if条件,打印结果是死循环hi guys! # result = 1.2-1 # print(result, round(result, 1)) # 0.19999999999999996 0.2 # while True: # if round(result,1) == 0.2: # print('hi guys!') # else: # print(False) ''' 8.递归的最大层数?(1分) ''' # 网络上的递归最大层数:1000 # 自己测得:998 import sys print(sys.getrecursionlimit()) ''' 9.读代码写结果 如下代码输出的结果是?(2分) def Generator(): value = yield 1 yield value gen = Generator() print(gen.send(1)) ''' #报错 #修改: def Generator(): value = yield 1 yield value gen = Generator() # s=gen.__next__() # print(s) print(gen.send(None)) ''' 10.列举你了解的5个模块并简述其作⽤。(2分) ''' # import time 时间模块 # import random 数字模块 # import sys python解释器相关 # import os 系统相关 # import pickle 序列化相关 # import json 序列化相关 # import re 正则相关 #import logging 日志 #import hashlib 加密 ''' 11.闭包函数有什么特点,应用场景?(2分) ''' # 保证了数据的安全,只能内部访问外部,外部不能访问内部 #应用场景: # 装饰器 # 缓存 ''' 12.写出下⾯代码的输出结果,并解释为什么?(2分) def f(x,l=[]): for i in range(x): l.append(i*i) print(l) f(2) f(3,[3,2,1]) f(3) ''' # 答案:[0,1] # [3,2,1,0,1,4] # [0,1,0,1,4] ''' 13.写出下⾯代码的输出结果,并解释为什么?(3分) l = [1,2,3] d = {"a":7,"b":8} def f(arg1,arg2,*args,**kwargs): print(arg1,arg2,args,kwargs) f(1,2,3,"groovy") f(arg1=1,arg2=2,c=3,zzz="h1" f(1,2,3,a=1,b=2,c=3) f(*l,**d) f(1,2,*l,q="winning",**d) ''' # 1 2 (3,'groovy') {} # 1 2 () {'c':3,'zzz':'h1'} # 1 2 (3,) {'a': 1, 'b': 2, 'c': 3} # 1 2 (3,) {'a': 7, 'b': 8} # 18 1 2 (1, 2, 3) {'q': 'winning', 'a': 7, 'b': 8} ''' 14.解释⼀下什么是迭代器,你在代码中如何获得⼀个迭代器?(2分) ''' # 可迭代对象执行__iter__方法返回的结果称为迭代器 # 迭代器中必须包含:__iter__和__next__ ''' 15.迭代器如何取值?迭代器的好处?(2分) ''' # 迭代器的特点: # 重复 下一次的重复是基于上一次结果 # 使用迭代器的优点: # 1.提供一种不依赖索引的取值方式.迭代器通过__next__方法取值 # 2.惰性运算 # 缺点: # 1.取值不如索引方便 # 2.迭代过程不可逆 ''' 16.什么是⽣成器?你在代码中如何获得⼀个⽣成器?(2分) ''' # 函数体内包含有yield关键字,该函数执行的结果(返回值generator_obj)为生成器,而该函数称为生成器函数 # yield的功能: # 1. yield与return一样可以终止函数执行、可以返回值(不指定返回值默认返回None), # 但不同之处yield可以在函数内多次使用,而return只能返回一次。 # 2. 为函数封装好了__iter__和__next__方法,把函数得执行结果转换为迭代器,也就是 # 说yield自动实现了迭代协议并遵循迭代器协议。 # 3. 触发函数的执行、暂停、再继续,包括状态都由yield保存。 # 4. 生成器本质就是迭代器。 # 5. 延迟计算,当你需要的时候,yield返回一次,不需要,就保留信息,等待下一次调 # 用。 # 生成器函数和普通的函数最大的不同之处在于,生成器每当yield一次,在返回值的时候,将 # 函数挂起,保存相关信息,在下一次函数执行的时候,从当前挂起的位置继续执行。 ''' 17.请写出下⾯代码的执⾏结果(4分) print([lambda: i for i in range(10)][0]()) ''' print([lambda: i for i in range(10)][0]()) # 结果:9 ''' 二.简洁编程 ''' ''' 1)有列表 a = ["7net ","www.7net ","www.septnet ","7net ","www"]现需要从中将包含字符 7net的元素给删掉,请以最少代码量实现。(2分 ''' a = ["7net ","www.7net ","www.septnet ","7net ","www"] print([i for i in a if '7net'not in i ]) ''' 2)l = ['20','10','3','15','32'],按照数字的顺序从小到大排序,不改变原列表。(请⽤最简的 ⽅式)(1分) ''' l = ['20','10','3','15','32'] l1=[str(k) for k in sorted([int(i) for i in l])] print(l1) ''' 3)l = ['班级20','班级10','班级3','班级15','班级32'],按照数字的顺序从小到大排序,不改变 原列表。(请⽤最简的⽅式) (2分) ''' l = ['班级20','班级10','班级3','班级15','班级32'] def bar(y): return '班级'+str(y) def foo(n): return int(n[2:]) l2=sorted(list(map(foo,l))) print(l2) print(list(map(bar,l2))) ''' 4)有⼀个列表l1 = ['alex', 'WuSir', '⽼男孩', '太⽩']⽤列表推导式将其构造成这种列表 ['alex0', 'WuSir1', '⽼男孩2', '太⽩3'] (2分) ''' l1 = ['alex', 'WuSir', '老男孩', '太白'] print([i+str(l1.index(i)) for i in l1]) ''' 5)现在有两元祖(('a'),('b')),(('c'),('d')),请使⽤python中的匿名函数和内置函数⽣成列表 [{'a':'c'},{'b':'d'}] (2分) ''' t1=(('a'),('b')) t2=(('c'),('d')) print([{k:v} for k,v in zip(t1,t2)]) #第二种,用lambda ret=lambda t1,t2:[{k:v} for k,v in zip(t1,t2)] print(ret(t1,t2)) ''' 6)alist = [{“a”:5,”b”:2},{“a”:2,”b”:8},{“a”:8,”b”:2}]请写出以键a的值对alist进⾏排序的表达 式(3分) ''' alist = [{'a':5,'b':2},{'a':2,'b':8},{'a':8,'b':2}] ret=sorted([i['a'] for i in alist]) print([i for k in ret for i in alist if i['a']==k]) ''' 7)现有列表alist = [3,1,-4,-2],按照元素的绝对值⼤⼩进⾏排序并将得到列表的每个元素求 平⽅形成⼀个新的列表 (2分 ''' alist = [3,1,-4,-2] print(list(sorted(map(lambda x:abs(x)**2,alist)))) ''' 8).写函数(lambda)实现字符串翻转,如:V = ‘oldboy’ (请⽤最简的⽅式) (2分) ''' print((lambda x:x[::-1])('oldboy')) ##第二种 ret = ''.join(reversed('oldboy')) print(ret) ''' 9)请构建⼀个⽣成器,⾥⾯的元素是1,4,9,16,25,36,49 ''' def func(): for i in range(1,8): ret=i**2 yield ret for i in func(): print(i) ''' 10).写个⽣成器,⾥⾯的元素是20以内所有奇数的平⽅减⼀ ''' print(list(i*i-1 for i in range(20) if i %2==1)) ''' 1.写函数传入一个列表[11,22,33,44,55,[66,77,88,‘99’]] 将列表的所有的元素相加 得到总和495 (3分 ''' list=[11,22,33,44,55,[66,77,88,'99']] def func(list): sum=0 sum1=0 for i in list[0:5]: sum+=i for k in list[-1]: sum1+=int(k) print(sum+sum1) func(list) #第二种 def func(l): num=0 for i in l: if isinstance(i ,list): #判断是否是列表类型 for k in i: num+=int(k) else: num+=int(i) return num print(func([11,22,33,44,55,[66,77,88,'99']])) ''' 2.写函数,接收两个列表类型的参数,返回⼀个规定的字典:假设有列表 a = ['name', 'age', 'sex']和b = ['alex', 35, 'Male'], 此函数最终的返回结果为{'name': 'alex', 'age': 35, 'sex': 'Male'} (3分) ''' a = ['name', 'age', 'sex'] b = ['alex', 35, 'Male'] ret=zip(a,b) print(dict(ret)) print(dict(zip(a,b))) #一条代码输出 def func(a,b): dict={} ##函数输出 for i in zip(a,b): dict[i[0]]=i[1] print(dict) func(a,b) ''' 3.有字符串 “AlexLi_PageWu_BossJin” 写函数传⼊该字符串 将该字符串结果处 理成”AlexPageWuBossJin”(2分) ''' a='AlexLi_PageWu_BossJin' s=a.replace('_','') print(s) print(a.replace("_","")) ''' 4.写函数,接收两个字典类型的参数,此函数完成的功能是实现两个字典的相 加,不同的key对应的值保留,相同的key对应的值相加后保留,如果是字符串 就拼接。⽐如: dicta = {"a":1,"b":2,"c":3,"d":4,"f":"hello"} dictb = {"b":3,"d":5,"e":7,"m":9,"k":"world"} 如上⽰例得到结果为: dictc = {“a":1,"b":5,"c":3,"d":9,"e":7,"m": 9,"f":"hello","k":"world"}(4分) ''' dicta = {"a":1,"b":2,"c":3,"d":4,"f":"hello"} dictb = {"b":3,"d":5,"e":7,"m":9,"k":"world"} def func(a,b): dictc={} for i in a: if i in b: dictc[i]=b[i]+a[i] else: dictc[i]=a[i] for k in b: if k not in dictc: dictc[k]=b[k] print(dictc) func(dicta,dictb) ''' 5.写函数,完成给下个列表去重的功能。(不能使⽤set集合)(3分) ''' a=[1,2,3,5,2,4,1] b=[1,5,6] def func(): for i in a: if i in b: b.remove(i) print(a+b) func() #第二种 def func(args): list=[] for i in args: if i not in list: list.append(i) else: continue print(list) func(a) ''' 6. 将当前时间戳打印成 "2017-10-01 18:08:15" 的格式 , 将 "2017-11-18 17:43:43" 转换为结构化时间(2分) ''' import time s=time.strptime("2017-10-01 18:08:15","%Y-%m-%d %H:%M:%S") print(s) s1=time.mktime(s) print(s1) ret=time.strptime('2017-11-18 17:43:43','%Y-%m-%d %H:%M:%S' ) print(ret) import time s=time.gmtime(time.time()) s1=time.mktime(s) print(time.strftime('%Y-%m-%d %H:%M:%S',s)) ''' 7.生成器题,有空⽂件“info.txt” 请往⾥填写任意内容,你往”info.txt”所写⼊的内 容实时返回到控制台(也就是电脑的屏幕)⽤⽣成器函数实现 请列出具体代码(4 分) ''' # with open ('info.tst',mode='w',encoding='utf-8')as f: # f.write('kaowanle') # def tail(filename): # f=open(filename,mode='r',encoding='utf-8') # f.seek(0,2) # while True: # line =f.read() # if not line: # time.sleep(0.1) # continue # yield line # tail_g=tail('info.txt') # for line in tail_g: # print(line) ''' 8.请基于random模块 写⼀个随机生成6位验证码包含大小写a-z 数字0-9 例如: Kn7s1F 请列出具体代码(4分) ''' #纯数字的 import random def func(n=6): s='' for i in range(n): num=random.randint(0,9) s+=str(num) return s print(func()) #数字和字母的 import random def func(): s='' for i in range(6): num =random.randint(0,9) alf_big=chr(random.randint(65,90)) alf_small=chr(random.randint(97,123)) add=random.choice([num,alf_big,alf_small]) s = ''.join([s,str(add)]) print(s) func() ''' 9.⽤内置函数过滤出单价大于100的股票。(3分) 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}] ''' 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}] ret=filter(lambda dic:dic['price']>100,portfolio) print(list(ret)) #一条代码 print(list(filter(lambda x:x['price']>100,portfolio))) ''' 10.’asjdgf1.23sjdhf2.56ahsfgf2.34’请⽤python代码从字符串中找到所有数字并求 和。 最后计算1.23+2.56+2.34(3分) ''' s='asjdgf1.23sjdhf2.56ahsfgf2.34' import re print(sum([float(i) for i in re.findall('\d+\.\d+',s)])) #取用这个方法 ''' 11.请从⽂件中读取内容,并且⽤内置函数和匿名函数找到年纪最⼩的⼈的字典 ⽂件中的内容如下:(5分) [{“name”:“yuan”,”age”:18},{“name”:“nezha”,”age”:19},{“name”:“baoyuan”,”age”: 17}] ''' with open('info',encoding='utf-8')as f: l1=[] title=f.readline().strip().split(',') for i in f: name,age=i.strip().split(',') l1.append({title[0]:name,title[1]:age}) print([i for i in l1 if str(min(list(map(lambda d:int(d['age']),l1))))==i['age']]) ''' 12.请写函数,接收参数⽂件夹路径,获取这个⽂件夹中所有的⽂件(不包括⽂件 夹)的⼤⼩,并根据⽂件的size从⼤到⼩进⾏排序。(6分) 最终结果:[{‘file’:’file1’,’size’:10000},{‘file’:’file2’,’size’:9000},…] ''' import os def sort_file(path): l=[] name_lst=os.listdir(path) for name in name_lst: w = os.path.join(path,name) w1=os.path.getsize(w) l.append({'file':name,'size':w1}) l.sort(key=lambda dic: dic['size'],reverse=True) return l ret=sort_file('/Users/jingliyang/PycharmProjects/MyFlask') print(ret) ''' 13.有一个数据结构如下所示,请编写一个函数从该结构数据中返回由指定的字段和对应的值 组成的字典。如果指定字段不存在,则跳过该字段。(字典还有可能有n层) (实现可扩展10分 实现当前功能5分) data:{"time":"2016-08-05T13:13:05", "some_id":"ID1234", "grp1":{ "fld1":1, "fld2":2}, "xxx2":{ "fld3":0, “test”:{‘fld5’:0.4}}, "fld6":11, "fld7":7, “fld46":8 } fields:由"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19 def select(data,fields): # TODO:implementation return resul ''' data = {'time': '2016-08-05T13:13:05', 'some_id': 'ID1234', 'grp1': {'fld1': 1, 'fld2': 2}, 'xxx2': {'fld3': 0, 'test': {'fld5': 0.4}}, 'fld6': 11, 'fld7': 7, 'fld46': 8} def foo(data,fields): d=[] for k,v in data.items(): if isinstance(v,dict): d+=foo(v,fields) elif k in fields: d.append({k:v}) return d def core(): while True: fields=input('输入你的field:').strip().split('|') if fields[0].upper()=='Q': break print(foo(data,fields)) core()
如果发现错误,希望能评论下!!!