Använda variabelargument i Python
I Python kan du använda valfritt antal argument och nyckelordsargument utan att deklarera var och en av dem. Den här möjligheten är användbar när en funktion kan få ett okänt antal indata.
Variabelargument
Argument i funktioner krävs. Men när du använder variabelargument tillåter funktionen att valfritt antal argument (inklusive 0
) skickas in. Syntaxen för att använda variabelargument prefixar en enda asterisk (*
) före argumentets namn.
Följande funktion skriver ut de mottagna argumenten:
def variable_length(*args):
print(args)
Kommentar
Det krävs inte för att anropa variabelargument args
. Du kan använda valfritt giltigt variabelnamn. Även om det är vanligt att se *args
eller *a
bör du försöka använda samma konvention i ett projekt.
I det här fallet *args
instruerar funktionen att acceptera valfritt antal argument (inklusive 0
). I funktionen args
är nu tillgänglig som variabeln som innehåller alla argument som en tuppeln. Prova funktionen genom att skicka valfritt antal eller typ av argument:
variable_length()
()
variable_length("one", "two")
('one', 'two')
variable_length(None)
(None,)
Som du ser finns det ingen begränsning för antalet eller typen av argument som skickas in.
Ett raketskepp går igenom flera steg före en uppskjutning. Beroende på uppgifter eller fördröjningar kan de här stegen ta längre tid än planerat. Nu ska vi skapa en funktion med variabel längd som kan beräkna hur många minuter fram till lanseringen, med tanke på hur lång tid varje steg kommer att ta:
def sequence_time(*args):
total_minutes = sum(args)
if total_minutes < 60:
return f"Total time to launch is {total_minutes} minutes"
else:
return f"Total time to launch is {total_minutes/60} hours"
Prova funktionen genom att skicka ett antal minuter:
sequence_time(4, 14, 18)
Total time to launch is 36 minutes.
sequence_time(4, 14, 48)
Total time to launch is 1.1 hours.
Kommentar
När du använder variabelargument tilldelas inte längre varje värde ett variabelnamn. Alla värden är nu en del av variabelnamnet catch-all som använder asterisken (args
i dessa exempel).
Argument för variabelnyckelord
För att en funktion ska acceptera valfritt antal nyckelordsargument använder du en liknande syntax. I det här fallet krävs en dubbel asterisk:
def variable_length(**kwargs):
print(kwargs)
Prova exempelfunktionen, som skriver ut de namn och värden som kwargs
skickas som :
variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}
Om du redan är bekant med Python-ordlistor ser du att nyckelordsargument med variabellängd tilldelas som en ordlista. Om du vill interagera med variabler och värden använder du samma åtgärder som en ordlista.
Kommentar
Precis som med variabelargument behöver du inte använda kwargs
när du använder nyckelordsargument för variabeln. Du kan använda valfritt giltigt variabelnamn. Även om det är vanligt att se **kwargs
eller **kw
bör du försöka använda samma konvention i ett projekt.
I den här funktionen ska vi använda nyckelordsargument för variabeln för att rapportera astronauterna som tilldelats uppdraget. Eftersom den här funktionen tillåter valfritt antal nyckelordsargument kan den återanvändas oavsett hur många astronauter som har tilldelats:
def crew_members(**kwargs):
print(f"{len(kwargs)} astronauts assigned for this mission:")
for title, name in kwargs.items():
print(f"{title}: {name}")
Prova med besättningen på Apollo 11:
crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins
Eftersom du kan skicka valfri kombination av nyckelordsargument bör du undvika upprepade nyckelord. Upprepade nyckelord resulterar i ett fel:
crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael Collins")
File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot