Aký je rozdiel medzi Pythonom 3 a 2.7?


Odpoveď 1:

Odteraz sa svet Pythonu väčšinou delí na dve frakcie: jedna, ktorá stále pracuje na Pythone 2.7 a druhá, ktorá začala migrovať na 3.x alebo začala používať 3.x bez akýchkoľvek vedomostí alebo skúseností v 2.7.

Python 2.7 však v budúcnosti nebude podporovaný a čoskoro bude zastaraný. Odpočítavanie v Pythone 2.7

Otázka, aké sú rozdiely medzi 3.xa 2.7, je teda horúcou otázkou, pretože na rozdiel od iných upgradov má Python 3.x nielen nové funkcie, ale aj inline filozofiu a samotný dizajn. A bolo by lepšie nazývať Python 3.x ako vyzretý jazyk Python, nie iba ako upgrade na 2,7

Nasledujú niektoré dôležité rozdiely v bodoch 2.7 a 3.x

  1. Manipulácia so str a unicode:

V pythone 2.7 sú normálne reťazce, bajtové reťazce a reťazce unicode. Ale vlastne bajty a normálne sú v Pythone 2.7 v podstate rovnaké.

my_str = 'example'
byte_str = b'example '
uni_str = u'example '
print (type (my_str) # Výstupy 
print (type (byte_str) # Výstupy 
print (type (uni_str) # Výstupy 

Neexistuje nič ako typ bajtov alebo inými slovami, normálny reťazec sa správa ako kódovaný typ s iba znakmi ASCII. Príklad (Python 2.7)

>>> my_str = 'für' # špeciálny znak, nie znak ascii
>>> my_str
'F \ xfcr'
>>> tlač (my_str)
für

Vo vyššie uvedenom príklade sa znak non ascii v my_str v pozadí zmení na ascii char, ale tlač (my_str) vytlačí správny reťazec. Deje sa to preto, lebo interne python2.7 kóduje my_str. Takže nemôžete volať metódu kódovania na my_str alebo python2.7 str. Ale dekódovanie sa dá nazvať, pretože je už kódované pythónom.

my_str.encode ( 'latin-1'),
Zvyšuje kód UnicodeDecodeError, pretože kód my_str je už kódovaný.

my_str.decode ('latin-1') # vracia reťazec unicode.

Ale v pythone 3.x sa unicode nazýva reťazec (typ str) a bajty sú typ byte. To znamená, že všetky reťazce sú predvolene reťazce unicode a neexistuje žiadny normálny reťazec. Typy reťazcov v pythone 3 sú iba unicode a bajty.

my_str = 'example'
byte_str = b'example '
uni_str = u'example '
print (type (my_str) # Výstupy 
print (type (byte_str) # Výstupy 
print (type (uni_str) # Výstupy 

To znamená, že v predvolenom nastavení môžete písať alebo držať ľubovoľný znak bez ascii aj s typom str / unicode. Na rozdiel od python2.7 python3.x interne nekóduje reťazec a zaobchádza so znakom podľa štýlu unicode. Napríklad

>>> my_str = 'für' # špeciálny znak, nie znak ascii
>>> my_str
'Für'
>>> tlač (my_str)
für

>>> b'für '# sa snaží mať bajtový reťazec bez znaku ascii char.
Raises Error s tým, že bajty môžu obsahovať iba znaky ASCII.

Môžete ho však dekódovať alebo zadať zadaním schémy kódovania

>>> s1 = bytes (my_str, 'utf-8')
>>> s2 = my_str.encode ('utf-8')
>>> s1
b'f \ xfcr '
>>> s2
b'f \ xfcr '
# Rovnaký výsledok

>>> s1.decode ('utf-8')
'für' # reťazec unicode

2. Takmer všetko je generátor v Pythone 3.x

Najdôležitejšia a najväčšia zmena v Pythone 3.x v porovnaní s Pythonom 2.7 je, že všetko sa stalo generátorom. Generátory v Pythone majú výhodu efektívneho využitia pamäte. Prečo strácať pamäť n položkami, keď môžete naraz získať jednu položku.

V python2.7 existuje metóda rozsahu a xrange, kde xrange je generátor a rozsah poskytuje zoznam položiek.

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

>>> xrange (5)
xrange (5) # iterátorový objekt, ktorý v prípade potreby vygeneruje jedno číslo

V Pythone 3.x neexistuje xrange, rozsah sa správa ako xrange Pythonu 2.7

Podobne je každé volanie alebo objekt, ktorý vracal zoznam položiek v python2.7, nahradené objektom generátora v Python 3.x

Príklady

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

Python 3.x
>>> rozsah (5)
rozsah (5) # generátorový objekt


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

Python 3.x
>>> zips ([1,2,3], [4,5,6])
objekt generátora zip


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])
mapový objekt # generátorový objekt mapy


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 ()
objekt generátora dict_items # dict_items
# podobné objekty aj pre d1.values ​​() a d1.keys ()

Tieto a takmer všetky typy funkcií, ktoré vracali zoznam v Python2.7, budú teraz vracať objekt generátora v Python 3.6

Navyše, na rozdiel od Pythonu 2.7, ktorý drží položky v slovníku neusporiadaným spôsobom, slovník Python 3.6 drží hodnotu usporiadaným spôsobom.

3. Definovanie funkcií s očakávaným dátovým typom a návratovým dátovým typom v Pythone 3.x

def myfunc (num: int) -> int:
míňať

Tieto konvencie výrazne nezadávajú vašu hodnotu, ide iba o konvenciu, ktorá ukazuje, že očakáva konkrétny typ údajov, ale žiadna iná hodnota nezvýši žiadnu chybu / výnimku.

Viac o tomto bode nájdete v mojej ďalšej odpovedi na odpoveď Viveka Keshora na otázku Ako môžem silný parameter funkcie napísať v Pythone 3?

4. Globálny únik priestoru názvov v Python2.7

Pochopme príklad úniku globálneho priestoru názvov.

>>> i = 10
>>> tlačiť i
10
>>> l1 = [i pre i v rozsahu (5)]
>>> tlač l1
>>> [0, 1, 2, 3, 4]
>>> i
4

Vo vyššie uvedenom príklade si môžete všimnúť, že globálna premenná „i“ sa mení v lokálnom kontexte porozumenia zoznamu, čo by sa v ideálnom prípade nemalo stať.

Zatiaľ čo v Pythone 3.x nedochádza k úniku globálneho priestoru názvov. Premenná s rovnakým menom v lokálnom kontexte nemá žiaden vplyv na globálnu premennú s rovnakým menom.

>>> i = 10
>>> tlačiť i
10
>>> l1 = [i pre i v rozsahu (5)]
>>> tlač l1
>>> [0, 1, 2, 3, 4]
>>> i
10

Okrem všetkých týchto zmien existujú aj menšie zmeny

  • príkaz print (2.7) a print () method (3.x) input () & raw_input () in 2.7 a only input () in 3.x result of Division '/' operator in 2.7 and 3.xuse 'as' while manipulácia s výnimkou v 3.6, ako s výnimkou ValueError, ako je zaokrúhlenie erBankera v 3.x na rozdiel od 2.7, napríklad v 2,7 kole (14,5) -> 15 a kole (15,5) ---> 16, ale v pythonovom 3.x kole (14,5) —-> 15 a tiež okolo (15.5) —-> 15

Odpoveď 2:

Aby ste sa dozvedeli viac o rozdieloch medzi Python 3 a Python 2.7, môžete navštíviť Python Software Foundation Wiki Server, ktorý prechádza do hĺbky rozdielov medzi Python 2.7 a 3.3 a hovorí, že pre každého sú výhody. Skutočne záleží na tom, čo sa snažíte dosiahnuť. Ale v súhrne: „Python 2.x je dedičstvo, Python 3.x je súčasnosť a budúcnosť jazyka.“

Medzi nimi sú jemné rozdiely. Najväčší rozdiel je v tlači.

ČO JE RÔZNE O TLAČOVOM VYHLÁSENÍ

Z diskusie o Stack Overflow,

„Najviditeľnejší (rozdiel) je pravdepodobne spôsob, akým funguje tlačené vyhlásenie. Je dosť odlišné na to, aby ten istý skript nemohol bežať súčasne na oboch verziách, ale vyberte jednu a budete v poriadku. “Viac sa o nich môžete dozvedieť pripojením sa k dobrej programovacej škole s názvom Holberton School a vedieť, viac o verziách Pythonu a ďalších dôležitých programovacích jazykoch. „Hlavnou výhodou 3.x je to, že je na špici, takže všetky nové funkcie sa tam implementujú a nie sa pridávajú do 2.x. Druhou vecou, ​​ktorú by ste mohli chcieť zvážiť, je to, že je to obyčajný python budúcnosti, takže ak sa pozrieme o pár rokov nižšie, bude to zrelá vetva, do ktorej ľudia chodia. “


Odpoveď 3:

Aby ste sa dozvedeli viac o rozdieloch medzi Python 3 a Python 2.7, môžete navštíviť Python Software Foundation Wiki Server, ktorý prechádza do hĺbky rozdielov medzi Python 2.7 a 3.3 a hovorí, že pre každého sú výhody. Skutočne záleží na tom, čo sa snažíte dosiahnuť. Ale v súhrne: „Python 2.x je dedičstvo, Python 3.x je súčasnosť a budúcnosť jazyka.“

Medzi nimi sú jemné rozdiely. Najväčší rozdiel je v tlači.

ČO JE RÔZNE O TLAČOVOM VYHLÁSENÍ

Z diskusie o Stack Overflow,

„Najviditeľnejší (rozdiel) je pravdepodobne spôsob, akým funguje tlačené vyhlásenie. Je dosť odlišné na to, aby ten istý skript nemohol bežať súčasne na oboch verziách, ale vyberte jednu a budete v poriadku. “Viac sa o nich môžete dozvedieť pripojením sa k dobrej programovacej škole s názvom Holberton School a vedieť, viac o verziách Pythonu a ďalších dôležitých programovacích jazykoch. „Hlavnou výhodou 3.x je to, že je na špici, takže všetky nové funkcie sa tam implementujú a nie sa pridávajú do 2.x. Druhou vecou, ​​ktorú by ste mohli chcieť zvážiť, je to, že je to obyčajný python budúcnosti, takže ak sa pozrieme o pár rokov nižšie, bude to zrelá vetva, do ktorej ľudia chodia. “