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)

から始まる等間隔の値を返す反復子を作成しますnimap()連続したデータ ポイントを生成するための引数としてよく使用されます。また、izip()シーケンス番号を追加するためにも使用されます。

Python 2.x ではizip、Py2Kzipがすべての結果のリストを作成しようとするため、これを使用する必要がizipありますiterator。残念ながら、ここでは無限イテレータを扱っているためzip、うまくいきません...これはおそらく、Py3Kzipで の役割を実行するように変更された理由 (もう存在しません) の良い点です。izipizip

あなたが機能的であることに夢中なら、これを行うこともできます(しかし、私は s が嫌いになったので、私の意見では醜く見えますlambda):

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 インタープリター (必要に応じてシェル)、またはbpython...のような python インタープリターのラッパーを使用しているためです。このようなコードをテストするには、bpython を入手することを強くお勧めします。

于 2013-04-20T01:56:59.140 に答える
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

また、あなたが言っていた2つの数字に合わせて、次のことができます

for x,y in zip(range(0), range(10, 0, -1))
    if x == y:
        break
    # do stuff

これにより、増加する値と減少する値の両方が得られます。

于 2013-04-20T01:55:32.433 に答える
1

zip を使用できますが、当面の問題では、2 番目の変数をループする必要はないため、より単純なアプローチが保証されます。

for i in range(10):
    j = 20 - i
    ⋮
于 2013-04-20T02:26:04.353 に答える