有了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)
它增加了什么价值?
要点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)
除了使用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__对象类型实现的方法.