1.初识生成器
生成器就是自定义的迭代器
生成器的定义:
def func():
print(1)
yield 1
print(2) #yield的返回值相当于__next__()获得的值
yield 2
print(3)
yield 3
ret = func()
print(ret) 结果是:<generator object func at 0x0000023293B52C50> 生成器对象
print(ret.__iter__) 结果是:<method-wrapper '__iter__' of generator object at 0x0000023293B52C50>
print(ret.__next__) 结果是:<method-wrapper '__next__' of generator object at 0x0000023293B52C50>
当函数有yield关键字时,调用函数会得到一个生成器返回值,使用生成器的__next__()会执行yield之前的函数体代码,然后将yield返回的值当做函数调用的返回值
yield与return的区别:yield可以返回多次值,return只会返回一次值
示例代码:
def func():
print("第一次")
yield 1
print("第二次")
yield 2
print("第三次")
yield 3
ret = func()
ret1 = next(ret)
print(ret1)
ret2 = next(ret)
print(ret2)
ret3 = next(ret)
print(ret3)
next(ret)
结果如下:
前三次,生成器中都有yield返回值,所以不会报错,第四次没有yield返回值,也就是迭代器去不到值了,所以就会抛出StopIteration的错误
2.进阶
def func():
while 1:
x = yield 1
print(x)
g = func() #生成一个生成器对象
g.send(None) #相当于next(g)
g.send("哈哈")
g.send("呵呵")
g.close()
注意事项:
1.send()可以给yield传值,yield将值转交给x
2.在使用send()之前,必须先让生成器取一次值
3.send(None) == next()
结果如下: