2010-08-13 26 views
122

Creo que 'desempaquetar' puede ser un vocabulario incorrecto aquí - disculpas porque estoy seguro de que esta es una pregunta duplicada.¿Desempaquetar una lista en Python?

Mi pregunta es bastante simple: en una función que espera una lista de elementos, ¿cómo puedo pasar un elemento de la lista de Python sin obtener un error?

my_list = ['red', 'blue', 'orange'] 
function_that_needs_strings('red', 'blue', 'orange') # works! 
function_that_needs_strings(my_list) # breaks! 

Seguramente debe haber una manera de ampliar la lista y pasar a la función 'red','blue','orange' en pie?

+30

Mi # 1 queja con Python es la dificultad de levantar cosas muy buenas como el '*' operador. :) –

+1

sí, ¿cómo demonios hubieras sabido cómo hacer eso por adelantado? – gtrak

+1

Si busca "python apply" y lee los documentos allí, indica la sintaxis allí. "aplicar" se usa en varios idiomas de esta manera. – srparish

Respuesta

160
function_that_needs_strings(*my_list) # works! 

You can read all about it here.

+0

-1 Suponiendo que su 'csvfile' es un objeto' csv.writer', su método 'writerow' tiene solo una arg. '* args' en una llamada a función/método es solo una forma breve de escribir' arg [0], arg [1], ... '. La función o método debe ser capaz de manejar los argumentos que usted proporciona. '* args' no es vudú que anula la declaración de funtion/method arg. Su ejemplo "funciona" solo cuando 'len (mi_lista) == 1'. Este es el peor caso de votaciones en Gadarene que he visto por un tiempo. –

+1

@John Machin: Te perdiste el objetivo de la pregunta. Acabo de copiar la función de la primera revisión de la pregunta, pero la cambié solo para ti. –

+0

@ THC4k: Estoy al tanto del punto de la pregunta. De dónde copiaste partes de tu respuesta es irrelevante. Mi punto es que la primera frase de tu respuesta fue ridículamente errónea. –

15

Sí, se puede utilizar el *args (splat) sintaxis:

function_that_needs_strings(*my_list) 

donde my_list puede ser cualquier iterable; Python recorrerá el objeto dado y usará cada elemento como un argumento separado para la función.

Ver el call expression documentation.

Hay una palabra clave-parámetro equivalente, así, el uso de dos estrellas:

kwargs = {'foo': 'bar', 'spam': 'ham'} 
f(**kwargs) 

y hay equivalent syntax para especificar catch-all argumentos en una función de firma:

def func(*args, **kw): 
    # args now holds positional arguments, kw keyword arguments 
5

Como Python 3.5 puede desempacar una cantidad ilimitada de list s.

PEP 448 - Additional Unpacking Generalizations

Así que esto va a funcionar:

a = ['1', '2', '3', '4'] 
b = ['5', '6'] 
function_that_needs_strings(*a, *b) 
+0

¿cómo puedo hacer lo mismo con Python 2.7 o 3.4? – answerSeeker