Novedades de Python 3

El módulo __future__

Python 3.x introdujo algunas palabras clave y características incompatibles con Python 2 que se pueden importar a través del módulo __future__ incorporado en Python 2. Se recomienda usar importaciones __future__, si está planeando la compatibilidad con Python 3.x para su código.

Por ejemplo, si queremos el comportamiento de división de enteros de Python 3.x en Python 2, agregue la siguiente declaración de importación.

from __future__ import division

La función de impresión

El cambio más notable y más conocido en Python 3 es cómo el printse utiliza la función. El uso de paréntesis () con la función de impresión ahora es obligatorio. Era opcional en Python 2.

print "Hello World" #is acceptable in Python 2
print ("Hello World") # in Python 3, print must be followed by ()

La función print () inserta una nueva línea al final, por defecto. En Python 2, se puede suprimir poniendo ',' al final. En Python 3, "end = ''" agrega espacio en lugar de nueva línea.

print x,           # Trailing comma suppresses newline in Python 2
print(x, end=" ")  # Appends a space instead of a newline in Python 3

Leer entrada desde el teclado

Python 2 tiene dos versiones de funciones de entrada, input() y raw_input(). La función input () trata los datos recibidos como una cadena si se incluyen entre comillas '' o ""; de lo contrario, los datos se tratan como un número.

En Python 3, la función raw_input () está obsoleta. Además, los datos recibidos siempre se tratan como una cadena.

In Python 2

>>> x = input('something:') 
something:10 #entered data is treated as number
>>> x
10

>>> x = input('something:')
something:'10' #entered data is treated as string
>>> x
'10'

>>> x = raw_input("something:")
something:10 #entered data is treated as string even without ''
>>> x
'10'

>>> x = raw_input("something:")
something:'10' #entered data treated as string including ''
>>> x
"'10'"

In Python 3

>>> x = input("something:")
something:10
>>> x
'10'

>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"

>>> x = raw_input("something:") # will result NameError
Traceback (most recent call last):
   File "<pyshell#3>", line 1, in 
  <module>
   x = raw_input("something:")
NameError: name 'raw_input' is not defined

División entera

En Python 2, el resultado de la división de dos números enteros se redondea al número entero más cercano. Como resultado, 3/2 mostrará 1. Para obtener una división de punto flotante, el numerador o denominador debe usarse explícitamente como flotante. Por lo tanto, 3.0 / 2 o 3 / 2.0 o 3.0 / 2.0 resultarán en 1.5

Python 3 evalúa 3/2 como 1.5 por defecto, lo que es más intuitivo para los nuevos programadores.

Representación Unicode

Python 2 requiere que marque una cadena con au si desea almacenarla como Unicode.

Python 3 almacena cadenas como Unicode, de forma predeterminada. Tenemos cadenas Unicode (utf-8) y clases de 2 bytes: bytes y matrices de bytes.

Función xrange () eliminada

En Python 2 range () devuelve una lista, y xrange () devuelve un objeto que solo generará los elementos en el rango cuando sea necesario, ahorrando memoria.

En Python 3, la función range () se elimina y xrange () ha sido renombrado como range (). Además, el objeto range () admite la división en Python 3.2 y versiones posteriores.

levantar excepción

Python 2 acepta ambas notaciones, la sintaxis 'antigua' y la 'nueva'; Python 3 genera un SyntaxError si no encerramos el argumento de excepción entre paréntesis.

raise IOError, "file error" #This is accepted in Python 2
raise IOError("file error") #This is also accepted in Python 2
raise IOError, "file error" #syntax error is raised in Python 3
raise IOError("file error") #this is the recommended syntax in Python 3

Argumentos en excepciones

En Python 3, los argumentos de la excepción deben declararse con la palabra clave 'as'.

except Myerror, err: # In Python2
except Myerror as err: #In Python 3

next () Función y .next () Método

En Python 2, next () como método de objeto generador, está permitido. En Python 2, la función next (), para iterar sobre el objeto generador, también se acepta. En Python 3, sin embargo, el siguiente (0 como método generador se descontinúa y aumentaAttributeError.

gen = (letter for letter in 'Hello World') # creates generator object
next(my_generator) #allowed in Python 2 and Python 3
my_generator.next() #allowed in Python 2. raises AttributeError in Python 3

Utilidad 2to3

Junto con el intérprete de Python 3, el script 2to3.py generalmente se instala en la carpeta tools / scripts. Lee el código fuente de Python 2.xy aplica una serie de correctores para transformarlo en un código válido de Python 3.x.

Here is a sample Python 2 code (area.py):

def area(x,y = 3.14): 
   a = y*x*x
   print a
   return a

a = area(10)
print "area",a

To convert into Python 3 version:

$2to3 -w area.py

Converted code :

def area(x,y = 3.14): # formal parameters
   a = y*x*x
   print (a)
   return a

a = area(10)
print("area",a)