Kuinka käyttää ja huomioida oletusargumentteja Python-funktioissa?

liiketoiminta

Oletusargumentin asettaminen Python-funktion määrittelyssä aiheuttaa sen, että oletusarvoa käytetään, jos argumentti jätetään pois funktiokutsun aikana.

Seuraavassa kuvataan seuraavat yksityiskohdat.

  • Oletusargumenttien asettaminen
  • Oletusargumenttien sijaintia koskevat rajoitukset
  • Huomaa, että kun oletusarvona käytetään luetteloa tai sanakirjaa.

Oletusargumenttien asettaminen

Jos argumentin nimi = oletusarvo funktion määritelmässä, oletusarvoa käytetään, kun vastaava argumentti jätetään pois.

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

Oletusargumenttien sijaintia koskevat rajoitukset

Oletusargumentin sijoittaminen ennen normaalia argumenttia (argumentti, jolle ei ole määritetty oletusarvoa) funktiota määritettäessä johtaa virheeseen.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

Huomaa, että kun oletusarvona käytetään luetteloa tai sanakirjaa.

Jos oletusarvoksi on määritetty päivitettävä (muuttuva) objekti, kuten lista tai sanakirja, kyseinen objekti luodaan, kun funktio määritellään. Kun funktiota sitten kutsutaan ilman vastaavaa argumenttia, käytetään samaa objektia.

Oletusargumenttien arvot arvioidaan vasemmalta oikealle, kun funktion määritelmä suoritetaan. Tämä tarkoittaa, että oletusargumentin lauseke arvioidaan vain kerran, kun funktio määritellään, ja samaa ”laskettua” arvoa käytetään jokaisessa kutsussa.
8.7. Function definitions — Python 3.10.2 Documentation

Jos esimerkiksi määritellään funktio, joka ottaa oletusargumentikseen listan tai sanakirjan ja lisää siihen elementtejä, ja sitä kutsutaan useita kertoja ilman tätä argumenttia, elementit lisätään samaan objektiin toistuvasti.

Esimerkki luettelosta.

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

Esimerkki sanakirjasta.

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

Uusi objekti luodaan aina, kun funktiota kutsutaan.

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]
Copied title and URL