logo

Privzeti argumenti v Pythonu

Python omogoča, da imajo argumenti funkcij privzete vrednosti. Če je funkcija poklicana brez argumenta, dobi argument svojo privzeto vrednost.

Privzeti argumenti:

Python ima drugačen način predstavljanja sintakse in privzetih vrednosti za argumente funkcije. Privzete vrednosti kažejo, da bo argument funkcije prevzel to vrednost, če med klicem funkcije ni podana vrednost argumenta. Privzeta vrednost je dodeljena z uporabo operatorja dodelitve(=) obrazca ime ključne besede =vrednost.
Razumejmo to skozi funkcijo študent . Funkcija študent vsebuje 3 argumente, od katerih sta 2 argumentoma dodeljena s privzetimi vrednostmi. Torej, funkcija študent sprejme en zahtevan argument ( ime ), ostala dva argumenta pa sta neobvezna.

Python3






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

>

>


Pri klicanju funkcij moramo upoštevati naslednje točke:

  1. V primeru posredovanja argumentov ključne besede je vrstni red argumentov pomemben.
  2. Za en parameter mora biti samo ena vrednost.
  3. Posredovano ime ključne besede se mora ujemati z dejanskim imenom ključne besede.
  4. V primeru klica funkcije, ki vsebuje argumente, ki niso ključne besede, je vrstni red pomemben.

Primer #1: Klicanje funkcij brez argumentov ključnih besed

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'>)>

>

>

Izhod:

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

V prvem klicu je samo en zahtevan argument, ostali argumenti pa uporabljajo privzete vrednosti. V drugem klicu, priimek in vrednost standardnih argumentov je zamenjana s privzete vrednosti na novo vrednost podajanja. Vrstni red argumentov je pomemben iz 2., 3. in 4. klica funkcije.

Primer #2: Klicanje funkcij z argumenti ključne besede

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'>)>

>

>

Izhod:

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

V prvem klicu je samo en zahtevan argument ključne besede. V drugem klicu je eden obvezen argument, eden pa izbirni (standardni), katerega vrednost se nadomesti s privzeto na novo podano vrednost. V tretjem klicu lahko vidimo, da vrstni red v argumentu ključne besede ni pomemben.

Primer #3: Nekateri neveljavni klici funkcij

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'>)>

>

>

Zgornja koda bo povzročila napako, ker:

  • V prvem klicu vrednost ni posredovana za parameter ime kar je zahtevani parameter.
  • V drugem klicu je za argumentom ključne besede argument, ki ni ključna beseda.
  • V tretjem klicu se podani argument ključne besede ne ujema z dejanskimi argumenti imena ključne besede.

Uporaba spremenljivih predmetov kot privzetih vrednosti argumentov v pythonu

To je treba storiti zelo previdno. Razlog je v tem, da so privzete vrednosti argumentov ovrednotene samo enkrat, ko kontrolnik doseže funkcijo

Definicija prvič. Po tem se iste vrednosti (ali spremenljivi objekti) sklicujejo v naslednjih klicih funkcij.
S primerom bodo stvari veliko bolj jasne

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'>))>

>

>

Izhod

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

Kaj ste pričakovali, če domnevate, da se v vsakem klicu funkcije ustvari nov seznam, ko mu ne posredujemo seznama

['zvezek']

['svinčnik']

['radirka']

Toda kot lahko vidite v dejanskem izhodu programa ob vsakem klicu funkcije, se uporabi isti seznam, pri novem klicu se ne ustvari nov seznam.

Primer uporabe slovarja

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>))>

>

>

Izhod

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

Kaj ste pričakovali, če predvidevate, da se pri vsakem klicu funkcije ustvari nov slovar

{'zvezek': 4}

{'svinčnik': 1}

{'radirka': 1}

Jasno pa lahko vidite, da je dejanski rezultat programa drugačen in nakazuje uporabo istega slovarja pri vsakem naslednjem klicu.

Ključni zaključek je, da se moramo izogibati takšnim scenarijem.

Najboljše prakse

Dodelite privzeto vrednost kot none in nato v funkciji preverite, ali je pričakovan argument seznama ali slovarja none ali ne.

Če ni nobenega, ga dodelite s seznamom ali slovarjem, odvisno od vaše zahteve.

Python3


algoritem za razvrščanje vstavljanja



# 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>))>

>

>

Izhod

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

Tukaj lahko jasno vidite, da vsakič, ko je funkcija poklicana in seznam ali slovar ni posredovan kot argument funkciji, ustvari nov seznam ali slovar.