Care este diferența dintre, Python 3 și 2.7?


Răspunsul 1:

În prezent lumea Python este împărțită în cea mai mare parte în două facțiuni, una care încă lucrează la Python 2.7 și una care a început să migreze către 3.x sau a început să folosească 3.x fără cunoștințe sau experiență în 2.7.

Python 2.7 este oricum nu va fi acceptat și în curând va deveni învechit. Python 2.7 Countdown

Deci, întrebarea care sunt diferențele dintre 3.x și 2.7 este o întrebare arzătoare, deoarece, spre deosebire de orice alte actualizări, Python 3.x nu numai că are caracteristici noi, dar filosofia inline și designul în sine sunt modificate. Și ar fi mai bine să apelăm la Python 3.x ca limbă Python maturizată, decât la o actualizare de 2,7

Următoarele sunt unele diferențe importante în 2.7 și 3.x

  1. Manipularea str și unicode:

În python 2.7, există șir normal, șir de byte și șir unicode. Dar de fapt octeții și normalul sunt în esență același lucru în Python 2.7.

my_str = 'exemplu'
byte_str = cu exempiu '
uni_str = u'exemplu '
print (tip (my_str) # Ieșiri 
print (tip (byte_str) # Ieșiri 
print (tip (uni_str) # Ieșiri 

Nu există nimic de tipul octeților sau, cu alte cuvinte, șirul normal se comportă ca tipul codificat cu doar caractere ascii. Exemplu (Python 2.7)

>>> my_str = 'für' # special char u umlaut, nu un ascii char
>>> my_str
'F \ xfcr'
>>> print (my_str)
blană

În exemplul de mai sus, caracterul non ascii din my_str este schimbat în ascii char în fundal, dar print (my_str) a imprimat șirul corespunzător. Se întâmplă deoarece python2.7 intern codifică my_str. Deci, nu puteți apela o metodă de codare pe str. My_str sau python2.7. Dar, decodarea poate fi numită, deoarece este codificată deja de python.

my_str.encode ( 'latin-1')
Crește UnicodeDecodeError, deoarece my_str este deja codificat.

my_str.decode ('latin-1') # returnează șirul unicode.

Dar în python 3.x, acolo unicode este numit string (tip str), iar bytes este byte type. Înseamnă că toate șirurile implicit sunt șiruri unicode și nu există un șir normal. Numai unicode și octeți sunt tipurile de șiruri din python 3.

my_str = 'exemplu'
byte_str = cu exempiu '
uni_str = u'exemplu '
print (tip (my_str) # Ieșiri 
print (tip (byte_str) # Ieșiri 
print (tip (uni_str) # Ieșiri 

Înseamnă că, în mod implicit, puteți tasta sau reține orice caracter non ascii, de asemenea, cu tip str / unicode. Spre deosebire de python2.7, python3.x nu codifică o șir internă și tratează caracterul în funcție de stilul Unicode. De exemplu

>>> my_str = 'für' # special char u umlaut, nu un ascii char
>>> my_str
'blană'
>>> print (my_str)
blană

>>> b'für '# încearcă să aibă șir de byte cu non ascii char.
Crește eroare, spunând că octeții pot reține doar caractere ascii.

Dar puteți să o decodați sau să o tastați prin furnizarea schemei de codificare

>>> s1 = octeți (my_str, 'utf-8')
>>> s2 = my_str.encode ('utf-8')
>>> s1
b'f \ xfcr“
>>> s2
b'f \ xfcr“
# Același rezultat

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

2. Aproape totul este generator în Python 3.x

Cea mai importantă și cea mai mare schimbare în Python 3.x în comparație cu python 2.7 este că totul a devenit generator. Generatoarele din Python au un avantaj de utilizarea eficientă a memoriei. De ce să pierzi memoria cu n articole, când poți obține un articol simultan.

În python2.7, există metoda range și xrange, unde xrange este un generator, iar gama oferă o listă de elemente.

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

>>> xrange (5)
xrange (5) # un obiect iterator, generând un număr la un moment dat când este nevoie

În Python 3.x, nu există xrange, intervalul în sine se comportă ca xrange din Python 2.7

În mod similar, orice apel sau obiect care returnează o listă de elemente din python2.7 este înlocuit cu un obiect generator în Python 3.x

Exemple

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

Python 3.x
>>> gama (5)
interval (5) # obiect generator


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

Python 3.x
>>> fermoar ([1,2,3], [4,5,6])
Obiect zip # obiect generator zip


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

Python 3.x
>>> hartă (lambda x: x * x, [1,2,3,4,5])
obiect de hartă # map generator object


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 ()
obiect dict_items # obiect generator dict_items
# obiecte similare pentru d1.values ​​() și d1.keys ()

Acestea și aproape toate tipurile de funcționalități care returnau o listă în Python2.7, vor reveni acum la obiectul generator în Python 3.6

Mai mult, spre deosebire de Python 2.7, care conține elemente în dicționar, în mod necomandat, dicționarul Python 3.6 are valoare în mod ordonat.

3. Definirea funcțiilor cu tipul de date de parametri preconizat și tipul de date returnat în Python 3.x

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

Această convenție nu scrie foarte puternic valoarea dvs., este doar o convenție care arată că așteaptă un anumit tip de date, dar orice altă valoare nu va ridica nicio eroare / excepție.

Mai multe despre acest punct puteți găsi în celălalt răspuns al meu la răspunsul lui Vivek Keshore la Cum pot parametrul funcției tip puternic în Python 3?

4. Scurgere globală a spațiului de nume în Python2.7

Să înțelegem scurgerea globală a spațiului de nume cu un exemplu.

>>> i = 10
>>> tipăresc i
10
>>> l1 = [i pentru i în interval (5)]
>>> print l1
>>> [0, 1, 2, 3, 4]
>>> i
4

În exemplul de mai sus, puteți observa că variabila globală „i” este schimbată în contextul local de înțelegere a listei, ceea ce în mod ideal nu ar trebui să se întâmple.

În timp ce în Python 3.x, scurgerea globală a spațiului de nume nu se întâmplă. Variabila cu același nume în contextul local nu va avea niciun efect asupra variabilei globale cu același nume.

>>> i = 10
>>> tipăresc i
10
>>> l1 = [i pentru i în interval (5)]
>>> print l1
>>> [0, 1, 2, 3, 4]
>>> i
10

În afară de toate aceste schimbări, există unele modificări minore, cum ar fi

  • print statement (2.7) și print () metoda (3.x) input () & raw_input () în 2.7 și numai input () în 3.xresult of division '/' operator în 2.7 și 3.xuse of 'as' while gestionarea excepției în 3.6, cum ar fi, cu excepția ValueError, ca rotunjirea erBanker în 3.x spre deosebire de 2.7, de exemplu în 2.7 round (14.5) —-> 15 și round (15.5) —>> 16, dar în python 3.x round (14.5) —-> 15 și, de asemenea, rotunde (15,5) —-> 15

Răspunsul 2:

Pentru a afla mai multe despre diferența dintre Python 3 și Python 2.7, puteți vizita Python Software Foundation Wiki Server întrucât se aprofundează asupra diferențelor dintre Python 2.7 și 3.3, spunând că există beneficii pentru fiecare. Depinde cu adevărat de ceea ce încercați să obțineți. Dar, rezumând: „Python 2.x este moștenire, Python 3.x este prezentul și viitorul limbii.”

Există diferențe subtile între cele două. Dar cea mai mare diferență este declarația de tipărire.

CE ESTE DIFERIT DE DESPRE DECLARAȚIA PRINTĂ

Luat dintr-o discuție despre Stack Overflow,

„Cea mai vizibilă (diferență) este probabil modul în care funcționează instrucțiunea„ print ”. Este suficient de diferit încât același scenariu să nu poată rula pe ambele versiuni în același timp, ci alege una și vei fi în regulă. Puteți afla mai multe despre acestea, alăturându-vă unei școli bune de programare numită Holberton School și să știți mai multe despre versiunile Python și alte limbaje de programare importante. „Principalul avantaj al 3.x este că este pe marginea vârfului, astfel încât toate noile caracteristici vor fi implementate acolo, în loc să fie adăugate la 2.x. Celălalt lucru pe care poate doriți să-l luați în considerare este faptul că este pitonul comun al viitorului, așa că, privind câțiva ani în linie, aceasta va fi ramura matură la care merg oamenii. "


Răspunsul 3:

Pentru a afla mai multe despre diferența dintre Python 3 și Python 2.7, puteți vizita Python Software Foundation Wiki Server întrucât se aprofundează asupra diferențelor dintre Python 2.7 și 3.3, spunând că există beneficii pentru fiecare. Depinde cu adevărat de ceea ce încercați să obțineți. Dar, rezumând: „Python 2.x este moștenire, Python 3.x este prezentul și viitorul limbii.”

Există diferențe subtile între cele două. Dar cea mai mare diferență este declarația de tipărire.

CE ESTE DIFERIT DE DESPRE DECLARAȚIA PRINTĂ

Luat dintr-o discuție despre Stack Overflow,

„Cea mai vizibilă (diferență) este probabil modul în care funcționează instrucțiunea„ print ”. Este suficient de diferit încât același scenariu să nu poată rula pe ambele versiuni în același timp, ci alege una și vei fi în regulă. Puteți afla mai multe despre acestea, alăturându-vă unei școli bune de programare numită Holberton School și să știți mai multe despre versiunile Python și alte limbaje de programare importante. „Principalul avantaj al 3.x este că este pe marginea vârfului, astfel încât toate noile caracteristici vor fi implementate acolo, în loc să fie adăugate la 2.x. Celălalt lucru pe care poate doriți să-l luați în considerare este faptul că este pitonul comun al viitorului, așa că, privind câțiva ani în linie, aceasta va fi ramura matură la care merg oamenii. "