logo

Predvolené argumenty v Pythone

Python umožňuje, aby argumenty funkcií mali predvolené hodnoty. Ak sa funkcia volá bez argumentu, argument získa svoju predvolenú hodnotu.

Predvolené argumenty:

Python má odlišný spôsob reprezentácie syntaxe a predvolených hodnôt pre argumenty funkcií. Predvolené hodnoty naznačujú, že argument funkcie nadobudne túto hodnotu, ak sa počas volania funkcie neodovzdá žiadna hodnota argumentu. Predvolená hodnota je priradená pomocou operátora priradenia (=) formulára názov kľúčového slova =hodnota.
Pochopme to prostredníctvom funkcie študent . Funkcia študent obsahuje 3 argumenty, z ktorých 2 argumenty majú priradené predvolené hodnoty. Takže funkcia študent akceptuje jeden požadovaný argument ( krstné meno ) a zvyšné dva argumenty sú voliteľné.



Python3








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

>

>


Pri volaní funkcií musíme mať na pamäti nasledujúce body:

  1. V prípade odovzdávania kľúčového slova argumenty je dôležité poradie argumentov.
  2. Pre jeden parameter by mala byť len jedna hodnota.
  3. Názov odovzdaného kľúčového slova by sa mal zhodovať so skutočným názvom kľúčového slova.
  4. V prípade volania funkcie obsahujúcej nekľúčové argumenty je dôležité poradie.

Príklad č. 1: Volanie funkcií bez argumentov kľúčových slov

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

>

>

Výkon:

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 prvom volaní je len jeden povinný argument a ostatné argumenty používajú predvolené hodnoty. V druhom hovore priezvisko a hodnota štandardných argumentov sa nahradí z predvolenej hodnoty na novú hodnotu. Vidíme, že poradie argumentov je dôležité pri 2., 3. a 4. volaní funkcie.

Príklad č. 2: Volanie funkcií s argumentmi kľúčových slov

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

>

>

Výkon:

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

V prvom volaní je len jeden povinný argument kľúčového slova. V druhom volaní je jeden povinný argument a jeden je voliteľný (štandardný), ktorého hodnota sa nahradí z predvolenej hodnoty na novú hodnotu. V treťom volaní vidíme, že poradie v argumente kľúčového slova nie je dôležité.

Príklad č. 3: Niektoré volania neplatných funkcií

prepínač c#

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

>

>

Vyššie uvedený kód vyvolá chybu, pretože:

  • Pri prvom volaní sa hodnota parametra neodovzdá krstné meno čo je požadovaný parameter.
  • V druhom volaní je za argumentom kľúčového slova argument, ktorý nie je kľúčovým slovom.
  • V treťom volaní sa argument prechádzajúceho kľúčového slova nezhoduje so skutočnými argumentmi názvu kľúčového slova.

Použitie meniteľných objektov ako predvolených hodnôt argumentov v pythone

Toto sa musí robiť veľmi opatrne. Dôvodom je, že predvolené hodnoty argumentov sa vyhodnotia iba raz, keď ovládací prvok dosiahne funkciu

Definícia po prvýkrát. Potom sa v nasledujúcich volaniach funkcie odkazujú na rovnaké hodnoty (alebo meniteľné objekty).
Na príklade budú veci oveľa jasnejšie

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

>

>

Výkon

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

Čo ste očakávali, ak predpokladáte, že pri každom volaní funkcie sa vytvorí nový zoznam, keď mu neodovzdáme zoznam

[‚zápisník‘]

['ceruzka']

[‚guma‘]

Ale ako môžete vidieť na skutočnom výstupe programu pri každom volaní funkcie sa používa rovnaký zoznam, pri novom volaní sa nevytvára žiadny nový zoznam.

Príklad s použitím slovníka

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

prepojený zoznam
>

>

Výkon

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

Čo ste očakávali, ak predpokladáte, že pri každom volaní funkcie sa vytvorí nový slovník

{‘notebook’: 4}

{'ceruzka': 1}

{'guma': 1}

Môžete však jasne vidieť, že skutočný výstup programu je odlišný a naznačuje použitie rovnakého slovníka pri každom nasledujúcom volaní.

Kľúčovým záverom je, že by sme sa takýmto scenárom mali vyhýbať.

Osvedčené postupy

Priraďte predvolenú hodnotu ako none a potom skontrolujte vo funkcii, či je očakávaný argument zoznamu alebo slovníka none alebo nie.

Ak nie je, priraďte mu zoznam alebo slovník v závislosti od vašej požiadavky.

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

>

>

Výkon

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

Tu môžete jasne vidieť, že zakaždým, keď je funkcia zavolaná a zoznam alebo slovník nie je odovzdaný ako argument funkcii, vytvorí sa nový zoznam alebo slovník.