Args en Kwargs in Python begrijpen

In deze tutorial zal ik me richten op argumenten (* args) en zoekwoordargumenten (* kwargs) in Python.

Ik zal je leren wat args en kwargs zijn en, nog belangrijker, hoe je ze moet gebruiken - dat is hoe je een onbeperkt aantal argumenten en zoekwoordargumenten moet opnemen in functies.

Wat zijn Args?

* args worden gebruikt om te passeren non-zoekwoord argumenten. Voorbeelden van niet-trefwoordargumenten zijn fun (3,4), fun ("foo", "bar").

* args worden meestal gebruikt als een maatregel om te voorkomen dat het programma crasht als we niet weten hoeveel argumenten worden doorgegeven aan de functie. Dit wordt zowel in C ++ als in andere programmeertalen gebruikt.

Wat zijn Kwargs?

** kwargs is een woordenboek met trefwoordargumenten. De ** stelt ons in staat om een ​​willekeurig aantal trefwoordargumenten door te geven. Een trefwoordargument is in feite een woordenboek.

Een voorbeeld van een sleutelwoordargument is fun (foo = 2 bar = 7).

** kwargs zijn net zoals * args behalve dat u de variabelen en de hoeveelheid binnen de functie declareert argumenten.

Waar Args en Kwargs gebruiken

Args en kwargs zijn handig wanneer u:

  • Verminder code herschrijven.
  • Maak uw code leesbaar.
  • Gebruik uw code opnieuw

Args en Kwargs gebruiken in functies

Laten we eens kijken naar hoe kwargs en args worden gebruikt in functies.

args

De onderstaande functie bevat drie argumenten. De drie argumenten zijn expliciet gedefinieerd, dus meer of minder zal een fout in het programma veroorzaken.

def add (a, b, c): print (a + b + c) print add (2,3,4) 

Laten we de functie uitvoeren. De functie voegt de drie nummers toe en geeft de volgende uitvoer:

Uitgang 9

Wat als we vier argumenten in de functie zouden doorgeven in plaats van de vereiste drie? We ontvangen een foutmelding zoals hieronder getoond.

Dit komt doordat slechts drie parameters in de functie zijn gedefinieerd, maar we hebben vier positionele argumenten doorgegeven toen de functie werd aangeroepen.

def add (a, b, c): print (a + b + c) print add (2,3,4,5) 
Output TypeError: add () neemt 3 positionele argumenten maar er zijn er 4 gegeven 

In het tweede voorbeeld hieronder, de * is voor non-zoekwoord argumenten en wordt doorgegeven aan de functie. In plaats van gedefinieerde argumenten te gebruiken, vervangen we een, b en c met een enkele parameter (* args).

Merk op hoe het gebruik van * args maakt het gemakkelijk om een ​​willekeurig aantal argumenten te gebruiken zonder uw code te hoeven wijzigen. * args bied meer flexibiliteit aan uw code omdat u in de toekomst zoveel argumenten kunt hebben als u wilt.

def add (* args): total = 0 voor arg in args: total + = arg print total 
Scenario 1 print add (1,2,5) Uitgang 8 
Scenario 2 print add (1,2,5,6) output 14 
Scenario 3 print add (1,2,5,8) Output 16

Meer voorbeelden

Maak een eenvoudige functie zoals getoond:

def func (* args): # * args betekent voor hoe veel argumenten je ook inneemt, het zal ze allemaal vangen voor arg in args: print arg 

Test de functie met een combinatie van gehele getallen en strings:

def func (* args): # * args betekent voor hoe veel argumenten je ook meeneemt, het zal ze allemaal vangen voor arg in args: print arg print func (11,3,4,5, "tuts") 
Uitgang 11 3 4 5 tuts

Wat als we een lijst zouden doorgeven als argument? Test de functie met een lijst door de vorige argumenten te vervangen door een lijst,  l = [11,3,4,5, "tuts].

def func (* args): # * args betekent voor hoeveel argumenten je ook inneemt, het zal ze allemaal vangen voor arg in args: print arg l = [11,3,4,5, "tuts"] print func (l ) 
Hiermee wordt de lijst als geheel afgedrukt. Dit komt omdat de lijst als één item wordt geïnterpreteerd. Uitgang [11,3,4,5, "tuts]

Uit het bovenstaande voorbeeld kunt u ook gebruiken * args om argumenten uit te pakken die zich al in een lijst of een tuple bevinden, zodat alle elementen in de lijst als verschillende parameters worden doorgegeven.

Met dezelfde functie:

def func (* args): # * args betekent voor hoe veel argumenten je ook meeneemt, het zal ze allemaal vangen voor arg in args: print (arg) l = [11,3,4,5, "tuts"] print ( func (* l)) 
Met * wordt de lijst uitgepakt en wordt elk individueel lijstitem uitgevoerd. Uitgang 11 3 4 5 tuts

kwargs

Met Kwargs kunt u zoekwoordargumenten doorgeven aan een functie. Ze worden gebruikt als u niet zeker bent van het aantal zoekwoordargumenten dat in de functie wordt doorgegeven.

Schrijf een functie mijn_func en pas erin (x = 10, y = 20) als sleutelwoord argumenten zoals hieronder getoond:

def my_func (x = 10, y = 20): print x, y
Hiermee worden de waarden van x en y Output 10,20 afgedrukt

Kwargs kan worden gebruikt voor het uitpakken van woordenboeksleutel, waardeparen. Dit gebeurt met behulp van de dubbele asterisk-notatie (**). Het is belangrijk om te weten dat elke sleutel moet overeenkomen met een waarde.

Hier is een typisch voorbeeld van hoe het is gedaan. De onderstaande functie neemt landen als sleutels en hun hoofdsteden als de waarden. Vervolgens wordt een instructie afgedrukt die itereert over de kwargs en wordt elk zoekwoord toegewezen aan de waarde die eraan is toegewezen.

def capital_cities (** kwargs): # initialiseer een lege lijst om het resultaat te bewaren = [] voor sleutel, waarde in kwargs.items (): result.append ("De hoofdstad van  is  .format (key , waarde) retourresultaat

Je kunt de functie oproepen met elke gewenste argumenten.

def capital_cities (** kwargs): # initialiseer een lege lijst om het resultaat te bewaren = [] voor sleutel, waarde in kwargs.items (): result.append ("De hoofdstad van  is  .format (key , waarde) retourresultaat print capital_city (China = "Beijing", Cairo = "Egypte", Rome = "Italië"))
output ['De hoofdstad van China is Beijing', 'De hoofdstad van Cairo is Egypte', 'De hoofdstad van Rome is Italië'] 

Voor een meer complex voorbeeld, stel dat we een model voor een klant hebben dat er ongeveer zo uitziet:

class Klant (models.Model): first_name = models.CharField (max_length = 100, null = True) last_name = models.CharField (max_length = 100) gebruikersnaam = models.Charfield (max_length = 100) email = models.EmailField (max_length = 100) wachtwoord = modellen.CharField (max_length = 100)

U kunt kwargs gebruiken voor zowel gegevensinvoer als gegevensquery's van modelobjecten. Laten we een functieoverzicht schrijven om een ​​nieuwe klant te maken.

kwargs = "first_name": "John", "last_name": "Doe", "gebruikersnaam": "johndoe", "email" [email protected] "," password ":" 1234 " new_user = Gebruiker (* * kwargs) new_user.save ()

Hier leest u hoe u een query kunt uitvoeren van de klant die we net met kwargs hebben gemaakt.

filter_customer = 'email': [email protected], 'gebruikersnaam': johndoe, Customer.objects.filter (** filter_customer)

Zowel Args als Kwargs gebruiken in een functie

Bij gebruik van zowel args als kwargs in dezelfde functiedefinitie, * args moet eerder voorkomen ** kwargs

class MyFunction (Foo): def __init __ (self, * args, ** kwargs): print 'my function' super (MyFunction, self) .__ init __ (* args, ** kwargs)

Voorbeeld:

def Func (* args, ** kwargs): voor arg in args: print arg voor item in kwargs.items (): print item

Onthouden args zou eerder moeten komen kwargs.

def Func (* args, ** kwargs): voor arg in args: print arg voor item in kwargs.items (): print item print Func (1, x = 7, u = 8)
Uitgang 1 ('x', 7) ('u', 8)

Conclusie

Ik hoop dat deze tutorial je heeft geholpen args en kwargs te begrijpen.

Hieronder staan ​​enkele tips om te onthouden bij het gebruik van args en kwargs:

  • * args en ** kwargs zijn speciale syntaxis die in functies worden gebruikt om een ​​variabel aantal argumenten aan een functie door te geven.
  • * args eerder voorkomen ** kwargs in een functiedefinitie.
  • * args en ** kwargs worden het best gebruikt in situaties waarin het aantal ingangen relatief klein zal blijven.
  • U kunt elke gewenste naam gebruiken; args en kwargs zijn alleen volgens afspraak en geen vereiste. U kunt bijvoorbeeld gebruiken * foo in plaats van * args of ** foo in plaats van ** kwargs.

De officiële Python-documentatie biedt veel informatie voor verder onderzoek. Aarzel niet om te zien wat we te koop aanbieden en om te studeren op de markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.