logo

Argomenti predefiniti in Python

Python consente agli argomenti delle funzioni di avere valori predefiniti. Se la funzione viene chiamata senza argomento, l'argomento assume il suo valore predefinito.

Argomenti predefiniti:

Python ha un modo diverso di rappresentare la sintassi e i valori predefiniti per gli argomenti delle funzioni. I valori predefiniti indicano che l'argomento della funzione assumerà quel valore se non viene passato alcun valore di argomento durante la chiamata alla funzione. Il valore predefinito viene assegnato utilizzando l'operatore di assegnazione(=) del modulo nome parola chiave = valore.
Capiamolo attraverso una funzione alunno . La funzione alunno contiene 3 argomenti di cui 2 argomenti sono assegnati con valori predefiniti. Quindi, la funzione alunno accetta un argomento obbligatorio ( nome di battesimo ) e i restanti due argomenti sono facoltativi.

Python3




confrontare con la stringa



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

>

>


Dobbiamo tenere a mente i seguenti punti mentre chiamiamo le funzioni:

  1. Nel caso in cui si passino argomenti con parole chiave, l'ordine degli argomenti è importante.
  2. Dovrebbe esserci un solo valore per un parametro.
  3. Il nome della parola chiave passata deve corrispondere al nome della parola chiave effettiva.
  4. Nel caso di chiamata di una funzione contenente argomenti diversi da parole chiave, l'ordine è importante.

Esempio 1: Chiamare funzioni senza argomenti di parole chiave

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

>

>

Produzione:

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

Nella prima chiamata è presente un solo argomento obbligatorio e gli altri argomenti utilizzano i valori predefiniti. Nella seconda convocazione, cognome e il valore degli argomenti standard viene sostituito dal valore predefinito al nuovo valore passato. Possiamo vedere che l'ordine degli argomenti è importante dalla 2a, 3a e 4a chiamata della funzione.

Esempio n.2: chiamata di funzioni con argomenti di parole chiave

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

>

>

Produzione:

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

Nella prima chiamata è richiesto un solo argomento chiave. Nella seconda chiamata, uno è un argomento obbligatorio e l'altro è facoltativo (standard), il cui valore viene sostituito da quello predefinito con un nuovo valore passante. Nella terza chiamata, possiamo vedere che l'ordine nell'argomento della parola chiave non è importante.

Esempio n. 3: alcune chiamate di funzione non valide

Python3




dimensione di un cucchiaino
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'>)>

>

>

Il codice precedente genererà un errore perché:

  • Nella prima chiamata, il valore non viene passato per il parametro nome di battesimo che è il parametro richiesto.
  • Nella seconda chiamata, c'è un argomento che non sia una parola chiave dopo un argomento con una parola chiave.
  • Nella terza chiamata, l'argomento della parola chiave passato non viene abbinato agli argomenti del nome della parola chiave effettiva.

Utilizzo di oggetti mutabili come valori di argomento predefiniti in Python

Questo deve essere fatto con molta attenzione. Il motivo è che i valori predefiniti degli argomenti vengono valutati solo una volta quando il controllo raggiunge la funzione

Definizione per la prima volta. Successivamente, si fa riferimento agli stessi valori (o oggetti mutabili) nelle successive chiamate di funzione.
Le cose saranno molto più chiare con l’esempio

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

>

>

Produzione

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

Cosa ti aspettavi se presumi che un nuovo elenco venga creato in ogni chiamata di funzione quando non gli passiamo un elenco

['taccuino']

['matita']

['gomma per cancellare']

Ma come puoi vedere nell'output effettivo del programma, ogni volta che viene chiamata la funzione, viene utilizzata la stessa lista, non viene creata una nuova lista ad una nuova chiamata.

Esempio utilizzando il dizionario

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

>

alfabeto di numeri

>

Produzione

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

Cosa ti aspetti se presumi che venga creato un nuovo dizionario in ogni chiamata di funzione

{'taccuino': 4}

{'matita': 1}

{'gomma': 1}

Ma puoi vedere chiaramente che l'output effettivo del programma è diverso e indica l'uso dello stesso dizionario in ogni chiamata successiva.

La conclusione fondamentale è che dovremmo evitare tali scenari.

Migliori pratiche

Assegnare il valore predefinito come none e quindi verificare nella funzione se l'elenco o l'argomento del dizionario previsto è none o meno.

Se non lo è, assegnagli un elenco o un dizionario a seconda delle tue esigenze.

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

>

>

Produzione

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

Qui puoi vedere chiaramente che ogni volta che viene chiamata una funzione e una lista o un dizionario non viene passato come argomento alla funzione, viene creata una nuova lista o dizionario.