Skip to content

Definire e chiamare funzioni in Python (def, return)

Python

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