Wat is het verschil tussen, Python 3 en 2.7?


Antwoord 1:

Vanaf nu is de Python-wereld grotendeels verdeeld in twee facties, een die nog steeds aan Python 2.7 werkt en een die begint te migreren naar 3.x of 3.x begint te gebruiken zonder enige kennis of ervaring in 2.7

Python 2.7 is hoe dan ook niet ondersteund in de toekomst en zal snel verouderd raken. Python 2.7 Countdown

Dus de vraag wat de verschillen zijn tussen 3.x en 2.7 is een brandende vraag, want in tegenstelling tot andere upgrades heeft Python 3.x niet alleen nieuwe functies, maar ook de inline-filosofie en het ontwerp zelf is veranderd. En het zou beter zijn om Python 3.x als een gerijpte Python-taal te noemen in plaats van alleen een upgrade van 2.7

Hierna volgen enkele belangrijke verschillen in 2.7 en 3.x

  1. Behandeling van str en unicode:

In python 2.7 zijn er een normale string, een byte-string en een unicode-string. Maar eigenlijk zijn bytes en normaal in wezen hetzelfde in python 2.7.

my_str = 'voorbeeld'
byte_str = b'example '
uni_str = u'example '
print (type (my_str) # Uitgangen 
print (type (byte_str) # Uitgangen 
print (type (uni_str) # Uitgangen 

Er gaat niets boven het type bytes, of met andere woorden: normale tekenreeks gedraagt ​​zich als gecodeerd type met alleen ASCII-tekens. Voorbeeld (Python 2.7)

>>> my_str = 'für' # special char u umlaut, not a ascii char
>>> my_str
'F \ xfcr'
>>> afdrukken (my_str)
vacht

In het bovenstaande voorbeeld is het niet-ascii-teken in my_str gewijzigd in ascii-teken op de achtergrond, maar print (my_str) heeft de juiste tekenreeks afgedrukt. Het gebeurt omdat intern python2.7 codeert voor de my_str. U kunt dus geen coderingsmethode op my_str of python2.7 str aanroepen. Maar decoderen kan worden genoemd, omdat het al door python is gecodeerd.

my_str.encode ( 'latin-1')
Verhoogt UnicodeDecodeError, omdat my_str al is gecodeerd.

my_str.decode ('latin-1') # retourneert een unicode-tekenreeks.

Maar in python 3.x wordt er unicode als string (str-type) genoemd en bytes is het byte-type. Het betekent dat alle tekenreeksen standaard Unicode-tekenreeksen zijn en dat er geen normale tekenreeks is. Alleen unicode en bytes zijn het type string in python 3.

my_str = 'voorbeeld'
byte_str = b'example '
uni_str = u'example '
print (type (my_str) # Uitgangen 
print (type (byte_str) # Uitgangen 
print (type (uni_str) # Uitgangen 

Het betekent dat je standaard elk niet-ascii-teken kunt typen of vasthouden met het str / unicode-type. In tegenstelling tot python2.7 codeert python3.x niet intern voor een string en behandelt het karakter volgens de unicode-stijl. Bijvoorbeeld

>>> my_str = 'für' # special char u umlaut, not ascii char
>>> my_str
'vacht'
>>> afdrukken (my_str)
vacht

>>> b'für '# probeert byte string te hebben met niet-ascii char.
Raises Error, zeggend dat bytes alleen ascii-tekens kunnen bevatten.

Maar u kunt het decoderen of typecasten door een coderingsschema aan te bieden

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

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

2. Bijna alles is generator in Python 3.x

De belangrijkste en grootste verandering in Python 3.x ten opzichte van python 2.7 is dat alles generator is geworden. Generatoren in Python hebben het voordeel van effectief geheugengebruik. Waarom geheugen verspillen met n items, wanneer u één item tegelijk kunt krijgen.

In python2.7 is er de methode bereik en xrange, waarbij xrange een generator is en bereik een lijst met items geeft.

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

>>> xrange (5)
xrange (5) # een iterator-object, dat telkens één nummer genereert wanneer dat nodig is

In Python 3.x is er geen xrange, bereik zelf gedraagt ​​zich als xrange van Python 2.7

Evenzo wordt elke aanroep of elk object dat een lijst met items in python2.7 retourneerde, vervangen door een generatorobject in Python 3.x

Voorbeelden

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

Python 3.x
>>> bereik (5)
bereik (5) # generatorobject


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])
zip object # zip generator object


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

Python 3.x
>>> kaart (lambda x: x * x, [1,2,3,4,5])
map object # 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 ()
dict_items object # dict_items generatorobject
# vergelijkbare objecten voor d1.values ​​() en d1.keys () ook

Deze en bijna alle soorten functionaliteit die een lijst in Python2.7 retourneerden, zullen nu een generatorobject in Python 3.6 retourneren

Bovendien, in tegenstelling tot Python 2.7 dat items in het woordenboek op ongeordende wijze bevat, heeft Python 3.6 woordenboek waarde op de geordende manier.

3. Definiëren van functies met verwacht parameter datatype en retourneer datatype in Python 3.x

def myfunc (num: int) -> int:
voorbij gaan aan

In deze conventies wordt uw waarde niet sterk getypeerd, het is gewoon een conventie om aan te tonen dat het een bepaald gegevenstype verwacht, maar andere waarden zullen geen fouten / uitzonderingen veroorzaken.

Meer hierover is te vinden in mijn andere antwoord op het antwoord van Vivek Keshore op Hoe kan ik de functieparameter sterk typen in Python 3?

4. Globaal naamruimtelek in Python2.7

Laten we een algemeen naamruimtelek met een voorbeeld begrijpen.

>>> i = 10
>>> afdrukken i
10
>>> l1 = [i voor i binnen bereik (5)]
>>> afdrukken l1
>>> [0, 1, 2, 3, 4]
>>> i
4

In het bovenstaande voorbeeld ziet u dat de globale variabele ‘i’ is gewijzigd in de lokale context van het begrip van de lijst, wat idealiter niet zou moeten gebeuren.

Terwijl in Python 3.x geen wereldwijd naamruimtelek optreedt. Variabele met dezelfde naam in lokale context heeft geen effect op globale variabele met dezelfde naam.

>>> i = 10
>>> afdrukken i
10
>>> l1 = [i voor i binnen bereik (5)]
>>> afdrukken l1
>>> [0, 1, 2, 3, 4]
>>> i
10

Afgezien van al deze wijzigingen zijn er enkele kleine wijzigingen zoals

  • print statement (2.7) en print () methode (3.x) input () & raw_input () in 2.7 en alleen input () in 3.xult of divisie '/' operator in 2.7 en 3.xuse of 'as' while afhandeling uitzondering in 3.6, zoals behalve ValueError als afronding van erBanker in 3.x in tegenstelling tot 2.7, bijvoorbeeld in 2.7 ronde (14.5) —-> 15 en ronde (15.5) —-> 16, maar in python 3.x ronde (14.5) —-> 15 en ook ronde (15.5) —-> 15

Antwoord 2:

Om meer te weten te komen over het verschil tussen Python 3 en Python 2.7, kun je de Python Software Foundation Wiki Server bezoeken, omdat deze dieper ingaat op de verschillen tussen Python 2.7 en 3.3, en zegt dat er voordelen zijn voor elk. Het hangt echt af van wat u probeert te bereiken. Maar kort samengevat: "Python 2.x is erfenis, Python 3.x is het heden en de toekomst van de taal."

Er zijn subtiele verschillen tussen de twee. Maar het grootste verschil is de printverklaring.

WAT IS ANDERS OVER DE PRINTVERKLARING

Uit een discussie over Stack Overflow,

"Het meest zichtbare (verschil) is waarschijnlijk de manier waarop de" print "-instructie werkt. Het is anders genoeg dat hetzelfde script niet tegelijkertijd op beide versies kan worden uitgevoerd, maar kies er een en je komt wel goed. ”Je kunt hier meer over leren door lid te worden van een goede programmeerschool genaamd Holberton School en weet meer over Python-versies en andere belangrijke programmeertalen. “Het belangrijkste voordeel van 3.x is dat het op het snijvlak staat, dus alle nieuwe functies zullen erin worden geïmplementeerd in plaats van toegevoegd aan 2.x. Het andere wat je misschien wilt overwegen, is dat het de gemeenschappelijke python van de toekomst is, dus als je een paar jaar verder kijkt, zal dit de volwassen tak zijn waar mensen naartoe gaan. ”


Antwoord 3:

Om meer te weten te komen over het verschil tussen Python 3 en Python 2.7, kun je de Python Software Foundation Wiki Server bezoeken, omdat deze dieper ingaat op de verschillen tussen Python 2.7 en 3.3, en zegt dat er voordelen zijn voor elk. Het hangt echt af van wat u probeert te bereiken. Maar kort samengevat: "Python 2.x is erfenis, Python 3.x is het heden en de toekomst van de taal."

Er zijn subtiele verschillen tussen de twee. Maar het grootste verschil is de printverklaring.

WAT IS ANDERS OVER DE PRINTVERKLARING

Uit een discussie over Stack Overflow,

"Het meest zichtbare (verschil) is waarschijnlijk de manier waarop de" print "-instructie werkt. Het is anders genoeg dat hetzelfde script niet tegelijkertijd op beide versies kan worden uitgevoerd, maar kies er een en je komt wel goed. ”Je kunt hier meer over leren door lid te worden van een goede programmeerschool genaamd Holberton School en weet meer over Python-versies en andere belangrijke programmeertalen. “Het belangrijkste voordeel van 3.x is dat het op het snijvlak staat, dus alle nieuwe functies zullen erin worden geïmplementeerd in plaats van toegevoegd aan 2.x. Het andere wat je misschien wilt overwegen, is dat het de gemeenschappelijke python van de toekomst is, dus als je een paar jaar verder kijkt, zal dit de volwassen tak zijn waar mensen naartoe gaan. ”