2010-04-06 6 views

Antwort

10

value = func_returning_a_tuple()[0] scheint klarer und kann auch verallgemeinert werden.

Was ist, wenn die Funktion ein Tupel mit mehr als 2 Werten zurückgibt?
Was ist, wenn die Programmlogik am vierten Element eines zig Tupels interessiert ist?
Was passiert, wenn die Größe des zurückgegebenen Tupels variiert?

Keine dieser Fragen betrifft das subcript-basierte Idiom, aber im Fall von Multi-Assignement-Idiom.

6

Für ein einzelnes Element zu extrahieren, die Indizierung ist ein bisschen mehr idiomatische. Wenn Sie zwei oder mehr Elemente extrahieren, wird das Entpacken idiomatischer. Das ist nur eine empirische Beobachtung meinerseits; Ich kenne keine Stilführer, die eine Wahl empfehlen oder vorschreiben! -)

10

Wenn Sie eine praktische Art und Weise zu schätzen wissen würde dies in python3.x zu tun, die Python-Erweiterung Vorschlag überprüfen (PEP) 3132 auf dieser page of What's New in Python:

Erweiterte Iterable Auspacken. Sie können jetzt Dinge wie a, b, *rest = some_sequence schreiben. Und sogar *rest, a = stuff. Das Restobjekt ist immer eine (möglicherweise leere) Liste; die rechte Seite kann beliebig iterierbar sein. Beispiel:

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

Dies setzt a-0, b-4 und rest-[1, 2, 3].

1

Für Liste/Generator Comprehensions mit Schlüssel/Wert-Paar Ich denke, die Verwendung des Dummy-Variable kann recht ordentlich sein, insbesondere wenn der entpackten Wert muss mehr als einmal verwendet werden (wiederholte Indizierung zu vermeiden), zB:

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] 

gegen:

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

eine andere Sache ist zu beachten, dass beim Auspacken und Indizierung etwa so teuer wie sie ist, erweitert auspacken scheint langsamer eine Größenordnung zu sein.

mit Python 3.2 mit% timeit in IPython:

Regular auspacken:

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

Erweiterte auspacken:

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