18 giugno, 2019

Parametri con nome e valore predefinito

tramonto marziano - Spirit

Con Python --OK, anche tanti altri linguaggi-- si possono facilmente definire le funzioni in modo da rendere flessibile il passaggio di parametri; capitano casi in cui questa opzione risulta molto conveniente e il codice risulta più chiaro.

Credo serva un esempio, minimo, così mi capisco anch'io. La funzione (è solo un esempio, nèh!) udc ritorna il valore delle unità u, decine d e centinaia c che le vengono passate; per un caso più realistico si può pensare agli angoli espressi come gradi, primi e secondi o al tempo dall'anno fino al secondo. Ecco la funzione udc:

def udc(u=0, d=0, c=0):
    res = u + d * 10 + c * 100
    return res


Ovviamente la variabile res è ridondante si possono (tranne eventualmente per i debug) unire le righe 2 e 3 nella seguente return u + d * 10 + c * 100. Anzi c'è un'unica istruzione e --volendo-- potrei scrivere udc = lambda u, d, c : u + d * 10 + c * 100. Ma no perché i parametri hanno valori di default. (C'è anche un altro motivo, non tutti usano (già) la notazione lambda, argomento da riparlarne in futuro (forse).)

Avendo valori predefiniti per i parametri posso usare la funzione diversi modi, eccone qualcuno:

>>> udc(1, 2, 3)
321
>>> udc(1, 2)
21
>>> udc(1)
1
>>> udc()
0
>>> udc(c=8)
800
>>> udc(c=8, d=4)
840


Tutto chiaro, vero?
  • chiamando la funzione con tutti gli argomenti si ha il risultato usuale;
  • passando un numero di argomenti minore di quelli dichiarati nella definizione questi vengono assegnati da sinistra;
  • posso anche chiamare la funzione senza argomenti;
  • posso chiamare la funzione con gli argomenti con nome.
Forse è inutile ricordare che in questo caso diventa ancora più importante dare nomi significativi alle variabili, ma lo sappiamo da sempre, vero?

I nomi dei parametri vengono riconosciuti solo nella chiamata alla funzione, se ho la variabile d e la uso per la chiamata è (ovviamente) solo un valore:

>>> d = 7
>>> udc(d)
7


risultato diverso da

>>> udc(d=7)
70


Ancora una cosa (ovvia): se uso nomi quelli devono essere:

>>> udc(k=5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: udc() got an unexpected keyword argument 'k'


OT
: mi fanno notare che uso convenzioni mie non universali; per esempio è normale scrivere udc ( c = 7, d = 2 ), dipende dai gusti, secondo me è meno leggibile. Vale anche (e a volte serve) passare un argomento per riga:

>>> udc(d = 7,
...     c = 2)
270

🔴

Nessun commento:

Posta un commento