Quina diferència hi ha entre Python 3 i 2.7?


Resposta 1:

Fins ara, el món de Python es divideix majoritàriament en dues faccions, una que encara treballa a Python 2.7 i una que va començar a migrar a 3.x o va començar a utilitzar 3.x sense cap coneixement ni experiència en 2.7.

De totes maneres, Python 2.7 no serà compatible i aviat quedarà desactualitzat. Python 2.7 Compta enrere

Per tant, la pregunta de quines diferències hi ha entre 3.x i 2.7 és una pregunta candent, ja que a diferència de qualsevol altra actualització, Python 3.x no només té novetats, sinó que també canvia la filosofia i el disseny en línia. I seria millor anomenar Python 3.x com a idioma Python madurat en lloc d’una simple actualització de 2,7

A continuació, es presenten algunes diferències importants en 2.7 i 3.x

  1. Maneig de str i unicode:

Al pitó 2.7, hi ha cadena normal, cadena de bytes i cadena Unicode. Però en realitat els bytes i el normal són essencialment el mateix a Python 2.7.

my_str = 'exemple'
byte_str = amb l'exemple '
uni_str = u'exemple '
print (type (my_str) # Sortides 
print (type (byte_str) # Sortides 
print (type (uni_str) # Sortides 

No hi ha res com el tipus d’octets o, en altres paraules, la cadena normal es comporta com un tipus codificat amb només caràcters ascii. Exemple (Python 2.7)

>>> my_str = 'für' # char especial i umlaut, no un ascii char
>>> my_str
'f \ xfcr'
>>> print (my_str)
für

A l'exemple anterior, el caràcter no ascii de my_str es canvia a ascii char en segon pla, però print (my_str) va imprimir la cadena adequada. Està passant perquè internament python2.7 codifica el meu_str. Per tant, no podeu trucar a un mètode de codificació a my_str o python2.7 str. Però, es pot anomenar descodificació, ja que és codificada per pitó.

my_str.encode ('llatí-1')
Puja UnicodeDecodeError, perquè el meu_str ja està codificat.

my_str.decode ('latin-1') # retorna la cadena Unicode.

Però a python 3.x, allí unicode es denomina string (tipus str) i els bytes són byte type. Significa que per defecte totes les cadenes són cadenes unicode i no hi ha una cadena normal. Només unicode i bytes són els tipus de cadena del pitó 3.

my_str = 'exemple'
byte_str = amb l'exemple '
uni_str = u'exemple '
print (type (my_str) # Sortides 
print (type (byte_str) # Sortides 
print (type (uni_str) # Sortides 

Vol dir que, per defecte, podeu escriure o mantenir qualsevol tipus de caràcter no ascii amb el tipus str / unicode. A diferència de python2.7, python3.x no codifica una cadena internament i tracta el personatge segons l'estil Unicode. Per exemple

>>> my_str = 'für' # char especial i umlaut, no un ascii char
>>> my_str
'für'
>>> print (my_str)
für

>>> b'für '# intentant tenir una cadena de bytes amb no ascii char.
Fa un error, dient que els bytes només poden contenir caràcters d’associacions.

Però podeu descodificar-lo o tipografiar-lo proporcionant esquemes de codificació

>>> s1 = bytes (my_str, 'utf-8')
>>> s2 = my_str.encode ('utf-8')
>>> s1
b'f \ xfcr '
>>> s2
b'f \ xfcr '
# El mateix resultat

>>> s1.decode ('utf-8')
'für' # cadena unicode

2. Gairebé tot és generador a Python 3.x

El canvi més important i més important de Python 3.x en comparació amb python 2.7 és que tot s’ha convertit en generador. Els generadors de Python tenen un avantatge de l'ús eficaç de la memòria. Per què malgastar la memòria amb n ítems, quan podeu obtenir un article alhora.

A python2.7, hi ha mètode gamma i xrange, on xrange és un generador i un rang dóna una llista d'elements.

>>> gamma (5)
[1, 2, 3, 4, 5]

>>> xrange (5)
xrange (5) # un objecte iterador, generant un número alhora

A Python 3.x, no hi ha xrange, el propi rang es comporta com a xrange de Python 2.7

De la mateixa manera, qualsevol trucada o objecte que retornava una llista d’elements de python2.7 es substitueix per un objecte generador a Python 3.x

Exemples

Python 2.7
>>> gamma (5)
[1, 2, 3, 4, 5]

Python 3.x
>>> gamma (5)
rang (5) # objecte generador


Python 2.7
>>> zip ([1,2,3], [4,5,6])
[(1, 4), (2, 5), (3, 6)]

Python 3.x
>>> zip ([1,2,3], [4,5,6])
object object zip # object generator de cremallera


Python 2.7
>>> mapa (lambda x: x * x, [1,2,3,4,5])
[1, 4, 9, 16, 25]

Python 3.x
>>> mapa (lambda x: x * x, [1,2,3,4,5])
object object # mapa objecte generador


Python 2.7
>>> d1 = {'a': 1, 'b': 2, 'c': 3}
>>> d1.items ()
[('a', 1), ('b', 2), ('c', 3)]

Python 3.x
>>> d1 = {'a': 1, 'b': 2, 'c': 3}
>>> d1.items ()
objecte dict_items # objecte generador dict_items
# objectes similars per a d1.values ​​() i d1.keys () també

Aquestes i gairebé tots els tipus de funcionalitats que tornaven una llista a Python2.7, ara tornaran l'objecte generador a Python 3.6

A més, a diferència de Python 2.7, que conté articles en el diccionari de manera no ordenada, el diccionari Python 3.6 té un valor ordenat.

3. Definició de funcions amb el tipus de paràmetre esperat i tipus de dades de retorn a Python 3.x

def myfunc (num: int) -> int:
passar

Aquesta convenció no escriu fortament el vostre valor, és només una convenció per demostrar que espera un tipus de dades concret, però qualsevol altre valor no generarà cap error / excepció.

Podeu trobar més informació sobre aquest punt a la meva altra resposta a la resposta de Vivek Keshore a Com puc fer el paràmetre de funció de tipus fort a Python 3?

4. Fuga global de l’espai de noms a Python2.7

Entenem una fuga global d’espai de noms amb un exemple.

>>> i = 10
>>> imprimir i
10
>>> l1 = [i per a la gamma (5)]
>>> imprimir l1
>>> [0, 1, 2, 3, 4]
>>> i
4

A l'exemple anterior, podeu notar que la variable global "i" està canviada dins del context local de comprensió de la llista, que idealment no hauria de passar.

Mentre que a Python 3.x, no es produeix la filtració de l’espai de noms global. La variable amb el mateix nom dins del context local no tindrà cap efecte sobre la variable global del mateix nom.

>>> i = 10
>>> imprimir i
10
>>> l1 = [i per a la gamma (5)]
>>> imprimir l1
>>> [0, 1, 2, 3, 4]
>>> i
10

A part de tots aquests canvis, hi ha alguns canvis menors com

  • instrucció d'impressió (2.7) i mètode print () (3.x) entrada () i raw_input () en 2.7 i només entrada () en operador 3.xresultat de divisió / / operador en 2.7 i 3.xuse de "as" mentre excepte el maneig de l’excepció a 3.6, com excepte ValueError com l’arrodoniment d’erBanker a 3.x a diferència de 2.7, per exemple a la ronda 2.7 (14.5) —-> 15 i la ronda (15.5) —>> 16, però a la ronda python 3.x (14.5) —-> 15 i també rodona (15,5) —-> 15

Resposta 2:

Per obtenir més informació sobre la diferència entre Python 3 i Python 2.7, podeu visitar el servidor Wiki de Python Software Foundation, aprofundint en les diferències entre Python 2.7 i 3.3, dient que hi ha avantatges per a cadascú. Depèn realment del que esteu intentant aconseguir. Però, en resum: "Python 2.x és una herència, Python 3.x és el present i el futur del llenguatge."

Hi ha diferències subtils entre ambdues. Però la diferència més gran és la declaració impresa.

QUÈ ÉS UNA DIFERÈNCIA SOBRE L'INDICACIÓ D'IMPRESSIÓ

A partir d’una discussió sobre el desbordament de pila,

“El més visible (diferència) és probablement el funcionament de la instrucció“ print ”. És prou diferent que el mateix guió no podrà ser executat en ambdues versions alhora, però en tria una i estarà bé. ”Podeu obtenir més informació sobre això unint una bona escola de programació anomenada Holberton School i saber més informació sobre versions de Python i altres llenguatges de programació importants. "El principal avantatge de 3.x és que està en l'avantguarda, de manera que totes les novetats s'implantaran allà en lloc de ser afegides a 2.x. L’altra cosa que potser voldreu considerar és que és el pitó comú del futur, de manera que, un parell d’anys al capdavant, aquesta serà la branca madura a la qual van les persones. "


Resposta 3:

Per obtenir més informació sobre la diferència entre Python 3 i Python 2.7, podeu visitar el servidor Wiki de Python Software Foundation, aprofundint en les diferències entre Python 2.7 i 3.3, dient que hi ha avantatges per a cadascú. Depèn realment del que esteu intentant aconseguir. Però, en resum: "Python 2.x és una herència, Python 3.x és el present i el futur del llenguatge."

Hi ha diferències subtils entre ambdues. Però la diferència més gran és la declaració impresa.

QUÈ ÉS UNA DIFERÈNCIA SOBRE L'INDICACIÓ D'IMPRESSIÓ

A partir d’una discussió sobre el desbordament de pila,

“El més visible (diferència) és probablement el funcionament de la instrucció“ print ”. És prou diferent que el mateix guió no podrà ser executat en ambdues versions alhora, però en tria una i estarà bé. ”Podeu obtenir més informació sobre això unint una bona escola de programació anomenada Holberton School i saber més informació sobre versions de Python i altres llenguatges de programació importants. "El principal avantatge de 3.x és que està en l'avantguarda, de manera que totes les novetats s'implantaran allà en lloc de ser afegides a 2.x. L’altra cosa que potser voldreu considerar és que és el pitó comú del futur, de manera que, un parell d’anys al capdavant, aquesta serà la branca madura a la qual van les persones. "