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:
- 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í
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> ))> |
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.