参考:
可迭代器 vs. 迭代器 vs. 生成器 » nvie.comhttps://nvie.com/posts/iterators-vs-generators/#containers
可迭代的(Iterable)有:
- 文件
- generator
- 大部分containers , 如list, tuple, dict, String.....
一点小测试:
from collections import Iterable, Iterator
def f():
x = 0
while True:
yield x
x = x + 1
g = f()
a = [1, 2, 3]
b = (1, 2, 3)
c = {"name":"kkk", "age":15}
print(type(g)) #<class 'generator'>
print(isinstance(g, Iterable)) #True
print(isinstance(a, Iterable)) #True
print(isinstance(b, Iterable)) #True
print(isinstance("String", Iterable)) #True
print(isinstance(c, Iterable)) #True
iterable实现了__iter__()方法的对象, 该方法返回的是的一个iterator对象.其中,iterator的目的是返回所有元素
测试:
x = [1, 2, 3, 6, 2, 39]
itX = iter(x)
print(type(itX)) #<class 'list_iterator'>
for i in range(6):
print(next(itX),end=" ") #1 2 3 6 2 39
iterable是一个比iterator更大的概念
x = [1, 2, 3, 6, 2, 39]
for i in x:
. . .
当反汇编此代码时,可以看到显式调用GET_ITER
iter(x)
FOR_ITER
next()的
指令,它将等效于重复调用以获取每个元素,但这不会从字节代码指令中显示,因为它针对解释器中的速度进行了优化。
import dis
x = [1, 2, 3, 6, 2, 39]
dis.dis('for i in x: pass')
调用FOR_ITER这个指令实现了读取下一个next()的功能, 即, for循环中,首先利用GET_ITER得到x的返回值, 一个iterator. 再通过FOR_ITER得到其中的元素. 如此实现了循环的功能