一、生成器练习:
1、自定义函数模拟range(1,7,2)
def my_range(start,stop,step=1):
while start yield start start+=step obj=my_range(1,7,2) print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj)) #StopIteration 为什么不能在函数里面加异常处理的原因是,只有在取值的时候才会有异常,函数中没涉及取值 2、模拟管道,实现功能:tail -f access.log | grep '404' def tail(file): import time with open(file,'rb') as f: f.seek(0,2) while True: line = f.readline() if line: # print(line) yield line else: # continue 不要直接continue,会变成死循环 消耗资源 time.sleep(0.05) def grep(lines,pattern): for line in lines: line = line.decode('utf-8') if pattern in line: yield line for line in grep( tail('access.log'),'404'): print(line, end='') 附加:另一个向access.log文件里面输入字符的py程序 with open('access.log','a',encoding='utf-8') as f: f.write('出错啦404n') f.flush() 3、编写装饰器,实现初始化协程函数的功能 4、实现功能:grep -rl 'python' /etc 二、声明式编程练习题 1、将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写 names=['egon','alex_sb','wupeiqi','yuanhao'] names=[name.upper() for name in names] print(names) 2、将names=['egon','alex_sb','wupeiqi','yuanhao']中以sb结尾的名字过滤掉,然后保存剩下的名字长度 names=['egon','alex_sb','wupeiqi','yuanhao'] names=[name for name in names if name.endswith('sb') ] print(names) 3、求文件a.txt中最长的行的长度(长度按字符个数算,需要使用max函数) with open('a.txt','r',encoding='utf-8') as f: print(max(len(line) for line in f)) 4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数) with open('a.txt', 'r', encoding='utf-8') as f: print(sum(len(line) for line in f)) print(sum(len(line) for line in f)) #求包换换行符在内的文件所有的字符数,为何得到的值为0? 5、思考题 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 求总共花了多少钱? 打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...] 求单价大于10000的商品信息,格式同上 #每次必须重新打开文件或seek到文件开头,因为迭代完一次就结束了 with open('a.txt',encoding='utf-8') as f: info=[line.split() for line in f] cost=sum(float(unit_price)*int(count) for _,unit_price,count in info) print(cost) with open('a.txt',encoding='utf-8') as f: info=[{ 'name': line.split()[0], 'price': float(line.split()[1]), 'count': int(line.split()[2]), } for line in f] print(info) with open('a.txt',encoding='utf-8') as f: info=[{ 'name': line.split()[0], 'price': float(line.split()[1]), 'count': int(line.split()[2]), } for line in f if float(line.split()[1]) > 10000] print(info) 三、阶段性练习 1、文件内容如下,标题为:姓名,性别,年纪,薪资 egon male 18 3000 alex male 38 30000 wupeiqi female 28 20000 yuanhao female 28 10000 要求: 从文件中取出每一条记录放入列表中, 列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式 2、根据1得到的列表,取出薪资最高的人的信息 3、根据1得到的列表,取出最年轻的人的信息 4、根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式 5、根据1得到的列表,过滤掉名字以a开头的人的信息 6、使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0 1 1 2 3 4 7...) 7、一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的值 #1 with open('db.txt') as f: items=(line.split() for line in f) info=[{'name':name,'sex':sex,'age':age,'salary':salary} for name,sex,age,salary in items] print(info) #2 print(max(info,key=lambda dic:dic['salary'])) #3 print(min(info,key=lambda dic:dic['age'])) # 4 info_new=map(lambda item:{'name':item['name'].capitalize(), 'sex':item['sex'], 'age':item['age'], 'salary':item['salary']},info) print(list(info_new)) #5 g=filter(lambda item:item['name'].startswith('a'),info) print(list(g)) #6 #非递归 def fib(n): a,b=0,1 while a < n: print(a,end=' ') a,b=b,a+b print() fib(10) #递归 def fib(a,b,stop): if a > stop: return print(a,end=' ') fib(b,a+b,stop) fib(0,1,10) #7 l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]] def get(seq): for item in seq: if type(item) is list: get(item) else: print(item) get(l)



