##python的高级特性----迭代器 参考:python的高级特性----迭代器
迭代器主要就是节省内存。
- 在python中可以直接作用于
for
循环的数据类型有以下几种:
(1)集合类型的数据:list
,tuple
,dict
,set
,str
(2)generator
: 包括生成器
和带yield 的 generator function
上述对象可以直接作用于for
循环,统称为可迭代对象:iterable
,我们可以通过isinstance()
判断一个对象是否是Iterable
对象:
isinstance((x*x for x in range(1,5)), Iterator) # True, (x*x for x in range(1,5))并不是生成tuple,而是生成generator
- 生成器
generator
不但可以用for
循环,还可以被next()函数
或者__next__()
内置方法不断获取下一个值,直到最后抛出StopIteration
错误。可以被next()函数
或者__next__()
内置方法不断返回下一个值的对象成为迭代器Iterator
。生成器generator
都是迭代器Iterator
,但是Iterable对象
不一定是迭代器Iterator
,如list
、dict
、str
、tuple
、set
都不是迭代器Iterator
,想要用next()函数
或者__next__()
内置方法得先通过iter()
方法将其变成迭代器Iterator
。
# 斐波那契数列
a = [1, 2, 3, 4, 5]
a = iter(a)
print(type(a)) # >>> <class 'list_iterator'>
for i in range(5):
print(a.__next__()) # >>> 1, 2, 3, 4, 5
# 这里有个问题,如果把`iter(a)`声明在for循环里,则会出现问题,只打印第一个值,应该是每次for循# 环都会`iter(a)`一次,所以才会这样,类似于局部变量
a = [1, 2, 3, 4, 5]
print(type(a)) # >>> <class 'list_iterator'>
for i in range(5):
print(iter(a).__next__()) # >>> 1, 1, 1, 1,
```
```python
def fab(max): # fab 是一个 generator function
n = 0
a, b = 0, 1
while(n < max):
yield b
a, b = b, a + b
n = n + 1
a = fab(5) # >>> fab(5) 是一个 generator
for i in range(5):
print(a.__next__()) # >>> 1, 1, 2, 3, 5
generator
有__next__()
内置方法。迭代器Iterator
有next()函数
,python3中next()函数
用法为next(iterator)
。for
循环本质上就是不断调用next()
函数实现的
for x in [1,2,3,4,5]:
pass
等同于
it = iter([1,2,3,4,5])
while True:
try:
x = next(it)
except StopIteration: #遇到StopIteration时则退出循环。
break
================================================
小结:
1、可以for循环的对象都是Iterable ,可迭代对象。
2、可以作用于next()函数
或者__next__()
的对象都是Iterator迭代器
,next()函数
其实就是在调用__next__()
方法。Iterator迭代器
是一个惰性计算的序列。
3、集合数据类型如dict
、list
、tuple
等对象是Iterable
,但是不是Iterator
,但是可以通过iter()
函数获得Iterator
对象,iter()
函数其实就是在调用__iter__()
方法。需要传入一个Iterable
参数,函数的返回值是一个iterator对象
。