Python 2 vs Python 3: considerazioni pratiche

17 Agosto 2016 Python

Introduzione

Python è un linguaggio di programmazione estremamente leggibile e versatile. Con un nome ispirato al gruppo comico britannico Monty Python, rendere il linguaggio divertente da usare è stato un importante e fondamentale obiettivo del team di sviluppo di Python. Facile da installare e scritto in uno stile relativamente semplice con un feedback immediato sugli errori, Python è una ottima scelta per i principianti.

Visto che Python è un linguaggio multiparadigma, cioè che supporta molteplici stili di programmazione tra cui lo scripting e l’object-oriented, è ottimo per un utilizzo multiuso. Sempre più utilizzato nell’industria da organizzazioni come la United Space Alliance (il principale committente del supporto allo shuttle) e la Industrial Light & Magic (lo studio di animazione e VFX della Lucasfilm), Python offre un grande potenziale per coloro che cercano di aquisire un ulteriore linguaggio di programmazione.

Sviluppato alla fine del 1980 e pubblicato nel 1991, Python è stato scritto da Guido van Rossum, ancora molto attivo nella comunità. Concepito come un successore del linguaggio di programmazione ABC, la prima versione di Python includeva già la gestione delle eccezioni, le funzioni e le classi con ereditarietà. Quando nel 1994 fu costituito un importante newsgroup Usenet chiamato comp.lang.python, la base di utenti di Python è cresciuta, creando le premesse al fatto che Python sia diventato uno dei linguaggi di programmazione più popolari per lo sviluppo open source.

Panoramica generale

Prima di guardare ai potenziali vantaggi legati a Python 2 e Python 3 e alle loro fondamentali differenze concettuali, diamo uno sguardo alle basi delle recenti principali versioni di Python.

Python 2

Pubblicato alla fine del 2000, Python 2 ha espresso un processo di sviluppo del linguaggio più trasparente e completo rispetto alle versioni precedenti di Python tramite l’implementazione della PEP (Python Enhancement Proposal), una specifica tecnica che o fornisce delle informazioni ai membri della comunità Python oppure descrive una nuova funzionalità del linguaggio.

Inoltre, Python 2 include molte altre caratteristiche già previste tra cui un garbage collector in grado di rilevare cicli [di riferimenti alla memoria, NdT] per automatizzare la gestione della memoria, un migliore supporto Unicode per uniformare i caratteri e la list comprehension per creare una lista basata su liste esistenti. Con il continuo sviluppo di Python 2, sono state aggiunte altre funzionalità, tra cui l’unificazione dei tipi e delle classi di Python in una gerarchia (nella versione 2.2 di Python).

Python 3

Python 3 è ritenuto essere il futuro di Python ed è la versione del linguaggio che è attualmente in fase di sviluppo. Quale importante revisione, Python 3 è stato rilasciato alla fine del 2008 per affrontare e modificare i difetti di progettazione intrinsechi delle precedenti versioni del linguaggio. L’obiettivo dello sviluppo di Python 3 è stato quello di ripulire il codice base e rimuovere la ridondanza, mettendo in chiaro che c’è un solo modo per eseguire un determinato compito.

Le principali modifiche di Python 3.0 comprendono il cambiamento dell’istruzione print in una funzione built-in, il migliormento del modo in cui gli interi sono divisi e un maggiore supporto a Unicode.

In un primo momento Python 3 è stato adottato lentamente visto che il linguaggio non è retrocompatibile con Python 2, obbligando le persone a prendere una decisione su quale versione del linguaggio utilizzare. Inoltre molte librerie erano disponibili solo per Python 2, ma visto che il team di sviluppo di Python 3 ha ribadito che c’è un fine vita per il supporto a Python 2, sono state portate a Python 3 un numero maggiore di librerie. L’accresciuta adozione di Python 3 può essere dimostrata dal numero di pacchetti Python che attualmente forniscono il supporto a Python 3, che al momento della scrittura includono 339 dei 360 pacchetti Python più popolari.

Python 2.7

Successivamente al rilascio del Python 3.0 nel 2008 , Python 2.7 è stato pubblicato il 3 luglio 2010 e previsto come l’ultimo dei rilasci 2.x. L’intento di Python 2.7 è stato quello di rendere più facile per gli utenti Python 2.x l’effettuare il porting di certe caratteristiche verso Python 3, fornendo un certo grado di compatibilità tra i due. Questo supporto alla compatibilità include moduli avanzati per la versione 2.7 come unittest che supporta l’automazione dei test, argparse per fare il parsing delle opzioni della riga di comando e le più convenienti classi in collections.

A causa della condizione unica di Python 2.7 quale release intermedia tra le versioni precedenti di Python 2 e Python 3.0, continua ad essere una scelta molto popolare per i programmatori grazie alla sua compatibilità con molte solide librerie. Quando oggi si parla di Python 2, in genere ci riferiamo alla release 2.7 di Python come la versione più utilizzata.

Python 2.7, tuttavia, è considerato un linguaggio legacy e il suo costante sviluppo, che oggi consiste principalmente in correzioni di bug, cesserà completamente nel 2020.

Le differenze principali

Nonostante Python 2.7 e Python 3 condividano molte caratteristiche simili, non dovrebbero essere considerati come del tutto intercambiabili. Anche se è possibile scrivere del buon codice e programmi validi in entrambe le versioni, vale la pena di comprendere che ci saranno alcune significative differenze nella sintassi del codice e nella gestione.

Di seguito ci sono alcuni esempi, ma si dovrebbe tenere a mente che è probabile si riscontrino più differenze sintattiche continuando ad imparare Python.

Print

In Python 2, print viene trattato come una istruzione invece che una funzione, il che creava quella tipica perplessità come molte altre azioni in Python che, per essere eseguite, vogliono gli argomenti all’interno delle parentesi. Se si desidera che la console stampi

Sammy lo Squalo e' la mia creatura marina preferita

in Python 2 è possibile farlo con la seguente istruzione print:

print "Sammy lo Squalo e' la mia creatura marina preferita"

Con Python 3, print() è ora esplicitamente trattato come una funzione, in modo che stampare la stessa stringa precendete è possibile in modo semplice e facile utilizzando la sintassi di una funzione:

print("Sammy lo Squalo e' la mia creatura marina preferita")

Questo cambiamento ha reso la sintassi di Python più coerente e anche reso più facile passare tra differenti funzioni print. Per comodità, la sintassi di print() è anche retrocompatibile con Python 2.7, in modo che la funzione print() di Python 3 possa essere eseguita in entrambe le versioni.

Divisione con numeri interi

In Python 2 qualsiasi numero che si scrive senza cifre decimali viene considerato come il tipo di dato chiamato intero. Mentre a prima vista ciò sembra un modo semplice per gestire i tipi di dati, quando si tenta di dividere gli interi assieme a volte ci si aspetta di ottenere un output con cifre decimali (chiamato float), come in:

5 / 2 = 2.5

Tuttavia, in Python 2 i numeri interi sono stati fortemente tipizzati e non cambierebbero in un float con cifre decimali, anche nei casi in cui ciò sarebbe intuitivo.

Quando i due numeri su entrambi i lati del simbolo della divisione / sono numeri interi, Python 2 fa una divisione floor di modo che per il quoziente x il numero restituito sia il massimo intero minore o uguale a x . Questo significa che quando si scrive 5 / 2 per dividere i due numeri, Python 2.7 restituisce il più grande intero minore o uguale a 2.5, in questo caso 2 :

a = 5 / 2
print a

Output

2

Per aggirare questa situazione, si potrebbero aggiungere delle cifre decimali come in 5.0 / 2.0 per ottenere la risposta attesa 2.5.

In Python 3 la divisione intera è diventata più intuitiva, come in:

a = 5 / 2
print(a)

Output

2.5

È comunque possibile utilizzare 5.0 / 2.0 per restituire 2.5 , ma se si vuole fare la divisione floor si dovrà usare la sintassi // di Python 3 in questo modo:

b = 5 // 2
print(b)

Output

2

Questa modifica in Python 3 ha reso la divisione degli interi molto più intuitiva ed è una caratteristica che non è retrocompatibile con Python 2.7.

Supporto Unicode

Quando i linguaggi di programmazione gestiscono il tipo stringa, cioè una sequenza di caratteri, possono farlo in diverse maniere di modo che i computer possano convertire i numeri in lettere ed altri simboli.

Di default Python 2 utilizza l’alfabeto ASCII in modo che quando si digita "Hello, Sammy!" Python 2 gestirà la stringa come ASCII. Limitato ad un paio di centinaia di caratteri nella migliore delle ipotesi, in varie forme estese, ASCII non è un metodo molto flessibile per la codifica dei caratteri, in particolare di caratteri non inglesi.

Per utilizzare Unicode, una codifica dei caratteri più versatile e robusta che supporta oltre 128.000 caratteri oltre a caratteri contemporanei e storici ed insiemi di simboli, si dovrà digitare u"Hello, Sammy!", con la u prefissa che sta per Unicode.

Python 3 utilizza Unicode di default, che consente ai programmatori di risparmiare ulteriore tempo di sviluppo e che permette di scrivere e visualizzare facilmente molti più caratteri direttamente nel programma. Dato che Unicode supporta una maggiore diversità linguistica dei caratteri come la visualizzazione di emoji, usandolo come codifica di default dei caratteri garantisce che i dispositivi mobili di tutto il mondo sono agevolmente supportati nello sviluppo dei progetti.

Se volete però che il vostro codice Python 3 sia retrocompatibile con Python 2, potete mantenere la u prima della stringa.

Proseguimento dello sviluppo

La più grande differenza tra Python 3 e Python 2 non è sintattica, ma il fatto che Python 2.7 cesserà di avere un supporto continuativo nel 2020 e Python 3 continuerà ad essere sviluppato, con più funzionalità e più bugfix.

I recenti sviluppi includono le stringhe letterali formattate [quelle tra apici, doppi apici, etc, NdT], una più semplice personalizzazione nella creazione delle classi ed un modo più sintatticamente pulito per gestire la moltiplicazione delle matrici.

Il continuo sviluppo di Python 3 fa sì che gli sviluppatori possano contare sulla risoluzione dei  problemi in modo tempestivo ed i programmi possano essere più efficienti e con maggiori funzionalità rispetto al passato.

Ulteriori punti da considerare

Sia che siate una persona che inizia Python come programmatore principiante o come un programmatore esperto ma nuovo al linguaggio Python, vorrete prendere in considerazione ciò che sperate di raggiungere nell’imparare un linguaggio.

Se sperate solo di imparare senza avere un progetto in mente, è più probabile che vogliate prendere in considerazione il fatto che Python 3 continui ad essere sostenuto e sviluppato, mentre Python 2.7 no.

Se invece avete intenzione di partecipare ad un progetto esistente, è più probabile che vogliate vedere quale versione di Python sta usando il team, in che modo una versione differente possa interagire con il codice legacy, se i pacchetti usati nel progetto sono supportati in un diversa versione e quali sono i dettagli di implementazione del progetto.

Se state iniziando un progetto che avete in mente, varrebbe la pena di indagare su quali pacchetti possono essere usati e con quale versione di Python sono compatibili. Come già osservato, anche se le versioni precedenti di Python 3 avevano meno compatibilità con le librerie create per le versioni di Python 2, in molti hanno fatto il porting verso Python 3 o si sono impegnati a farlo nei prossimi quattro anni.

Conclusioni

Python è un linguaggio di programmazione ben documentato e versatile da imparare e sia che scegliate di lavorare con Python 2 o con Python 3 sarete in grado di lavorare su progetti software interessanti.

Anche se ci sono diverse fondamentali differenze, non è troppo difficile passare da Python 3 a Python 2 con poche modifiche e troverete che spesso Python 2.7 può facilmente eseguire codice Python 3, soprattutto quando si è agli inizi.

È importante tenere a mente che, quanto più lo sviluppo e l’attenzione della comunità si focalizzeranno su Python 3, il linguaggio migliorerà sempre di più e sarà più in linea con le esigenze in continua evoluzione dei programmatori e sarà dato meno supporto a Python 2.7.

Autrice: Lisa Tagliaferri

Traduzione dell’articolo: https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2 Copyright © 2016 DigitalOcean™ Inc.

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *