Python
Python linguaggio di programmazione | |
---|---|
![]() | |
Autore | Python Software Foundation e Guido van Rossum |
Data di origine | 20 febbraio 1991 |
Ultima versione | 3.13.2 (4 febbraio 2025) e 3.14.0a6 (14 marzo 2025) |
Utilizzo | general-purpose, scripting |
Paradigmi | programmazione funzionale, programmazione orientata agli oggetti, dynamic programming, programmazione imperativa e programmazione multi-paradigma |
Tipizzazione | dinamica |
Influenzato da | ABC |
Ha influenzato | Boo, Cobra, CoffeeScript, D, F#, Go, Groovy, JavaScript, Julia, Ruby, Swift |
Implementazione di riferimento | |
Sistema operativo | Multipiattaforma |
Licenza | Python Software Foundation License |
Sito web | www.python.org/ |
Python è un linguaggio di programmazione ad alto livello, orientato a oggetti, adatto, tra gli altri usi, a sviluppare applicazioni distribuite, scripting, computazione numerica e system testing.
Ideato dall'olandese Guido van Rossum all'inizio degli anni novanta, è spesso paragonato a Ruby, Tcl, Perl, JavaScript, Visual Basic o Scheme[1]. Il nome fu scelto per la passione dello stesso inventore verso i Monty Python e per la loro serie televisiva Monty Python's Flying Circus[2].
Spesso è tra i primi linguaggi di programmazione a essere studiati dai neofiti, per la sua somiglianza a uno pseudo-codice, e di frequente viene usato per simulare la creazione di software grazie alla flessibilità di sperimentazione consentita, che permette al programmatore di organizzare le idee durante lo sviluppo, come per esempio il creare un gioco tramite Pygame oppure il back-end di un sito web tramite Flask o Django.
Python dispone anche di una sezione grafica, il modulo Python Turtle Graphics, che permette di applicare le righe di codici alla grafica.
Descrizione
[modifica | modifica wikitesto]È un linguaggio che ha tra i principali obiettivi: dinamicità, semplicità e flessibilità. Python è un linguaggio semplice poiché progettato per essere facilmente comprensibile fino ad includere alcuni elementi del linguaggio naturale. Flessibile perché si presta ad un ampio spettro di utilizzi grazie alle sue numerose librerie.[non chiaro]. Supporta multipli paradigmi di programmazione, tra cui quello a oggetti e quello funzionale.
Le caratteristiche più immediatamente riconoscibili di Python sono le variabili non tipizzate e l'uso dell'indentazione per la sintassi delle specifiche, al posto delle più comuni parentesi.
Altre caratteristiche distintive sono l'overloading di operatori e funzioni tramite delegati, la presenza di un ricco assortimento di tipi e funzioni di base e librerie standard, sintassi avanzate quali slicing e list comprehension.
Il controllo dei tipi è forte (strong typing) e viene eseguito a run-time (dynamic typing): una variabile è un contenitore a cui viene associata un'etichetta (il nome) che può essere associata a diversi contenitori anche di tipo diverso durante il suo tempo di vita. Fa parte di Python un sistema garbage collector per la liberazione e il recupero automatici della memoria con cui si lavora.
Python ha qualche somiglianza con Perl, ma i suoi progettisti hanno scelto una sintassi più essenziale e uniforme con l'obiettivo di migliorare la leggibilità del codice. Analogamente a Perl è classificato spesso come linguaggio di scripting, ma pur essendo utile per scrivere script di sistema, in alternativa per esempio a bash, la grande quantità di librerie disponibili e la facilità con cui il linguaggio permette di scrivere software modulare favoriscono anche lo sviluppo di applicazioni molto complesse.
Altre caratteristiche
[modifica | modifica wikitesto]

Sebbene Python venga in genere considerato e presentato come un linguaggio interpretato, in realtà il codice sorgente non viene convertito direttamente in linguaggio macchina, ma passa prima da una fase di pre-compilazione in bytecode, che viene quasi sempre riutilizzato dopo la prima esecuzione del programma, evitando così di dover reinterpretare ogni volta il sorgente e migliorando le prestazioni. Inoltre è possibile distribuire programmi Python direttamente in bytecode, saltando totalmente la fase di interpretazione da parte dell'utilizzatore finale e ottenendo programmi Python a sorgente chiuso[3].

Come il linguaggio Lisp e a differenza del Perl, l'interprete Python supporta anche un modo d'uso interattivo (REPL) attraverso cui è possibile inserire codice direttamente da un terminale, visualizzando immediatamente il risultato.
Inoltre l'interprete Python è contenuto nella libreria standard, perciò come in molti altri linguaggi interpretati è possibile far valutare stringhe arbitrarie nel contesto corrente. È possibile passare all'interprete anche un contesto completamente diverso, sotto forma di liste che contengono l'elenco dei simboli definiti.
Python dispone anche di un framework per lo unit testing che supporta lo sviluppo di test unitari automatici.
Prestazioni
[modifica | modifica wikitesto]Se paragonato ai linguaggi compilati statically typed, come ad esempio il C, la velocità di esecuzione non è uno dei punti di forza di Python[4], specie nel calcolo matematico. Inoltre, il programma si basa unicamente su un core, e il multithreading è presente al solo livello astratto. Esisteva un'estensione, Psyco [5], il cui sviluppo è terminato nel 2012, che era una sorta di compilatore JIT, in grado di velocizzare in modo notevole alcuni tipi di codice, specialmente l'implementazione di algoritmi, a scapito dell'aumento di memoria utilizzata. Un progetto attuale e attivamente sviluppato per migliorare le prestazioni del codice Python grazie a un compilatore JIT è PyPy[6].
Python permette di aggirare in modo facile l'ostacolo delle performance pure: è infatti relativamente semplice scrivere un'estensione in C o C++ e poi utilizzarla all'interno di Python, sfruttando così l'elevata velocità di un linguaggio compilato solo nelle parti in cui effettivamente serve e sfruttando invece la potenza e versatilità di Python per tutto il resto del software[7].
Implementazioni
[modifica | modifica wikitesto]- CPython: è l'implementazione di riferimento del linguaggio Python. Scritto in C e Python, è l'implementazione più usata in assoluto;[8]
- Jython: implementazione basata su Java;[9]
- IronPython: implementazione C# pensata per l'integrazione con l'ecosistema .NET;[10]
- PyS60: implementazione per Symbian OS;[11]
- PyPy: scritto in Python stesso. Ha tra i principali obiettivi la semplificazione dello sviluppo del linguaggio e la sua ottimizzazione in termini prestazionali[12];
Sintassi
[modifica | modifica wikitesto]Python è stato progettato in modo da risultare facilmente leggibile e scrivibile. Visivamente si presenta in modo lineare e pulito, con pochi costrutti sintattici rispetto ad altri linguaggi strutturati come per esempio C, Perl o Pascal.
Per esempio, Python ha solo due forme di ciclo: for
che itera sugli elementi di una lista o su un iteratore (equivalente al foreach
di Perl o PHP) e while
, che itera fintanto che l'espressione booleana specificata risulterà vera. In sostanza gli mancano i cicli in stile C come il for
, il do...while
e come l'until
del Pascal, ma tutti questi possono essere espressi con dei semplici equivalenti. Allo stesso modo ha solamente il costrutto if...elif...else
per le scelte condizionate e non possiede né switch
né goto
.
Indentazione
[modifica | modifica wikitesto]Un aspetto inusuale di Python è il metodo che usa per delimitare i blocchi di programma, che lo rende unico fra i linguaggi più diffusi.
Nei linguaggi derivati dall'ALGOL. come Pascal, C e Perl, i blocchi di codice sono indicati con parentesi oppure con parole chiave; per esempio il C e il Perl usano {}
mentre il Pascal usa begin
e end
. In questi linguaggi è solo una pura convenzione degli sviluppatori indentare (ovvero spostare verso destra rispetto al margine sinistro della pagina) il codice sorgente interno a un blocco, per migliorare la leggibilità del codice e chiarire la struttura del flusso di esecuzione.
Python, invece, deriva il suo sistema di indentazione dal meno noto linguaggio di programmazione Occam: invece di usare parentesi o parole chiave, usa l'indentazione stessa per indicare i blocchi nidificati, in congiunzione col carattere "due punti" (:
). L'indentazione si può ottenere sia con il carattere di tabulazione sia con un numero arbitrario di spazi, purché ovviamente si operi in modo congruente con la sintassi del linguaggio. L'esempio che segue chiarisce questo aspetto, mostrando la versione in C e in Python di funzioni per il calcolo del fattoriale di un numero intero.
Fattoriale in C
[modifica | modifica wikitesto]int fattoriale(int x) {
if (x == 0)
return 1;
else
return x * fattoriale(x-1);
}
Fattoriale in Python
[modifica | modifica wikitesto]def fattoriale(x):
if x == 0:
return 1
else:
return x * fattoriale(x-1)
All'inizio questo modo di indicare i blocchi e esprimere la sintassi può confondere le idee a chi viene da altri linguaggi, ma poi si rivela molto vantaggioso, perché risulta conciso e obbliga a scrivere sorgenti indentati correttamente, aumentando così la leggibilità del codice.
Lo svantaggio è che la gestione degli spazi e dei caratteri di tabulazione può essere diversa da un editor di testo all'altro, il che costringe a prestare attenzione nell'indentare il codice oppure ad affidarsi alle funzioni di indentazione automatica ormai presenti nella maggior parte degli editor di programmi. Può anche capitare di lavorare con editor di codice sorgente diversi, su vari computer, e ritrovarsi così con codice sorgente che usa in modo misto tabulazioni e spazi, accorgendosi dell'errore solo in fase di esecuzione.
Python permette anche alcune scorciatoie per scrivere una maggiore quantità di codice sulla stessa riga. Se i due punti (:
) danno il via a un blocco indentato di una sola istruzione, esso può essere scritto anche sulla stessa riga, preceduto da uno spazio.
if b > a: print("b is greater than a")
Sebbene decisamente poco apprezzabile per i puristi del linguaggio Python, è comunque possibile usare il "punto e virgola" (;
) come in grande parte dei linguaggi di programmazione per indicare che un'istruzione è conclusa, e cominciarne un'altra sulla stessa riga.
a = b + 10; print("Hello world"); b = 243 - 23;
Tipi di dati e strutture
[modifica | modifica wikitesto]
Essendo Python a tipizzazione dinamica, tutte le variabili sono, in realtà, puntatori a oggetto. Per esempio, se a una variabile è assegnato un valore numerico intero, subito dopo può essere assegnata una stringa o una lista. Gli oggetti sono invece dotati di tipo.
Python prevede un moderato controllo dei tipi al momento dell'esecuzione, ovvero run-time. I tipi numerici godono di conversione implicita, perciò è possibile, per esempio, moltiplicare un numero complesso per un intero. Non esiste invece conversione implicita tra numeri e stringhe alfanumeriche, perciò un numero è un argomento non valido per le operazioni su stringhe, a differenza di quanto avviene per esempio in linguaggio PHP.
Python dispone di vari modelli/librerie da utilizzare per fornire funzionalità senza dovere scrivere codice, come per esempio il modulo turtle graphics
[13] (per disegnare), copy
[14] (per creare copie di oggetti), random
[15] (per generare numeri casuali), sys
[16] (per interagire da riga di comandi con l'interprete) e time
(per operare con unità di tempo e date).
Python mette a disposizione un gran numero di tipi base, essenzialmente numerici e contenitori. Caratteristica distintiva è il supporto nativo, oltre che ai classici tipi quali interi, numeri in virgola mobile e stringhe alfanumeriche, anche a tipi più evoluti quali interi a grandezza arbitraria, numeri complessi, liste, insiemi e dizionari. Non è invece previsto un tipo specifico per i caratteri.
Molti altri tipi sono importabili da librerie standard e nuovi tipi possono essere creati attraverso le classi.
Tipi numerici
[modifica | modifica wikitesto]I tipi interi (int
) e floating point (float
) hanno una dimensione dipendente dall'hardware e dall'implementazione dell'interprete, in genere 32 e 64 bit. Sono previsti, in modo nativo, numeri interi arbitrariamente grandi (long
, che diventano l'opzione di default per gli interi a partire da Python 3.0) e numeri complessi (complex
).
Python prevede tutti i principali operatori logici e aritmetici fra numeri, compreso l'elevamento a potenza. Il tipo booleano (bool
) appartiene anch'esso alla categoria dei numeri.
Dalla versione 2.4 di Python sono disponibili come libreria[17] anche i numeri decimali (decimal
), ossia numeri in virgola mobile con precisione illimitata, come quelli disponibili in REXX o in Cobol, che non soffrono di problemi di arrotondamento e stabilità tipici dei numeri floating point classici.
Contenitori
[modifica | modifica wikitesto]Python considera in generale come contenitori gli oggetti che prevedono la possibilità di iterare su un insieme di elementi, perciò utilizzabili all'interno di contesti quali il ciclo for
e funzioni quali somma, ricerca e ordinamento. I contenitori in genere permettono di contenere dati di tipo eterogeneo.
Per quanto riguarda i contenitori standard propriamente detti, sono classificabili come sequenze, insiemi e dizionari. I contenitori seguono una filosofia comune e condividono gran parte dei metodi.
Le sequenze sono contenitori ordinati, che condividono metodi basati sull'ordinamento, l'indicizzazione intera e la creazione di sottosequenze tramite slicing.
Le liste (list
) sono sequenze estendibili, mentre le tuple (tuple
) sono sequenze immutabili. Anche le stringhe alfanumeriche (str
e unicode
) sono considerate sequenze. A partire da Python 3.0, i tipi str
e unicode
sono unificati e compare il tipo byte
, equivalente grosso modo a una stringa binaria.
Sono previste tutte le operazioni classiche sulle stringhe come concatenamento, formattazione, ricerca, sostituzione e così via. Le stringhe in Python sono sequenze immutabili, cosicché qualsiasi operazione che in qualche modo potrebbe alterare una stringa, per esempio la sostituzione di un carattere, restituisce in effetti una nuova stringa, come avviene in Java e in C#.
Altri contenitori sono i dizionari (dict
), conosciuti in altri contesti con il nome di hash table oppure array associativi. Esiste una sintassi per la creazione di dizionari, i cui elementi sono specificati da una coppia di dati separati da due punti :
. Il primo elemento della coppia rappresenta l'indice, detto "chiave", e il secondo è il suo valore corrispondente. Infatti ogni elemento di un dizionario è detto anche coppia chiave-valore.
Per esempio l'istruzione seguente crea un dizionario identificato come diz
composto da due elementi le cui chiavi sono wikipedia
e wikiquote
, rispettivamente e con associati i valori interi 40
e 60
:
diz = {'wikipedia': 40, 'wikiquote': 60}
Le chiavi in un dizionario sono immutabili, mentre il valore corrispondente a ciascuna chiave è alterabile tramite un'assegnazione. La seguente istruzione modifica il valore corrispondente a wikipedia
, portandolo a 4500:
diz['wikipedia'] = 4500
A partire dalla versione 2.7 di Python[18] sono supportati anche gli insiemi (set
e frozenset
), ovvero insiemi non ordinati di oggetti hashable.
Organizzazione a oggetti
[modifica | modifica wikitesto]Il sistema dei tipi Python è ben integrato con il sistema delle classi. Anche se i tipi base non sono formalmente classi, come per esempio in C#, una classe può comunque ereditare da essi. In questo modo è possibile estendere stringhe, dizionari e perfino gli interi. È inoltre supportata l'ereditarietà multipla.[19]
Vengono supportate anche funzionalità estensive di introspezione sui tipi e sulle classi. I tipi e le classi sono a loro volta oggetti che possono essere esplorati e confrontati. Gli attributi sono gestiti in un dizionario.