Python中的生成器和迭代器

好文链接:

廖雪峰的官方网站:生成器

廖雪峰的官方网站:迭代器

刘江的博客教程:生成器

刘江的博客教程:迭代器

个人尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 生成器可直接通过将列表生成式的[]改为()得到
# 用yield关键字将一个函数标识为一个生成器
# 如实现斐波那契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
# print(b)
yield b
a, b = b, a + b
n = n + 1
return 'done'

# 使用next()函数调用
# 调用fib()并非返回原函数的返回值,而是返回一个生成器对象
gene = fib(6)
print(type(gene))
print(next(gene))
print(next(gene))
print(next(gene))
print(next(gene))
print(next(gene))
print(next(gene))

# 必须新创建一个生成器对象
# 继续使用gene会抛出StopIteration异常
gene2 = fib(6)
# 使用for循环调用
for n in gene2:
print(n)

# 检查某种类型是否是”可迭代的“
from collections.abc import Iterable, Iterator
print(isinstance([], Iterable))
print(isinstance({}, Iterable))
print(isinstance('abc', Iterable))
print(isinstance((x for x in range(10)), Iterable))
print(isinstance(100, Iterable))

# ”可迭代的“和”可迭代对象“是两种完全不同的东西
# 列表、元组等是”可迭代的“,但却不是”可迭代对象“,它们无法被next()方法调用
# 使用iter()函数将”可迭代的“类型转化成为”可迭代对象“
# 生成器天然就是”可迭代对象“,也就是迭代器
print(isinstance([], Iterator))
print(isinstance(iter([]), Iterator))

上述代码输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<class 'generator'>
1
1
2
3
5
8
1
1
2
3
5
8
True
True
True
True
False
False
True