Python 2.x
from itertools import izip, count
for i, j in izip(count(0, 1), count(20, -1)):
if i == j: break
# do stuff
Python 3.x:
from itertools import count
for i, j in zip(count(0, 1), count(20, -1)):
if i == j: break
# do stuff
这使用itertools.count(),它是一个无限期地从某个起始点迭代的迭代器:
itertools.count(start=0, step=1)
Make an iterator that returns evenly spaced values starting with n. Often used as an argument to imap() to generate consecutive data points. Also, used with izip() to add sequence numbers.
在Python 2.x中你必须使用izip,因为Py2K zip尝试创建所有结果的列表,而不是izip,它会在获得结果时返回迭代器.不幸的是我们在这里处理无限迭代器所以zip不起作用…这可能是一个很好的点,为什么zip已被更改为在Py3K中执行izip的角色(izip不再存在).
如果你对功能感到疯狂,你甚至可以做到这一点(但在我看来,因为我已经成长为讨厌lambdas而看起来很难看):
from itertools import takewhile, izip, count
for i, j in takewhile(lambda x: x[0] != x[1], izip(count(0, 1), count(20, -1))):
# do stuff