我是 python 新手。有没有类似的方法在 python 中用 2 个变量编写这个 C for 循环?
for (i = 0, j = 20; i != j; i++, j--) { ... }
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)
创建一个返回以 . 开头的均匀间隔值的迭代器
n
。通常用作imap()
生成连续数据点的参数。此外,用于izip()
添加序列号。
在 Python 2.x 中,您必须使用izip
,因为 Py2Kzip
尝试创建所有结果的列表,而不是在获得结果izip
时返回iterator
结果。不幸的是,我们在这里处理无限迭代器,所以zip
不会工作......这可能是一个很好的观点,为什么zip
已经更改为izip
在 Py3K 中执行角色(izip
不再存在)。
如果您对功能性感到疯狂,您甚至可以这样做(但在我看来它看起来很丑,因为我已经讨厌lambda
s):
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
>>> i, j = 0, 10
>>> while i != j:
... # Your code here:
... print "i: %d j: %d" % (i, j)
... i += 1
... j -= 1
...
...
i: 0 j: 10
i: 1 j: 9
i: 2 j: 8
i: 3 j: 7
i: 4 j: 6
如果您想知道为什么在代码示例中很常见,>>>
那...
是因为人们正在使用 python 解释器(如果您愿意,可以使用 shell),或者像bpython这样的 python 解释器的包装器。我真的建议使用 bpython 来测试这样的代码。
您可以使用 zip,但对于手头的问题,循环第二个变量并不是真正必要的,因此需要一种更简单的方法:
for i in range(10):
j = 20 - i
⋮
根据情况您可以使用 zip:
lista = [1,2,3]
listb = [4,5,6]
for x,y in zip(lista, listb)
print(x, y)
输出:
1 4
2 5
3 6
zip 文档在这里:http ://docs.python.org/3.3/library/functions.html#zip
另外,为了配合你所说的两个数字,你可以做
for x,y in zip(range(0), range(10, 0, -1))
if x == y:
break
# do stuff
这将为您提供增加和减少的值。