logo

Argumente implicite în Python

Python permite argumentelor funcției să aibă valori implicite. Dacă funcția este apelată fără argument, argumentul primește valoarea implicită.

Argumente implicite:

Python are un mod diferit de a reprezenta sintaxa și valorile implicite pentru argumentele funcției. Valorile implicite indică faptul că argumentul funcției va lua acea valoare dacă nu este transmisă nicio valoare a argumentului în timpul apelului funcției. Valoarea implicită este atribuită utilizând operatorul de atribuire(=) al formularului nume cheie =valoare.
Să înțelegem asta printr-o funcție student . Functia student conține 3 argumente dintre care 2 argumente sunt atribuite cu valori implicite. Deci, funcția student acceptă un argument necesar ( Nume ), iar restul două argumente sunt opționale.

Python3






def> student(firstname, lastname>=>'Mark'>, standard>=>'Fifth'>):> >print>(firstname, lastname,>'studies in'>, standard,>'Standard'>)>

>

>


Trebuie să ținem cont de următoarele puncte atunci când apelăm funcții:

  1. În cazul trecerii argumentelor cuvântului cheie, ordinea argumentelor este importantă.
  2. Ar trebui să existe o singură valoare pentru un parametru.
  3. Numele cuvântului cheie transmis trebuie să se potrivească cu numele actual al cuvântului cheie.
  4. În cazul apelării unei funcții care conține argumente non-cheie, ordinea este importantă.

Exemplul #1: Apelarea funcțiilor fără argumente de cuvinte cheie

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'>)>

>

json din obiectul java
>

Ieșire:

John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard>

În primul apel, există un singur argument necesar, iar celelalte argumente folosesc valorile implicite. La al doilea apel, nume iar valoarea argumentelor standard este înlocuită de la valoarea implicită la o nouă valoare de trecere. Putem vedea că ordinea argumentelor este importantă din al 2-lea, al 3-lea și al 4-lea apel al funcției.

Exemplul #2: Apelarea funcțiilor cu argumente de cuvinte cheie

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'>)>

>

>

Ieșire:

John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard>

În primul apel, există un singur argument cheie obligatoriu. În al doilea apel, unul este un argument obligatoriu și unul este opțional (standard), a cărui valoare este înlocuită de la implicit la o nouă valoare de trecere. În al treilea apel, putem vedea că ordinea în argumentul cuvântului cheie nu este importantă.

Exemplul #3: Unele apeluri de funcții nevalide

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'>)>

>

>

Codul de mai sus va genera o eroare deoarece:

  • În primul apel, valoarea nu este transmisă pentru parametru Nume care este parametrul necesar.
  • În al doilea apel, există un argument non-cheie după un argument cheie.
  • În al treilea apel, argumentul cuvânt cheie care trece nu este potrivit cu argumentele numelui cuvântului cheie.

Utilizarea obiectelor mutabile ca valori implicite ale argumentului în python

Acest lucru trebuie făcut cu mare atenție. Motivul este că valorile implicite ale argumentelor sunt evaluate o singură dată când controlul ajunge la funcție

Definiție pentru prima dată. După aceea, aceleași valori (sau obiecte mutabile) sunt referite în apelurile de funcții ulterioare.
Lucrurile vor fi mult mai clare cu exemplul

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'>))>

>

>

Ieșire

['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']>

La ce v-ați așteptat dacă presupuneți că o nouă listă este creată în fiecare apel de funcție atunci când nu îi transmitem o listă

['caiet']

['creion']

['radieră']

Dar după cum puteți vedea în rezultatul real al programului de fiecare dată când funcția este apelată, se folosește aceeași listă, nu se face nicio listă nouă la un nou apel.

Exemplu folosind dicționar

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>))>

git add all
>

>

Ieșire

{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}>

La ce v-ați așteptat dacă presupuneți că un nou dicționar este creat în fiecare apel de funcție

{‘caiet’: 4}

{‘creion’: 1}

{‘eraser’: 1}

Dar puteți vedea clar că rezultatul real al programului este diferit și indică utilizarea aceluiași dicționar în fiecare apel ulterioar.

Principala concluzie aici este că ar trebui să evităm astfel de scenarii.

Cele mai bune practici

Atribuiți valoarea implicită ca none și apoi verificați în funcție dacă lista așteptată sau argumentul dicționarului este niciunul sau nu.

Dacă nu există, atunci atribuiți-i o listă sau un dicționar în funcție de cerințele dvs.

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>))>

>

>

Ieșire

#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}>

Aici puteți vedea clar că de fiecare dată când o funcție este apelată și o listă sau dicționar nu este transmis ca argument funcției, atunci se creează o nouă listă sau dicționar.