Python2 vs Python3: различия синтаксиса
Оператор print был заменён функцией print(), с именованными аргументами для замены большей части синтаксиса старого оператора print. Примеры:
Также вы можете настроить разделитель между элементами, например:
possibilities!
Функция print() не поддерживает особенность «программный пробел» старого оператора print. Например, в Python 2, print «A\n», «B» напечатает «A\nB\n»; но в Python 3, print(«A\n», «B») напечатает «A\n B\n».
Отображения и итераторы вместо списков
Некоторые хорошо известные методы не возвращают списки в Python 3:
- Методы словарей dict.keys(), dict.items() и dict.values() возвращают «отображения» вместо списков. Например, больше не работает: k = d.keys(); k.sort(). Используйте k = sorted(d).
- Соответственно, методы dict.iterkeys(), dict.iteritems() и dict.itervalues() более не поддерживаются.
- map() и filter() возвращают итераторы. Если вам действительно нужен список, быстрым исправлением станет list(map(. )), но часто лучшим исправлением будет использование генераторов списков (особенно когда оригинальный код использует лямбда-выражения), либо переписать код так, чтобы ему не нужен был список как таковой. Особенно сложно, что map() вызывает побочные эффекты функции; правильное преобразование заключается в использовании цикла (создание списка просто расточительно).
- range() теперь ведёт себя как xrange(), но работает со значениями любого размера. xrange() больше не существует.
- zip() возвращает итератор.
Операторы сравнения
Python 3 упростил правила для операторов сравнения:
builtin.sorted() и list.sort() больше не принимают аргумент cmp, обеспечивающий функцию сравнения. Вместо этого используйте аргумент key. Аргументы key и reverse теперь «keyword-only».
Функция cmp() должна рассматриваться как устаревшая, и специальный метод __cmp__() в Python 3 не поддерживается. Используйте __lt__() для сортировки, __eq__() с __hash__() для сравнения. (Если вам действительно нужна функциональность cmp(), вы можете использовать выражение (a > b) — (a < b) в качестве эквивалента для cmp(a, b).)
Целые числа
- PEP 0237: long переименован в int.
- PEP 0238: Выражение вида 1/2 возвращает float. Используйте 1//2 для отсечения дробной части. (Этот синтаксис существует с Python 2.2)
- Константа sys.maxint была удалена, с тех пор, как более не существует предела значения целых чисел. Однако, sys.maxsize может быть использован как число, большее любого практического индекса списка или строки. sys.maxsize соответствует «естественному» размеру целого и, как правило, имеет такое же значение, как sys.maxint на той же платформе (при условии одних и те же параметров сборки).
- repr() от длинного целого числа не включает более завершающий символ L, так что код, который безусловно отрезает этот символ, будет отрезать вместо этого последнюю цифру. (Используйте str() вместо этого.)
- Восьмеричные литералы более не имеют формы вида 0720; используйте 0o720.
Текст, Unicode и 8-битные строки
Все, что вы знали о бинарных данных и Unicode, изменилось.
Python 3 использует понятия текста и (бинарных) данных вместо строк Unicode и 8-битных строк. Весь текст — Unicode; Однако кодированные Unicode строки представлены в виде двоичных данных. Тип , используемый для хранения текста является str, тип, используемый для хранения данных — bytes. Самое большое различие с python 2.x является то, что любая попытка комбинировать текст и данные в Python 3.0 поднимает TypeError, в то время как если бы вы смешивали Unicode и 8-битные строки в Python 2.x, это будет работать, если 8-битная строка содержала только 7-битные (ASCII) символы, но вы получите UnicodeDecodeError, если она содержит не-ASCII символы. Такое поведение вызывало многочисленные скорбные лица на протяжении многих лет.
Как следствие этого изменения в философии, значительная часть кода, который использует Unicode, кодировки или бинарные данные, скорее всего, должна измениться. Это изменения к лучшему, так как в python 2.x были многочисленные ошибки, имеющие отношение к смешиванию закодированного и декодированного текста. Чтобы быть подготовленным к этому, в Python 2.x следует начать использовать Unicode для всего незакодированного текста, и str только для бинарных или закодированных данных . Затем инструмент 2to3 будет делать большую часть работы за вас.
Вы можете больше не использовать литерал u». » для текста Unicode. Тем не менее, вы должны использовать литерал b». » для бинарных данных.
Так как str и bytes не могут быть смешаны, вы всегда должны их явно преобразовывать. Используйте str.encode(), чтобы перейти от str к bytes и bytes.decode(), чтобы перейти от bytes к str. Вы также можете использовать bytes(s, encoding=. ) и str(b, encoding=. ), соответственно.
Как str, тип bytes неизменен. Существует отдельный изменяемый тип для двоичных данных, bytearray. Почти все функции, которые принимают bytes также принимают bytearray.
Все обратные косые черты в «сырых» строковых литералах интерпретируются буквально. Это означает, что «\U» и «\u» в сырых строках не рассматриваются особо. Например, r»\u20ac» это строка из 6 символов в Python 3.0, в то время как в 2.6, ur»\u20ac» был один символ «евро». (Конечно, это изменение влияет только на сырые строковые литералы).
Встроенный абстрактный тип basestring был удален. Используйте str вместо него. str и bytes не имеют достаточно общей функциональности, чтобы оправдать общий базовый класс. Инструмент 2to3 (см. ниже) заменяет каждое вхождение basestring на str.
PEP 3138: repr() для строки больше не экранирует символы, не входящие в набор ASCII. Однако, он по-прежнему экранирует управляющие символы
PEP 3120: Кодировка исходного кода по умолчанию теперь UTF-8.
PEP 3131: не-ASCII символы разрешены в идентификаторах. (Тем не менее, стандартная библиотека остается ASCII, за исключением имен авторов в комментариях.)
Модули StringIO и cStringIO удалены. Вместо этого, импортируйте модуль io и используйте io.StringIO или io.BytesIO для текста и данных соответственно.
Обзор изменений синтаксиса
Этот раздел дает краткий обзор каждого синтаксического изменения Python 3.0.
Новый синтаксис
PEP 3107: аннотации для аргументов функции и возвращаемых значений.
, 'return': 9>
PEP 3102: Keyword-only аргументы.
PEP 3104: nonlocal. Переменная во внешней (но не глобальной) области видимости.
PEP 3132: Extended Iterable Unpacking
Генераторы словарей: (то же самое, что и dict(stuff))
Литералы множеств (например, ). Заметьте, что <> — это пустой словарь. Используйте set() для пустых множеств. Генераторы множеств:
Новые восьмеричные литералы, например 0o720, вместо старых (0720).
Новые двоичные литералы, например 0b1010. Новая встроенная функция, bin().
Изменённый синтаксис
PEP 3109 and PEP 3134: новый синтаксис выражения raise: raise [expr [from expr]].
«as» и «with» зарезервированные слова.
«True» и «False» и «None» — зарезервированные слова.
Изменено «except exc, var» на «except exc as var».
PEP 3115: Новый синтаксис для метаклассов. Вместо:
Вы должны использовать:
Переменная __metaclass__ более не поддерживается.
Генераторы списков больше не поддерживают синтаксическую форму [. for var in item1, item2, . ]. Используйте [. for var in (item1, item2, . )].
Удаленный синтаксис
PEP 3113: распаковка кортежей в параметрах удалена. Вы больше не можете писать
Пишите
Удалены обратные кавычки (backtick). Используйте repr().
exec — функция. Перестала быть зарезервированным словом.
from module import * запрещено использовать внутри функций.
Встроенные функции
PEP 3135: Новый super(). Теперь вы можете вызывать super() без аргументов и (при условии, что это метод экземпляра, определенный внутри определении класса) класс и экземпляр будут автоматически выбраны. С аргументами, поведение super() остается без изменений.
PEP 3111: raw_input() переименован в input(). Вместо input() в Python 2, вы можете использовать eval(input()).
Добавлена функция next(), вызывающая метод __next__() объекта.
Перемещен intern() в sys.intern().
Удалено: apply(). Вместо apply(f, args) используйте f(*args).
Удалено: callable(). Вместо callable(f) используйте hasattr(f, «__call__»). Функция operator.isCallable() также удалена.
Удалено: execfile(). Вместо execfile(fn) используйте exec(open(fn).read()).
Удалено: file. Используйте open().
Перемещено: reduce() в functools.reduce()
Перемещено: reload() в imp.reload().
Удалено: dict.has_key(). Используйте оператор in.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Отличия Python 2.7 и Python 3.6#
В Python 3 строка - это тип str, но, кроме этого, в Python 3 появился тип bytes:
In [3]: line = 'тест' In [4]: line.encode('utf-8') Out[4]: b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82' In [5]: byte_str = b'test'
Функция print#
В Python 2.7 print был оператором:
In [6]: print 1, 'test' 1 test
In [7]: print(1, 'test') 1 test
В Python 2.7 можно брать аргументы в скобки, но от этого print не становится функцией и, кроме того, print возвращает другой результат (кортеж):
In [8]: print(1, 'test') (1, 'test')
В Python 3, использование синтаксиса Python 2.7 приведет к ошибке:
In [9]: print 1, 'test' File "", line 1 print 1, 'test' ^ SyntaxError: Missing parentheses in call to 'print'
input вместо raw_input#
В Python 2.7 для получения информации от пользователя в виде строки использовалась функция raw_input:
In [10]: number = raw_input('Number: ') Number: 55 In [11]: number Out[11]: '55'
В Python 3 используется input:
In [12]: number = input('Number: ') Number: 55 In [13]: number Out[13]: '55'
range вместо xrange#
В Python 2.7 были две функции
- range - возвращает список
- xrange - возвращает итератор
Пример range и xrange в Python 2.7:
In [14]: range(5) Out[14]: [0, 1, 2, 3, 4] In [15]: xrange(5) Out[15]: xrange(5) In [16]: list(xrange(5)) Out[16]: [0, 1, 2, 3, 4]
В Python 3 есть только функция range, и она возвращает итератор:
In [17]: range(5) Out[17]: range(0, 5) In [18]: list(range(5)) Out[18]: [0, 1, 2, 3, 4]
Методы словарей#
Несколько изменений произошло в методах словарей.
dict.keys(), values(), items()#
Методы keys(), values(), items() в Python 3 возвращают «views» вместо списков. Особенность view заключается в том, что они меняются вместе с изменением словаря. И фактически они лишь дают способ посмотреть на соответствующие объекты, но не создают их копию.
В Python 3 нет методов:
- viewitems, viewkeys, viewvalues
- iteritems, iterkeys, itervalues
Для сравнения, методы словаря в Python 2.7:
In [19]: d = 1:100, 2:200, 3:300> In [20]: d. d.clear d.get d.iteritems d.keys d.setdefault d.viewitems d.copy d.has_key d.iterkeys d.pop d.update d.viewkeys d.fromkeys d.items d.itervalues d.popitem d.values d.viewvalues
In [21]: d = 1:100, 2:200, 3:300> In [22]: d. clear() get() pop() update() copy() items() popitem() values() fromkeys() keys() setdefault()
Распаковка переменных#
В Python 3 появилась возможность использовать * при распаковке переменных:
In [23]: a, *b, c = [1,2,3,4,5] In [24]: a Out[24]: 1 In [25]: b Out[25]: [2, 3, 4] In [26]: c Out[26]: 5
В Python 2.7 этот синтаксис не поддерживается:
In [27]: a, *b, c = [1, 2, 3, 4, 5] File "", line 1 a, *b, c = [1, 2, 3, 4, 5] ^ SyntaxError: invalid syntax
Итератор вместо списка#
В Python 2.7 map, filter и zip возвращали список:
In [28]: map(str, [1, 2, 3, 4, 5]) Out[28]: ['1', '2', '3', '4', '5'] In [29]: filter(lambda x: x > 3, [1, 2, 3, 4, 5]) Out[29]: [4, 5] In [30]: zip([1, 2, 3], [100, 200, 300]) Out[30]: [(1, 100), (2, 200), (3, 300)]
В Python 3 они возвращают итератор:
In [31]: map(str, [1, 2, 3, 4, 5]) Out[31]: map at 0xb4ee3fec> In [32]: filter(lambda x: x > 3, [1, 2, 3, 4, 5]) Out[32]: filter at 0xb448c68c> In [33]: zip([1, 2, 3], [100, 200, 300]) Out[33]: zip at 0xb4efc1ec>
subprocess.run#
В версии Python 3.5 в модуле subprocess появилась новая функция - run. Она предоставляет более удобный интерфейс для работы с модулем и получения вывода команд.
Соответственно, вместо функций call и check_output используется функция run, но функции call и check_output остались.
Jinja2#
В модуле Jinja2 больше не нужно использовать такой код, так как кодировка по умолчанию и так utf-8:
import sys reload(sys) sys.setdefaultencoding('utf-8')
В самих шаблонах, как и в Python, изменились методы словарей. Тут, аналогично, вместо iteritems надо использовать items.
Модули pexpect, telnetlib, paramiko#
Модули pexpect, telnetlib, paramiko отправляют и получают байты, поэтому надо делать encode/decode соответственно.
В netmiko эта конвертация выполняется автоматически.
Мелочи#
- Название модуля Queue сменилось на queue
- С версии Python 3.6 объект csv.DictReader возвращает OrderedDict вместо обычного словаря.
Дополнительная информация#
Ниже приведены ссылки на ресурсы с информацией об изменениях в Python 3.
- What’s New In Python 3.0
- Should I use Python 2 or Python 3 for my development activity?
- The key differences between Python 2.7.x and Python 3.x with examples
- Supporting Python 3: An in-depth guide
Разница между Python 2 и Python 3
Освойте разницу между Python 2 и Python 3, узнайте о синтаксисе, семантике и совместимости библиотек в этой статье для новичков.
Алексей Кодов
Автор статьи
10 июля 2023 в 17:48
Python — один из самых популярных языков программирования, который используется во множестве различных областей. Однако, начинающим разработчикам часто сталкиваются с выбором между двумя версиями этого языка — Python 2 и Python 3. В этой статье мы рассмотрим основные различия между этими версиями и попытаемся понять, какая из них лучше подходит для ваших нужд.
Синтаксис и семантика
Одно из основных различий между Python 2 и Python 3 касается синтаксиса и семантики языка. Версия Python 3 внесла ряд изменений, направленных на упрощение синтаксиса и улучшение читаемости кода. Некоторые из этих изменений включают:
- В Python 3 функция print стала функцией, а не оператором, как в Python 2. Теперь для вывода текста на экран необходимо использовать скобки: print("Hello, World!") .
- В Python 3 изменена семантика оператора деления: / теперь выполняет деление с плавающей точкой, а // — целочисленное деление. В Python 2 оба оператора выполняли целочисленное деление, если оба аргумента были целыми числами.
- Улучшена поддержка Unicode: в Python 3 все строки по умолчанию являются Unicode-строками, в то время как в Python 2 существовали отдельные типы для Unicode-строк и обычных строк.
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Библиотеки и совместимость
Еще одним важным различием между Python 2 и Python 3 является совместимость с библиотеками и модулями. Большинство популярных библиотек и фреймворков сейчас имеют поддержку Python 3, однако некоторые из них могут все еще работать только с Python 2.
Стоит отметить, что поддержка Python 2 была официально прекращена 1 января 2020 года, что означает, что больше не выпускаются обновления безопасности и исправлений ошибок для этой версии. В связи с этим рекомендуется использовать Python 3 для новых проектов, чтобы обеспечить лучшую совместимость и поддержку в будущем.
Обучение и рекомендации
Если вы только начинаете изучать Python, настоятельно рекомендуется начать с версии Python 3. Она является актуальной и активно развивается, имеет улучшенный синтаксис и семантику, а также лучше поддерживается сообществом разработчиков и библиотеками.
Примеры кода для Python 2 и Python 3:
# Python 2 print "Hello, World!"
# Python 3 print("Hello, World!")
Если вы хотите получить профессиональные навыки в области Python-разработки, рассмотрите возможность обучения в онлайн-школе, которая специализируется на этой сфере. Одну из таких школ можно найти, перейдя по ссылке ниже:
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Заключение
Выбор между Python 2 и Python 3 во многом зависит от ваших потребностей и требований к проекту. Если вы только начинаете изучать язык программирования, то рекомендуется начать с Python 3. Он обеспечивает лучшую поддержку, совместимость и упрощенный синтаксис.
Если же у вас есть опыт работы с Python 2 и ваш проект требует использования определенных библиотек, которые еще не поддерживают Python 3, то вы можете продолжать использовать Python 2. Однако, учитывая прекращение официальной поддержки этой версии, рекомендуется переходить на Python 3 для новых проектов и постепенно обновлять старые.
Python 2 и 3 — отличия. Функция print
Статья рассказывает, в чём разница между Python 2 и 3. Приводятся сравнительные примеры кода, показываются особенности работы функции print. Даются советы, какую версию выбрать и почему.
О том, что официальная поддержка «Пайтон» 2 скоро прекратится, было объявлено уже давно. Но это не помешало выпустить Python 2.7.18 в апреле 2020 года. Тогда же разработчики утверждали, что это точно последний релиз, поэтому всем рекомендуется переходить на 3-ю версию. Сложно предсказать будущее, но очевидно одно: в противостоянии «Пайтон» 3 vs 2 — более перспективным направлением для развития является именно номер три.
Есть ещё несколько причин остановить свой выбор на «Питоне» 3.x.x: • официальная поддержка сообществом; • более простое изучение (это мнение субъективно, но некоторые его высказывают); • мощнейший инструментарий, множество библиотек; • применимость в машинном обучении и AI, плюс язык используется при обработке больших данных (Big Data).
Главной причиной должно стать то, что «Питон» 2 сегодня является устаревшей версией. Несмотря на это, списывать в утиль его ещё рано: • если вы DevOps-инженер, надо разбираться в конфигурации инструментов управления типа Ansible или Puppet. То есть пригодится умение работать с двумя версиями «Пайтона»; • если большинство проектов в компании реализовано с помощью «Пайтон» 2, знать эту версию тоже необходимо; • если при реализации проекта, требуемые сторонние библиотеки или софт не поддерживаются Python 3, опять же, единственным вариантом остаётся «Пайтон» 2.
Python 2 vs 3
В таблице ниже кратко представлены некоторые отличия и разница версий (2 vs 3):

В результате можно сказать, что языки отличаются следующим: • синтаксис в 3-м «Питоне» проще и понятнее для понимания; • по дефолту, чтобы хранить строки, применяется Unicode, а в Python 2 строковое значение нужно определять посредством "u"; • в третьей ветви языка значения переменных не меняются никогда, а во второй они меняются в случае применения внутреннего цикла for; • в Python 3 исключения помещают в круглые скобки, а в Python 2 они должны быть заключены в notations; • упрощены правила очереди для сравнений; • в Python 3 для итераций есть функция range() , а в Python 2 применяется xrange() .
Модуль future
При разработке 3-й версии «Питона» в язык были включены некоторые ключевые слова и функции, несовместимые с Python 2. Но это не значит, что ими нельзя воспользоваться. Если требуется поддержка Python-кода 3-й версии, можно выполнить импорт, для чего существует встроенный модуль future.
Вот как выглядит импорт функциональности, поддерживающей деление целых чисел:

Прочие детали по модулю future можно посмотреть на странице ниже:

Сравниваем код. Функция print
Лучше всего рассматривать разницу наглядно. Для этого подойдёт простейший код. Начнём с Python 2:
def main(): print "Hello, OTUS!" if __name__== "__main__": main()А теперь «Пайтон» 3:
def main(): print("Hello, OTUS!") if __name__== "__main__": main()Самое заметное отличие — это изменение синтаксиса print. Используемый ранее оператор print заменили функцией print() . В результате объект вывода надо теперь обязательно заключать в скобки. И если в старом «Питоне» проблемы с дополнительными скобками «in print» отсутствуют, то в новом, в случае вызова print прежним способом, возникнет SyntaxError. Чтобы всё это проверить, совсем необязательно устанавливать у себя сразу два «Пайтона». Можно воспользоваться онлайн-компилятором (можно найти компилятор и для двойки, и для тройки). Есть и другие различия, но они выходят за рамки данной статьи.
