2010-04-06 4 views

Respuesta

10

value = func_returning_a_tuple()[0] parece más clara y también se puede generalizar.

¿Qué ocurre si la función devuelve una tupla con más de 2 valores?
¿Qué sucede si la lógica del programa está interesada en el 4º elemento de una tupla incontable?
¿Qué pasa si el tamaño de la tupla devuelta varía?

Ninguna de estas preguntas afecta al modismo basado en subíndices, pero sí en el caso del modismo de varias asignaciones.

6

Para extraer un solo elemento, la indexación es un poco más idiomática. Cuando extrae dos o más elementos, desempacar se vuelve más idiomático. Eso es solo una observación empírica de mi parte; ¡No sé de ninguna guía de estilo que recomiende u obligue a cualquiera de las dos opciones! -)

10

Si desea apreciar una forma práctica de hacer esto en python3.x, echa un vistazo a la propuesta de mejora de Python (PEP) 3132 en este page of What's New en Python:

extendido Iterable desembalaje. Ahora puede escribir cosas como a, b, *rest = some_sequence. E incluso *rest, a = stuff. El objeto de descanso siempre es una lista (posiblemente vacía); el lado derecho puede ser iterable. Ejemplo:

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

Esto establece a-0, b-4, y rest-[1, 2, 3].

1

Para listas por comprensión/generador con pares clave/valor que creo que el uso de la variable ficticia puede ser bastante limpio, especialmente cuando el valor descomprimido necesita ser utilizada más de una vez (evitando la indexación repetida), por ejemplo:

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] 

frente:

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

otra cosa a tener en cuenta es que, si bien el desembalaje y la indexación son aproximadamente tan caro como el uno al otro, el desembalaje extendida parece ser un orden de magnitud más lento.

Con Python 3.2 utilizando% timeit en IPython:

desembalaje regular:

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

desembalaje extendido:

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