# 迭代器和生成器

# 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'>
上次更新: 2/13/2025, 3:29:47 AM