2010-08-13 16 views
122

Myślę, że "rozpakowywanie" może być niewłaściwym słownictwem tutaj - przepraszam, ponieważ jestem pewien, że jest to duplikat pytania.Rozpakuj listę w języku Python?

Moje pytanie jest całkiem proste: w funkcji, która oczekuje listy pozycji, w jaki sposób mogę przekazać element listy w języku Python bez otrzymania błędu?

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

pewnością nie musi być jakiś sposób, aby rozwinąć listę i przekazać funkcję 'red','blue','orange' na kopyta?

+30

My # 1 zastrzeżenie z Python jest trudność patrząc schludny rzeczy jak '' operatora *. :) –

+1

tak, jak do cholery wiedziałbyś, jak to zrobić z góry? – gtrak

+1

Jeśli wyszukujesz "python apply" i przeczytaj dokumenty tam, to wskazuje na składnię tam. "apply" jest używane w wielu językach w ten sposób. – srparish

Odpowiedz

160
function_that_needs_strings(*my_list) # works! 

You can read all about it here.

+0

-1 Zakładając, że twój plik 'csvfile' jest obiektem' csv.writer', jego metoda 'writerow' ma tylko jeden argument. '* args' w wywołaniu funkcji/metody to tylko krótki sposób zapisu' arg [0], arg [1], ... '. Funkcja lub metoda musi obsługiwać podane przez Ciebie argumenty. '* args' nie jest voodoo, który zastępuje deklarację arg/method. Twój przykład "działa" tylko wtedy, gdy 'len (my_list) == 1'. To najgorszy przypadek Gadarena, który widziałem przez jakiś czas. –

+1

@John Machin: Przegapiłeś kwestię pytania. Właśnie skopiowałem funkcję z pierwszej wersji pytania - ale zmieniłem ją tylko dla Ciebie. –

+0

@ THC4k: Jestem świadomy sedna pytania. Miejsce, w którym skopiowałeś części swojej odpowiedzi, jest nieistotne. Chodzi mi o to, że pierwsze zdanie z twojej odpowiedzi było absurdalnie błędne. –

15

Tak, można użyć *args (ikona) składnię:

function_that_needs_strings(*my_list) 

gdzie my_list może być dowolny iterable; Python zapętli się nad podanym obiektem i użyje każdego elementu jako osobnego argumentu dla funkcji.

Zobacz call expression documentation.

Jest odpowiednikiem słów kluczowych parametrów, jak również za pomocą dwóch Gwiazdy:

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

i jest equivalent syntax do określania typu catch-all argumenty podpisu funkcji:

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