问题
如何不使用 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
>>>