Яка різниця між 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 = 'приклад'
byte_str = b'приклад '
uni_str = u'primple '
print (тип (my_str) # Виходи <тип 'str'>
print (тип (byte_str) # Виводи <тип 'str'>
print (тип (uni_str) # Виводи <тип 'unicode'>

Немає нічого типу типу байтів, або іншими словами, звичайний рядок поводиться як закодований тип із лише символами ascii. Приклад (Python 2.7)

>>> my_str = 'für' # спеціальний char u umlaut, а не ascii char
>>> мій_стр
'f \ xfcr'
>>> друк (мій_стр)
für

У наведеному вище прикладі символ non ascii в my_str змінюється на ascii char у фоновому режимі, але print (my_str) друкує відповідний рядок. Це відбувається тому, що внутрішньо python2.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 = 'приклад'
byte_str = b'приклад '
uni_str = u'primple '
print (тип (my_str) # Виходи <тип 'str'>
print (тип (byte_str) # Виводи <тип 'байтів'>)
print (тип (uni_str) # Виводи <тип 'str'>

Це означає, що за замовчуванням ви можете вводити або утримувати будь-який символ, який не є ascii, а також тип str / unicode. На відміну від python2.7, python3.x не кодує рядок внутрішньо і обробляє символ відповідно до стилю unicode. Наприклад

>>> my_str = 'für' # спеціальний char u umlaut, а не ascii char
>>> мій_стр
'für'
>>> друк (мій_стр)
für

>>> b'für '# намагається мати байтовий рядок із знаками, які не мають ascii.
Піднімає помилку, кажучи, що байти можуть містити лише символи ascii.

Але ви можете його розшифрувати або набрати, надавши схему кодування

>>> s1 = байти (my_str, 'utf-8')
>>> s2 = my_str.encode ('utf-8')
>>> s1
b'f \ xfcr '
>>> s2
b'f \ xfcr '
# Той же результат

>>> s1.decode ('utf-8')
'für' # рядок unicode

2. Майже все є генератором в Python 3.x

Найбільш важливою і найбільшою зміною в Python 3.x порівняно з python 2.7 є те, що все стало генератором. Генератори в Python мають перевагу в ефективному використанні пам'яті. Навіщо витрачати пам'ять на n предметів, коли ви можете отримати один предмет за один раз.

У python2.7 є метод діапазону та xrange, де xrange є генератором, а діапазон дає список елементів.

>>> діапазон (5)
[1, 2, 3, 4, 5]

>>> xrange (5)
xrange (5) # об’єкт ітератора, генеруючи по одному номеру за необхідності

У Python 3.x немає xrange, сам діапазон поводиться як 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])
об’єкт zip # об'єкт генератора zip


Python 2.7
>>> карта (лямбда x: x * x, [1,2,3,4,5])
[1, 4, 9, 16, 25]

Python 3.x
>>> карта (лямбда x: x * x, [1,2,3,4,5])
об’єкт map # об'єкт генератора карт


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 # генератор об'єкта dict_items
# подібних об'єктів для d1.values ​​() і d1.keys () також

Ці та майже всі типи функціональних можливостей, які повертають список у Python2.7, тепер повертатимуть об’єкт генератора в Python 3.6

Більше того, на відміну від Python 2.7, який зберігає елементи в словнику в упорядкованому вигляді, словник Python 3.6 має значення в упорядкованому вигляді.

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

def myfunc (num: int) -> int:
пропуск

Ця конвенція не сильно вводить ваше значення, це лише умова, яка показує, що вона очікує певного типу даних, але будь-яке інше значення не призведе до помилок / винятків.

Більше про це можна знайти в іншій моїй відповіді на відповідь Вівека Кешора на те, як я можу ввімкнути параметр функції в Python 3?

4. Глобальний простір імен у Python2.7

Давайте розберемося з прикладом витоку простору імен.

>>> i = 10
>>> друк i
10
>>> l1 = [i для i в діапазоні (5)]
>>> друк l1
>>> [0, 1, 2, 3, 4]
>>> я
4

У наведеному вище прикладі ви можете помітити, що глобальна змінна 'i' змінюється в локальному контексті розуміння списку, що в ідеалі не повинно відбуватися.

Тоді як у Python 3.x витоку у глобальному просторі імен не відбувається. Змінна з тим самим іменем у локальному контексті не матиме жодного впливу на глобальну змінну з тим самим іменем.

>>> i = 10
>>> друк i
10
>>> l1 = [i для i в діапазоні (5)]
>>> друк l1
>>> [0, 1, 2, 3, 4]
>>> я
10

Крім усіх цих змін, є деякі незначні зміни

  • оператор print (2.7) та метод print () (3.x) input () & raw_input () у 2.7 та лише введення () у 3.результаті поділу '/' оператор у 2.7 та 3.xuse 'as' while обробка виключення в 3.6, наприклад, за винятком ValueError як округлення erBanker у 3.x на відміну від 2.7, наприклад у 2.7 раунді (14.5) —-> 15 та раунді (15.5) —-> 16, але в пітоні 3.x раунді (14.5) —-> 15, а також круглі (15.5) —-> 15

Відповідь 2:

Для того, щоб дізнатися більше про різницю між Python 3 та Python 2.7, ви можете відвідати Python Software Foundation Wiki Server, оскільки він заглиблюється у відмінності між Python 2.7 та 3.3, кажучи, що для кожного є переваги. Це дійсно залежить від того, що ви намагаєтесь досягти. Але, підсумовуючи: "Python 2.x - це спадщина, Python 3.x - це теперішнє і майбутнє мови".

Між ними є тонкі відмінності. Але найбільша різниця - це друкована заява.

ЩО РОЗПОВІДАЄ ДЛЯ ДРУКОВОГО ЗАЯВЛЕННЯ

Узяте з дискусії про переповнення стека,

"Найбільш помітною (різницею) є, мабуть, спосіб роботи оператора" print ". Досить по-різному, що один і той же сценарій не зможе запускатись на обох версіях одночасно, але виберіть одну, і ви все будете добре. докладніше про версії Python та інші важливі мови програмування. «Основна перевага 3.x полягає в тому, що він знаходиться на передовій, тому всі нові функції будуть впроваджені там, а не додаються до 2.x. Інша річ, яку ви можете розглянути, - це загальний пітон майбутнього, тому, дивлячись через пару років вниз, це буде зріла галузь, до якої йдуть люди ».


Відповідь 3:

Для того, щоб дізнатися більше про різницю між Python 3 та Python 2.7, ви можете відвідати Python Software Foundation Wiki Server, оскільки він заглиблюється у відмінності між Python 2.7 та 3.3, кажучи, що для кожного є переваги. Це дійсно залежить від того, що ви намагаєтесь досягти. Але, підсумовуючи: "Python 2.x - це спадщина, Python 3.x - це теперішнє і майбутнє мови".

Між ними є тонкі відмінності. Але найбільша різниця - це друкована заява.

ЩО РОЗПОВІДАЄ ДЛЯ ДРУКОВОГО ЗАЯВЛЕННЯ

Узяте з дискусії про переповнення стека,

"Найбільш помітною (різницею) є, мабуть, спосіб роботи оператора" print ". Досить по-різному, що один і той же сценарій не зможе запускатись на обох версіях одночасно, але виберіть одну, і ви все будете добре. докладніше про версії Python та інші важливі мови програмування. «Основна перевага 3.x полягає в тому, що він знаходиться на передовій, тому всі нові функції будуть впроваджені там, а не додаються до 2.x. Інша річ, яку ви можете розглянути, - це загальний пітон майбутнього, тому, дивлячись через пару років вниз, це буде зріла галузь, до якої йдуть люди ».