Incrementare le funzionalità di base tramite le librerie#
Tutti i programmi esistenti, dai videogiochi, ai modelli di intelligenza artificiali, possono essere implementati utilizzando le funzionalità viste fino ad ora. Ma per farlo, oltre ad una conoscenza dettagliata di tutti gli aspetti che compongono tali software, sarebbe necessario scrivere un programma gigantesco, composto da milioni di righe di codice.
Per evitare che chiunque voglia intraprendere un progetto complesso in Python debba riscriversi da zero tutte le funzioni di base, negli anni sono stati implementati una serie di pacchetti di funzioni, ciascuno contenente delle specifiche funzionalità. Quando ce ne fosse bisogno, è quindi possibile caricare in memoria tali pacchetti, così da avere a disposizione tutta una gamma di funzioni in grado di aiutarci a risolvere il nostro problema.
Pacchetti built-in
#
La maggior parte dei pacchetti che implementano funzioni genericamente utili, sono built-in
, ovvero possono essere richiamate direttamente da Python, senza dover scaricare nulla di extra.
Per caricare in memoria una libreria built-in
, basta semplicemente utilizzare il comando import NOME_LIBRERIA
. Per convenzione, il caricamento delle librerie viene sempre fatto come prima cosa, all’interno del proprio script di codice.
Vediamo ad esempio le librerie built-in
random
e math
, che implementano funzioni per lavorare con estrazioni casuali e tutte le funzioni matematiche di base, rispettivamente.
# Importiamo le librerie random e math
import random
import math
Per richiamare una funzione di libreria, è necessario indicare il nome della funzione, preceduto dal nome della libreria che lo contiene, separati da un .
.
# Estriamo un numero casuale tra 0 e 1
x = random.random() # La funzione random() del pacchetto random,
# estrae un numero in (0, 1)
# Calcoliamo y = e^x
y = math.exp(x)
print(f"e^{x:0.3f} = {y:0.3f}.")
e^0.773 = 2.167.
Importare una libreria con renaming#
Quando all’interno di uno stesso codice è necessario utilizzare varie volte una stessa libreria, scrivere tutte le volte il nome della libreria prima delle funzioni può diventare inefficiente, specialmente se il nome della libreria è lungo.
Per risolvere questo problema, Python introduce la possibilità di dare un nome personalizzato alla libreria importata, così da renderla più semplice da utilizzare nei riferimenti delle funzioni.
Vediamo ad esempio come importare la libreria random
, chiamandola con il nome personalizzato rnd
.
import random as rnd
# Genero un numero casuale
x = rnd.random()
print(x)
0.4807141157196192
Se invece abbiamo intenzione di utilizzare la libreria con molta frequenza, Python offre anche la possibilità di integrare le funzioni di libreria con il linguaggio Python base, in maniera da poterle utilizzare senza dover utilizzare alcun riferimento per utilizzarne le funzioni.
Warning
Se la libreria contiene una funzione che ha lo stesso nome di un’altra funzione di Python, questo procedimento andrà a sovrascrivere la funzione originale. Quindi, utilizzare questa funzione con cautela.
from random import *
from math import *
# Genero un numero casuale
x = random()
y = asin(x)
print(y)
0.3609837284570607
Un’altra funzionalità interessante utilizzabile quando si va ad importare una libreria in uno script Python, è la possibilità di importare non l’intera libreria, ma solo alcune funzioni specifiche in modo da ridurre il tempo richiesto per il caricamento della libreria stessa.
Vediamo ad esempio come importare le funzioni seno, coseno e tangente dalla libreria math
, senza importare l’intera libreria.
from math import sin, cos, tan
from random import *
# Genero un numero casuale
x = random()
y = sin(x) # Importata
Moduli definiti dall’utente#
Chiaramente, è assolutamente possibile scrivere una propria libreria, ovvero una propria collezione di funzioni, che possono essere d’aiuto per sviluppare progetti più complessi. Anzi, ogni progetto che si rispetti implementa dei moduli personalizzati di funzioni che migliorano la lettura del codice, dislocando le funzionalità in più file, ciascuno contenente delle specifiche funzioni.
Supponiamo ad esempio di scrivere un paio di funzioni di utilità per un programma di contabilità: una che prende in input un prezzo di EUR e lo converte in USD con un certo cambio (di default il cambio attuale di 1 EUR = 1.10 USD), l’altro che viceversa converte un prezzo in USD, in EUR.
def eur_to_usd(prezzo: float, tasso: float = 1.10) -> float:
r"""
Preso in input il prezzo in EUR e il tasso di cambio, lo converte in USD
e ritorna tale valore.
Parameters:
prezzo (float): il prezzo in euro.
tasso (float): il tasso di cambio da EUR in USD.
Returns:
(float): il prezzo in dollari.
"""
return prezzo * tasso
def usd_to_eur(prezzo: float, tasso: float = 0.91) -> float:
r"""
Preso in input il prezzo in USD e il tasso di cambio, lo converte in EUR
e ritorna tale valore.
Parameters:
prezzo (float): il prezzo in dollari.
tasso (float): il tasso di cambio da USD in EUR.
Returns:
(float): il prezzo in euro.
"""
return prezzo * tasso
E supponiamo di salvare il file con queste funzioni all’interno della cartella del progetto, chiamandolo conversioni.py
.
A questo punto, è possibile importare queste funzioni in un’altro script per poterle utilizzare in un qualunque programma, semplicemente facendo:
import conversioni
# Prezzo in euro
prezzo_EUR = 550
prezzo_USD = conversioni.eur_to_usd(prezzo_EUR)
o, se il file conversioni.py
si trova all’interno di una cartella utilita
:
from utilita import conversioni
# Prezzo in euro
prezzo_EUR = 550
prezzo_USD = conversioni.eur_to_usd(prezzo_EUR)
pip
e conda
#
Quando si lavora con funzioni più specifiche o di uso meno comune, quasi sicuramente non sarà disponibile una libreria built-in
che implementa tali funzionalità. In tal caso, è possibile attingere dalla quasi infinita lista di librerie disponibili online, pensate per svolgere pressoché qualuqune compito.
Per scaricare ed installare sul proprio environment virtuale una libreria specifica, è possibile utilizzare uno dei due più comuni package-manager
ad oggi: pip
e conda
. Il loro funzionamento è molto simile: in generale, su pip
sono disponibili molte più librerie, ma spesso si vengono a generare dei conflitti (poiché pip
non ha un controllo sulle incompatibilità tra versioni), mentre su conda
sono disponibili meno librerie, ma si occupa lui di gestire la compatibilità tra le versioni delle librerie.
In ogni caso, per installare una libreria con pip
, posizionarsi sul virtual environment corretto con il comando:
conda activate <nome_environment>
E poi lanciare il comando:
pip install <nome_libreria>
Similmente, per installare una libreria tramite conda
, il comando in genere è:
conda install <nome_libreria>
tranne per alcune librerie, che hanno dei comandi particolari per essere installate. Fare riferimento alla pagina di installazione della libreria per questi specifici casi.
Una volta installato una libreria, questa sarà disponibile nello stesso modo in cui lo sono le librerie built-in. Quindi, possono essere importate semplicemente con il comando:
import <nome_libreria>