0
点赞
收藏
分享

微信扫一扫

[python笔记] 深入分析iterable, iterator, generator

 

可迭代的(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')

[python笔记] 深入分析iterable, iterator, generator_迭代

调用FOR_ITER这个指令实现了读取下一个next()的功能, 即, for循环中,首先利用GET_ITER得到x的返回值, 一个iterator. 再通过FOR_ITER得到其中的元素. 如此实现了循环的功能

 


举报

相关推荐

0 条评论