关于Python中的迭代器和可迭代项的困惑

我目前正在阅读Python 3.5的官方文档.

它指出range()是可迭代的,而list()和for是迭代器. [section 4.3]

但是,here指出zip()构成了迭代器.

我的问题是,当我们使用此指令时:

list(zip(list1, list2))

我们是否使用迭代器(list())来迭代另一个迭代器?

解决方法:

通过重复使用术语“迭代器”,文档在这里造成了一些混乱.

iterator protocol包含三个组件:

>可迭代;您可以一遍一遍地迭代并获取其元素的事物.
>迭代器;做迭代的事情.每次您要遍历迭代的所有项目时,都需要其中之一来跟踪过程中的位置.这些不可重用;一旦到达终点,就是这样.对于大多数可迭代项,您可以创建多个独立的迭代器,每个跟踪位置都独立.
>迭代器的消费者;那些想要对物品有所帮助的东西.

for循环是后者的示例,因此#3. for循环使用iter() function为要循环的对象生成一个迭代器(上面的#2),因此“任何”都必须是可迭代的(上面的#1).

range()是#1的示例;它是可迭代的对象.您可以独立地对其进行多次遍历:

>>> r = range(5)
>>> r_iter_1 = iter(r)
>>> next(r_iter_1)
0
>>> next(r_iter_1)
1
>>> r_iter_2 = iter(r)
>>> next(r_iter_2)
0
>>> next(r_iter_1)
2

在这里,r_iter_1和r_iter_2是两个单独的迭代器,每次您要求下一个项目时,它们都会根据自己的内部簿记进行操作.

list()是可迭代(#1)和迭代使用者(#3)的示例.如果将另一个可迭代(#1)传递给list()调用,则会生成一个列表对象,其中包含该可迭代的所有元素.但是列表对象本身也是可迭代的.

python(3)中的zip()接受多个可迭代项(#1),它本身就是一个迭代器(#2). zip()为您提供的每个可迭代对象存储一个新的迭代器(#2).每次您向zip()请求下一个元素时,zip()都会使用包含的每个可迭代对象的下一个元素构建一个新的元组:

>>> lst1, lst2 = ['foo', 'bar'], [42, 81]
>>> zipit = zip(lst1, lst2)
>>> next(zipit)
('foo', 42)
>>> next(zipit)
('bar', 81)

因此,最后,list(zip(list1,list2))同时使用list1和list2作为可迭代对象(#1),当外部list()调用使用zip()本身时,zip()消耗了它们(#3).

上一篇:python-os.walk().next()中类“ Iterable”的未解析属性引用“ next”


下一篇:Oracle Dg配置过程