Rozpakować listę w Pythonie?

222

Myślę, że „rozpakuj” może być tutaj niewłaściwym słownictwem - przepraszam, ponieważ jestem pewien, że jest to duplikat pytania.

Moje pytanie jest dość proste: w funkcji, która oczekuje listy elementów, w jaki sposób mogę przekazać element listy Python bez wyświetlania błędu?

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

Z pewnością musi istnieć sposób na rozszerzenie listy i przekazanie funkcji 'red','blue','orange'na kopyto?

AP257
źródło

Odpowiedzi:

32

Tak, możesz użyć *argsskładni (splat):

function_that_needs_strings(*my_list)

gdzie my_listmoże być dowolny iterowalny; Python zapętli dany obiekt i użyje każdego elementu jako osobnego argumentu dla funkcji.

Zobacz dokumentację wyrażenia wywołania .

Istnieje również odpowiednik parametru słowa kluczowego, wykorzystujący dwie gwiazdki:

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

i istnieje równoważna składnia do określania argumentów catch-all w sygnaturze funkcji:

def func(*args, **kw):
    # args now holds positional arguments, kw keyword arguments
Martijn Pieters
źródło
14

Od wersji Python 3.5 możesz rozpakować nieograniczoną liczbę plików lists.

PEP 448 - Dodatkowe uogólnienia dotyczące rozpakowywania

To zadziała:

a = ['1', '2', '3', '4']
b = ['5', '6']
function_that_needs_strings(*a, *b)
vishes_shell
źródło
1
jak mogę zrobić to samo z Pythonem 2.7 lub 3.4?
answerSeeker
1
@answerSeeker nie jest skuteczny, alefunction_that_needs_strings(*(a+b))
azalia