私は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
、うまくいきません...これはおそらく、Py3Kzip
で の役割を実行するように変更された理由 (もう存在しません) の良い点です。izip
izip
あなたが機能的であることに夢中なら、これを行うこともできます(しかし、私は 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
>>> 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 を入手することを強くお勧めします。
状況に応じて、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
これにより、増加する値と減少する値の両方が得られます。
zip を使用できますが、当面の問題では、2 番目の変数をループする必要はないため、より単純なアプローチが保証されます。
for i in range(10):
j = 20 - i
⋮