Diferencias entre Python 2.x y 3.x
La versión 3.0 de Python, a menudo llamada Python 3000, o abreviadamente Py3k. En comparación con las versiones anteriores de Python, es una actualización importante.
Para no introducir demasiado lastre, Python 3.0 no fue diseñado teniendo en cuenta la compatibilidad hacia atrás.
Muchos programas diseñados para versiones anteriores de Python no pueden ejecutarse correctamente en Python 3.0.
Para atender a los programas existentes, Python 2.6, como versión de transición, utiliza básicamente la sintaxis y las bibliotecas de Python 2.x, al tiempo que considera la migración a Python 3.0, permitiendo usar parte de la sintaxis y funciones de Python 3.0.
Se recomienda que los nuevos programas de Python usen la sintaxis de la versión 3.0 de Python.
A menos que el entorno de ejecución no pueda instalar Python 3.0 o que el programa en sí use bibliotecas de terceros que no admitan Python 3.0. Actualmente, las bibliotecas de terceros que no admiten Python 3.0 incluyen Twisted, py2exe, PIL, etc.
La mayoría de las bibliotecas de terceros se están esforzando por ser compatibles con Python 3.0. Incluso si no se puede usar Python 3.0 de inmediato, se recomienda escribir programas compatibles con Python 3.0 y luego ejecutarlos con Python 2.6 o Python 2.7.
Los cambios de Python 3.0 se centran principalmente en los siguientes aspectos:
Función print
La declaración print ya no existe, en su lugar está laprint()función. Python 2.6 y Python 2.7 admiten parcialmente esta forma de sintaxis de print. En Python 2.6 y Python 2.7, las siguientes tres formas son equivalentes:
print "fish"
print ("fish") # 注意print后面有个空格
print("fish") # print()不能带有任何其它参数
Sin embargo, Python 2.6 ya admite la nueva sintaxis print(), por ejemplo:
from __future__ import print_function
print("fish", "panda", sep=', ')
Si una versión de Python 2.x quiere usar la función print de Python 3.x, puede importar__future__el paquete, que deshabilita la declaración print de Python 2.x y adopta la función print de Python 3.x:
Ejemplo
>>> print list # La declaración print de Python 2.x
['a', 'b', 'c']
>>> from __future__ import print_function # Importar el paquete __future__
>>> print list # La declaración print de Python 2.x está deshabilitada, su uso genera error
File "<stdin>", line 1
print list
^
SyntaxError: invalid syntax
>>> print (list) # Usar la función print de Python 3.x
['a', 'b', 'c']
>>>
Muchas funciones de compatibilidad entre Python 3.x y Python 2.x pueden importarse mediante__future__este paquete.
Unicode
Python 2 tiene el tipo ASCII str(), unicode() es independiente y no es un tipo byte.
Ahora, en Python 3, finalmente tenemos cadenas Unicode (utf-8) y una clase de bytes: byte y bytearrays.
Dado que los archivos de código fuente de Python 3.x usan codificación utf-8 por defecto, usar chino es más conveniente:
>>> 中国 = 'china' >>>print(中国) china
Python 2.x
>>> str = "我爱北京天安门" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我爱北京天安门" >>> str u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'
Python 3.x
>>> str = "我爱北京天安门" >>> str '我爱北京天安门'
Operación de división
La división en Python parece muy avanzada en comparación con otros lenguajes, tiene un conjunto de reglas muy complejas. La división en Python tiene dos operadores:/y//
Primero hablemos de la/división:
En Python 2.x,/la división es como en la mayoría de los lenguajes que conocemos, como Java y C: el resultado de dividir enteros es un entero, ignorando por completo la parte decimal; la división de números de punto flotante conserva la parte decimal y produce un resultado de punto flotante.
En Python 3.x,/la división ya no hace esto; para la división entre enteros, el resultado también será un número de punto flotante.
Python 2.x:
>>> 1 / 2 0 >>> 1.0 / 2.0 0.5
Python 3.x:
>>> 1/2 0.5
En cuanto a la//división, este tipo de división se llama división floor, que aplica automáticamente una operación floor al resultado de la división. Es consistente en Python 2.x y Python 3.x.
python 2.x:
>>> -1 // 2 -1
python 3.x:
>>> -1 // 2 -1
Ten en cuenta que no se descarta la parte decimal, sino que se realiza una operación floor. Si se quiere truncar la parte entera, entonces se debe usar la función trunc del módulo math.
python 3.x:
>>> import math >>> math.trunc(1 / 2) 0 >>> math.trunc(-1 / 2) 0
Excepciones
El manejo de excepciones también cambió ligeramente en Python 3. En Python 3 ahora usamos as como palabra clave.
La sintaxis para capturar excepciones cambia deexcept exc, varaexcept exc as var。
Usar la sintaxis except (exc1, exc2) as var permite capturar múltiples categorías de excepciones al mismo tiempo. Python 2.6 ya admite ambas sintaxis.
- 1. En la era 2.x, todos los tipos de objetos podían lanzarse directamente; en la era 3.x, solo los objetos que heredan de BaseException pueden lanzarse.
- 2. En 2.x, la declaración raise usaba una coma para separar el tipo de objeto lanzado y los argumentos; 3.x eliminó esta extraña sintaxis, simplemente se llama al constructor para lanzar el objeto.
En la era 2.x, las excepciones en el código, además de representar errores del programa, a menudo hacían cosas que las estructuras de control normales deberían hacer. En 3.x se puede ver que los diseñadores hicieron que las excepciones sean más específicas; solo cuando ocurre un error se debe usar la declaración de captura de excepciones para manejarlo.
Python 2.x: La sintaxis de manejo de excepciones usa coma.
try:
# code
except Exception, e:
print ePython 3.x: La sintaxis de manejo de excepciones usa as.
try:
# code
except Exception as e:
print(e)
xrange() y range()
Python 2.x: range() devuelve una lista, mientras que xrange() devuelve un generador (ahorra más memoria).
range(5) # 返回 [0, 1, 2, 3, 4] xrange(5) # 返回 xrange 对象,按需生成数字
Python 3.x: xrange() fue eliminado, range() devuelve un generador, ahorrando memoria.
range(5) # 返回一个迭代器,按需生成数字
Representación de literales octales
Los números octales deben escribirse como 0o777; la forma anterior 0777 ya no se puede usar; los binarios deben escribirse como0b111。
Se añadió una nuevabin()función para convertir un entero en una cadena binaria. Python 2.6 ya admite ambas sintaxis.
En Python 3.x, solo hay una forma de representar un literal octal: 0o1000.
python 2.x
>>> 0o1000 512 >>> 01000 512
python 3.x
>>> 01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
Operadores de desigualdad
En Python 2.x, la desigualdad se escribe de dos formas: != y <>
Python 3.x eliminó <>, solo queda != como única forma. Por suerte, nunca tuve la costumbre de usar <>.
Se eliminó la expresión repr ``
En Python 2.x, las comillas invertidas `` equivalen a la función repr.
Python 3.x eliminó la escritura con `` y solo permite usar la función repr. ¿El propósito de esto es hacer que el código se vea más claro? Sin embargo, siento que tengo pocas oportunidades de usar repr; generalmente solo lo uso al depurar (debug). La mayoría de las veces uso la función str para describir objetos con cadenas.
def sendMail(from_: str, to: str, title: str, body: str) -> bool:
pass
Varios módulos fueron renombrados (según PEP8)
| Nombres antiguos | Nombres nuevos |
|---|---|
| _winreg | winreg |
| ConfigParser | configparser |
| copy_reg | copyreg |
| Queue | queue |
| SocketServer | socketserver |
| repr | reprlib |
El módulo StringIO ahora se fusiona en el nuevo módulo io. Los módulos new, md5, gopherlib, etc. fueron eliminados. Python 2.6 ya admite el nuevo módulo io.
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib se fusionaron en el paquete http.
Se eliminó la declaración exec, solo queda la función exec(). Python 2.6 ya admite la función exec().
5. Tipos de datos
1) Py3.X eliminó el tipo long; ahora solo hay un tipo entero: int, pero su comportamiento es como el long de la versión 2.X.
2) Se añadió el tipo bytes, correspondiente a la cadena de ocho bits de la versión 2.X. La forma de definir un literal bytes es la siguiente:
>>> b = b'china' >>> type(b) <type 'bytes'>
Los objetos str y bytes pueden usar .encode() (str -> bytes) o .decode() (bytes -> str) métodos para convertirse entre sí.
>>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china'
3) Los métodos .keys(), .items y .values() de dict devuelven iteradores, mientras que funciones anteriores como iterkeys() fueron eliminadas. También se eliminó dict.has_key(); usa in en su lugar.
6. Reorganización de la biblioteca estándar
Python 3.x: algunos módulos fueron reorganizados o renombrados. Por ejemplo, urllib y urlparse se fusionaron en urllib.
# Python 2.x import urllib import urlparse # Python 3.x import urllib.parse
7. Las funciones iteritems() y items()
Python 2.x: el diccionario tiene los métodos items() e iteritems(); items() devuelve una lista e iteritems() devuelve un iterador.
d = {'a': 1, 'b': 2}
d.items() # 返回 [('a', 1), ('b', 2)]
d.iteritems() # 返回字典的迭代器Python 3.x: iteritems() fue eliminado, e items() devuelve una vista de diccionario (es decir, un iterador).
d = {'a': 1, 'b': 2}
d.items() # 返回 dict_items([('a', 1), ('b', 2)])8. Soporte del módulo __future__
Python 3.x: muchas características de Python 2.x han sido eliminadas. Los usuarios de Python 2.x que quieran usar por adelantado el comportamiento de Python 3.x en su código pueden usar la importación __future__ para lograr compatibilidad.
from __future__ import print_function
9. Ordenamiento de diccionarios
Python 2.x: los diccionarios no están ordenados (no se garantiza el orden).
Python 3.x: los diccionarios están ordenados, y los elementos se conservan en el orden de inserción.
10. El método next()
Python 2.x: next() es una función, normalmente se usa junto con iter().
Python 3.x: next() es una función integrada; su uso es el mismo que en Python 2.x, pero sus parámetros son diferentes. En Python 3.x se admite establecer un valor predeterminado mediante next(iterator, default).
Otras extensiones