Различия между Python 2.x и 3.x
Python 3.0, часто называемый Python 3000 или просто Py3k, — это крупное обновление по сравнению с более ранними версиями Python.
Чтобы не привносить слишком много лишнего, Python 3.0 был спроектирован без учёта обратной совместимости.
Многие программы, созданные для более ранних версий Python, не могут корректно работать на Python 3.0.
Чтобы приспособиться к существующим программам, Python 2.6 служит переходной версией, в основном использующей синтаксис и библиотеки Python 2.x, но также учитывающей миграцию на Python 3.0 и позволяющей использовать некоторые синтаксические конструкции и функции Python 3.0.
Для новых программ на Python рекомендуется использовать синтаксис Python 3.0.
Если только среда выполнения не может установить Python 3.0 или сама программа не использует сторонние библиотеки, не поддерживающие Python 3.0. В настоящее время к сторонним библиотекам, не поддерживающим Python 3.0, относятся Twisted, py2exe, PIL и т. д.
Большинство сторонних библиотек стремятся быть совместимыми с Python 3.0. Даже если вы не можете сразу перейти на Python 3.0, рекомендуется писать программы, совместимые с Python 3.0, а затем запускать их с помощью Python 2.6 или Python 2.7.
Изменения в Python 3.0 в основном касаются следующих аспектов:
функция print
Оператор print исчез, его заменила функцияprint(). Python 2.6 и Python 2.7 частично поддерживают такую форму синтаксиса print. В Python 2.6 и Python 2.7 следующие три формы эквивалентны:
print "fish"
print ("fish") # 注意print后面有个空格
print("fish") # print()不能带有任何其它参数
Однако Python 2.6 уже поддерживает новый синтаксис print(), например:
from __future__ import print_function
print("fish", "panda", sep=', ')
Если вы хотите использовать функцию print из Python 3.x в Python 2.x, можно импортировать пакет__future__, который отключает оператор print Python 2.x и включает функцию print Python 3.x:
Пример
>>> print list # оператор print в python2.x
['a', 'b', 'c']
>>> from __future__ import print_function # Импорт пакета __future__
>>> print list # Оператор print в Python2.x отключён, его использование вызывает ошибку
Файл "<stdin>", строка 1
print list
^
SyntaxError: неверный синтаксис
>>> print (list) # Использовать функцию print из Python3.x
['a', 'b', 'c']
>>>
Многие возможности совместимости между Python3.x и Python2.x можно импортировать через__future__этот пакет.
Юникод
В Python 2 есть тип ASCII str(), а unicode() — отдельный, не байтовый тип.
Теперь в Python 3 у нас наконец есть строки Unicode (utf-8) и байтовый класс: bytes и bytearrays.
Поскольку исходные файлы Python3.x по умолчанию используют кодировку utf-8, использовать китайский стало удобнее:
>>> 中国 = 'china' >>>print(中国) china
Python 2.x
>>> str = "我爱北京天安门" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我爱北京天安门" >>> str u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'
Python 3.x
>>> str = "我爱北京天安门" >>> str '我爱北京天安门'
Операция деления
Деление в Python кажется очень сложным по сравнению с другими языками, со сложным набором правил. В Python есть два оператора деления:/и//
Сначала поговорим о/делении:
В Python 2.x/деление работает так же, как в большинстве знакомых нам языков, например Java и C: целочисленное деление даёт целое число, полностью игнорируя дробную часть, тогда как деление с плавающей точкой сохраняет десятичную часть и даёт результат с плавающей точкой.
В Python 3.x/деление больше так не работает; результат деления целых чисел также является числом с плавающей точкой.
Python 2.x:
>>> 1 / 2 0 >>> 1.0 / 2.0 0.5
Python 3.x:
>>> 1/2 0.5
Что касается//деления, такой вид деления называется делением с округлением вниз. Оно автоматически выполняет округление вниз результата деления, и это одинаково в Python 2.x и Python 3.x.
python 2.x:
>>> -1 // 2 -1
python 3.x:
>>> -1 // 2 -1
Обратите внимание, что оно не отбрасывает дробную часть, а выполняет округление вниз. Если вы хотите отсечь дробную часть, нужно использовать функцию trunc из модуля math.
python 3.x:
>>> import math >>> math.trunc(1 / 2) 0 >>> math.trunc(-1 / 2) 0
Исключения
Обработка исключений также немного изменилась в Python 3. В Python 3 теперь используется 'as' в качестве ключевого слова.
Синтаксис перехвата исключений изменился сexcept exc, varнаexcept exc as var。
Использование синтаксиса 'except (exc1, exc2) as var' позволяет перехватывать несколько типов исключений одновременно. Python 2.6 уже поддерживает оба синтаксиса.
- 1. В эпоху 2.x можно было напрямую выбрасывать объекты всех типов. В эпоху 3.x можно выбрасывать только объекты, производные от BaseException.
- 2. В 2.x инструкция raise использовала запятую для разделения типа выбрасываемого объекта и аргумента. В 3.x этот странный синтаксис убрали; можно просто вызвать конструктор, чтобы выбросить объект.
В эпоху 2.x исключения, помимо указания на ошибки программы, часто использовались для того, что должны делать обычные управляющие конструкции. В 3.x видно, что разработчики сделали исключения более конкретными; операторы обработки исключений следует использовать только при возникновении ошибок.
Python 2.xСинтаксис обработки исключений использует запятую.
try:
# code
except Exception, e:
print ePython 3.xВ синтаксисе обработки исключений используется 'as'.
try:
# code
except Exception as e:
print(e)
xrange() и range()
Python 2.xrange() возвращает список, тогда как xrange() возвращает генератор (более эффективный по памяти).
range(5) # 返回 [0, 1, 2, 3, 4] xrange(5) # 返回 xrange 对象,按需生成数字
Python 3.xxrange() был удалён, а range() возвращает генератор, экономя память.
range(5) # 返回一个迭代器,按需生成数字
Представление восьмеричного литерала
Восьмеричные числа должны записываться как 0o777; старая форма 0777 больше не может использоваться; двоичные должны записываться как0b111。
Добавленаbin()функция для преобразования целого числа в двоичную строку. Python 2.6 уже поддерживает оба синтаксиса.
В Python 3.x существует только один способ записи восьмеричного литерала — 0o1000.
python 2.x
>>> 0o1000 512 >>> 01000 512
python 3.x
>>> 01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
Операторы неравенства
В Python 2.x есть два способа записать «не равно»: != и <>
В Python 3.x оператор <> был удалён, остался только !=. К счастью, я так и не привык использовать <>.
Удалено выражение repr ``
В Python 2.x обратные кавычки `` эквивалентны функции repr.
В Python 3.x удалён синтаксис `` и допускается только функция repr. Это чтобы код выглядел понятнее? Однако мне кажется, что возможность использовать repr встречается редко; обычно я использую её только при отладке. Большую часть времени я использую функцию str, чтобы описывать объекты как строки.
def sendMail(from_: str, to: str, title: str, body: str) -> bool:
pass
Несколько модулей были переименованы (в соответствии с PEP8)
| Старые имена | Новые имена |
|---|---|
| _winreg | winreg |
| ConfigParser | configparser |
| copy_reg | copyreg |
| Очередь | queue |
| SocketServer | socketserver |
| repr | reprlib |
Модуль StringIO теперь объединён с новым модулем io. Такие модули, как new, md5, gopherlib, были удалены. Python 2.6 уже поддерживает новый модуль io.
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie и cookielib были объединены в пакет http.
Инструкция exec была удалена, осталась только функция exec(). Python 2.6 уже поддерживает функцию exec().
5. Типы данных
1) В Py3.X был удалён тип long. Теперь существует только один целочисленный тип — int, но его поведение подобно типу long в 2.X.
2) Был добавлен новый тип bytes, соответствующий 8-битной строке в 2.X. Чтобы определить литерал bytes:
>>> b = b'china' >>> type(b) <type 'bytes'>
Объекты str и bytes могут использовать методы .encode() (str -> bytes) или .decode() (bytes -> str) для взаимного преобразования.
>>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china'
3) Методы dict .keys(), .items() и .values() возвращают итераторы, тогда как прежние функции, такие как iterkeys(), устарели. Также удалён dict.has_key(); вместо него используйте 'in'.
6. Реорганизация стандартной библиотеки
Python 3.x: Некоторые модули были реорганизованы или переименованы. Например, urllib и urlparse были объединены в urllib.
# Python 2.x import urllib import urlparse # Python 3.x import urllib.parse
7. Функции iteritems() и items()
Python 2.x: В словарях есть методы items() и iteritems(); items() возвращает список, iteritems() возвращает итератор.
d = {'a': 1, 'b': 2}
d.items() # 返回 [('a', 1), ('b', 2)]
d.iteritems() # 返回字典的迭代器Python 3.x: iteritems() был удалён, а items() возвращает представление словаря (то есть итератор).
d = {'a': 1, 'b': 2}
d.items() # 返回 dict_items([('a', 1), ('b', 2)])8. Поддержка модуля __future__
Python 3.x: Многие возможности Python 2.x были удалены. Пользователи Python 2.x, которые хотят заранее использовать поведение Python 3.x в своём коде, могут применять импорты __future__ для достижения совместимости.
from __future__ import print_function
9. Сортировка словарей
Python 2.x: Словари неупорядочены (порядок не гарантируется).
Python 3.x: Словари упорядочены и сохраняют элементы в порядке вставки.
10. метод next()
Python 2.x: next() — это функция, обычно используемая с iter().
Python 3.x: next() — встроенная функция, используется так же, как в Python 2.x, но её параметры отличаются. В Python 3.x можно задать значение по умолчанию через next(iterator, default).
Другие расширения