1,什么是生成器?
只要函数内部包含yield关键字,那么函数名()得到的结果就是生成器,而且不会执行函数内部代码
def func():
print('============first')
yield 1
print('second)
yield 2
print(third)
yield3
print('end')
g=func()
print(g)
2 ,生成器就是迭代器
g.__iter__
g.__next__
生成器就是迭代器,因此可以这么取值
res=next(g)
print(res)
3,携程函数 yield
yield 关键字的另外一种使用形势:表达式形式的yield
def eater(name):
print('%s 准备开始吃饭啦'%name)
foo_list=[]
while True:
food=yield food_list
print('%s吃了%s'%(name,food_list)
food_list.append(food)
g=eater('egon')
g.send(None)#对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g)
g.send('真颅骨')
g.send('蒸熊掌')
yield 总结
1,把函数做成迭代器
2,对比return, 可以返回多次值,可以挂起保存函数的运行状态
4,三元表达式
name=input('姓名')
res='sb ' if name =='alex' else 'NB'
列表推导式
egg_list=[]
for i in range (10):
egg_list.append('鸡蛋%s' %i)
egg_list =['鸡蛋%s'%i for i in range(10)]
优点:方便,改变了编程习惯,可称之为声明式编程
五,生成器表达式
1, 把 列表推导式的[ ]换成()就是生成器表达式
1、把列表推导式的[]换成()就是生成器表达式 #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性 >>> chicken=('鸡蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f200> >>> next(chicken) '鸡蛋0' >>> list(chicken) #因chicken可迭代,因而可以转成列表 ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',] #3、优点:省内存,一次只产生一个值在内存中