Python 3 - Funzioni

Una funzione è un blocco di codice organizzato e riutilizzabile che viene utilizzato per eseguire una singola azione correlata. Le funzioni forniscono una migliore modularità per la tua applicazione e un elevato grado di riutilizzo del codice.

Come già saprai, Python ti offre molte funzioni incorporate come print (), ecc. Ma puoi anche creare le tue funzioni. Queste funzioni sono chiamate funzioni definite dall'utente.

Definizione di una funzione

È possibile definire funzioni per fornire la funzionalità richiesta. Ecco semplici regole per definire una funzione in Python.

  • I blocchi funzione iniziano con la parola chiave def seguito dal nome della funzione e dalle parentesi (()).

  • Qualsiasi parametro o argomento di input deve essere inserito tra queste parentesi. È inoltre possibile definire parametri all'interno di queste parentesi.

  • La prima istruzione di una funzione può essere un'istruzione opzionale: la stringa di documentazione della funzione o docstring .

  • Il blocco di codice all'interno di ogni funzione inizia con due punti (:) ed è rientrato.

  • L'istruzione return [espressione] esce da una funzione, facoltativamente restituendo un'espressione al chiamante. Un'istruzione return senza argomenti è uguale a return None.

Sintassi

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

Per impostazione predefinita, i parametri hanno un comportamento posizionale ed è necessario informarli nello stesso ordine in cui sono stati definiti.

Esempio

La seguente funzione prende una stringa come parametro di input e la stampa sullo schermo standard.

def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

Chiamare una funzione

La definizione di una funzione le dà un nome, specifica i parametri che devono essere inclusi nella funzione e struttura i blocchi di codice.

Una volta finalizzata la struttura di base di una funzione, è possibile eseguirla richiamandola da un'altra funzione o direttamente dal prompt di Python. Di seguito è riportato un esempio per chiamare il fileprintme() funzione -

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")

Quando il codice sopra viene eseguito, produce il seguente risultato:

This is first call to the user defined function!
Again second call to the same function

Passa per riferimento vs valore

Tutti i parametri (argomenti) nel linguaggio Python vengono passati per riferimento. Significa che se si modifica ciò a cui si riferisce un parametro all'interno di una funzione, la modifica si riflette anche nella funzione chiamante. Ad esempio:

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   print ("Values inside the function before change: ", mylist)
   
   mylist[2]=50
   print ("Values inside the function after change: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

Qui, stiamo mantenendo il riferimento dell'oggetto passato e aggiungendo valori nello stesso oggetto. Pertanto, questo produrrebbe il seguente risultato:

Values inside the function before change:  [10, 20, 30]
Values inside the function after change:  [10, 20, 50]
Values outside the function:  [10, 20, 50]

C'è un altro esempio in cui l'argomento viene passato per riferimento e il riferimento viene sovrascritto all'interno della funzione chiamata.

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4] # This would assi new reference in mylist
   print ("Values inside the function: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

Il parametro mylistè locale per la funzione changeme. La modifica della mia lista all'interno della funzione non influisce sulla mia lista. La funzione non realizza nulla e alla fine questo produrrebbe il seguente risultato:

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Argomenti della funzione

È possibile chiamare una funzione utilizzando i seguenti tipi di argomenti formali:

  • Argomenti obbligatori
  • Argomenti delle parole chiave
  • Argomenti predefiniti
  • Argomenti a lunghezza variabile

Argomenti obbligatori

Gli argomenti obbligatori sono gli argomenti passati a una funzione nel corretto ordine posizionale. Qui, il numero di argomenti nella chiamata di funzione dovrebbe corrispondere esattamente alla definizione della funzione.

Per chiamare la funzione printme(), devi assolutamente passare un argomento, altrimenti restituisce un errore di sintassi come segue:

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme()

Quando il codice sopra viene eseguito, produce il seguente risultato:

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Argomenti delle parole chiave

Gli argomenti delle parole chiave sono correlati alle chiamate di funzione. Quando si utilizzano argomenti di parole chiave in una chiamata di funzione, il chiamante identifica gli argomenti in base al nome del parametro.

Ciò consente di saltare gli argomenti o di metterli fuori ordine perché l'interprete Python è in grado di utilizzare le parole chiave fornite per abbinare i valori ai parametri. Puoi anche effettuare chiamate con parole chiave al fileprintme() funzionare nei seguenti modi:

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme( str = "My string")

Quando il codice sopra viene eseguito, produce il seguente risultato:

My string

L'esempio seguente fornisce un'immagine più chiara. Notare che l'ordine dei parametri non ha importanza.

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )

Quando il codice sopra viene eseguito, produce il seguente risultato:

Name:  miki
Age  50

Argomenti predefiniti

Un argomento predefinito è un argomento che assume un valore predefinito se non viene fornito un valore nella chiamata di funzione per quell'argomento. L'esempio seguente fornisce un'idea sugli argomenti predefiniti, stampa l'età predefinita se non viene passata -

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )

Quando il codice sopra viene eseguito, produce il seguente risultato:

Name:  miki
Age  50
Name:  miki
Age  35

Argomenti a lunghezza variabile

Potrebbe essere necessario elaborare una funzione per più argomenti di quelli specificati durante la definizione della funzione. Questi argomenti sono chiamati argomenti di lunghezza variabile e non sono nominati nella definizione della funzione, a differenza degli argomenti obbligatori e predefiniti.

Di seguito viene fornita la sintassi per una funzione con argomenti variabili senza parole chiave:

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

Un asterisco (*) viene inserito prima del nome della variabile che contiene i valori di tutti gli argomenti della variabile non parola chiave. Questa tupla rimane vuota se non vengono specificati argomenti aggiuntivi durante la chiamata alla funzione. Di seguito è riportato un semplice esempio:

#!/usr/bin/python3

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print ("Output is: ")
   print (arg1)
   
   for var in vartuple:
      print (var)
   return

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

Quando il codice sopra viene eseguito, produce il seguente risultato:

Output is:
10
Output is:
70
60
50

Le funzioni anonime

Queste funzioni sono chiamate anonime perché non vengono dichiarate in modo standard utilizzando l'estensione defparola chiave. Puoi usare il filelambda parola chiave per creare piccole funzioni anonime.

  • I moduli Lambda possono accettare un numero qualsiasi di argomenti ma restituiscono un solo valore sotto forma di espressione. Non possono contenere comandi o più espressioni.

  • Una funzione anonima non può essere una chiamata diretta a print perché lambda richiede un'espressione.

  • Le funzioni Lambda hanno il proprio spazio dei nomi locale e non possono accedere a variabili diverse da quelle nel loro elenco di parametri e da quelle nello spazio dei nomi globale.

  • Sebbene sembri che i lambda siano una versione di una riga di una funzione, non sono equivalenti alle istruzioni inline in C o C ++, il cui scopo è quello di impilare l'allocazione passando la funzione, durante l'invocazione per motivi di prestazioni.

Sintassi

La sintassi di lambda funzioni contiene solo una singola istruzione, che è la seguente:

lambda [arg1 [,arg2,.....argn]]:expression

Di seguito è riportato un esempio per mostrare come lambda forma di funzione funziona -

#!/usr/bin/python3

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2

# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))

Quando il codice sopra viene eseguito, produce il seguente risultato:

Value of total :  30
Value of total :  40

La dichiarazione di ritorno

L'istruzione return [espressione] esce da una funzione, facoltativamente restituendo un'espressione al chiamante. Un'istruzione return senza argomenti è uguale a return None.

Tutti gli esempi forniti di seguito non restituiscono alcun valore. È possibile restituire un valore da una funzione come segue:

#!/usr/bin/python3

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print ("Inside the function : ", total)
   return total

# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )

Quando il codice sopra viene eseguito, produce il seguente risultato:

Inside the function :  30
Outside the function :  30

Ambito delle variabili

Tutte le variabili in un programma potrebbero non essere accessibili in tutte le posizioni in quel programma. Dipende da dove hai dichiarato una variabile.

L'ambito di una variabile determina la parte del programma in cui è possibile accedere a un particolare identificatore. Ci sono due ambiti di base delle variabili in Python:

  • Variabili globali
  • Variabili locali

Variabili globali e locali

Le variabili definite all'interno del corpo di una funzione hanno un ambito locale e quelle definite all'esterno hanno un ambito globale.

Ciò significa che è possibile accedere alle variabili locali solo all'interno della funzione in cui sono dichiarate, mentre è possibile accedere alle variabili globali in tutto il corpo del programma da tutte le funzioni. Quando chiamate una funzione, le variabili dichiarate al suo interno vengono portate nell'ambito. Di seguito è riportato un semplice esempio:

#!/usr/bin/python3

total = 0   # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print ("Inside the function local total : ", total)
   return total

# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )

Quando il codice sopra viene eseguito, produce il seguente risultato:

Inside the function local total :  30
Outside the function global total :  0