藐姑射之山,有神人居焉,肌肤若冰雪,绰约如处子,不食五谷,吸风饮露,乘云气,御飞龙,而游乎四海之外。——《逍遥游》很喜欢这一句,如果世间真的有神人,那么不过如此,遁入空门,不受世俗约束,不受五谷杂粮羁绊,有的只是一颗赤子之心,一份与世无争的胸怀。
什么是生成器?
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和return
相同点,都是用再函数内,都可以返回值,没有类型限制,没有个数限制
不同点,return只能返回一次值,yield可以返回多次值
了解知识:x = yiled 可以给yiled传值,然后讲了一个next的扩展函数send()
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) 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))