当前位置: Python基础教程 > 17-多任务-协程 > 阅读正文

python的生成器

2021.7.6.   500 次   889字

python的生成器( generator ), 是一种特殊的迭代器

生成器, 会自动生成可迭代对象

()创建方式

生成器有多种创建方法, 第一种方法, 是把一个列表的[]改成()

L = [ x*2 for x in range(5)]
L
[0, 2, 4, 6, 8]

# 生成器
G = ( x*2 for x  in range(5))
G
<generator object <genexpr> at 0x0000013B46D1AA98>
# 遍历对象
for temp in G:
    print(temp)
0
2
4
6
8

yield创建方式

对于稍微复杂一点的生成器, 可以使用函数形式创建

这里使用的关键字是 yield, 只要函数中存在此关键字, 则会被当作是生成器, 不再是简单的方法调用, 而是返回一个可迭代对象

def fib(n):
    current = 0
    num1, num2 = 0, 1
    while current < n:
        num1, num2 = num2, num1 + num2
        current += 1
        yield num1


f = fib(5)

for temp in f:
    print(temp)

程序执行结果:

1
1
2
3
5

send创建方式

要获取迭代器对象, 可以使用 iter(对象) 函数, 而获取一次迭代内容, 可以使用 next(可迭代对象) , 但 next 不能指定参数, 若希望灵活的传参, 可以使用 send 方式

send(参数)方式, 相当于 next(参数), 而无法直接 next(参数)

def fib(n):
    current = 0
    num1, num2 = 0, 1
    while current < n:
        num1, num2 = num2, num1 + num2
        current += 1
        res = yield num1
        print("res="+str(res))


f = fib(5)

ret = next(f)
print(ret)

ret = next(f)
print(ret)

ret = f.send("abc")
print(ret)

程序结果如下:

1
res=None
1
res=abc
2

send 可以传递参数, 而next不可以传参, 而函数内通过 变量=yield得到, 若第一次就使用send必须传递None

此外, 生成器函数若有返回值, 可以在函数终止后, 即抛出了异常后, 通过异常.value获取到返回值

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群