2010-08-13 13 views
122

Je pense que «décompresser» pourrait être le mauvais vocabulaire ici - des excuses parce que je suis sûr que c'est une question en double.Déballez une liste en Python?

Ma question est assez simple: dans une fonction qui attend une liste d'éléments, comment puis-je passer un élément de liste Python sans erreur?

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

Sûrement il doit y avoir un moyen d'élargir la liste, et passez la fonction 'red','blue','orange' sur le sabot?

+30

Mon # 1 avec Python est gripe la difficulté de trouver des trucs sympa comme l'opérateur '' *. :) –

+1

oui, comment diable auriez-vous su comment le faire à l'avance? – gtrak

+1

Si vous recherchez "python apply" et lisez les documents là-bas, il indique la syntaxe. "apply" est utilisé dans un certain nombre de langues de cette manière. – srparish

Répondre

160
function_that_needs_strings(*my_list) # works! 

You can read all about it here.

+0

-1 En supposant que votre 'csvfile' est un objet' csv.writer', sa méthode 'writow' n'a qu'un argument. '' args' dans un appel de fonction/méthode est juste un court chemin pour écrire 'arg [0], arg [1], ...'. La fonction ou la méthode doit être capable de gérer les arguments que vous fournissez. '* args' n'est pas du vaudou qui remplace la déclaration d'argument/méthode funtion. Votre exemple "fonctionne" seulement quand 'len (my_list) == 1'. C'est le pire cas d'upvote de Gadarene que j'ai vu depuis un moment. –

+1

@John Machin: Vous avez manqué le point de la question. Je viens de copier la fonction de la première révision de la question - mais je l'ai modifiée pour vous. –

+0

@ THC4k: Je suis bien conscient du but de la question. L'endroit où vous avez copié des parties de votre réponse n'est pas pertinent. Ce que je veux dire, c'est que la première phrase de votre réponse était ridiculement fausse. –

15

Oui, vous pouvez utiliser la *args (floc) Syntaxe:

function_that_needs_strings(*my_list) 

my_list peut y avoir itérables; Python boucle sur l'objet donné et utilise chaque élément comme un argument séparé de la fonction. Voir la call expression documentation

Il y a un équivalent mot-clé paramètres aussi bien, en utilisant deux étoiles:

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

et il y a equivalent syntax pour spécifier rattrapages tous les arguments dans une signature de la fonction:

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

Depuis Python 3.5 vous pouvez déballer une quantité illimitée de list s.

PEP 448 - Additional Unpacking Generalizations

donc ça marchera:

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

comment puis-je faire la même chose avec Python 2.7 ou 3.4? – answerSeeker