python 迭代器与生成器

258 阅读3分钟

迭代器

正如我们之前看到的,在 Python 中使用 “for” 循环来迭代对象的内容:

>>> for value in [0,1,2,3,4,5]:

    print(value)

0
1 
4 
9 
16 
25

可以与“for”循环一起使用的对象称为迭代器。因此,迭代器是遵循迭代协议的对象。

内置函数“iter”可用于构建迭代器对象,而“next”函数可用于逐步迭代其内容:

>>>my_iter=iter([1,2,3])

>>> my_iter

list_iterator object at 0x10ed41cc0>

>>>next(my_iter)

1

>>>next(my_iter)

2

>>>next(my_iter)

3

>>>next(my_iter)

Traceback (most recent call last): File "<stdin>", line 1, in <module> 
                                                               
StopIteration

如果没有更多元素,迭代器将引发“停止迭代”异常。

使用迭代器进行练习

  1. 实现一个迭代器类来返回从“a”到“b”的所有数字的平方。

  2. 实现一个迭代器类以返回从 1 到 (n) 的所有偶数。 3.实现迭代器类以返回从 1 到 (n) 的所有奇数。

  3. 实现一个迭代器类以返回从 (n) 到 0 的所有数字。

  4. 实现一个迭代器类,以返回从第一个元素到 (n) 的斐波那契序列。您可以在函数的章节中查看斐波那契序列的定义。这些是序列的第一个数字:0、1、1、2、3、5、8、13、21、34、55、89,...

  5. 实现一个迭代器类来返回从 0 到 (n) 的所有连续数字对,例如 (0,1)、(1,2)、(2,3)...

生成器

迭代器是经常与“for”循环一起使用的对象。

在其他情况下,迭代器是实现迭代协议的对象。

Python 生成器是实现迭代器的便捷方法。

生成器不是类,而是每次使用“yield”关键字时返回一个值的函数。

下面是一个生成器示例,用于计算两个数字之间的值:

def myrange(a, b):

    while a<b: 
    
        yield a
    
        a+=1

与迭代器一样,生成器可以与“for”循环一起使用:

 >>> for value in myrange(1,4):

print(value)
1
2
3

生成器的行为类似于迭代器:

>>> seq = myrange(1, 3)

>>> next(seq)
1

>>> next(seq)
2

>>> next(seq)

Traceback(most recent call last): File "<stdin>", line1, in < module > StopIteration

关于生成器的有趣之处在于“yield”关键字。“yield”关键字的工作方式与“return”关键字非常相似,但与“return”不同,它允许函数最终恢复其执行。换句话说,每次需要生成器的下一个值时,Python 都会唤醒函数并从“yield”行恢复其执行,就好像函数从未退出。

生成器函数可以在内部使用其他函数。例如,使用“range”函数迭代数字序列是很常见的:

def squares(n):

    for value in range(n):

    yield value * value

使用生成器进行练习

  1. 实现一个名为“平方”的生成器,以产生从 (a) 到 (b) 的所有数字的平方。使用“for”循环对其进行测试并打印每个生成的值。
  2. 创建一个生成器以产生从 1 到 (n) 的所有偶数。 3.创建另一个生成器以产生从 1 到 (n) 的所有奇数。
  3. 实现一个生成器,该生成器返回从 (n) 到 0 的所有数字。
  4. 创建一个生成器以返回从第一个元素到 (n) 的斐波那契序列。序列的第一个数字是:0、1、1、2、3、5,8、13、21、34、55、89,...
  5. 实现一个生成器,返回从 0 到 (n) 的所有连续数字对,例如 (0, 1)、(1,2)、(2,3)...