2010-04-06 17 views

risposta

10

value = func_returning_a_tuple()[0] sembra più chiaro e può anche essere generalizzato.

E se la funzione restituisse una tupla con più di 2 valori?
Cosa succede se la logica del programma è interessata al quarto elemento di una tupla ennesima?
Cosa succede se la dimensione della tupla restituita varia?

Nessuna di queste domande influisce sull'idioma basato su sottocript, ma nel caso dell'idioma a più assegnazioni.

6

Per estrarre un singolo articolo, indicizzazione è un po 'più idiomatica. Quando estrai due o più oggetti, il disimballaggio diventa più idiomatico. Questa è solo un'osservazione empirica da parte mia; Non conosco alcuna guida di stile che raccomandi o autorizzi alcuna scelta! -)

10

Se desideri apprezzare un modo pratico per fare questo in python3.x, controlla la proposta di aumento di pitone (PEP) 3132 su questo page of What's New in Python:

estesa Iterable Apertura della confezione. Ora puoi scrivere cose come a, b, *rest = some_sequence. E anche *rest, a = stuff. L'oggetto resto è sempre un elenco (eventualmente vuoto); il lato destro potrebbe essere qualsiasi iterabile. Esempio:

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

Imposta a a 0, b a 4, e rest a [1, 2, 3].

1

per la lista/comprehensions generatore con coppie chiave/valore ritengo l'utilizzo della variabile dummy può essere molto accurata, soprattutto quando il valore decompresso deve essere utilizzato più di una volta (evitando ripetuta indicizzazione), ad esempio:

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] 

versus:

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

un'altra cosa da notare è che, mentre l'estrazione e l'indicizzazione sono più o meno costosi come l'un l'altro, disimballaggio esteso sembra essere un ordine di grandezza più lento.

Con Python 3.2 utilizzando% timeit in IPython:

disimballaggio listino:

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

disimballaggio estesa:

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