Introductie
Python is een van de meest populaire programmeertalen ter wereld. In Python maken parameters deel uit van functiedefinities. Ze stellen je in staat om bepaalde argumenten voor een functie te specificeren. Het argument kan door de functie worden geaccepteerd en toegepast.
Het is echter niet mogelijk om op het moment van coderen te weten welke exacte use cases met je code zullen worden geïmplementeerd. Daarom is het, in het belang van toekomstige programmeurs en gebruikers van je programma, raadzaam om een variabel aantal argumenten aan een functie door te geven. Om dit te doen, moet je speciale parameters gebruiken. Dit zijn *args en **kwargs. In deze handleiding zullen we alles leren over de *args en **kwargs parameters in Python. We zullen ook leren hoe we argumenten kunnen ordenen en hoe we deze kunnen toepassen in functie-aanroepen.
Vereisten
Om de stappen in de handleiding te kunnen volgen, zijn er enkele vereisten die je moet voorbereiden. Ten eerste moet je Python 3 geïnstalleerd hebben op je server met een actieve programmeeromgeving. Je moet ook het programma voor jouw specifieke besturingssysteem geïnstalleerd hebben (Ubuntu, CentOS, Debian, etc).
Wat is *args en hoe werkt het?
Laten we beginnen met te begrijpen hoe *args werkt. De versie van de parameter met een enkele asterisk wordt gebruikt om argumentenlijsten van variabele lengte zonder trefwoorden naar functies te sturen. Houd er rekening mee dat de asterisk het meest cruciale element in die parameter is.
Om dit beter te begrijpen, bekijken we een voorbeeld. Hieronder staat een typische functie die je in je code kunt tegenkomen, met twee argumenten:
|
1 2 |
def multiply(x, y): print (x * y) |
Zoals je kunt zien, zijn onze argumenten in de bovenstaande functie x en y. Wanneer je de functie aanroept, gebruik je getallen die overeenkomen met x en y. Laten we zeggen dat we de gehele getallen 5 en 4 voor x en y respectievelijk doorgeven:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
Nu kunnen we de code uitvoeren:
|
1 |
python lets_multiply.py |
De uitvoer die we zullen ontvangen is als volgt:
|
1 2 3 |
Output: 20 |
De uitvoer laat zien dat de gehele getallen 5 en 4 zijn vermenigvuldigd. Dit betekent dat de multiply(x, y) functie werkte.
Stel nu dat we uiteindelijk drie getallen willen vermenigvuldigen in plaats van slechts twee. Helaas zal het toevoegen van een extra getal aan de bovenstaande functie een foutmelding als deze opleveren:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Output: TypeError: multiply() takes 2 positional arguments but 3 were given |
Daarom, als je het vermoeden hebt dat je later mogelijk meer argumenten moet toevoegen, pas dan de *args parameter toe voor je gemak. Je kunt het als volgt gebruiken:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
We hebben simpelweg de functieparameters x en y vervangen door *args. Het uitvoeren van deze code geeft je het product voor elke afzonderlijke functie-aanroep, zoals hier:
|
1 2 3 4 5 6 |
Output: 20 90 24 900 |
Daarom is *args ideaal om te gebruiken wanneer je argumentenlijsten van variabele lengte naar je functie wilt sturen. Dankzij deze mogelijkheid kun je zoveel argumenten aan functie-aanroepen doorgeven als je wilt. Als zodanig stelt deze parameter je in staat om flexibelere code te bouwen die een flink aantal variabele argumenten zonder trefwoorden in de functie kan accepteren.
Wat is **kwargs en hoe werkt het?
Vervolgens hebben we de versie van de parameters met een dubbele asterisk, namelijk **kwargs. In tegenstelling tot de vorige vorm stelt deze parameter je in staat om dictionaries met argumenten van variabele lengte met trefwoorden aan de functie door te geven. Vergelijkbaar met *args, de dubbele sterretjes zijn het meest cruciale element van de parameter.
Net als in de vorige sectie kun je zoveel argumenten toevoegen als je wilt. Het verschil is dat je trefwoorden moet toewijzen. Om dit beter te begrijpen, bekijken we het volgende voorbeeld. Hier beginnen we met het uitprinten van de **kwargs argumenten die we aan de functie willen doorgeven:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
Laten we nu de functie aanroepen. Zoals je kunt zien, hebben we trefwoordargumenten toegevoegd:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
Als je het programma op dit punt uitvoert, zie je deze uitvoer:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Uitvoer: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
Het is echter mogelijk dat je dictionary-datatype ongeordend is. Dit hangt grotendeels af van de versie van Python 3 die je gebruikt. Elke versie na Python 3.6 geeft je bijvoorbeeld de sleutel-waarde-paren op volgorde. Elke eerdere versie toont de uitvoer in willekeurige volgorde. De dictionary die je maakt, heet kwargs. Merk op dat je deze kunt gebruiken en manipuleren zoals elke andere dictionary op het systeem. Laten we eens kijken hoe je de **kwargs parameter beter kunt benutten en toepassen.
In het volgende voorbeeld proberen we een nieuwe functie te maken die een dictionary met namen begroet. Onze voorbeeld-dictionary heeft twee namen:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("De waarde van {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
Als je het programma uitvoert, krijg je deze uitvoer:
|
1 |
python print_values.py |
|
1 2 3 4 |
Uitvoer: De waarde van your_name is Casey De waarde van my_name is Sammy |
Net als in het vorige voorbeeld kunnen de dictionaries ongeordend lijken. Hierdoor kan de volgorde van de namen Casey en Sammy in sommige gevallen omgedraaid zijn.
Vervolgens geven we extra argumenten door aan de functie. Dit bewijst dat je **kwargs elk gewenst aantal argumenten kunt laten accepteren:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("De waarde van {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
Als je het programma uitvoert, zie je deze uitvoer:
|
1 2 3 4 5 6 7 8 |
Uitvoer: De waarde van name_2 is Gray De waarde van name_6 is Val De waarde van name_4 is Phoenix De waarde van name_5 is Remy De waarde van name_3 is Harper De waarde van name_1 is Alex |
Deze uitvoer kan ook ongeordend zijn. Hoe dan ook, deze voorbeelden laten zien dat **kwargs je programma de flexibiliteit geeft om een aantal trefwoordargumenten te gebruiken.
Hoe argumenten te ordenen
Het is belangrijk om rekening te houden met de vastgestelde volgorde bij het ordenen van een argument in een functie of functie-aanroep. Deze is als volgt:
-
Formele positionele argumenten
-
*args
-
Trefwoordargumenten
-
**kwargs
Stel dat je *args en **kwargs gebruikt met expliciete positionele parameters. Dit betekent dat je functie er als volgt uitziet:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
Aan de andere kant, als je deze parameters gebruikt met benoemde keyword-parameters, krijgt je functie de volgende algemene structuur:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
Als je je niet aan de ingestelde volgorde houdt, krijg je een syntaxfout wanneer je je code uitvoert. Daarom is het het beste om deze fout in de eerste plaats te voorkomen.
Hoe je *args en **kwargs gebruikt in functie-aanroepen
Tot slot laten we je zien hoe je beide parameters gebruikt om argumenten door te geven aan functies. We beginnen met een voorbeeld dat het volgende laat zien: *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
Er zijn drie parameters in deze functie: arg_1, arg_2, en arg_3. Je moet een variabele maken en deze instellen op een iterable. In dit geval is dat een tuple. Vervolgens kun je de variabele doorgeven aan de functie met behulp van de asterisk-syntaxis.
Bekijk de uitvoer wanneer je het programma uitvoert met het python some_args.py commando:
|
1 2 3 4 5 |
Output: arg_1: Sammy arg_2: Casey arg_3: Alex |
Het is ook mogelijk om het programma te wijzigen naar een iterable lijst datatype met een andere variabele als naam. De volgende code combineert *args met een benoemde parameter:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
De uitvoer is als volgt bij het uitvoeren van het programma:
|
1 2 3 4 5 |
Output: arg_1: 1 arg_2: 2 arg_3: 3 |
Aan de andere kant kun je keyword-argumenten toepassen met **kwargs. Zorg ervoor dat je een variabele maakt die gelijk is aan een dictionary. Deze moet 2 sleutel-waarde-paren hebben. Hier zie je hoe we de variabele doorgeven aan een functie met 3 argumenten:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
Gebruik het python some_kwargs.py commando nogmaals om het programma uit te voeren:
|
1 2 3 4 5 |
Output: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
Conclusie
Aan het einde van deze handleiding zou je goed op de hoogte moeten zijn van wat *args en **kwargs zijn en hoe ze werken. Je kunt deze parameters nu toepassen op je eigen code om je programma flexibel te maken voor toekomstige gebruikers. Deze zijn ideaal voor situaties waarin je niet weet hoeveel argumenten er gebruikt zullen worden. Zorg er wel voor dat je voorzichtig bent met de cruciale elementen van de functies en parameters.
Tot slot zijn hier nog meer bronnen van onze blog die je zullen helpen succesvol met Python te werken:
- Het txt-bestandsformaat: Werken met platte tekstbestanden in Python 3
- Loops in Python 3: Break-, Continue- en Pass-statements gebruiken
- Modules importeren in Python 3: Een uitgebreide gids
- Python 3 String Formatters gebruiken
- Programmeren met Python 3: Hoe ga je te werk bij het construeren van klassen en het definiëren van objecten?
Veel programmeerplezier!
Reacties
Nog geen reacties. Wees de eerste.