2012-02-22 7 views
6

私は特に、前にこの行を見ていないことthis questionに昨日いくつかのコードを見た:forループ中にlist/dictを割り当てるのに適していますか?

for xyz[num] in possible[num]: 
    ... 

このループが実行されるように、possible[num]からの要素が位置numでリストxyzに割り当てられます。私はそれよりも最初は多くの混乱を見つけるため

for value in possible[num]: 
    xyz[num] = value 
    ... 

私は間違いなく、常にこの第二のフォーマットを使用する:私は本当に、私はいくつかのテスト、そしてここではもう少し明示的であるいくつかの同等のコードではなかった。このことで混乱していましたそれは価値がありますが、私は好奇心が強いです... so:

この「機能」を使用する理由はありますか?

ここで私が思いついたばかげた使用例があります(同じことをするより良い方法があるので愚かです)。最初は13文字でアルファベットの文字を回転させるものです。 rot13から文字を13位離れた場所にマップする辞書を作成するためのものです。

>>> import string 
>>> rot13 = [None]*26 
>>> for i, rot13[i%26] in enumerate(string.ascii_lowercase, 13): pass 
... 
>>> ''.join(rot13) 
'nopqrstuvwxyzabcdefghijklm' 

>>> rot13_dict = {} 
>>> for k, rot13_dict[k] in zip(rot13, string.ascii_lowercase): pass 
... 
>>> print json.dumps(rot13_dict, sort_keys=True) 
{"a": "n", "b": "o", "c": "p", "d": "q", "e": "r", "f": "s", "g": "t", "h": "u", "i": "v", "j": "w", "k": "x", "l": "y", "m": "z", "n": "a", "o": "b", "p": "c", "q": "d", "r": "e", "s": "f", "t": "g", "u": "h", "v": "i", "w": "j", "x": "k", "y": "l", "z": "m"} 
+1

私はコードを誤解していると思います。 'num'は固定値です。あなたの例はより複雑です... –

+2

おそらくそれはコードギアのために便利です:) –

+0

@gnibblerこれを使用してインプレースで行列を転置できますか? –

答えて

10

これは簡単です。 "ループ変数"のリストは同じgrammar as any other assignment targetです。一例として、タプルのアンパックは代入で許可されているので、forループでも許可されています。これは確かに非常に便利です。ループ変数の割り当てのための別の構文を定義することは、私にとって人工的なようです。通常の割り当てとループ変数の割り当てのセマンティクスは同じです。

+5

+1これは実際には機能ではなく、言語の一貫性。 –

+1

あなたはあなたがそれをしなくてはならないということができるからではありません。 – dugres

3

私はそれはプログラミングスタイルの問題か、誰かがこの技術を使用していないと思う。明らかに、このようなループが最初に見られるような優れた人々にとっては明らかではありません。したがって、私は自分自身でコードを他の人が読めるようにしたい場合には、もっと明確な方法を使用することをお勧めします。

しかし、そのような構造が許されないならば、それは哲学とpythonの仕組みを突破するだろう。これは、ループがシーケンス(リストまたは文字列)をとり、各反復で現在の値を格納するすべての要素を反復して与えられる変数に入れるために、これをはっきりと見ることができます。変数はObjectへの参照であるため、仮変数、配列のフィールドなのか、それとも別のものなのかは関係ありません。

関連する問題