
Questo articolo descrive come definire e chiamare (eseguire) funzioni in Python.
- Nozioni di base sulla definizione di funzioni e chiamate in Python
- Argomenti posizionali e di parole chiave
- Argomento posizionale
- Argomento della parola chiave
- Argomento posizionale/solo parola chiave
- Argomento predefinito
- Argomento a lunghezza variabile
- *args: riceve più argomenti come una tupla
- **kwargs: ricevi più argomenti di parole chiave come dizionario
- Decomprimere elenchi e dizionari
- Valore di ritorno
- Nozioni di base sul ritorno
- Funzione per restituire Nessuno
- Specificare più valori restituiti
Vedere l’articolo seguente per le espressioni lambda usate per creare funzioni anonime.
La documentazione ufficiale per la definizione della funzione è:
Nozioni di base sulla definizione di funzioni e chiamate in Python
In Python, le funzioni sono definite con le istruzioni def. I parametri sono specificati tra parentesi () e il valore restituito è specificato con ritorno.
def function_name(param1, param2...):
do_something
return return_value
Quando si chiama la funzione definita, scrivere come segue:
function_name(arg1, arg2...)
Esempio:
def add(a, b):
x = a + b
return x
x = add(3, 4)
print(x)
# 7
I parametri ei valori restituiti tramite possono essere omessi se non sono necessari.
def hello():
print('Hello')
hello()
# Hello
I dettagli sugli argomenti e sui valori restituiti sono descritti di seguito.
Si noti che mentre si consiglia di lasciare due righe prima e dopo il blocco nello def standard di codifica Python PEP8, nel codice di esempio lasciata solo una riga per viene comodità.
Argomenti posizionali e di parole chiave
I parametri sono definiti separandoli con virgole tra parentesi di function_name(). L’esempio è una semplice funzione che spiega gli argomenti come sono così, utilizzando la stringa f.
def func(a, b, c):
print(f'a={a}, b={b}, c={c}')
Argomento posizionale
Quando si chiama, specificare i valori nell’ordine definito.
func(1, 10, 100)
# a=1, b=10, c=100
Se il numero di valori specificato alla chiamata di funzione non corrisponde al numero di parametri alla definizione della funzione, si verificherà TypeError.
# func(1)
# TypeError: func() missing 2 required positional arguments: 'b' and 'c'
# func(1, 10, 100, 1000)
# TypeError: func() takes 3 positional arguments but 4 were given
Argomento della parola chiave
È possibile specificare un valore come nome_parametro=valore quando si chiama una funzione. In questo caso, possono essere specificati in qualsiasi ordine.
func(b=10, c=100, a=1)
# a=1, b=10, c=100
Non tutti gli argomenti devono essere specificati da parole chiave. Puoi specificare per posizione e poi per parola chiave. Tuttavia, dopo aver specificato dalle parole chiave, tutti gli argomenti devono essere specificati dalle parole chiave.
func(1, c=100, b=10)
# a=1, b=10, c=100
# func(a=1, 10, 100)
# SyntaxError: positional argument follows keyword argument
Argomento posizionale/solo parola chiave
Argomento solo posizionale (Python 3.8 o successivo)
Se / viene utilizzato come parametro durante la definizione di una funzione, il parametro prima di / viene definito come solo posizionale.
I parametri solo posizionali non possono essere passati per parola chiave. I parametri che seguono la / possono essere passati per parola chiave.
def func_pos_only(a, b, /, c):
print(f'a={a}, b={b}, c={c}')
# func_pos_only(a=1, b=10, c=100)
# TypeError: func_pos_only() got some positional-only arguments passed as keyword arguments: 'a, b'
func_pos_only(1, 10, 100)
# a=1, b=10, c=100
func_pos_only(1, 10, c=100)
# a=1, b=10, c=100
Se si definisce una funzione con / alla fine, come func(a, b, c, /), tutti i parametri sono solo posizionali.
Il parametro solo posizionale che utilizza / è introdotto in Python 3.8 e non è disponibile nelle versioni precedenti.
Argomento solo parola chiave
Se * viene utilizzato come parametro durante la definizione di una definizione, il parametro dopo * viene come solo parola chiave.
I parametri specifici della parola chiave devono essere specificati per parola chiave. I parametri prima di * possono essere specificati per posizione o parola chiave.
def func_kw_only(a, b, *, c):
print(f'a={a}, b={b}, c={c}')
# func_kw_only(1, 10, 100)
# TypeError: func_kw_only() takes 2 positional arguments but 3 were given
func_kw_only(1, 10, c=100)
# a=1, b=10, c=100
func_kw_only(1, c=100, b=10)
# a=1, b=10, c=100
Se si definisce una funzione con * all’inizio, come func(*, a, b, c), tutti i parametri sono solo parole chiave.
Argomento solo posizionale e argomento solo parola chiave
È possibile utilizzare / e * contemporaneamente. I parametri prima di / sono solo posizione ei parametri dopo * sono solo parole chiave. I parametri tra / e * possono essere posizionali o parole chiave.
def func_pos_kw_only(a, /, b, *, c):
print(f'a={a}, b={b}, c={c}')
# func_pos_kw_only(1, 10, 100)
# TypeError: func_pos_kw_only() takes 2 positional arguments but 3 were given
# func_pos_kw_only(a=1, b=10, c=100)
# TypeError: func_pos_kw_only() got some positional-only arguments passed as keyword arguments: 'a'
func_pos_kw_only(1, 10, c=100)
# a=1, b=10, c=100
func_pos_kw_only(1, c=100, b=10)
# a=1, b=10, c=100
Non puoi usare / prima di *.
# def func_pos_kw_only(a, *, b, /, c):
# print(f'a={a}, b={b}, c={c}')
# SyntaxError: invalid syntax
Argomento predefinito
Il valore predefinito del parametro può essere definitondo nome_parametro=valore_predefinito alla definizione della funzione.
Se è impostato il valore predefinito, è possibile omettere l’argomento quando si chiama la funzione. Naturalmente, se si specifica un altro valore, verrà utilizzato tale valore.
def func_default(a, b, c=100):
print(f'a={a}, b={b}, c={c}')
func_default(1, 10)
# a=1, b=10, c=100
func_default(1, 10, 200)
# a=1, b=10, c=200
L’inserimento di un parametro predefinito prima di un parametro ordinario (parametri senza un valore predefinito) alla definizione della funzione provoca un SyntaxError.
# def func_default(a=1, b, c=100):
# print(f'a={a}, b={b}, c={c}')
# SyntaxError: non-default argument follows default argument
Si noti che se si utilizza un oggetto mutabile come un elenco o un dizionario come valori predefiniti, gli stessi oggetti verranno sempre utilizzati quando si chiama una funzione. Vedere il seguente articolo per i dettagli.
Argomento a lunghezza variabile
Se aggiungi * e ai nomi dei parametri durante la definizione di una funzione, diventa un parametro a lunghezza variabile ed è possibile specificare un numero qualsiasi di quando si chiama una funzione.
Per convenzione, i nomi *args e **kwargs sono spesso usati, ma fintanto che * e ** sono intestati, non ci sono problemi con altri nomi.
*args: riceve più argomenti come una tupla
Se metti * all’inizio del nome, saranno ricevuti più argomenti come una tupla.
def func_args(*args):
print(args)
func_args(1, 10)
# (1, 10)
func_args(1, 10, 100, 1000)
# (1, 10, 100, 1000)
**kwargs: ricevi più argomenti di parole chiave come dizionario
Vedi inserire ** all’inizio del nome, verranno ricevuti più argomenti di parole chiave come un dizionario (dict).
def func_kwargs(**kwargs):
print(kwargs)
func_kwargs(a=1, b=10)
# {'a': 1, 'b': 10}
func_kwargs(c=1, b=10, d=1000, a=100)
# {'c': 1, 'b': 10, 'd': 1000, 'a': 100}
Fai attenzione all’ordine quando combini con argomenti posizionali o combini con *args e **kwargs. Vedere il seguente articolo per i dettagli.
Decomprimere elenchi, tuple e dizionari
Decomprimere elenchi o tupla
Se si aggiunge * a un elenco oa una tupla quando si chiama una funzione, gli elementi vengono decompressi e specificati come argomenti posizionali. TypeError viene generato se il numero di elementi e il numero di argomenti non corrispondenti.
def func(a, b, c):
print(f'a={a}, b={b}, c={c}')
l = [1, 10, 100]
func(*l)
# a=1, b=10, c=100
l = [1, 10]
# func(*l)
# TypeError: func() missing 1 required positional argument: 'c'
Disimballare i dizionari
Se si aggiunge ** al dizionario quando si chiama una funzione, le sue chiavi e valori vengono decompressi come nomi e valori degli argomenti e specificati come argomenti di parole chiave. Se non ci sono chiavi sufficienti per corrispondere al nome dell’argomento, o se ci sono che non sono corrispondenti, viene generato TypeErro.
d = {'a': 1, 'b': 10, 'c': 100}
func(**d)
# a=1, b=10, c=100
d = {'a': 1, 'b': 10, 'x': 100}
# func(**d)
# TypeError: func() got an unexpected keyword argument 'x'
Per ulteriori informazioni, vedere il seguente articolo.
Valore di ritorno
Nozioni di base sul ritorno
Il valore di ritorno della funzione è specificato dall’istruzione return.
def func_return(a, b):
return a + b
x = func_return(3, 4)
print(x)
# 7
print(type(x))
# <class 'int'>
Il tipo di valore restituito dipende dal tipo di argomento e dall’elaborazione dalla funzione.
x = func_return(0.3, 0.4)
print(x)
# 0.7
print(type(x))
# <class 'float'>
Funzione per restituire Nessuno
ritorno non è obbligatorio in una funzione e può essere omesso se non è necessario restituire un valore.
Una funzione che omette return restituisce Nessuno. Nell’esempio seguente viene utilizzato perché viene generato un errore se non viene scritto nulla nel blocco def.
def func_none():
# do something
pass
x = func_none()
print(x)
# None
Se si omette il valore dopo la restituzione, viene restituito nessuno.
def func_none2():
return
x = func_none2()
print(x)
# None
Ovviamente puoi scrivere obbligatoriamente return None.
def func_none3():
return None
x = func_none3()
print(x)
# None
Specificare più valori restituiti
Specificando più valori separati da virgole dopo il ritorno restituirà una tupla.
def func_return_multi(a, b):
return a + b, a * b, a / b
x = func_return_multi(3, 4)
print(x)
# (7, 12, 0.75)
print(type(x))
# <class 'tuple'>
È possibile decomprimere ogni valore e assegnarlo a ciascuna variabile.
x, y, z = func_return_multi(3, 4)
print(x)
# 7
print(y)
# 12
print(z)
# 0.75
