Python sallii funktion argumenttien oletusarvot. Jos funktiota kutsutaan ilman argumenttia, argumentti saa oletusarvon.
Oletusargumentit:
Pythonilla on erilainen tapa esittää syntaksia ja oletusarvoja funktion argumenteille. Oletusarvot osoittavat, että funktion argumentti ottaa kyseisen arvon, jos argumenttiarvoa ei välitetä funktiokutsun aikana. Oletusarvo määritetään käyttämällä lomakkeen assignment(=)-operaattoria avainsananimi = arvo.
Ymmärretään tämä funktion kautta opiskelija . Toiminto opiskelija sisältää 3 argumenttia, joista 2 argumentille on määritetty oletusarvot. Siis funktio opiskelija hyväksyy yhden vaaditun argumentin ( etunimi ), ja loput kaksi argumenttia ovat valinnaisia.
Python 3
def> student(firstname, lastname>=>'Mark'>, standard>=>'Fifth'>):> >print>(firstname, lastname,>'studies in'>, standard,>'Standard'>)> |
>
>
Meidän on pidettävä mielessä seuraavat seikat, kun kutsumme toimintoja:
- Avainsanaargumenttien välittämisen tapauksessa argumenttien järjestys on tärkeä.
- Yhdelle parametrille saa olla vain yksi arvo.
- Välitetyn avainsanan nimen tulee vastata todellista avainsanan nimeä.
- Kun kutsutaan funktiota, joka sisältää muita kuin avainsanaargumentteja, järjestys on tärkeä.
Esimerkki 1: Funktioiden kutsuminen ilman avainsanaargumentteja
Python 3
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'>)> |
>
>
Lähtö:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard>
Ensimmäisessä kutsussa on vain yksi pakollinen argumentti ja loput argumentit käyttävät oletusarvoja. Toisessa puhelussa sukunimi ja vakioargumenttien arvo korvataan oletusarvosta uuteen välitysarvoon. Näemme, että argumenttien järjestys on tärkeä funktion 2., 3. ja 4. kutsusta.
Esimerkki 2: Funktioiden kutsuminen avainsanaargumenteilla
Python 3
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'>)> |
>
>
Lähtö:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard>
Ensimmäisessä kutsussa on vain yksi pakollinen avainsanaargumentti. Toisessa kutsussa yksi on pakollinen argumentti ja toinen on valinnainen (standardi), jonka arvo korvataan oletusarvosta uuteen välitysarvoon. Kolmannessa kutsussa voimme nähdä, että avainsanaargumentin järjestys ei ole tärkeä.
Esimerkki #3: Jotkut virheelliset funktiokutsut
Python 3
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'>)> |
>
>
Yllä oleva koodi antaa virheen, koska:
- Ensimmäisessä kutsussa parametrin arvoa ei välitetä etunimi mikä on vaadittu parametri.
- Toisessa kutsussa avainsanaargumentin jälkeen on ei-avainsanaargumentti.
- Kolmannessa kutsussa ohittavaa avainsanaargumenttia ei täsmää todellisten avainsanan nimiargumenttien kanssa.
Muuttuvien objektien käyttäminen oletusargumenttiarvoina pythonissa
Tämä on tehtävä erittäin huolellisesti. Syynä on, että argumenttien oletusarvot arvioidaan vain kerran, kun ohjausyksikkö saavuttaa funktion
Määritelmä ensimmäistä kertaa. Sen jälkeen samoihin arvoihin (tai muuttuviin objekteihin) viitataan seuraavissa funktiokutsuissa.
Asiat tulevat paljon selvemmiksi esimerkin avulla
Python 3
# 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'>))> |
merkkijonoarvo
>
>Lähtö
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']>
Mitä olet odottanut, jos oletat, että jokaisessa funktiokutsussa luodaan uusi luettelo, kun emme välitä sille luetteloa
['muistikirja']
['lyijykynä']
['pyyhekumi']
Mutta kuten näet ohjelman todellisesta lähdöstä joka kerta kun toimintoa kutsutaan, käytetään samaa listaa, uutta listaa ei tehdä uudella kutsulla.
Esimerkki sanakirjan käytöstä
Python 3
# 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>))> |
>
>Lähtö
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}> Mitä olet odottanut, jos oletat, että jokaisessa funktiokutsussa luodaan uusi sanakirja
{’muistikirja’: 4}
{'kynä': 1}
{’pyyhekumi’: 1}
Mutta näet selvästi, että ohjelman todellinen tulos on erilainen ja se osoittaa saman sanakirjan käytön jokaisessa seuraavassa kutsussa.
Tärkeintä tässä on, että meidän tulee välttää tällaisia skenaarioita.
Parhaat käytännöt
Määritä oletusarvoksi ei mitään ja tarkista sitten funktiosta, onko odotettu luettelo- tai sanakirjaargumentti none vai ei.
Jos sitä ei ole, määritä se luettelon tai sanakirjan kanssa tarpeidesi mukaan.
Python 3
# 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>))> |
>
>Lähtö
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}> Tässä näkyy selvästi, että aina kun funktiota kutsutaan eikä listaa tai sanakirjaa välitetä argumenttina funktiolle, se luo uuden luettelon tai sanakirjan.