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:
- V prípade odovzdávania kľúčového slova argumenty je dôležité poradie argumentov.
- Pre jeden parameter by mala byť len jedna hodnota.
- Názov odovzdaného kľúčového slova by sa mal zhodovať so skutočným názvom kľúčového slova.
- 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.