2010-04-06 6 views

Odpowiedz

10

wydaje się być jaśniejszy i można go uogólnić.

Co się stanie, jeśli funkcja zwróci krotkę z więcej niż 2 wartościami?
Co, jeśli logika programu jest zainteresowana czwartym elementem krotnej krotki?
Co się stanie, jeśli rozmiar zwróconej krotki będzie różny?

Żadne z tych pytań nie wpływa na idiom oparty na indeksach, ale w przypadku idiomu z wieloma przypisaniami.

6

Dla wydobycia pojedynczy element, indeksowanie jest nieco bardziej idiomatyczne. Podczas wydobywania dwóch lub więcej elementów rozpakowywanie staje się bardziej idiomatyczne. To tylko obserwacja empiryczna z mojej strony; Nie znam żadnych stylów polecających lub nakazujących wybór! -)

10

Gdybyś docenią wygodny sposób, aby to zrobić w python3.x, sprawdź propozycję powiększenia python (PEP) 3132 na tej page of What's New w Pythonie:

Dłuższy Iterable rozpakowywania. Możesz teraz pisać takie rzeczy, jak a, b, *rest = some_sequence. A nawet *rest, a = stuff. Obiekt odpoczynku jest zawsze listą (prawdopodobnie pustą); prawa strona może być dowolna. Przykład:

(a, *rest, b) = range(5)

Ustawia a do 0, b do 4 i rest do [1, 2, 3].

1

Do listy/listowe Generator z par klucz/wartość myślę, że użycie zmiennej manekina może być całkiem fajna, szczególnie tam, gdzie potrzebuje wartość rozpakowaniu należy stosować więcej niż jeden raz (unikając powtarzającego indeksowanie), np:

l = [('a', 1.54), ('b', 4.34), ('c', 3.22), ('d', 6.43)] 
s = [x * (1.0 - x) * (2.0 - x) for _, x in l] 

kontra:

s = [x[0] * (1.0 - x[0]) * (2.0 - x[0]) for x in l] 

inną rzeczą jest, aby pamiętać, że podczas rozpakowywania i indeksowania są mniej więcej tak drogie, jak siebie, rozszerzony rozpakowanie wydaje się być o rząd wielkości mniejszą.

Pythona 3,2 funkcji% timeit w ipython:

Zwykły rozpakowanie:

>>> x = (1, 2) 
>>> %timeit y, _ = x 
10000000 loops, best of 3: 50 ns per loop 

>>> %timeit y, _ = x 
10000000 loops, best of 3: 50.4 ns per loop 

powiększonym rozpakowanie:

>>> x = (1, 2, 3) 
>>> %timeit y, *_ = x 
1000000 loops, best of 3: 1.02 us per loop 

>>> %timeit y = x[0] 
10000000 loops, best of 3: 68.9 ns per loop 
Powiązane problemy