上节课复习

上节课复习: 1、有参装饰器 def outter(x): def deco(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper return deco @outter(x=1) #index=deco(index) def index(): pass 2、迭代器 1、迭代:是一个重复的过程,每次重复都是基于上一次的结果而来 迭代器:迭代取值的工具 2、为什么要用迭代器 对于没有索引的数据类型,必须找到一种通用的不依赖索引的迭代取值方式 3、如何用迭代器 可迭代的对象:但凡内置有__iter__方法的对象都是可迭代的对象 迭代器对象=可迭代的对象.__iter__() 迭代器对象:既内置有__iter__方法,又内置有__next__方法的对象 迭代器对象本身=迭代器对象.__iter__() 拿到的是下一个值=迭代器对象.__next__() ps:迭代器对象一定是可迭代对象 for i in 可迭代的对象: pass 总结迭代器优缺点: 优点 1、节省内存 2、提供一种不依赖索引的迭代取值方式 l=[1,2,3] iter_l=iter(l) next(iter_l) next(iter_l) 缺点: 1、取值不灵活,只能往后取不能往前推 2、无法预测值的个数 l=[1,2,3,4,....] iter_l=iter(l) 今日内容 生成器 三元表达式 列表生成式、字典生成式、生成器表达式
生成器

1 什么是生成器? 在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,会返回值一个值,该值称之为生成器 生成器本质就是迭代器 2、为什么要有生成器? 生成器是一种自定义迭代器的方式 3、如何用生成器 def func(): print('first1') print('first2') print('first3') yield 1 #暂停 print('second1') print('second2') print('second3') yield 2 #暂停 print('third') yield 3 #暂停 print('fourth') g=func() print(g) print(g.__iter__().__iter__().__iter__() is g) res1=next(g) print('第一次的返回值:',res1) print('='*100) res2=next(g) print('第二次的返回值:',res2) print('='*100) res3=next(g) print('第三次的返回值:',res3) print('='*100) res4=next(g) print('第三次的返回值:',res4) for item in g: #g=iter(g) #item=next(g) print(item) i=range(1,1000) for item in range(1,10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000): print(item) def my_range(start,stop,step=1): while start < stop: yield start # 暂停 start+=step g=my_range(1,5,2) #1 3 print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) for item in g: print(item) 总结yield的功能 1、提供一种自定义迭代器的方式 2、yield可以暂停住函数,返回值 yield VS return 相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制 不同点:return只能返回一次值,yield可以返回多次值 了解知识 yield 值 x=yield x= yield 值 def dog(name): food_list=[] print('狗哥 %s 准备开吃' %name) while True: food=yield food_list#暂停 food=yield='一桶泔水' print('狗哥[%s]吃了<%s>' %(name,food)) food_list.append(food) alex_dog=dog('alex') res1=next(alex_dog) # 初始化,即让狗准备好 print(res1) next(alex_dog) # 等同于alex_dog.send(None) next(alex_dog) res2=alex_dog.send(('一泡翔','咖啡伴侣')) print(res2) res3=alex_dog.send('一桶泔水') print(res3)
杂项

三元表达式 条件成立时的返回值 if 条件 else 条件不成立时的返回值 def max2(x,y): if x > y: return x else: return y x=10 y=20 res=x if x > y else y print(res) 列表生成式 l=[item**2 for item in range(1,11)] print(l) names=['alex','wxx','lxx'] l=[] for name in names: l.append(name + 'SB') names=l names=[name+'SB' for name in names] print(names) names=['alex','wxx','egon','lxx','zhangmingyan'] l=[] for name in names: if name != 'egon': l.append(name + 'SB') names=l names=[name+'SB' for name in names if name != 'egon'] print(names) l=[item**2 for item in range(1,5) if item > 2] print(l) names=['egon','alex_sb','wupeiqi','yuanhao'] names=[name.upper() for name in names] print(names) names=['egon','alex_sb','wupeiqi','yuanhao'] nums=[len(name) for name in names if not name.endswith('sb')] print(nums) 字典生成式 s1='hello' l1=[1,2,3,4,5] res=zip(s1,l1) print(res,type(res)) print(list(res)) keys=['name','age','sex'] values=['egon',18,'male'] res=zip(keys,values) print(list(res)) print(list(res)) d={} for k,v in zip(keys,values): d[k]=v print(d) keys=['name','age','sex'] values=['egon',18,'male'] d={k:v for k,v in zip(keys,values)} print(d) info={'name': 'egon', 'age': 18, 'sex': 'male'} keys=info.keys() print(keys) iter_keys=keys.__iter__() values=info.values() print(values) d={k:v for k,v in zip(keys,values)} print(d) s={i for i in range(10)} print(s,type(s)) 生成器表达式 g=(i for i in range(10)) # print(g) print(next(g)) print(next(g)) nums=[11,22,33,44,55] print(max(nums)) with open('a.txt',encoding='utf-8') as f: nums=(len(line) for line in f) print(max(nums)) print(max(nums)) print(max(nums)) l=['egg%s' %i for i in range(100)] print(l) g=('egg%s' %i for i in range(1000000000000)) print(g) print(next(g)) print(next(g))