Standardargumenter i Python

Python tillader funktionsargumenter at have standardværdier. Hvis funktionen kaldes uden argumentet, får argumentet sin standardværdi.

Standardargumenter:

Python har en anden måde at repræsentere syntaks og standardværdier for funktionsargumenter. Standardværdier angiver, at funktionsargumentet vil tage denne værdi, hvis der ikke sendes nogen argumentværdi under funktionskaldet. Standardværdien tildeles ved at bruge formularens assignment(=)-operator søgeordsnavn =værdi.
Lad os forstå dette gennem en funktion studerende . Funktionen studerende indeholder 3-argumenter, hvoraf 2 argumenter er tildelt standardværdier. Altså funktionen studerende accepterer et påkrævet argument ( fornavn ), og de to andre argumenter er valgfrie.

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )>


Vi skal huske på følgende punkter, når vi kalder funktioner:

  1. I tilfælde af at bestå søgeordsargumenterne, er rækkefølgen af ​​argumenter vigtig.
  2. Der bør kun være én værdi for én parameter.
  3. Det beståede søgeordsnavn skal matche det faktiske søgeordsnavn.
  4. I tilfælde af at kalde en funktion, der indeholder ikke-søgeordsargumenter, er rækkefølgen vigtig.

Eksempel #1: Kaldende funktioner uden nøgleordsargumenter

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 positional argument> student(> 'John'> )> # 3 positional arguments> student(> 'John'> ,> 'Gates'> ,> 'Seventh'> )> # 2 positional arguments> student(> 'John'> ,> 'Gates'> )> student(> 'John'> ,> 'Seventh'> )>

Produktion:

John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard 

I det første kald er der kun et påkrævet argument, og resten argumenter bruger standardværdierne. I det andet opkald, efternavn og standardargumentværdien erstattes fra standardværdien til den nye beståede værdi. Vi kan se rækkefølgen af ​​argumenter er vigtig fra 2., 3. og 4. kald af funktionen.

Eksempel #2: Kaldning af funktioner med søgeordsargumenter

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 keyword argument> student(firstname> => 'John'> )> # 2 keyword arguments> student(firstname> => 'John'> , standard> => 'Seventh'> )> # 2 keyword arguments> student(lastname> => 'Gates'> , firstname> => 'John'> )>

Produktion:

John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard 

I det første kald er der kun et påkrævet søgeordsargument. I det andet kald er et påkrævet argument, og et er valgfrit (standard), hvis værdi bliver erstattet fra standard til en ny passerende værdi. I det tredje opkald kan vi se, at rækkefølgen i søgeordsargumentet ikke er vigtig.

Eksempel #3: Nogle ugyldige funktionskald

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # required argument missing> student()> # non keyword argument after a keyword argument> student(firstname> => 'John'> ,> 'Seventh'> )> # unknown keyword argument> student(subject> => 'Maths'> )>

Ovenstående kode vil give en fejl, fordi:

  • I det første kald sendes der ikke værdi for parameter fornavn som er den nødvendige parameter.
  • I det andet kald er der et ikke-søgeordsargument efter et nøgleordsargument.
  • I det tredje kald matches det beståede nøgleordsargument ikke med de faktiske søgeordsnavnargumenter.

Brug af mutable objekter som standard argumentværdier i python

Dette skal gøres meget omhyggeligt. Årsagen er, at standardværdierne for argumenterne kun evalueres én gang, når kontrolelementet når funktionen

Definition for første gang. Derefter refereres til de samme værdier (eller mutable objekter) i de efterfølgende funktionskald.
Tingene vil være meget mere klare med eksemplet

Python3




# mutable default argument values example using python list> # itemName is the name of the item that we want to add to list> # that is being passed, or if it is not passed then appending in> # the default list> def> appendItem(itemName, itemList> => []):> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))>

Produktion

['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser'] 

Hvad du har forventet, hvis du antager, at der oprettes en ny liste i hvert funktionskald, når vi ikke sender en liste til den

['notesbog']

['blyant']

['viskelæder']

Men som du kan se i selve udgangen af ​​programmet, hver gang funktionen kaldes, bruges den samme liste, der laves ingen ny liste på et nyt kald.

Eksempel ved brug af ordbog

Python3




# mutable default argument values example using python dictionary> # itemName is the name of item and quantity is the number of such> # items are there> def> addItemToDictionary(itemName, quantity, itemList> => {}):> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))>

Produktion

{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} 

Hvad du har forventet, hvis du antager, at der oprettes en ny ordbog i hvert funktionskald

{'notesbog': 4}

{'blyant': 1}

{'viskelæder': 1}

Men du kan tydeligt se, at programmets faktiske output er anderledes, og det indikerer brugen af ​​den samme ordbog i hvert efterfølgende opkald.

Det vigtigste her er, at vi bør undgå sådanne scenarier.

Bedste praksis

Tildel standardværdien som ingen, og kontroller derefter i funktionen, om det forventede liste- eller ordbogsargument er ingen eller ej.

Hvis det ikke er nogen, så tildel den med en liste eller ordbog afhængigt af dit krav.

Python3




# using None as values of the default arguments> print> (> '#list'> )> def> appendItem(itemName, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => []> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))> # using None as value of default parameter> print> (> ' #dictionary'> )> def> addItemToDictionary(itemName, quantity, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => {}> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))>

Produktion

#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} 

Her kan du tydeligt se, at hver gang en funktion kaldes og en liste eller ordbog ikke sendes som argument til funktionen, så opretter den en ny liste eller ordbog.