函数-Ⅷ
>>> # 在 Python 中,使用了 yield 语句的函数被称为生成器(generator)。>>> # 与普通函数不同的是,生成器是一个返回生成器对象的函数,它只能用于进行迭代操作,更简单的理解是 —— 生成器就是一个特殊的迭代器。
>>> # 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 yield 方法时从当前位置继续运行。
>>> def counter():
... i = 0
... while i <=5:
... yield i
... i += 1
...
>>> # 调用 counter() 函数,得到的不是一个返回值,而是一个生成器对象:
>>> counter
<function counter at 0x016C7778>
>>> counter()
<generator object counter at 0x01B2CB50>
>>> for i in counter():
... print(i)
...
0
1
2
3
4
5
>>> # 注意:生成器不像列表、元组这些可迭代对象,你可以把生成器看作是一个制作机器,它的作用就是每调用一次提供一个数据,并且会记住当时的状态。而列表、元组这些可迭代对象是容器,它们里面存放着早已准备好的数据。
>>> >>>
>>> # 生成器可以看作是一种特殊的迭代器,因为它首先是 “不走回头路”,第二是支持 next() 函数:
>>> c = counter()
>>> next(c)
0
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>>
>>> next(c)
4
>>> next(c)
5
>>> next(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # 当没有任何元素产出的时候,它就会抛出一个 “StopIteration” 异常。
>>> # 斐波那契数列。
>>> def fib():
... back1, back2 = 0, 1
... while True:
... yield back1
... back1,back2 = back2, back1 + back2
...
>>> f = fib()
>>> next(f)
0
>>> next(f)
1
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
5
>>> # 生成器表达式
>>> (i ** 2 for i in range(10))
<generator object <genexpr> at 0x01B2CD48>
>>> t = (i ** 2 for i in range(10))
>>> next(t)
0
>>> next(t)
1
>>> next(t)
4
>>> next(t)
9
>>> next(t)
16
>>> next(t)
25
>>> next(t)
36
>>> next(t)
49
>>> next(t)
64
>>> next(t)
81
>>> next(t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> {:5_106:}
页:
[1]