Python Generator(生成器)--yield 用法
- 迭代--一个接一个地读取列表中值的过程
list1=[1,2,3] for i in list1: print(i,end=' ')
# 1 2 3
list2=[x*x for x in range(5)] for i in list2: print(i,end=' ')
# 0 1 4 9 16
上述代码当迭代次数为500万时,每一个值都需要放在内存里,非常消耗资源,为了节省内存资源,产生了Python Generator。
2. Python Generator--用多少生成多少,用完就扔掉,(只能用一次)--解决了资源消耗问题
#创建生成器
data_generator=(x*x for x in range(5))
data_generator
#<generator object <genexpr> at 0x00000168EE7BCF90>
# 生成器用法
for i in data_generator:
print(i ,end=' ')
# 0 1 4 9 16
#第二次迭代
for i in data_generator:
print(i ,end=' ')
#
#注,什么也没有
#区别列表
data_generator=[x*x for x in range(5)]
data_generator
#[0, 1, 4, 9, 16]
3. yield用法--- 生成器原理
yield与return类似
return expression --直接退出方法(函数),并返回expression 的值
yield也是返回值,但返回的是一个generator,generator当前值就是yield后面跟的表达式的值
每一个generator对象都有一个隐含方法.__next__() --可以单独调用,该方法的返回值就是yield后面表达式的值。
# 输出所有不大于max的偶数
def generator_even(max):
for i in range(0,max+1):
if i % 2==0:
yield i
#generator_even(10)
#<generator object generator_even at 0x00000168EFB2A510>
generator_even=generator_even(10) for i in generator_even: print(i,end=' ') #0 2 4 6 8 10 #seconds times for i in generator_even: print(i,end=' ') #什么也没有输出
关于容易出现的报错:--从定义的函数开始,从新跑一边
def generator_even(max): for i in range(0,max+1): if i % 2==0: yield i even_generator=generator_even(10) even_generator.__next__() # 0 even_generator.__next__() #2 even_generator.__next__() #4 even_generator.__next__() 6 even_generator.__next__() # 8 even_generator.__next__() 10 even_generator.__next__() # StopIteration: #当调用次数超过迭代次数就会出现上述异常, 应该使用try...except 捕获该异常
4.用普通函数模拟生成器
# 普通函数模拟生成器效果
#将生成器变为普通列表
def generator_even1(max):
evens=[]
for i in range(0,max+1):
if i % 2==0:
evens.append(i)
# yield i
return evens
generator_even1(20)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]