Diferencias importantes entre Python 2.x y Python 3.x con ejemplos

operador de división

Si estamos portando nuestro código o ejecutando código python 3.x en python 2.x, puede ser peligroso si los cambios en la división de enteros pasan desapercibidos (ya que no genera ningún error). Es preferible usar el valor flotante (como 7.0/5 o 7/5.0) para obtener el resultado esperado al portar nuestro código. 
 

Python

print 7 / 5
 
print -7 / 5    
 
   
 
'''
 
Output in Python 2.x
 
1
 
-2
 
Output in Python 3.x :
 
1.4
 
-1.4
 
   
 
# Refer below link for details
 
# https://www.geeksforgeeks.org/division-operator-in-python/
 
'''

función de impresión

Este es el cambio más conocido. En esto, la palabra clave print en Python 2.x se reemplaza por la función print() en Python 3.x. Sin embargo, los paréntesis funcionan en Python 2 si se agrega un espacio después de la palabra clave de impresión porque el intérprete lo evalúa como una expresión. 
 

Python

print 'Hello, Geeks'      # Python 3.x doesn't support
 
print('Hope You like these facts')
 
   
 
'''
 
Output in Python 2.x :
 
Hello, Geeks
 
Hope You like these facts
 
   
 
Output in Python 3.x :
 
File "a.py", line 1
 
    print 'Hello, Geeks'
 
                       ^
 
SyntaxError: invalid syntax
 
   
 
Refer below link for details
 
https://www.geeksforgeeks.org/g-fact-25-print-single-multiple-variable-python/
 
'''

Como podemos ver, si usamos paréntesis en python 2.x, entonces no hay problema, pero si no usamos paréntesis en python 3.x, obtenemos SyntaxError. 
 

código único:

En Python 2, un tipo str implícito es ASCII. Pero en Python 3.x, el tipo str implícito es Unicode. 
 

Python

print(type('default string '))
 
print(type(b'string with b '))
 
   
 
'''
 
Output in Python 2.x (Bytes is same as str)
 
<type 'str'>
 
<type 'str'>
 
   
 
Output in Python 3.x (Bytes and str are different)
 
<class 'str'>
 
<class 'bytes'>
 
'''

Python 2.x también es compatible con Unicode 
 

Python

print(type('default string '))
 
print(type(u'string with b '))
 
   
 
'''
 
Output in Python 2.x (Unicode and str are different)
 
<type 'str'>
 
<type 'unicode'>
 
   
 
Output in Python 3.x (Unicode and str are same)
 
<class 'str'>
 
<class 'str'>
 
'''

rango x:

xrange() de Python 2.x no existe en Python 3.x. En Python 2.x, range devuelve una lista, es decir, range(3) devuelve [0, 1, 2] mientras que xrange devuelve un objeto xrange, es decir, xrange(3) devuelve un objeto iterador que funciona de forma similar al iterador de Java y genera un número cuando es necesario. 
Si necesitamos iterar sobre la misma secuencia varias veces, preferimos range() ya que range proporciona una lista estática. xrange() reconstruye la secuencia cada vez. xrange() no es compatible con sectores y otros métodos de lista. La ventaja de xrange() es que ahorra memoria cuando la tarea es iterar en un rango amplio. 
En Python 3.x, la función de rango ahora hace lo que hace xrange en Python 2.x, por lo que para mantener nuestro código portátil, es posible que deseemos seguir usando un rango en su lugar. Entonces, la función de rango de Python 3.x es xrange de Python 2.x. 
 

Python

for x in xrange(1, 5):
 
    print(x),
 
   
 
for x in range(1, 5):
 
    print(x),
 
   
 
'''
 
Output in Python 2.x
 
1 2 3 4 1 2 3 4
 
   
 
Output in Python 3.x
 
NameError: name 'xrange' is not defined
 
'''

Manejo de errores:

Hay un pequeño cambio en el manejo de errores en ambas versiones. En python 3.x, se requiere la palabra clave ‘as’. 
 

Python

try:
 
    trying_to_check_error
 
except NameError, err:
 
    print err, 'Error Caused'   # Would not work in Python 3.x
 
   
 
'''
 
Output in Python 2.x:
 
name 'trying_to_check_error' is not defined Error Caused
 
   
 
Output in Python 3.x :
 
File "a.py", line 3
 
    except NameError, err:
 
                    ^
 
SyntaxError: invalid syntax
 
'''

Python

try:
 
     trying_to_check_error
 
except NameError as err: # 'as' is needed in Python 3.x
 
     print (err, 'Error Caused')
 
   
 
'''
 
Output in Python 2.x:
 
(NameError("name 'trying_to_check_error' is not defined",), 'Error Caused')
 
   
 
Output in Python 3.x :
 
name 'trying_to_check_error' is not defined Error Caused
 
'''

Módulo __futuro__:

Básicamente, esto no es una diferencia entre las dos versiones, pero es algo útil para mencionar aquí. La idea del módulo __future__ es ayudar a migrar a Python 3.x. 
Si planeamos tener compatibilidad con Python 3.x en nuestro código 2.x, podemos usar _future_ imports en nuestro código. 
Por ejemplo, en el código de Python 2.x a continuación, usamos el comportamiento de división de enteros de Python 3.x usando el módulo __future__. 
 

Python

# In below python 2.x code, division works
 
# same as Python 3.x because we use  __future__
 
from __future__ import division
 
   
 
print 7 / 5
 
print -7 / 5

Producción : 
 

1.4 

-1.4 

Otro ejemplo donde usamos corchetes en Python 2.x usando el módulo __future__: 
 

Python

from __future__ import print_function    
 
   
 
print('GeeksforGeeks')

Producción: 
 

GeeksforGeeks 

Consulte esto para obtener más detalles del módulo __future__. 
 

Este artículo es una contribución de Arpit Agarwal . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo electrónico a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *