iter()内置函数的意义何在?

2024-09-28 17:05:00 发布

您现在位置:Python中文网/ 问答频道 /正文

使用iter(),我可以这样做:

>>> listWalker = iter ( [23, 47, 'hike'] )
>>> for x in listWalker: print x,

但无论如何我都可以做到:

^{pr2}$

它增加了什么价值?在


Tags: infor价值printiterpr2hikelistwalker
3条回答

iter的意义在于它允许您从iterable对象获取迭代器并自己使用它,或者实现您自己的for循环的变体,或者在多个循环中保持迭代的状态。一个小例子:

it = iter(['HEADER', 0, 1, 2, 3])  # coming from CSV or such
title = it.next()
for item in it:
    # process item
    ...

这个分组习惯用法提供了iter的更高级用法:

^{pr2}$

除了使用iter为实现__iter__方法的对象显式获取迭代器之外,iter还有一种鲜为人知的双参数形式,它使迭代器重复调用函数,直到返回给定的sentinel值。在

 for line in iter(f.readline, 'EOF'):
     print line

前面的代码将调用f.read(例如,一个打开的文件句柄f),直到它读取由字符串EOF组成的行。这和写作差不多

^{pr2}$

此外,迭代器可能是一个不同于它所迭代的对象的对象。这对于list类型是正确的。这意味着您可以创建两个迭代器,两个迭代器都独立地在同一个对象上迭代。在

itr1 = iter(mylist)
itr2 = iter(mylist)

x = next(itr1)   # First item of mylist
y = next(itr1)   # Second item of my list
z = next(itr2)   # First item of mylist, not the third

但是,文件句柄充当它们自己的迭代器:

>>> f = open('.bashrc')
>>> id(f)
4454569712
>>> id(iter(f))
4454569712

通常,iter返回的对象依赖于对象类型实现的__iter__方法。在

当您对一个变量执行for循环时,它隐式调用您实际传递的iterable的__iter__方法。
{你总是在使用循环列表。。。所有的一切。在

我想这个字节码的摘录可以让你相信:

>>> def a():
...     for x in [1,2,3]:
...         print x
...
>>> import dis
>>> dis.dis(a)
  2           0 SETUP_LOOP              28 (to 31)
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 (2)
              9 LOAD_CONST               3 (3)
             12 BUILD_LIST               3
             15 GET_ITER                                 # <--- get iter is important here
        >>   16 FOR_ITER                11 (to 30)
             19 STORE_FAST               0 (x)

  3          22 LOAD_FAST                0 (x)
             25 PRINT_ITEM
             26 PRINT_NEWLINE
             27 JUMP_ABSOLUTE           16
        >>   30 POP_BLOCK
        >>   31 LOAD_CONST               0 (None)
             34 RETURN_VALUE


但是,iterables还允许您在Python中执行其他一些操作,例如使用next()进入iterable,或者引发一个{a1}。如果您要处理不同的对象类型,并且希望应用泛型算法,那么它非常有用。

相关问题 更多 >