Python è un linguaggio di programmazione altamente versatile e interpretato, di alto livello e di uso generale. È stato creato da Guido van Rossum e rilasciato per la prima volta nel 1991. La filosofia di progettazione di Python enfatizza la leggibilità del codice e la facilità d’uso. Da allora, Python è cresciuto in popolarità ed è una scelta eccellente nello scripting e nello sviluppo rapido di applicazioni.

Molte applicazioni legacy sono ancora scritte in Python 2. Le aziende che affrontano una migrazione a Python 3 richiedono la conoscenza delle differenze sia nella sintassi che nel comportamento. Lo scopo di questo articolo è di delineare le differenze tra Python 2 e Python 3. Con esempi, vedrete come le funzioni sembrano sintatticamente le stesse in una versione ma si comportano in modo completamente diverso in un’altra versione.

La versione di Python più usata

La versione più recente di Python è la 3.7, rilasciata nel 2018. La prossima versione 3.8 è attualmente in sviluppo e sarà rilasciata nel 2024. Anche se Python 2.7 è ancora ampiamente utilizzato. L’adozione di Python 3 sta crescendo rapidamente. Nel 2016, il 71,9% dei progetti usava Python 2.7, ma nel 2017, era sceso al 63,7%.

Quale versione dovrei usare?

A seconda di quali sono le tue esigenze e cosa vuoi fare, scegli la versione che ti aiuterà di più. Se puoi fare esattamente quello che vuoi con Python 3.x allora ottimo! Ci sono comunque alcuni lati negativi come:

  • Supporto librerie leggermente peggiore
  • Alcune distribuzioni Linux e Mac attuali usano ancora la 2.x come default

Finché Python 3..x è installato sui computer dei vostri utenti (che nella maggior parte dei casi lo sono perché la maggior parte delle persone che leggono questo articolo stanno sviluppando qualcosa per se stessi o su un ambiente che controllano) e state scrivendo cose dove sapete che nessuno dei moduli Python 2.x è necessario, è una scelta eccellente. Inoltre la maggior parte delle distribuzioni Linux hanno già installato Python 3.x e quasi tutte lo hanno disponibile per gli utenti finali. Un avvertimento può essere se Red Hat Enterprise Linux (fino alla versione 7) dove Python 3 esiste nel repository EPEL, ma ad alcuni utenti potrebbe non essere permesso di installare nulla da posizioni add-on o da posizioni non sicure. Inoltre alcune distribuzioni stanno gradualmente eliminando Python 2 come installazione di default.

Gli istruttori dovrebbero introdurre Python 3 ai nuovi programmatori, ma discutendo le differenze di Python 2.

Evitate di iniziare qualsiasi nuovo sviluppo in Python 2 perché a partire da gennaio 2020, Python 2 sarà EOL (“End of Life”) il che significa che tutto il supporto ufficiale cesserà.

Qual è la differenza tra Python 2 e 3?

La differenza principale è che alcune cose dovranno essere importate da posti diversi per gestire il fatto che hanno nomi diversi in Python 2 e Python 3. Di conseguenza, il pacchetto sei compatibilità è un’utilità chiave per supportare Python 2 e Python 3 in un unico codice base.

Discuteremo le principali differenze in ogni sezione di questo articolo e forniremo esempi di schermate della console sia in Python 2 che in Python 3.

Librerie: Python 2 vs Python 3

Dal punto di vista delle librerie, le librerie sono enormemente diverse in Python 2 vs Python 3. Molte librerie sviluppate per Python 2 non sono compatibili in Python 3. Gli sviluppatori delle librerie usate in Python 3 hanno buoni standard e hanno migliorato le librerie di Machine Learning e Deep Learning.

Divisione intere in Python 2 e 3

La divisione intere è la divisione di due numeri meno la parte frazionaria. In Python 2, si ottiene esattamente ciò che la divisione di interi è stata definita per fare.

Esempio 1. Divisione di interi in Python 2.

Nella schermata della console qui sotto, si vede la divisione di due interi. Anche il risultato in Python 2 è un intero. Manca la parte frazionaria.

Esempio 2. Divisione di interi in Python 3.

Nella schermata della console qui sotto, si vede la divisione di due interi in Python 3. Il risultato è un numero in virgola mobile che include la parte frazionaria che manca in Python 2.

Se la parte frazionaria è richiesta in Python 2, potete specificare uno degli interi che state dividendo come un numero in virgola mobile. In questo modo, si forza il risultato ad essere un numero in virgola mobile.

Sintassi della dichiarazione di stampa Python 2 vs 3

In Python 2, print è una dichiarazione che prende una serie di argomenti. Stampa gli argomenti con uno spazio in mezzo. In Python 3, print è una funzione che prende anche un numero di argomenti.

Esempio 3. Dichiarazione di stampa in Python 2

In questo esempio, usiamo la dichiarazione di stampa con tre argomenti. Notate che Python 2 stampa i tre argomenti separati da uno spazio. Successivamente, usiamo l’istruzione print con le parentesi tonde che circondano i tre argomenti. Il risultato è una tupla di tre elementi.

Esempio 4. Funzione di stampa in Python 3.

In questo esempio, usiamo la funzione print con tre argomenti e otteniamo lo stesso risultato dell’esempio 3 con Python 2. Tuttavia quando vogliamo stampare la tupla, dobbiamo circondare la tupla con un’altra serie di parentesi arrotondate.

Per ottenere lo stesso risultato in Python 2 come in Python 3, possiamo usare la direttiva future per indirizzare il compilatore ad usare una caratteristica che è disponibile in una versione futura.

Esempio 5. Direttiva future in Python 2.

Supporto Unicode in Python 2 vs Python 3

In Python 2 quando si apre un file di testo, la funzione open() ritorna una stringa di testo ASCII. In Python 3, la stessa funzione open() restituisce una stringa unicode. Le stringhe Unicode sono più versatili delle stringhe ASCII. Quando si tratta di memorizzare, dovete aggiungere una “u” se volete memorizzare stringhe ASCII come Unicode in Python 2.

Esempio 6. Stringhe in Python 2

Esempio 7. Stringhe in Python 3.

In Python 2, ci sono due diversi tipi di oggetti che possono essere usati per rappresentare una stringa. Questi sono ‘str’ e ‘unicode’. Le istanze di ‘str’ sono rappresentazioni di byte mentre con unicode, sono interi a 16 o 32 bit. Le stringhe Unicode possono essere convertite in stringhe byte con la funzione encode().

In Python 3, ci sono anche due diversi tipi di oggetti che possono essere usati per rappresentare una stringa. Questi sono ‘str’ e ‘bytes’. Lo ‘str’ corrisponde al tipo ‘unicode’ in Python 2. Potete dichiarare una variabile come ‘str’ e memorizzare una stringa in essa senza anteporre una ‘u’, perché ora è predefinita. Bytes’ corrisponde al tipo ‘str’ in Python 2. È un formato di serializzazione binario rappresentato da una sequenza di 8-bit interi che è ottimo per l’invio attraverso internet o per la memorizzazione sul filesystem.

Gestione degli errori Python 2 vs Python 3

La gestione degli errori in Python consiste nel sollevare eccezioni e fornire gestori di eccezioni. La differenza tra Python 2 e Python 3 è principalmente sintattica. Vediamo alcuni esempi.

Esempio 8. Sollevare errori in Python 2.

Nella schermata della console qui sotto, proviamo a sollevare errori in entrambi i formati e funziona.

Esempio 9. Sollevare errori in Python 3.

Nella schermata della console qui sotto, sollevare errori non funziona in Python 3 come in Python 2.

Con i gestori di eccezioni, la sintassi è cambiata leggermente in Python 3.

esempio 10. Blocco Try e Exception in Python 2.

Nella schermata della console qui sotto, specifichiamo un blocco try con un gestore di eccezioni. Causiamo volutamente un errore specificando un nome non definito nel ‘try’.

Esempio 11. Blocco try ed eccezioni in Python 3.

Nella schermata della console qui sotto, specifichiamo lo stesso codice dell’esempio precedente in Python 2. Notate la nuova sintassi in Python 3, che ci impone di usare la parola ‘as’.

Confronto di tipi non ordinabili

In Python 2, era possibile confrontare tipi non ordinabili come una lista con una stringa.

esempio 12. Confronto tra una lista e una stringa.

Esempio 13. Confrontare una lista con una stringa in Python 3.

Nuovo in Python 3, viene sollevato un TypeError se si cerca di confrontare una lista con una stringa.

XRange in Python 2 vs Python 3

In Python 2, esiste la funzione range() e la funzione xrange(). La funzione range() restituisce una lista di numeri mentre la funzione xrange() restituisce un oggetto.

In Python 3, c’è solo la funzione range() e nessuna funzione xrange(). La ragione per cui non c’è la funzione xrange() è che la funzione range() si comporta come la funzione xrange() in Python 2. In altre parole, la funzione range() restituisce l’oggetto range.

Esempio 14. La funzione Range() e XRange() in Python 2.

Nella schermata della console qui sotto, vediamo che la funzione range() restituisce una lista contenente 5 elementi perché abbiamo passato ‘5’ come argomento. Quando usiamo xrange(), otteniamo invece un oggetto.

Esempio 15. La funzione Range() in Python 3.

Come potete vedere dallo screenshot della console qui sotto, inserendo la funzione range() con ‘5’ come argomento, viene restituito un oggetto. Tuttavia, quando proviamo ad usare la funzione xrange(), vediamo che Python 3 non la gradisce perché è indefinita.

In Python 2, c’erano diverse funzioni che restituiscono liste. In Python 3, è stato fatto un cambiamento per restituire oggetti iterabili invece di liste. Questo include le seguenti funzioni:

  • zip()
  • map()
  • filter()
  • metodo .key() del dizionario
  • metodo .values() del dizionario
  • metodo .items() del dizionario

Modulo Futuro in Python 2 vs 3

Se state pianificando il supporto a Python 3 per il vostro codice Python 2 allora potreste voler aggiungere il modulo __future__. Per esempio, la divisione degli interi è cambiata da Python 2 a 3, ma se volete che il vostro codice Python 2 si comporti come Python 3, tutto quello che dovete fare è aggiungere questa linea:

“from __future__ import division”

Ora nel vostro codice Python 2, dividendo due interi il risultato sarà un numero in virgola mobile.

Esempio 16. Importare dal modulo __future__.

Come potete vedere qui sotto, quando dividiamo 2/3, otteniamo 0 che è di tipo intero. Ma dopo aver importato la divisione dal modulo __future__, 2 / 3 ha restituito un numero in virgola mobile.

Ci sono altre cose che potete specificare per facilitare le vostre migrazioni future. Esse includono:

  • Generatori
  • Divisione
  • Absolute_import
  • Con_statement
  • Print_function
  • Unicode_literals

Questo post è stato modificato l’ultima volta il 6 giugno 2020 9:20 am

Categorie: Articles

0 commenti

Lascia un commento

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