Python es un lenguaje de programación muy versátil e interpretado, de alto nivel y de propósito general. Fue creado por Guido van Rossum y lanzado por primera vez en 1991. La filosofía de diseño de Python enfatiza la legibilidad del código y la facilidad de uso. Desde entonces, Python ha crecido en popularidad y es una excelente opción en el desarrollo de scripts y aplicaciones rápidas.
Muchas aplicaciones heredadas todavía están escritas en Python 2. Las empresas que se enfrentan a una migración a Python 3 necesitan conocer las diferencias tanto de sintaxis como de comportamiento. El objetivo de este artículo es exponer las diferencias entre Python 2 y Python 3. Con ejemplos, verás cómo las funciones parecen sintácticamente iguales en una versión pero se comportan de forma completamente diferente en otra.
Versión de Python más utilizada
La versión más reciente de Python es la 3.7 fue lanzada en 2018. La siguiente versión 3.8 está actualmente en desarrollo y será lanzada en 2024. Aunque Python 2.7 sigue siendo ampliamente utilizado. La adopción de Python 3 está creciendo rápidamente. En 2016, el 71,9% de los proyectos utilizaban Python 2.7, pero en 2017 se redujo al 63,7%.
¿Qué versión debo usar?
Dependiendo de cuáles sean tus necesidades y de lo que quieras hacer, elige la versión que más te ayude. Si puedes hacer exactamente lo que quieres con Python 3.x entonces ¡genial! Sin embargo, hay algunas desventajas como:
- Un soporte de librerías ligeramente peor
- Algunas distribuciones actuales de Linux y Mac todavía utilizan la 2.x por defecto
- Cortar()
- Mapa()
- Filtro()
- Método .key() del diccionario
- Método .values() del diccionario
- Método .items() method
- Generadores
- División
- Absolute_import
- With_statement
- Print_function
- Unicode_literals
Mientras Python 3.x esté instalado en los ordenadores de tus usuarios (que en la mayoría de los casos lo están porque la mayoría de la gente que está leyendo esto está desarrollando algo para ellos mismos o en un entorno que controlan) y estés escribiendo cosas en las que sabes que no se necesita ninguno de los módulos de Python 2.x, es una excelente opción. Además, la mayoría de las distribuciones de Linux ya tienen Python 3.x instalado y casi todas lo tienen disponible para los usuarios finales. Una advertencia puede ser si Red Hat Enterprise Linux (a través de la versión 7) donde Python 3 sí existe en el repositorio EPEL, pero algunos usuarios pueden no estar autorizados a instalar nada desde ubicaciones complementarias o no seguras. También algunas distribuciones están retirando Python 2 como su antigua instalación por defecto.
Los instructores deberían introducir Python 3 a los nuevos programadores, pero discutiendo las diferencias en Python 2.
Absténgase de comenzar cualquier nuevo desarrollo en Python 2 porque a partir de enero de 2020, Python 2 será EOL («End of Life») lo que significa que todo el soporte oficial cesará.
¿Cuál es la diferencia entre Python 2 y 3?
La principal diferencia es que algunas cosas tendrán que ser importadas desde diferentes lugares con el fin de manejar el hecho de que tienen diferentes nombres en Python 2 y Python 3. En consecuencia, el paquete de compatibilidad seis es una utilidad clave para soportar Python 2 y Python 3 en una sola base de código.
Discutiremos las principales diferencias en cada sección de este artículo y proporcionaremos ejemplos de capturas de pantalla de la consola tanto en Python 2 como en Python 3.
Bibliotecas: Python 2 vs Python 3
Desde el punto de vista de las bibliotecas, éstas son enormemente diferentes en Python 2 vs Python 3. Muchas bibliotecas desarrolladas para Python 2 no son compatibles en Python 3. Los desarrolladores de las librerías utilizadas en Python 3 tienen buenos estándares y han mejorado las librerías de Machine Learning y Deep Learning.
División de números en Python 2 y 3
La división de números es la división de dos números menos la parte fraccionaria. En Python 2, se consigue exactamente para lo que se definió la división de enteros.
Ejemplo 1. División de enteros en Python 2.
En la siguiente captura de pantalla de la consola, se ve la división de dos enteros. El resultado en Python 2 también es un entero. Falta la parte fraccionaria.
Ejemplo 2. División de enteros en Python 3.
En la siguiente captura de pantalla de la consola, se ve la división de dos enteros en Python 3. El resultado es un número de punto flotante que incluye la parte fraccionaria que falta en Python 2.
Si la parte fraccionaria es necesaria en Python 2, puedes especificar uno de los enteros que estás dividiendo como un número de punto flotante. De esta manera, se fuerza a que el resultado sea un número de punto flotante.
Sintaxis de la sentencia print Python 2 vs 3
En Python 2, print es una sentencia que toma un número de argumentos. Imprime los argumentos con un espacio entre ellos. En Python 3, print es una función que también toma un número de argumentos.
Ejemplo 3. Sentencia Print en Python 2
En este ejemplo, utilizamos la sentencia print con tres argumentos. Observa que Python 2 imprime los tres argumentos separados por un espacio. A continuación, utilizamos la sentencia print con corchetes rodeando los tres argumentos. El resultado es una tupla de tres elementos.
Ejemplo 4. Función print en Python 3.
En este ejemplo, utilizamos la función print con tres argumentos y obtenemos el mismo resultado que en el ejemplo 3 con Python 2. Sin embargo, cuando queremos imprimir la tupla, tenemos que rodear la tupla con otro conjunto de corchetes redondeados.
Para obtener el mismo resultado en Python 2 que en Python 3, podemos utilizar la directiva future para indicar al compilador que utilice una función que esté disponible en una futura versión.
Ejemplo 5. Directiva future en Python 2.
Soporte Unicode en Python 2 vs Python 3
En Python 2 cuando se abre un fichero de texto, la función open() devuelve una cadena de texto ASCII. En Python 3, la misma función open() devuelve una cadena unicode. Las cadenas unicode son más versátiles que las cadenas ASCII. A la hora de almacenarlas, tienes que añadir una «u» si quieres almacenar cadenas ASCII como Unicode en Python 2.
Ejemplo 6. Cadenas en Python 2
Ejemplo 7. Cadenas en Python 3.
En Python 2, hay dos tipos diferentes de objetos que se pueden utilizar para representar una cadena. Estos son ‘str’ y ‘unicode’. Las instancias de ‘str’ son representaciones de bytes mientras que con unicode, son enteros de 16 o 32 bits. Las cadenas unicode se pueden convertir en cadenas de bytes con la función encode().
En Python 3, también hay dos tipos diferentes de objetos que se pueden utilizar para representar una cadena. Estos son ‘str’ y ‘bytes’. El ‘str’ corresponde al tipo ‘unicode’ en Python 2. Puedes declarar una variable como ‘str’ y almacenar una cadena en ella sin anteponerle una ‘u’ porque ahora está por defecto. Bytes’ corresponde al tipo ‘str’ en Python 2. Es un formato de serialización binario representado por una secuencia de enteros de 8 bits que es ideal para enviarlo a través de Internet o para almacenarlo en el sistema de archivos.
Manejo de errores Python 2 vs Python 3
El manejo de errores en Python consiste en lanzar excepciones y proporcionar manejadores de excepciones. La diferencia en Python 2 vs Python 3 son principalmente sintácticas. Veamos algunos ejemplos.
Ejemplo 8. Levantar errores en Python 2.
En la siguiente captura de pantalla de la consola, intentamos levantar errores en ambos formatos y funciona.
Ejemplo 9. Levantar errores en Python 3.
En la siguiente captura de pantalla de la consola, levantar errores no funciona en Python 3 como lo hacía en Python 2.
Con los manejadores de excepciones, la sintaxis ha cambiado ligeramente en Python 3.
Ejemplo 10. Bloque try y de excepción en Python 2.
En la siguiente captura de pantalla de la consola, especificamos un bloque try con un manejador de excepción. Provocamos un error a propósito al especificar un nombre indefinido en el ‘try’.
Ejemplo 11. Bloque try y de excepción en Python 3.
En la siguiente captura de pantalla de la consola, especificamos el mismo código que en el ejemplo anterior en Python 2. Fíjate en la nueva sintaxis de Python 3, que nos obliga a utilizar la palabra ‘as’.
Comparación de tipos no ordenables
En Python 2, era posible comparar tipos no ordenables como una lista con una cadena.
Ejemplo 12. Comparación de una lista con una cadena.
Ejemplo 13. Comparación de una lista con una cadena en Python 3.
Nuevo en Python 3, se produce un TypeError si se intenta comparar una lista con una cadena.
XRange en Python 2 vs Python 3
En Python 2, existe la función range() y la función xrange(). La función range() devolverá una lista de números mientras que la función xrange() devolverá un objeto.
En Python 3, sólo existe la función range() y no hay función xrange(). La razón por la que no existe la función xrange() es porque la función range() se comporta como la función xrange() en Python 2. En otras palabras, la función range() devuelve el objeto range.
Ejemplo 14. La función Range() y XRange() en Python 2.
En la siguiente captura de pantalla de la consola, vemos que la función range() devuelve una lista que contiene 5 elementos porque hemos pasado ‘5’ como argumento. Cuando usamos xrange(), obtenemos un objeto de vuelta en su lugar.
Ejemplo 15. La función Range() en Python 3.
Como puedes ver en la siguiente captura de pantalla de la consola, al introducir la función range() con ‘5’ como argumento se devuelve un objeto. Sin embargo cuando intentamos utilizar la función xrange(), vemos que a Python 3 no le gusta porque es indefinida.
En Python 2, había una serie de funciones que devolvían listas. En Python 3, se hizo un cambio para devolver objetos iterables en lugar de listas. Esto incluye las siguientes funciones:
Módulo Futuro en Python 2 vs 3
Si estás planeando el soporte de Python 3 para tu código de Python 2, entonces puede que quieras añadir el módulo __future__. Por ejemplo, la división de enteros había cambiado de Python 2 a 3 pero si quieres que tu código de Python 2 se comporte como el de Python 3, todo lo que tienes que hacer es añadir esta línea:
«from __future__ import division»
Ahora en tu código de Python 2, dividir dos enteros dará como resultado un número de punto flotante.
Ejemplo 16. Importando desde el módulo __future__.
Como puedes ver a continuación, cuando dividimos 2 / 3, obtenemos 0 que es de tipo entero. Pero después de importar la división desde el módulo __future__, 2 / 3 devuelve el tipo número de punto flotante.
Hay otras cosas que puedes especificar para facilitar tus migraciones futuras. Incluyen:
0 comentarios