python迭代器也是可迭代的,怎解?
第一次接触 Python 的时候,你可能写过类似 for i in [2, 3, 5, 7, 11, 13]: print(i)
这样的语句。
但是,你想过 Python 在处理 for in 语句的时候,具体发生了什么吗?什么样的对象可以被for in
来枚举呢?
for loop和迭代器
在Python中,for循环是一种常用的迭代结构,用于遍历可迭代对象
中的元素。迭代器是一种特殊的对象,它实现了迭代协议,允许按照一定的顺序逐个访问元素。
for循环和迭代器之间存在密切的关系,实际上,for循环是基于迭代器工作的。当使用for循环遍历可迭代对象时,Python会在内部自动创建一个迭代器对象,并使用该迭代器来逐个获取元素,直到所有元素都被访问完毕。
for loop
里面in后面那个东西必须是一个iterable
, 也就是必须是一个可迭代对象
。
下面是一个示例,演示了for循环和迭代器之间的关系:
fruits = ['apple', 'banana', 'orange']
# 使用for循环遍历列表元素
for fruit in fruits:
print(fruit)
# 上述代码等价于下面的迭代器方式
iterator = iter(fruits) # 创建迭代器对象
while True:
try:
fruit = next(iterator) # 获取下一个元素
print(fruit)
except StopIteration:
break
在上面的示例中,我们首先使用for循环遍历了列表fruits
中的元素,打印出每个水果的名称。然后,我们手动创建了一个迭代器对象iterator
,并使用next()
函数逐个获取元素,直到遇到StopIteration
异常,表示所有元素都被访问完毕。
可以看到,使用for循环可以简化迭代过程,不需要显式地创建迭代器对象和处理StopIteration
异常。Python的许多内置对象(如列表、元组、字典等)都是可迭代的,因此可以直接在for循环中使用它们。
列表
lst = [1, 2, 3]
for i in lst:
print(i)
字典
d = {"a": 1, "b": 2}
for i in d:
print(i)
文件操作
with open(my.txt, "r") as f:
for i in f:
print(i)
除了内置的可迭代对象,你还可以自定义迭代器类,实现自己的迭代逻辑。这样,你就可以在for循环中使用自定义的迭代器来遍历特定的数据结构或实现特定的迭代行为。
for loop
的背后核心是迭代器
和可迭代对象
。
迭代器和可迭代对象
https://docs.python.org/3/glossary.html
cpython本身并不总是遵循每个iterator都是iterable的要求。