3

我是 python 新手。有没有类似的方法在 python 中用 2 个变量编写这个 C for 循环?

for (i = 0, j = 20; i != j; i++, j--) { ... }
4

4 回答 4

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,因为 Py2Kzip尝试创建所有结果的列表,而不是在获得结果izip时返回iterator结果。不幸的是,我们在这里处理无限迭代器,所以zip不会工作......这可能是一个很好的观点,为什么zip已经更改为izip在 Py3K 中执行角色(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
于 2013-04-20T01:58:12.517 回答
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),或者像bpython这样的 python 解释器的包装器。我真的建议使用 bpython 来测试这样的代码。

于 2013-04-20T01:56:59.140 回答
1

您可以使用 zip,但对于手头的问题,循环第二个变量并不是真正必要的,因此需要一种更简单的方法:

for i in range(10):
    j = 20 - i
    ⋮
于 2013-04-20T02:26:04.353 回答
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

这将为您提供增加和减少的值。

于 2013-04-20T01:55:32.433 回答