一个包含yield关键字的函数就是一个生成器函数,并且yield和return不可以共用,并且yield只能用于函数内。
(1)生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。
(2)执行了__next__
方法之后才会执行函数体,并且返回函数值。
(3)next()内置方法,内部调用生成器函数的__next__()
方法。
(4)yield和return相同的是可以返回值,但是不同的是yield不会结束函数。
生成器的使用
def shengchan(n):
i=1
while i<=n:
yield i
i+=1
x=shengchan(5)
print(x)
for y in x:
print(y)
结果:
<generator object shengchan at 0x00000000037BDD68>
1
2
3
4
5
send获取下一个值的效果和next()基本一致,只是在获取下一个值的时候,给上一yield的位置传递一个数据。
注意:(1)第一次获取生成器的时候,是用next获取下一个值
(2)最后一个yield不能接受外部的值。
def f():
print("a")
x=yield 10
print("接收到的数据是:",x)
yield x+3
x=f()
print(next(x))
b=x.send(66)
print(b)
结果:a
10
接收到的数据是: 66
69
yield from循环遍历容器类型
def f():
yield from "ab"
yield from range(5)
for x in f():
print(x)
结果:a
b
0
1
2
3
4
生成器表达式,将列表解析式[]改成()即可
b=(i for i in range(5))
print(b)
for x in b:
print(x)
结果:
<generator object at 0x00000000037CDD68>
0
1
2
3
4