问题

如何不使用 for 关键词,遍历一个序列

方案

手动遍历,可以使用next()函数,然后使用StopIteration来捕获异常,看看这个读取文件行的代码:

with open('/etc/passwd') as f:
    try:
        line = next(f)
        print(line, end='')
    except StopIteration:
        pass

通常,StopIteration用来通知迭代结束。然而,如果你像上述代码手动调用的话,还可以得到一个迭代结束的值,如下:

with open('/etc/passwd') as f:
    while True:
        line = next(f, None)
        if line is None:
            break
        print(line, end='')

讨论

通常码农都使用for来遍历各种存储序列,然而总有些时候,你会想精确的控制迭代过程,因此知道迭代器是如何工作的很有用。

如下代码阐释了迭代时发生了什么:

tems = [1, 2, 3]
>>> it = iter(items)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>