Python – differenze fra le versioni 2 e 3

Nel wiki ufficiale http://wiki.python.org/ trovate

Python 2.x is the status quo, Python 3.x is the present and future of the language

Allora migriamo tutti alla versione 3 –nel frattempo arrivata a 3.2? Io sarei per il sì ma ci sono ancora casi in cui ciò non è possibile. Per esempio io ho implementato le mie app usando come GUI Wx e Wx non è stato aggiornato alla nuova versione e, peggio ancora, non si sa quando questo avverrà. Esistono GUI alternative già disponibili, PyQt e PyGobject per esempio, e se non ci saranno novità non è detto che… Ma non subito.

Le modifiche non sono poi così tante ma, secondo me, richiedono più di un post. Si potrebbe partire seguendo Guido, nella pagina “What’s New In Python 3.0“, a dispetto del titolo aggiornata alla release 3.2.2.
Comincio invece con una panoramica veloce. Anzi c’è chi l’ha già fatto, la trovate qui. Per i miei affezionati lettori sapete cosa faccio? Lo traduco, quasi 8)

print

print non è più un’istruzione ma una funzione. E come tale vuole le parentesi.

Python 2: print "The answer is", 42
Python 3: print("The answer is", 42)
Output: The answer is 42

Python 2: print
Python 3: print()
Output: newline

Per formattare l’output py2 usa una sintassi speciale mentre py3 usa le keyword sep e end.

Python 2:
print "The answer is", # comma suppresses newline
print 42
Output: The answer is 42

Python 3:
print("The answer is", end=" ")
print(42)
Output: The answer is 42

Python 3: print("01","12","1981",sep="-")
Output: 01-12-1981

Si può usare print() anche in py2, basta importare print_function dal modulo future
from future import print_function

Divisione fra interi

In py2 la divisione fra interi ritorna un intero troncando il risultato. Per avere un float si deve avere almeno un float ( o fare un cast). In py3 la divisione ritorna un float, anche se il risultato è un intero. Esiste l’operatore // che si comporta come / in py2.

Python 2: 4/3 # result is 1
Python 2: 3/3 # result is 1
Python 2: 4.0/3 # result is 1.33333
Python 2: 3.0/3 # result is 1.0

Python 3: 4/3 # result is 1.33333
Python 3: 3/3 # result is 1.0
Python 3: 4//3 # result is 1
Python 3: 3//3 # result is 1

Al solito in py2 si possono usare gli operatori di py3 impotando division dal modulo future

from future import division

input

La funzione raw_input() di py2 è stata rinominata input() in py3. Notare che le due funzioni ritornano una string; eseguire un cast se del caso

Python 2: the_input = raw_input() # the_input is of type string

Python 3: the_input = input() # the_input is of type string

Python 2: the_input = float(raw_input()) # the_input is of type float
Python 2: the_input = int(raw_input()) # the_input is of type int

Python 3: the_input = float(input()) # the_input is of type float
Python 3: the_input = int(input()) # the_input is of type int

file

Il comando file di py2 è stato rimosso. Occorre usare la funzione open() (che in realtà c’era da tempo in py2).

Python 2:

for line in file("my_file.txt"):
    print line

 


Python 3:

myFile = open("my_file.txt",'r')
for line in myFile: 
    print line

range

La funzione range() in py3 è l’equivalente di xrange() di py2, non ritorna una lista e può gestire un intervallo arbitrariamente ampio

Python 2: L = range(10) # L is [0,1,2,3,4,5,6,7,8,9]
Python 3: L = list(range(10)) # L is [0,1,2,3,4,5,6,7,8,9]

questa istruzione genera un errore in py2 ma è valida in py3

for i in range(1000000000000): # 1'000'000'000'000 = mille miliardi

OK! queste in sintesi le variazioni tra le versioni 2 e 3 di Python.
Saranno esaminate in dettaglio. Prossimamente 🙂
Aggiornato, corretto un paio di errori, grazie Step. – Hawk1 😀

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • bit3lux  Il 17 dicembre 2011 alle 16:56

    Io queste cose mica le sapevo. Mi ritornava sempre “Errore di sintassi” Se non sono impazzito al 100% il merito è tuo, caro Juhuan 😀

    • bit3lux  Il 17 dicembre 2011 alle 16:57

      Vedi? Volevo dire Juhan! 🙂

    • juhan  Il 17 dicembre 2011 alle 20:10

      Allora il blog serve 8) e comunque mi diverte e anche questo è l’importante 😀

  • Step.  Il 15 aprile 2013 alle 18:49

    Ci sono degli errori:

    Python 3: print(“01″,”12″,”1981″,sep=”-“)
    Output: 12-09-2011 –> ???
    L’Output è 01-12-1981

    Divisione fra interi:

    Python 2: 4/3 # result is 0 –> No, da 1 (Elide la parte decimale)

    • juhan  Il 15 aprile 2013 alle 18:57

      Hai ragione!!!
      Correggo prima di subito. È rimasto errato per più di un anno 😦
      Conto di averti come revisore anche in futuro 😀

      • Step. - Hawk1  Il 15 aprile 2013 alle 19:00

        Hahahahah, ^_^ Felice di esser stato d’aiuto.
        Mi sono inoltrato in python ri-leggendo tutto un libro sul python 2.5 che avevo accantonato qualche anno fa, ma provando a fare qualche esercizietto sono entrato nel panico, -> Articolo Molto Utile! 😉 Grazie.!

  • federico  Il 21 Maggio 2016 alle 16:24

    ci voleva proprio !!!

Trackback

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.