Qual è il modo usuale/più chiaro per scrivere questo in Python?Disimballaggio tupla: variabile fittizia vs indice
value, _ = func_returning_a_tuple()
o:
value = func_returning_a_tuple()[0]
Qual è il modo usuale/più chiaro per scrivere questo in Python?Disimballaggio tupla: variabile fittizia vs indice
value, _ = func_returning_a_tuple()
o:
value = func_returning_a_tuple()[0]
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.
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! -)
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]
.
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