1. 可迭代对象
可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象。
1 | from collections import Iterable |
True
True
True
True
False
True
2. 迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象。
1 | from collections import Iterator |
True
False
False
False
所以生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
3. 生成器
生成器指的就是生成器对象:
生成器其实是一种特殊的迭代器。
可以由生成器表达式得到;
1
2
3
4
5
6
7
8
9
10
11
12
13
14#(expr for iter_var in iterable)
L= (i +1 for i in range(10) if i %2)
print(type(L))
print(next(L))
print(next(L))
print(next(L))
#generator 生成器
<class 'generator'>
2
4
6可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象。
- 函数体中包含yield语句的函数,反正生成器对象
- 生成器对象,是延迟计算、惰性求值的。
1 | #实现计数器 |
1
2
1 | #打印斐波那契数列 |
<class 'generator'>
1
1
2
3
5
6356306993006846248183
4. 总结
关系图: