Standardargumenter i Python
Python lar funksjonsargumenter ha standardverdier. Hvis funksjonen kalles uten argumentet, får argumentet sin standardverdi.
Standardargumenter:
Python har en annen måte å representere syntaks og standardverdier for funksjonsargumenter på. Standardverdier indikerer at funksjonsargumentet vil ta denne verdien hvis ingen argumentverdi sendes under funksjonskallet. Standardverdien tilordnes ved å bruke tilordning(=)-operatoren for skjemaet søkeordnavn =verdi.
La oss forstå dette gjennom en funksjon student . Funksjonen student inneholder 3-argumenter hvorav 2 argumenter er tilordnet standardverdier. Så funksjonen student godtar ett nødvendig argument ( fornavn ), og resten to argumenter er valgfrie.
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> |
Vi må huske på følgende punkter når vi kaller funksjoner:
- Når det gjelder å sende nøkkelordargumentene, er rekkefølgen på argumentene viktig.
- Det skal bare være én verdi for én parameter.
- Det beståtte søkeordnavnet skal samsvare med det faktiske søkeordnavnet.
- Når det gjelder å kalle en funksjon som inneholder ikke-søkeordargumenter, er rekkefølgen viktig.
Eksempel #1: Kalle opp funksjoner uten nøkkelordargumenter
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'> )> |
Produksjon:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard
I den første samtalen er det bare ett nødvendig argument, og resten argumenter bruker standardverdiene. I den andre samtalen, etternavn og standard argumentverdi erstattes fra standardverdi til ny bestått verdi. Vi kan se at rekkefølgen av argumenter er viktig fra 2., 3. og 4. kall til funksjonen.
Eksempel #2: Kalle opp funksjoner med nøkkelordargumenter
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'> )> |
Produksjon:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard
I den første samtalen er det bare ett nødvendig søkeordargument. I det andre kallet er ett påkrevd argument og ett er valgfritt (standard), hvis verdi blir erstattet fra standard til en ny bestått verdi. I den tredje samtalen kan vi se at rekkefølgen i søkeordargumentet ikke er viktig.
Eksempel #3: Noen ugyldige funksjonskall
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'> )> |
Koden ovenfor vil gi en feil fordi:
- I det første kallet sendes ikke verdien for parameteren fornavn som er den nødvendige parameteren.
- I den andre samtalen er det et ikke-søkeord-argument etter et nøkkelord-argument.
- I den tredje samtalen samsvarer ikke det beståtte nøkkelordargumentet med de faktiske søkeordnavnargumentene.
Bruke mutable objekter som standard argumentverdier i python
Dette må gjøres veldig nøye. Årsaken er at standardverdiene til argumentene bare evalueres én gang når kontrollen når funksjonen
Definisjon for første gang. Etter det refereres til de samme verdiene (eller mutbare objekter) i de påfølgende funksjonskallene.
Ting blir mye klarere med eksemplet
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'> ))> |
Produksjon
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']
Hva du har forventet hvis du antar at det opprettes en ny liste i hvert funksjonskall når vi ikke sender en liste til den
['notisbok']
['blyant']
['viskelær']
Men som du kan se i selve utgangen av programmet hver gang funksjonen kalles opp, brukes den samme listen, ingen ny liste lages på et nytt anrop.
Eksempel ved bruk av ordbok
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> ))> |
Produksjon
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} Hva du har forventet hvis du antar at det opprettes en ny ordbok i hvert funksjonskall
{'notisbok': 4}
{'blyant': 1}
{‘eraser’: 1}
Men du kan tydelig se at den faktiske produksjonen av programmet er forskjellig, og det indikerer bruken av samme ordbok i hver påfølgende samtale.
Det viktigste her er at vi bør unngå slike scenarier.
Beste praksis
Tilordne standardverdien som ingen og sjekk deretter i funksjonen om det forventede liste- eller ordbokargumentet er ingen eller ikke.
Hvis det ikke er noen, tilordne det med en liste eller ordbok avhengig av ditt krav.
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> ))> |
Produksjon
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} Her kan du tydelig se at hver gang en funksjon kalles og en liste eller ordbok ikke sendes som argument til funksjonen, så lager den en ny liste eller ordbok.