Python 3: expresie cu stea pentru a despacheta o listă (Programare, Python, Python 3.X, Despachetarea Argumentelor)

Kifsif a intrebat.

Exemplu de utilizare:

def f(a, b, c, d): 
    print(a, b, c, d, sep = '&')

f(1,2,3,4)
>>> 1&2&3&4

f(*[1, 2, 3, 4])
>>> 1&2&3&4

Unde în documentația python este * explicată?

Comentarii

  • Întrebare conexă: stackoverflow.com/questions/6967632/… –  > Por Lev Levitsky.
  • Porțiunea relevantă din referința limbajului este aici: docs.python.org/dev/reference/expressions.html#calls . Căutați propoziția care începe cu „If the syntax *expression appears in the function call” –  > Por Mark Dickinson.
  • O explicație bună aici: stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python –  > Por Alex W.
2 răspunsuri
Martijn Pieters

The *args convenția de apelare este documentată în manualul Referința pentru expresii:

În cazul în care sintaxa *expression apare în apelul funcției, expression trebuie să se evalueze la o iterabilă. Elementele din acest iterabil sunt tratate ca și cum ar fi argumente poziționale suplimentare; dacă există argumente poziționale x1, …, xN, , și expression se evaluează la o secvență y1, …, yM, , acest lucru este echivalent cu un apel cu M+N argumente poziționale. x1, …, xN, y1, …, yM.

Așadar, din moment ce ați folosit [1, 2, 3, 4] ca expresie, care este un iterabil, și nu au existat alte argumente poziționale, aceasta este tratată ca un apel cu M=0 și N=4, pentru un total de 4 argumente poziționale.

Prin urmare, puteți apela funcția dvs. și sub forma f(1, 2, *[3, 4]) sau orice altă combinație de iterabile și argumente poziționale, cu condiția ca iterabilul să vină după poziționale.

s.k

Doar o adăugare pentru a dezvolta foarte simplu combinația de argumente nenumite și numite.

Aceasta este ordinea generală pe care trebuie să o aveți în vedere:

def func(arg_1, ..., arg_N, *args, kwarg_1, ..., kwarg_M, **kwargs):
    # do stuff
    return True

Unde, în cele mai multe cazuri tipice;

  • fiecare arg_i este un argument fără nume,
  • args este o listă, deci un set de argumente fără nume,
  • fiecare singur kwarg_j este un argument cu nume,
  • kwargs este un dicționar, deci un set de argumente cu nume.