可迭代(Iterable)
我们知道,在Python中一切皆为对象。其中可以用for
循环遍历的,即内部有__iter__()
方法的对象,都是可迭代的对象。
for
循环的本质: 使用for循环实际上干了两件事,首先调用__iter__()
返回一个对象,该对象需要有__next__()
方法,然后再循环调用该对象的__next__()
方法不断获取下一个值。
常见的可迭代对象包括:
- 集合数据类型:如
list
、tuple
、dict
、set
、str
等 - 迭代器 Iterator
可以用isinstance()
函数判断对象是否可迭代:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
迭代器(Iterator)
可以被 next()
函数调用,并不断返回下一个值的对象都称为迭代器,也就意味着这种对象中需要有__next__()
方法的实现。迭代器的特点是内存消耗少。其中:
- 生成器 Generator 是一种迭代器。
- list、dict、str虽然是可迭代对象,却不是迭代器,可以使用
iter()
函数,把list、dict、str等可迭代对象变成迭代器。
可迭代对象和迭代器的关系:
可迭代对象中包含__iter__()
方法的实现,经过iter()
函数调用后,返回一个迭代器,而迭代器中有__next__()
方法的实现。
可以用isinstance()
函数判断对象是否为迭代器:
>>> from collections import Iterator
>>> isinstance([], Iterator)
False
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
生成器(Generator)
生成器属于迭代器的一种,因此也可以被next()
函数调用。
生成器可以分为两种:
- 形如
( i for i in range(10))
的生成器 - 带
yield
关键字的生成器函数
生成器函数的例子:
def fib(num):
a, b = 0, 1
current = 0
while current < num:
ret = yield a
current += 1
obj = fib(10)