Python leidžia funkcijų argumentams turėti numatytąsias reikšmes. Jei funkcija iškviečiama be argumento, argumentas gauna numatytąją reikšmę.
Numatytieji argumentai:
Python funkcijos argumentų sintaksė ir numatytosios reikšmės pateikiami skirtingai. Numatytosios reikšmės rodo, kad funkcijos argumentas įgis tą reikšmę, jei funkcijos iškvietimo metu nebus perduodama jokia argumento reikšmė. Numatytoji reikšmė priskiriama naudojant formos assignment(=) operatorių raktinio žodžio pavadinimas = vertė.
Supraskime tai per funkciją studentas . Funkcija studentas yra 3 argumentai, iš kurių 2 argumentams priskiriamos numatytosios reikšmės. Taigi, funkcija studentas priima vieną reikalingą argumentą ( Pirmas vardas ), o kiti du argumentai yra neprivalomi.
2-1 multiplekseris
Python3
def> student(firstname, lastname>=>'Mark'>, standard>=>'Fifth'>):> >print>(firstname, lastname,>'studies in'>, standard,>'Standard'>)> |
>
>
Iškviesdami funkcijas turime nepamiršti šių dalykų:
- Jei perduodami raktinio žodžio argumentai, svarbi argumentų tvarka.
- Vienam parametrui turi būti tik viena reikšmė.
- Perduotas raktinio žodžio pavadinimas turi atitikti tikrąjį raktinio žodžio pavadinimą.
- Jei iškviečiama funkcija, kurioje yra ne raktinio žodžio argumentų, tvarka yra svarbi.
1 pavyzdys: Funkcijos iškvietimas be raktinių žodžių argumentų
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'>)> |
>
>
Išvestis:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard>
Pirmajame iškvietime yra tik vienas būtinas argumentas, o kiti argumentai naudoja numatytąsias reikšmes. Antrojo skambučio metu pavardė ir standartinių argumentų reikšmė pakeičiama iš numatytosios vertės į naują perduodamą reikšmę. Argumentų eilės svarbą matome iš 2, 3 ir 4 funkcijos iškvietimų.
2 pavyzdys: funkcijų iškvietimas naudojant raktinių žodžių argumentus
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'>)> |
stygos poeilutė
>
>
Išvestis:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard>
Pirmajame skambutyje yra tik vienas privalomas raktinio žodžio argumentas. Antrajame iškvietime vienas yra privalomas argumentas, o kitas yra neprivalomas (standartinis), kurio reikšmė iš numatytosios pakeičiama į naują perduodamą reikšmę. Trečiajame skambutyje matome, kad raktinio žodžio argumento tvarka nėra svarbi.
3 pavyzdys: kai kurie netinkami funkcijų iškvietimai
Python3
kaip paleisti scenarijų Linux
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'>)> |
>
>
Aukščiau pateiktas kodas parodys klaidą, nes:
- Pirmojo skambučio metu parametro reikšmė neperduodama Pirmas vardas kuris yra reikalingas parametras.
- Antrajame iškvietime po raktinio žodžio argumento yra ne raktinio žodžio argumentas.
- Trečiajame iškvietime perduodamas raktinio žodžio argumentas nesutampa su faktiniais raktinio žodžio pavadinimo argumentais.
Keičiamų objektų naudojimas kaip numatytosios argumentų reikšmės python
Tai turi būti daroma labai atsargiai. Priežastis ta, kad numatytosios argumentų reikšmės įvertinamos tik vieną kartą, kai valdiklis pasiekia funkciją
Apibrėžimas pirmą kartą. Po to tos pačios reikšmės (arba kintantys objektai) nurodomos tolesniuose funkcijų iškvietimuose.
Pavyzdžiu viskas bus daug aiškiau
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'>))> |
>
>Išvestis
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']>
Ko tikėjotės, jei manote, kad kiekviename funkcijos iškvietime sukuriamas naujas sąrašas, kai jam neperduodame sąrašo
['užrašų knygelė']
['pieštukas']
kas yra žiemos miegas['trintukas']
Bet kaip matote faktinėje programos išvestyje kiekvieną kartą, kai funkcija iškviečiama, naudojamas tas pats sąrašas, naujas sąrašas nesudaromas naujam iškvietimui.
Žodyno naudojimo pavyzdys
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>))> |
>
>Išvestis
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}> Ko tikėjotės, jei manote, kad kiekviename funkcijos iškvietime sukuriamas naujas žodynas
{'užrašų knygelė': 4}
{'pieštukas': 1}
{'trintukas': 1}
Bet jūs galite aiškiai matyti, kad tikroji programos išvestis skiriasi ir rodo, kad kiekviename paskesniame skambutyje naudojamas tas pats žodynas.
Svarbiausias dalykas yra tai, kad turėtume vengti tokių scenarijų.
Geriausia praktika
Priskirkite numatytąją reikšmę kaip nėra, tada patikrinkite funkciją, ar laukiamo sąrašo arba žodyno argumento nėra, ar ne.
Jei jo nėra, priskirkite jam sąrašą arba žodyną, atsižvelgdami į jūsų poreikius.
Python3
gb prieš mb
# 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>))> |
>
>Išvestis
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}> Čia galite aiškiai matyti, kad kiekvieną kartą, kai iškviečiama funkcija ir sąrašas ar žodynas nėra perduodamas kaip argumentas funkcijai, tada sukuriamas naujas sąrašas arba žodynas.