# 迭代器和生成器
# python中的容器
在 Python 中一切皆对象,对象的抽象就是类,而对象的集合就是容器。
列表(list: [0, 1, 2]),元组(tuple: (0, 1, 2)),字典(dict: {0:0, 1:1, 2:2}),集合(set: set([0, 1, 2]))都是容器。对于容器,你可以很直观地想象成多个元素在一起的单元;而不同容器的区别,正是在于内部数据结构的实现方法。然后,你就可以针对不同场景,选择不同时间和空间复杂度的容器。
# 可迭代对象
所有的容器都是可迭代的(iterable)。这里的迭代,和枚举不完全一样。迭代可以想象成是你去买苹果,卖家并不告诉你他有多少库存。这样,每次你都需要告诉卖家,你要一个苹果,然后卖家采取行为:要么给你拿一个苹果;要么告诉你,苹果已经卖完了。你并不需要知道,卖家在仓库是怎么摆放苹果的。
而可迭代对象,通过 iter() 函数返回一个迭代器,再通过 next() 函数就可以实现遍历。for in 语句将这个过程隐式化,所以,你只需要知道它大概做了什么就行了。
可迭代对象是指实现了__iter__()方法且该方法返回一个迭代器的对象。
__iter__()方法可以通过for..in或者iter()方法调用
# 如何判断一个对象是否可迭代?
from collections import Iterable
print(isinstance([1, 2, 3], Iterable))
# 迭代器
迭代器是指提供了__next__()方法且该方法返回下一个对象或者抛出StopIteration异常的对象
__next__()方法可以通过next()函数调用
# 生成器
生成器是懒人版本的迭代器
生成器只在调用next的时候计算下一个值
# 生成器表达式
a = (i for i in range(10000))
print(type(a))
# <class 'generator'>
# 生成器函数
def gen():
for i in range(10000):
yield i
print(type(gen()))
# <class 'generator'>
← 输入与输出 MetaClass元类 →