Använda variabelargument i Python

Slutförd

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 *abö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 kwargsskickas 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 **kwbö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