迭代
- 可以通过for循环来遍历,这种遍历就是迭代
可迭代对象
- 凡是可以被for循环遍历的对象都是可迭代对象:Iterable、
list
、dict
、str等
迭代器
- 迭代器模式:惰性获取数据,按需计算下一个数据
- 可以被
next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
- 可以使用
isinstance()
判断一个对象是否是Iterator
对象 - 迭代器有两个基本的方法:iter() 和 next()
- 集合数据类型如
list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
from collections.abc import Iterator, Iterable
a = [1, 2, 3]
b = iter(a)
print(a)
print(b)
print('a is Iterable', isinstance(a, Iterable))
print('b is Iterator', isinstance(b, Iterator))
[1, 2, 3]
<list_iterator object at 0x00000156AC167308>
a is Iterable True
b is Iterator True
class Fib(object):
"""迭代器"""
def __init__(self, num):
self.num = num
self.a, self.b = 0, 1
self.idx = 0
def __iter__(self):
return self
def __next__(self):
if self.idx < self.num:
self.a, self.b = self.b, self.a + self.b
self.idx += 1
return self.a
raise StopIteration()
生成器
- 在Python中,这种一边循环一边计算的机制,称为生成器:generator,所有的生成器都是迭代器
- Python 中,使用了 yield 的函数被称为生成器:generator
- 把一个列表生成式的
[]
改成()
,就创建了一个generator - 调用一个生成器函数,返回的是一个迭代器对象
a = [1, 2, 3]
# 把一个列表生成式的[]改成(),就创建了一个generator
b = (i for i in a)
def fib(num):
"""生成器"""
a, b = 0, 1
for _ in range(num):
a, b = b, a + b
yield a
def generator():
"""
函数使用yield,变成了generator
"""
for i in a:
yield i
g = generator()
print('generator():', type(generator()))
print('b:', type(b))
# generator,就是迭代器
for i in g:
print(i)