BrightXiong 发表于 2023-3-12 16:34:50

函数-Ⅷ

>>> # 在 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
>>>

match123_xbd 发表于 2023-3-31 16:54:28

{:5_106:}
页: [1]
查看完整版本: 函数-Ⅷ