Red de conocimiento informático - Problemas con los teléfonos móviles - La diferencia entre Python3.x y Python2.x

La diferencia entre Python3.x y Python2.x

Estas son las principales diferencias entre Python3.x y Python2.x

1. Rendimiento

Py3.0 es 30 veces más lento que Py2.5 cuando se ejecutan pruebas comparativas de pystone. Guido cree que hay mucho espacio para la optimización y que se pueden lograr buenos resultados de optimización en operaciones de cadenas y números enteros.

El rendimiento de Py3.1 es 15 veces más lento que el de Py2.5 y todavía hay mucho margen de mejora.

2. Codificación

Los archivos fuente Py3.X usan codificación utf-8 de forma predeterminada, lo que hace que el siguiente código sea legal:

gt; China = 'china'

gt; gt; print(China)

china

3) Eliminar. lt ;gt;, reemplace todo con ! =

2) Eliminar `` y reemplazar todo con repr()

3) Agregar como y con palabras clave, así como Verdadero, Falso y Ninguno

4 ) La división de enteros devuelve un número de punto flotante, para obtener un resultado entero use //

5) Agregue una declaración no local. Con noclocal x, puede asignar valores directamente a variables periféricas (no globales).

6) Elimine la declaración impresa y agregue una nueva. Elimine la declaración de impresión y agregue una función print() para lograr la misma funcionalidad. X: imprimir # Carácter de nueva línea de salida

3.X: imprimir() # Carácter de nueva línea de salida

2.X: imprimir gt; /p>

3.3.X: print("error fatal", file=sys.stderr)

2.X: print (x, y) # Salida repr((x, y))

3.X: print((x, y)) # ¡es diferente de print(x, y)!

7) Se cambió el comportamiento de los operadores secuenciales, como xlt;y, cuando los tipos x e y no coinciden, se generará un TypeError en lugar de devolver el valor bool correspondiente

8) cambió la función de entrada, eliminó raw_input y la reemplazó con entrada:

2.X: adivinar = int(raw_ input('Ingrese un número entero: '))# Método para leer la entrada del teclado p>

3.X: adivinar = int(input('Ingrese un número entero: '))

9) Se eliminó el desempaquetado del parámetro tupla. Ya no puedes usar def(a, (b, c)): pass para definir funciones como esta

10) Nuevo estilo de variable de 8 palabras, la función oct() se ha modificado en consecuencia.

2. 438)

'0666'

3.p> SyntaxError: token no válido (lt;pyshell#63gt;, línea 1)

gt;gt;gt ; 0o666

438

gt; gt; oct(438)

'0o666'

11) Se agregó literal binario y función bin()

gt;gt;gt;bin(438)

'0b110110110'

gt;gt ;gt; _438 = '0b110110110'

gt;gt;gt;_438

'0b110110110'

12) Desempaquetado iterable extendido. En Py3.

13) Se agrega un nuevo super() y ya no se pueden pasar parámetros a super()

gt; >

def __init__(self, a):

print('C', a)

gt; clase D(C):

def __init(self, a):

super().__init__(a) # Llamar a super() sin parámetros

gt;

C 8

lt; objeto __main__.D, ubicado en 0x00D7ED90gt;

14) Nueva sintaxis de metaclase:

class Foo( *bases , **kwds):

pass

15) Decoradores de clases de soporte. El uso es el mismo que el decorador de funciones:

gt;gt;gt; def foo(cls_a):

def print_func(self):

print(' ¡Hola mundo! ')

cls_a.print = print_func

return cls_a

gt; C(objeto):

pasar

gt; gt; C().print()

¡Hola mundo!

se puede utilizar para hacer grandes trucos a los castores. Para obtener más información, consulte PEP 3129

4. Cadenas y cadenas de bytes

1) Las cadenas ahora tienen un solo tipo, str, pero es igual que la versión 2.x Unicode. casi lo mismo.

2) Para cadenas de bytes, consulte la entrada 2 en "Tipos de datos"

5 El comportamiento en la versión 2.X es similar a long

2) Se agrega un nuevo tipo de byte, correspondiente a la cadena octal en la versión 2.X.

El método para definir bytes literales es el siguiente:

gt; gt; b = b'china'

gt;

lt;type 'bytes'gt;

Los objetos str y bytes se pueden convertir entre sí usando .encode() (str -gt; bytes) o .decode() (bytes -gt; str) métodos.

gt; gt; s = b.decode()

gt; s

'china'

gt; gt; b1 = s.encode()

gt; b1

b' china'

3) dict Los métodos .keys(), .items y .values() devuelven iteradores, y las funciones anteriores como iterkeys() han quedado obsoletas. Además, dict.has_key() ha sido eliminado y reemplazado por in

6. Orientado a objetos

1) Introducir la clase base abstracta (ABC).

2) Las clases de contenedor y las clases de iterador están ABCizadas, por lo que hay muchos más tipos en el módulo cellections que en Py2.5.

gt;gt;gt; importar colecciones

gt;gt;gt; print('\n'.join(dir(colecciones)))

Invocable

Contenedor

Hashable

ItemsView

Iterable

Iterador

KeysView

Mapeo

MappingView

MutableMapping

MutableSequence

MutableSet

NamedTuple

Secuencia

Establecer

Tamaño

ValuesView

__all__

__buildins__

__doc__

__file__

__nombre__

_abcoll

_itemgetter

_sys

defaultdict

deque

Además, el tipo numérico es ABC.

3) Se cambió el nombre del método next() del iterador a __next__() y se agregó la función integrada next() para llamar al método __next__() del iterador.

4) Se agregó @ Los decoradores abstractmethod y @abstractproperty hacen que la escritura de métodos abstractos (propiedades) sea más conveniente.

7. Excepciones

1) Por lo tanto, la excepción hereda de BaseException y StardError se elimina.

2) El comportamiento de secuencia de clase de excepción y el atributo .message se eliminan.

p>

3) Utilice rise Exception(args) en lugar de rise Exception, sintaxis de args

4) La sintaxis para detectar excepciones se ha cambiado en Py2.5 y Se han introducido palabras clave para identificar casos de excepción:

gt;gt;gt; try:

.....raise NotImplementedError('Error')

... .imprimir error.mensaje

... .imprimir error.mensaje

...

Error

En Py3 .0:

gt; gt; gt; intente:

generar NotImplementedError('Error')

excepto NotImplementedError como error.#Tenga en cuenta esto como

print(str( error))

Error

5) Cadena de excepción, porque __context__ no está implementado en la versión 3.0a1

8. Cambios de módulo

1) El módulo cPickle se ha eliminado y puede ser reemplazado por el módulo pickle. Finalmente tendremos un módulo transparente y eficiente.

2) Módulo imageop eliminado

3) Audiodev, Bastion, bsddb185, excepción, linuxaudiodev, md5, MimeWriter, mimify, popen2,

rexec , set eliminados , módulos sha, stringold, strop, sunaudiodev, timing y xmllib

4) Módulo bsddb eliminado (publicado por separado, disponible en http://www.jcea.es/programacion/pybsddb.htm Obtener)

5) El nuevo módulo fue eliminado

6) Las funciones os.tmpnam() y os.tmpfile() fueron movidas al módulo tmpfile

7) El El módulo tokenize ahora funciona con bytes. El punto de entrada principal ya no es generate_tokens, sino tokenize.tokenize()

Otros

1) xrange() pasa a llamarse range(), use range() para obtener. una Lista, debe llamarse explícitamente:

gt; gt; list(range(10))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2) Los objetos de bytes no se pueden aplicar hash y no admiten los métodos b.lower(), b.strip() y b.split(), excepto los dos últimos métodos. , Puedes usar b.strip(b'\n\t\r \f') y b.split(b' ') para lograr el mismo propósito

3) zip(), map( ) y filtrar () ambos iteradores de retorno.

Además, las funciones apply(), callable(), coerce(), execfile(), reduce() y reload() se han eliminado y ahora puedes usar hasattr() en lugar de callable(). La sintaxis de hasattr() es la siguiente: hasattr(string, '__name__')

4) string.letters y .lowercase y .uppercase relacionados se han eliminado, así que utilice funciones como string.ascii_letters en cambio . La versión 2.x devuelve un booleano pseudoaleatorio

6) El miembro de la familia __getslice__ ha quedado obsoleto. a[i:j] se convierte en a.__getitem__(slice(I, j)) o llamadas __setitem__ y __delitem__

7) En Py2.5:

gt;gt; gt; archivo

lt;escriba 'archivo'gt;

En Py3.X:

gt;gt;gt; > Rastreo (última llamada más reciente):

Archivo "lt;pyshell#120gt;", línea 1, en el archivo lt;modulegt;

NameError : el nombre 'archivo' no está definido

NameError: el nombre 'archivo' no está definido