我是python的新手。有没有类似的方法在python中用2个变量编写这个C for循环?
for (i = 0, j = 20; i != j; i++, j--) { ... }
答案 0 :(得分:7)
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
因为Py2K zip
尝试创建所有结果的列表,而不是izip
返回iterator
获得结果。不幸的是我们在这里处理无限迭代器,所以zip
将不起作用...这可能是一个很好的观点,为什么zip
被更改为在Py3K中执行izip
的角色(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
答案 1 :(得分:4)
>>> 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),或者是python周围的包装器像bpython这样的翻译。我真的建议让bpython来测试这样的代码。
答案 2 :(得分:1)
根据具体情况,您可以使用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
这将为您提供增加和减少的值。
答案 3 :(得分:1)
你可以使用zip,但对于手头的问题,循环第二个变量并不是必需的,因此需要采用更简单的方法:
for i in range(10):
j = 20 - i
⋮