2012-02-22 9 views
6

Widziałem niektóre kodu wczoraj w this question że nie widziałem wcześniej, ten wiersz w szczególności:Jakieś dobre wykorzystanie do przypisania listy/dict podczas pętli for?

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

Więc jak działa ta pętla, elementy z possible[num] są przypisane do listy xyz w pozycji num. Byłem bardzo zdezorientowany to więc zrobiłem kilka testów, a tu jest jakiś odpowiednik kod, który jest nieco bardziej wyraźne:

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

pewno zamierzają zawsze używać tego drugiego formatu, ponieważ uważam, że pierwsze bardziej skomplikowane niż to jest warta, ale byłem ciekawy ... więc:

Czy jest jakiś dobry powód, aby użyć tej "cechy", a jeśli nie, to dlaczego jest ona dozwolona?

Oto kilka głupich przypadków użycia, które wymyśliłem (głupie, ponieważ istnieje wiele lepszych sposobów na zrobienie tego samego), pierwsze dotyczy obracania liter alfabetu o 13 pozycji, a drugie jest do tworzenia słownika, który odwzorowuje postacie z rot13 do postaci 13 oddalonej.

>>> 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

Myślę, że źle zrozumiałeś kod. "num' ma tam ustaloną wartość. Twoje przykłady są bardziej skomplikowane ... –

+2

Może to jest przydatne dla kodegolf :) –

+0

@gnibbler można transponować macierzy w miejscu za pomocą tego? –

Odpowiedz

10

Powodem, dla którego jest to dozwolone, jest prostota. Lista "zmiennych pętli" ma ten sam grammar as any other assignment target. Przykładowo, rozpakowywanie krotek jest dozwolone w zadaniach, więc jest dozwolone również w pętlach for, a to z pewnością jest całkiem przydatne. Zdefiniowanie osobnej składni przypisywania zmiennych pętlowych wydaje mi się sztuczne - semantyka zwykłego przypisania i przypisania zmiennych pętli są takie same.

+5

+1 To naprawdę nie jest funkcja, to tylko konsekwencja w języku . –

+1

To nie dlatego, że możesz to zrobić, że musisz to zrobić. – dugres

3

Myślę, że to kwestia stylu programowania, czy nie używa się tej techniki. Oczywiście dla wybitnych ludzi nie jest tak oczywiste, jak wygląda taka pętla. Dlatego sam wolę sugerować stosowanie bardziej przejrzystych metod, szczególnie jeśli chcesz, aby twój kod był czytelny dla innych osób, które być może nie znają zbyt wiele języka.

Jednak byłoby to przełamanie filozofii i mechaniki Pythona, jeśli taka konstrukcja nie byłaby dozwolona. Widać to wyraźnie, ponieważ pętla przyjmuje sekwencję (listę lub ciąg) i iteruje nad każdym elementem przechowującym aktualną wartość w każdej iteracji do podanej zmiennej. Zmienna jest odniesieniem do obiektu i dlatego jest oczywiste, że nie ma znaczenia, czy jest to zmienna tymczasowa, pole tablicy czy coś innego.