1,什么是生成器?编程
只要函数内部包含yield关键字,那么函数名()获得的结果就是生成器,并且不会执行函数内部代码app
def func():
print('============first')
yield 1函数
print('second)code
yield 2内存
print(third)input
yield3generator
print('end')it
g=func()object
print(g)yield
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, 把 列表推导式的[ ]换成()就是生成器表达式
一、把列表推导式的[]换成()就是生成器表达式 #二、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性 >>> chicken=('鸡蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f200> >>> next(chicken) '鸡蛋0' >>> list(chicken) #因chicken可迭代,于是能够转成列表 ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',] #三、优势:省内存,一次只产生一个值在内存中