iter()内置的重点是什么?

lan*_*ng2 2 python

有了iter(),我可以这样做:

>>> listWalker = iter ( [23, 47, 'hike'] )
>>> for x in listWalker: print x,
Run Code Online (Sandbox Code Playgroud)

但无论如何我还是可以这样做:

>>> listWalker = [23, 47, 'hike']
>>> for x in listWalker: print x,
Run Code Online (Sandbox Code Playgroud)

它增加了什么价值?

use*_*342 5

要点iter是它允许您从可迭代对象获取迭代器并自己使用它,要么实现您自己的for循环变体,要么在多个循环中维护迭代的状态。一个简单的例子:

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

iter此分组惯用法提供了更高级的用法:

def in_groups(iterable, n):
    """Yield element from iterables grouped in tuples of size n."""
    it = iter(iterable)
    iters = [it] * n
    return zip(*iters)
Run Code Online (Sandbox Code Playgroud)


che*_*ner 5

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

 for line in iter(f.readline, 'EOF'):
     print line
Run Code Online (Sandbox Code Playgroud)

前面的代码将调用f.read(例如,打开文件句柄f),直到它读取由字符串组成的行EOF.它与写作大致相同

for line in f:
    if line == "EOF":
        break
    print line
Run Code Online (Sandbox Code Playgroud)

另外,迭代器可能是与迭代的对象不同的对象.这种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
Run Code Online (Sandbox Code Playgroud)

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

>>> f = open('.bashrc')
>>> id(f)
4454569712
>>> id(iter(f))
4454569712
Run Code Online (Sandbox Code Playgroud)

通常,返回的对象iter取决于__iter__对象类型实现的方法.