Parametrar

Parametrar är de variabler som definieras av en funktion, som den förväntas ta emot när den anropas. De är del av funktionens deklaration och fungerar som “platshållare” för de värden som funktionen ska bearbeta. Parametrar anger vilken typ av data en funktion förväntar sig och hur många dataelement den kan ta emot.

Till exempel, i funktionen def add(a, b):, är a och b parametrar för funktionen add. De indikerar att funktionen add förväntar sig två inputs när den anropas.

Argument vs parameter

Argument är de faktiska värdena eller uttrycken som skickas till funktionen vid funktionsanrop. Dessa värden “fyller i” funktionens parametrar och används sedan inuti funktionen för dess beräkningar eller operationer.

När du kör resultat = add(5, 3), är 5 och 3 argument som skickas till funktionen add. De ersätter parametrarna a och b när funktionen utför sin operation, vilket i detta fall är att addera talen 5 och 3.

Om vi exempelvis föreställer oss att vi har en funktion som jämför två tal och returnerar det största talet enligt:

def find_max(number1, number2): # number1 and number2 are parameters
    if number1 > number2:
        return number1
    else:
        return number2

find_max(10,5)                  # 10 and 5 are arguments

Parametrar är definierade i funktionens deklaration och används inuti funktionen som variabler. Argument är istället de faktiska värdena som skickas till funktionen vid anrop. Ett argument matchar mot en parameter baserat på dess position när funktionen anropas.

Matchning av parametrar i anrop och deklaration

Argument i anropet måste matcha parametrarna i funktionsdeklarationen. D.v.s. att det inte vore möjligt att enbart ange en enda parameter i ett funktionsanrop. Nedan exempel genererar därför ett felmeddelande vid körning.

def add(number1, number2):
    sum_numbers = number1 + number2
    return sum_numbers

added_numbers = add(5)
TypeError: add() missing 1 required positional argument: 'number2' 

Det skulle heller inte vara möjligt att ange en parameter för mycket enligt:

def add(number1, number2):
    sum_numbers = number1 + number2
    return sum_numbers

added_numbers = add(5, 10, 15)
TypeError: add() takes 2 positional arguments but 3 were given 

Antalet parametrar måste således matcha i anropet och deklarationen.

Variabelnamnen för parametrarna i en funktionsdeklaration är godtyckliga, d.v.s. att de exempelvis inte måste heta number1 och number2 i ovan exempel. Notera gärna även att vi i anropet anger faktiska värden. Detta innefattar att när funktionen tar emot parametrarna så kommer den att - i detta fall - ge variabeln number1 värdet 5, variabeln number2 värdet 10, osv. Ordningen som vi anger parametrarna i anropet är således viktig!

Standardvärden för parametrar

Att definiera funktioner med standardvärden för vissa parametrar ökar flexibiliteten och användbarheten av funktionen. Det gör det möjligt att anropa funktionen med färre argument än vad som definierats, vilket kan förenkla kodanropen och göra koden mer lättläst.

def say_hello(name, greeting="Hello"):
    print(f"{greeting}, {name} - welcome back!")

say_hello("Anna")  
say_hello("Erik", "Hi")
Hello, Anna - welcome back!
Hi, Erik - welcome back! 

Parametrar med standardvärden (default parameters) måste placeras efter parametrar utan standardvärden i funktionsdefinitionen. def say_hello(greeting="Hello", name): skulle med andra ord generera ett syntax fel.

Obegränsat antal parametrar

Python tillåter dig att definiera funktioner som kan ta emot ett obegränsat antal positionella parametrar (*args) samt ett obegränsat antal namngivna, eller nyckelordsspecifika, parametrar (**kwargs). Detta gör funktionerna extremt flexibla och anpassningsbara till olika användningsfall.

Positionella argument (*args)

Användningen av *args i en funktionsdefinition möjliggör mottagandet av en variabel lista av positionella argument som en tuple. Detta är användbart när du inte vet i förväg hur många argument som kommer att skickas till funktionen.

def add_all(*numbers):      
    total = 0
    for t in numbers:
        total += t
    return total

print(add_all(5, 10, 15, 20))   # numbers will contain 5, 10, 15, 20
print(add_all(5, 10))           # numbers will contain 5, 10
50
15 

Nyckelordsspecifika argument (**kwargs)

Användningen av **kwargs gör det möjligt för en funktion att acceptera ett obegränsat antal nyckelordsspecifika parametrar som en dictionary. Detta är användbart när du behöver hantera funktioner som kräver konfigurationsalternativ eller när du inte vet vilka nyckelord som kommer att användas.

def user_profile(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

user_profile(name="Anna", age=30, profession="Engineer")
user_profile(name="Erik", age=22)
50
name: Anna
age: 30
profession: Engineer
name: Erik
age: 22 

Kombinera *args och **kwargs

Du kan även kombinera *args och **kwargs i samma funktion för att tillåta en funktion att acceptera både en variabel lista av positionella argument och en variabel lista av nyckelordsspecifika argument.

def combo_function(*args, **kwargs):
    total = sum(args)
    print(f"Sum of positional arguments: {total}")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

combo_function(10, 20, name="Erik", profession="Developer")
Sum of positional arguments: 30
name: Erik
profession: Developer 

Sammanfattning

Att effektivt använda parametrar och returvärden i funktioner är avgörande för att skriva flexibel och återanvändbar kod. Förståelsen av standardvärden, variabla argument (*args och **kwargs), och typkonvertering direkt i parametrar kan utöka möjligheterna i hur du designar dina funktioner. Att förstå skillnaden mellan argument och parametrar, samt att kunna hantera olika returtyper, är nyckeln till att bygga robusta funktioner som kan hantera en mängd olika input och situationer.