Python noklusējuma argumenti
Python ļauj funkciju argumentiem izmantot noklusējuma vērtības. Ja funkcija tiek izsaukta bez argumenta, arguments iegūst noklusējuma vērtību.
Noklusējuma argumenti:
Python funkcijai ir atšķirīgs sintakses un noklusējuma vērtību attēlošanas veids funkciju argumentiem. Noklusējuma vērtības norāda, ka funkcijas arguments izmantos šo vērtību, ja funkcijas izsaukšanas laikā netiek nodota neviena argumenta vērtība. Noklusējuma vērtība tiek piešķirta, izmantojot veidlapas operatoru assignment(=). atslēgvārda nosaukums = vērtība.
Sapratīsim to, izmantojot funkciju students . Funkcija students satur 3 argumentus, no kuriem 2 argumentiem tiek piešķirtas noklusējuma vērtības. Tātad, funkcija students pieņem vienu nepieciešamo argumentu ( vārds ), un pārējie divi argumenti nav obligāti.
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> |
Izsaucot funkcijas, mums jāpatur prātā šādi punkti:
- Atslēgvārdu argumentu nodošanas gadījumā svarīga ir argumentu secība.
- Vienam parametram jābūt tikai vienai vērtībai.
- Nodotajam atslēgvārda nosaukumam ir jāsakrīt ar faktisko atslēgvārda nosaukumu.
- Ja tiek izsaukta funkcija, kas satur argumentus, kas nav atslēgvārdi, secība ir svarīga.
1. piemērs: Funkciju izsaukšana bez atslēgvārdu argumentiem
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'> )> |
Izvade:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard
Pirmajā izsaukumā ir tikai viens obligātais arguments, un pārējie argumenti izmanto noklusējuma vērtības. Otrajā zvanā uzvārds un standarta argumentu vērtība tiek aizstāta no noklusējuma vērtības uz jaunu pārejas vērtību. Var redzēt, ka argumentu secība ir svarīga no funkcijas 2., 3. un 4. izsaukuma.
2. piemērs: funkciju izsaukšana ar atslēgvārdu argumentiem
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'> )> |
Izvade:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard
Pirmajā izsaukumā ir tikai viens obligātais atslēgvārda arguments. Otrajā izsaukumā viens ir obligātais arguments, bet otrs ir neobligāts (standarta), kura vērtība no noklusējuma tiek aizstāta ar jaunu pārejas vērtību. Trešajā izsaukumā mēs redzam, ka atslēgvārdu argumentu secība nav svarīga.
3. piemērs: daži nederīgi funkciju izsaukumi
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'> )> |
Iepriekš minētais kods radīs kļūdu, jo:
- Pirmajā izsaukumā parametra vērtība netiek nodota vārds kas ir nepieciešamais parametrs.
- Otrajā izsaukumā aiz atslēgvārda argumenta ir arguments, kas nav atslēgvārds.
- Trešajā izsaukumā nododošais atslēgvārda arguments netiek saskaņots ar faktiskajiem atslēgvārda nosaukuma argumentiem.
Maināmu objektu izmantošana kā noklusējuma argumentu vērtības programmā python
Tas jādara ļoti uzmanīgi. Iemesls ir tāds, ka argumentu noklusējuma vērtības tiek novērtētas tikai vienu reizi, kad vadīkla sasniedz funkciju
Definīcija pirmo reizi. Pēc tam uz tām pašām vērtībām (vai mainīgiem objektiem) ir atsauces nākamajos funkciju izsaukumos.
Lietas būs daudz skaidrākas ar piemēru
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'> ))> |
Izvade
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']
Ko jūs gaidījāt, ja pieņemat, ka katrā funkcijas izsaukumā tiek izveidots jauns saraksts, kad mēs tam nenododam sarakstu
['piezīmju grāmatiņa']
['zīmulis']
['dzēšgumija']
Bet, kā jūs redzat programmas faktiskajā izvadē katru reizi, kad funkcija tiek izsaukta, tiek izmantots viens un tas pats saraksts, jauns saraksts netiek izveidots jaunam izsaukumam.
Piemērs, izmantojot vārdnīcu
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> ))> |
Izvade
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} Ko jūs gaidījāt, ja pieņemat, ka katrā funkcijas izsaukumā tiek izveidota jauna vārdnīca
{'piezīmju grāmatiņa': 4}
{'zīmulis': 1}
{'dzēšgumija': 1}
Bet jūs varat skaidri redzēt, ka programmas faktiskā izvade ir atšķirīga, un tas norāda uz vienas un tās pašas vārdnīcas izmantošanu katrā nākamajā izsaukumā.
Galvenais šeit ir tas, ka mums vajadzētu izvairīties no šādiem scenārijiem.
Labākā pieredze
Piešķiriet noklusējuma vērtību kā nav un pēc tam pārbaudiet funkcijā, vai paredzamais saraksta vai vārdnīcas arguments nav vai nav.
Ja tā nav, piešķiriet tam sarakstu vai vārdnīcu atkarībā no jūsu prasībām.
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> ))> |
Izvade
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} Šeit var skaidri redzēt, ka katru reizi, kad funkcija tiek izsaukta un saraksts vai vārdnīca netiek nodota kā arguments funkcijai, tā izveido jaunu sarakstu vai vārdnīcu.