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 #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_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]