У чым розніца паміж Python 3 і 2.7?


адказ 1:

У цяперашні час свет Python у асноўным падзелены на два фракцыі: той, які ўсё яшчэ працуе на Python 2.7, і той, які пачаў міграваць да 3.x альбо выкарыстоўвае 3.x без ведаў і досведу ў 2.7

Python 2.7 больш не будзе падтрымлівацца ў будучыні і хутка застарэе. Зваротны адлік Python 2.7

Такім чынам, пытанне пра адрозненні паміж 3.x і 2.7 з'яўляецца актуальным пытаннем, таму што, у адрозненне ад іншых мадэрнізацый, Python 3.x мае не толькі новыя магчымасці, але і змяняе філасофію і дызайн. І было б лепш назваць Python 3.x сталай мовай Python, чым проста мадэрнізаваць з 2.7

Вось некаторыя ключавыя адрозненні ў 2.7 і 3.x.

  1. Справа з str і Unicode:

У Python 2.7 ёсць звычайныя радкі, байтовыя радкі і радкі Unicode. На самай справе, байты і звычайныя па сутнасці аднолькавыя ў Python 2.7.

my_str = 'example' byte_str = b'example 'uni_str = u'example' print (тып (my_str) # вяртае ад друку (тып (byte_str) # вяртае) ад друку (тып (uni_str) # вяртае вунь

Няма нічога лепшага за тып байтаў. Іншымі словамі, звычайная радок паводзіць сябе як зашыфраваны тып толькі з сімваламі ASCII. Прыклад (Python 2.7)

>>> my_str = 'для' # спецыяльных знакаў і ўмаут, без сімвала ASCII >>> Meine_str 'f \ xfcr' >>> надрукаваць (my_str) мех

У прыкладзе вышэй, сімвал, які не з'яўляецца ASCII у my_str, змяняецца на ascii char у фонавым рэжыме, але print (my_str) надрукавала правільную радок. Гэта адбываецца таму, што Python 2.7 унутрана кадуе my_str. Такім чынам, вы не можаце выклікаць метад кадавання для my_str або python2.7 str. Але дэкадаваць можна назваць, таму што ён ужо закадаваны Python.

my_str.encode ('latin-1') падымае UnicodeDecodeError, таму што my_str ужо закадаваны. my_str.decode ('latin-1') # вяртае радок Unicode.

У Python 3.x, Unicode згадваецца як радок (тып str), а байт - як байт. Гэта азначае, што ўсе радкі па змаўчанні з'яўляюцца радкамі Unicode і няма звычайнай радкі. Толькі Unicode і байты - гэта тыпы радкоў у Python 3.

my_str = 'example' byte_str = b'example 'uni_str = u'example' print (тып (my_str) # вяртае ад друку (тып (byte_str) # вяртае) ад друку (тып (uni_str) # вяртае вунь

Гэта азначае, што па змаўчанні вы можаце ўвесці ці ўтрымліваць любыя сімвалы, акрамя ASCII сімвалаў з тыпам str / unicode. У адрозненне ад python2.7, python3.x не кадуе радок унутрана і апрацоўвае сімвал у адпаведнасці са стылем Unicode. Напрыклад

>>> my_str = 'для' # спецыяльных сімвалаў і ўмаут, без сімвала ASCII >>> my_str 'fur' >>> print (my_str) fur >>> b'for '# спрабуе напісаць байтовую радок з не-ASCII Каб былі сімвалы. Узнікае памылка, кажучы, што байты могуць утрымліваць толькі сімвалы ASCII. Тым не менш, вы можаце расшыфраваць або ўвесці яго, падаўшы схему кадавання >>> s1 = байт (my_str, 'utf-8') >>> s2 = mein_str.encode ('utf-8') >>> s1 b'f \ xfcr '>>> s2 b'f \ xfcr' # Той жа вынік >>> s1.decode ('utf-8') 'для' # радок Unicode

2. У Python 3.x амаль усё з'яўляецца генератарам

Самае важнае і самае вялікае змяненне Python 3.x у параўнанні з Python 2.7 - гэта тое, што ўсё стала генератарам. Генератары ў Python маюць перавагу эфектыўнага выкарыстання памяці. Навошта марнаваць памяць з n элементаў, калі можна атрымаць адзін элемент за адзін раз?

У python2.7 ёсць метады range і xrange, дзе xrange з'яўляецца генератарам, а дыяпазон змяшчае спіс элементаў.

>>> Дыяпазон (5) [1, 2, 3, 4, 5] >>> xrange (5) xrange (5) # аб'ект ітэратара, пры неабходнасці генеруе лік.

У Python 3.x няма XRange, сам Range паводзіць сябе як XRange з Python 2.7

Сапраўды гэтак жа кожны званок альбо аб'ект, які вяртае спіс элементаў у python2.7, у Python 3.x замяняецца генератарным аб'ектам.

Прыклады

Дыяпазон Python 2.7 >>> (5) [1, 2, 3, 4, 5] Python 3.x >>> дыяпазон (5) дыяпазон (5) # генератар аб'екта 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]) паштовы аб'ект # паштовы генератар, аб'ект, карта Python 2.7 >>> (лямбда х: х * х, [1,2,3,4,5]) [1, 4, 9, 16, 25] Python 3. x >>> карта (лямбда x: x * x, [1,2,3,4,5]) аб'ект карты # генератар карты аб'екта 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 generator generator # аналагічныя аб'екты таксама для d1.values ​​() і d1.keys ()

Гэтыя і практычна ўсе тыпы функцый, якія вярнулі спіс у Python 2.7, зараз вяртаюць аб'ект генератара ў Python 3.6

У адрозненне ад Python 2.7, які змяшчае элементы ў слоўніку ў неўпарадкаваным парадку, слоўнік Python 3.6 таксама змяшчае значэнне ў упарадкаваным парадку.

3. Вызначце функцыі з чаканым тыпам параметраў дадзеных і тыпам вяртання дадзеных у Python 3.x.

def myfunc (num: int) -> int: існуе

Гэтая канвенцыя не ўносіць сур'ёзных значэнняў у вашу каштоўнасць. Гэта проста канвенцыя, якая паказвае, што пэўны тып дадзеных чакаецца. Аднак ніякіх іншых значэнняў не ўзнікаюць памылкі і выключэнні.

Больш падрабязна пра гэта, глядзіце мой іншы адказ пад адказам Vivek Keshores на "Як мне ўвесці параметр" моцнага тыпу "ў Python 3?

4. Уцечка глабальнай прасторы імёнаў у Python2.7

Давайце разбярэмся ўцечкі глабальнай прасторы імёнаў на прыкладзе.

>>> i = 10 >>> друк i 10 >>> l1 = [i для i ў зоне (5)] >>> друк l1 >>> [0, 1, 2, 3, 4] >>> i 4-я

У прыкладзе вышэй можна ўбачыць, што глабальная зменная "i" змяняецца ў лакальным кантэксце разумення спісу, што ў ідэале не павінна адбывацца.

Пакуль у Python 3.x няма глабальнай уцечкі прасторы імен. Пераменная з тым жа імем у лакальным кантэксце не ўплывае на глабальную зменную з такім жа імем.

>>> i = 10 >>> друк i 10 >>> l1 = [i для i ў зоне (5)] >>> друк l1 >>> [0, 1, 2, 3, 4] >>> i 10-я

Акрамя ўсіх гэтых змен, ёсць некаторыя нязначныя змены, такія як

  • аперацыю print (2.7) і print () метад (3.x) увод () і raw_input () у 2.7 і толькі ўваход () у 3. вынікі дзялення "/" аператара ў 2.7 і 3.xuse "as" у той час Лячэнне выключэння ў 3.6, як і выключэнне ValueError, як акругленне erBanker у 3.x, у адрозненне ад 2.7, напрыклад, у 2.7 раунда (14.5) -> 15 і круглага (15.5) -> 16, але ў Python 3.x. Круглы (14.5) -> 15, а таксама круглы (15.5) -> 15

адказ 2:

Каб даведацца больш пра розніцу паміж Python 3 і Python 2.7, наведайце Wiki Server серверу праграмнага забеспячэння Python, у якім падрабязна апісаны адрозненні паміж Python 2.7 і 3.3. Гэта сапраўды залежыць ад таго, чаго вы хочаце дасягнуць. Выснова: "Python 2.x - гэта спадчына, Python 3.x - сучаснасць і будучыня мовы".

Існуюць тонкія адрозненні паміж імі. Самая вялікая розніца, аднак, у выразе.

Што адрозніваецца ад друку

З дыскусіі пра перапаўненне стэка,

"Самая бачная (розніца) - верагодна, тое, як працуе" print ". Дастаткова адрозніваецца тое, што адзін і той жа сцэнар не можа працаваць адначасова на абедзвюх версіях, але выберыце яго і вы не пярэчыце. "Вы можаце даведацца больш пра гэта, уступіўшы ў добрую школу праграмавання пад назвай Holberton School і даведаючыся пра версіі Python і іншыя асноўныя мовы праграмавання. "Галоўнай перавагай 3.x з'яўляецца тое, што ён актуальны, таму ўсе новыя функцыі ўкараняюцца там, а не дадаюцца ў" 2.x ". Другая рэч, якую вы можаце падумаць, гэта тое, што гэта агульны пітон будучыні. Такім чынам, калі паглядзець некалькі гадоў пазней, гэта будзе спелая галіна, у якую ідуць людзі. "


адказ 3:

Каб даведацца больш пра розніцу паміж Python 3 і Python 2.7, наведайце Wiki Server серверу праграмнага забеспячэння Python, у якім падрабязна апісаны адрозненні паміж Python 2.7 і 3.3. Гэта сапраўды залежыць ад таго, чаго вы хочаце дасягнуць. Выснова: "Python 2.x - гэта спадчына, Python 3.x - сучаснасць і будучыня мовы".

Існуюць тонкія адрозненні паміж імі. Самая вялікая розніца, аднак, у выразе.

Што адрозніваецца ад друку

З дыскусіі пра перапаўненне стэка,

"Самая бачная (розніца) - верагодна, тое, як працуе" print ". Дастаткова адрозніваецца тое, што адзін і той жа сцэнар не можа працаваць адначасова на абедзвюх версіях, але выберыце яго і вы не пярэчыце. "Вы можаце даведацца больш пра гэта, уступіўшы ў добрую школу праграмавання пад назвай Holberton School і даведаючыся пра версіі Python і іншыя асноўныя мовы праграмавання. "Галоўнай перавагай 3.x з'яўляецца тое, што ён актуальны, таму ўсе новыя функцыі ўкараняюцца там, а не дадаюцца ў" 2.x ". Другая рэч, якую вы можаце падумаць, гэта тое, што гэта агульны пітон будучыні. Такім чынам, калі паглядзець некалькі гадоў пазней, гэта будзе спелая галіна, у якую ідуць людзі. "