迭代器
正如我们之前看到的,在 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
如果没有更多元素,迭代器将引发“停止迭代”异常。
使用迭代器进行练习
-
实现一个迭代器类来返回从“a”到“b”的所有数字的平方。
-
实现一个迭代器类以返回从 1 到 (n) 的所有偶数。 3.实现迭代器类以返回从 1 到 (n) 的所有奇数。
-
实现一个迭代器类以返回从 (n) 到 0 的所有数字。
-
实现一个迭代器类,以返回从第一个元素到 (n) 的斐波那契序列。您可以在函数的章节中查看斐波那契序列的定义。这些是序列的第一个数字:0、1、1、2、3、5、8、13、21、34、55、89,...
-
实现一个迭代器类来返回从 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
使用生成器进行练习
- 实现一个名为“平方”的生成器,以产生从 (a) 到 (b) 的所有数字的平方。使用“for”循环对其进行测试并打印每个生成的值。
- 创建一个生成器以产生从 1 到 (n) 的所有偶数。 3.创建另一个生成器以产生从 1 到 (n) 的所有奇数。
- 实现一个生成器,该生成器返回从 (n) 到 0 的所有数字。
- 创建一个生成器以返回从第一个元素到 (n) 的斐波那契序列。序列的第一个数字是:0、1、1、2、3、5,8、13、21、34、55、89,...
- 实现一个生成器,返回从 0 到 (n) 的所有连续数字对,例如 (0, 1)、(1,2)、(2,3)...