Обновление с одной версии языка программирования Python до другой может быть настоящей проблемой. Это еще сложнее, если вы пропустили несколько промежуточных версий. Какие самые важные различия? Как они соотносятся с версией, с которой вы знакомы?
Сегодня мы ответим на все эти вопросы от Python 3.0 до Python 3.8. Мы проведем вас через все самые большие изменения, их сравнение с предыдущими версиями Python, и покажем вам примеры кода, которые помогут вам реализовать свой собственный современный код Python. В конце разделов вы получите загружаемый чит-лист, который вы сможете взять с собой, продолжая свой путь к программному обеспечению Python.
Python 2.x против Python 3.0
Python 3 внес много изменений, чтобы упростить синтаксис Python и добавить новые функции. Каждое из этих изменений может показаться незначительным, но вместе они могут серьезно повлиять на работу вашей программы.
В целом Python 3.x имеет:
- Более чистый синтаксис
- Более надежные математические и логические операторы
- Также более универсальное поведение String
- Более строгие правила для типов данных
- Более современная поддержка
Далее мы рассмотрим важные синтаксические изменения, которые помогут вам адаптироваться к Python 3.
Print()
В Python 3.0 поведение печати изменилось с оператора на функцию Python. Теперь поле печати должно быть заключено в круглые скобки как параметр для правильной работы.
print "hello, world" # Python 2 print("hello, world") # Python 3
Переход от printоператора к printфункции также повлиял на некоторые общие способы печати, такие как разрывы строк и печать в файл.
Во всех версиях Python каждый вызов печати заканчивается разрывом строки. Однако иногда вам нужно печатать в той же строке.
В Python 2 вы могли печатать в той же строке с запятой в конце:
# Python 2print 5,print 10
В Python 3 вместо этого вы используете endаргумент ключевого слова после первой строки.
# Python 3print(5, end =» «)print(10)
Наконец, Python 3 сделал синтаксис для печати в файл более читабельным.
print >>open('test.txt','w'), "Printing to file" # Python 2 print("Printing to file", file = open('test.txt','w')) # Python 3
Версия Python 3 избавляется от символов `>>` в пользу более интуитивно понятного `file =`. Он также изменяет порядок аргументов в соответствии с бизнес-логикой операции, как мы бы сказали «печать ___ в файл ___» поверх «на файл ___, печать ____».
Строки в Unicode и ASCII
В Python 2 все строки по умолчанию сохраняются как ASCII. Они могут быть сохранены как Unicode, используя uперед строкой.
#Python 2 default = "This string is ASCII" unicode = u"This string is Unicode"
В Python 3 все строки по умолчанию хранятся в Юникоде. Unicode предпочтительнее ASCII во всем мире, потому что Unicode поддерживает переменную битовую кодировку и другие наборы символов.
# Python 3 unicode = "This string is Unicode by default"
Изменение Python 3 для поддержки Unicode по умолчанию гарантирует, что вы всегда будете использовать лучший протокол кодирования, если вы специально не откажетесь.
Целочисленное деление
Деление между двумя целыми числами в Python 2 по умолчанию округляется до ближайшего целого числа. Разработчики Python должны были постоянно помнить об этом, чтобы предотвратить странное поведение в своих программах.
Теперь в Python 3 операция динамически переводит типы данных в число с плавающей запятой, если результатом является десятичное значение. Каждое частное теперь будет отражать истинное математическое значение без округления. Вам больше не нужно помнить тонкости работы, и вместо этого вы можете сосредоточиться на своем проекте.
Например:
Python2
# Python 2print 7 / 5print 7 / -5
Python3
# Python 3print (7 / 5)print (7 / -5)
Range против xrange
range()Функция Python 3 заменяет xrange()функцию Python2. Новая, более чистая функция дает тот же результат.
В Python 2 range()возвращал список, а xrange()возвращал объект-итератор xrange. В большинстве случаев они могут использоваться как взаимозаменяемые. Теперь range()поведение Python 2 было удалено.
Python2
for x in xrange(1, 5):print(x),
Python3
for x in range(1, 5):print(x),
Обработка ошибок
Python 3 теперь требует asключевое слово при реализации обработки ошибок. Это изменение отделяет синтаксис обработки ошибок от синтаксиса параметров функции и упрощает чтение кода обработки ошибок с первого взгляда. Многие разработчики, переходящие с Python 2 на Python 3.0, упускают из виду это небольшое, но важное изменение.
# Python 2 try: trying_to_check_error except NameError, err: print err, 'Error Caused'
# Python 3 try: trying_to_check_error except NameError as err: # new `as` keyword print (err, 'Error Caused')
Исходный код и совместимость библиотек
Код Python 2.x может быть совместим с Python 3, но часто приводит к неожиданному поведению. Однако код Python 3 нельзя запускать с Python 2.
Хотя код Python 2.x можно портировать, библиотеки часто не могут. Перенос библиотек Python 2 на Python 3 может быть трудным и ненадежным. Поскольку все больше пользователей продолжают внедрять новые функции Python 3, большинство разработчиков больше не создают или обновляют библиотеки из Python 2.
В конечном итоге вам придется перейти на Python 3, если вы хотите использовать новейшие инструменты и методы из современных библиотек, пакетов и модулей, особенно тех, которые используются для машинного обучения.
Например, Django для работы требуются современные библиотеки. В результате Django больше не поддерживает версии Python 2.x с обновлениями. Django 1.11 был последней версией, поддерживающей Python 2.7. Теперь Django рекомендует вам загрузить новейшую версию языка программирования Python, чтобы получить лучшие возможности и возможности веб-разработки.
Шпаргалка по Python 3
Python 3.7 против 3.8
Самая последняя версия Python — это версия 3.8. Независимо от того, используете ли вы Python 2 или более раннюю версию Python 3, важно понимать новейшие функции, доступные в этом мощном обновлении.
Ниже мы рассмотрим самые большие изменения с Python 3.7 до 3.8 с примерами кода и пояснениями, которые помогут вам использовать самую современную версию Python, независимо от того, с какой предыдущей версией вы работали.
Выражения присваивания
Выражения присваивания — самая большая функция, добавленная в Python 3.8. С помощью этих выражений вы можете назначать и возвращать значение переменной всего в одной строке. Назначение выражение записывается с новым оператором моржа, (:=).
Вот пример:
Python3.x
var = ‘False’print var# False
Python3.8
print(var := True)# True
Вместо использования двух строк мы используем оператор моржа, чтобы установить и распечатать значение varв одной строке. Этот тип структуры имеет большой потенциал в больших многомерных решениях, особенно при использовании в качестве временной переменной в цикле.
Посмотрите, насколько мы можем упростить эту более сложную программу:
Python3.x
shoppingList = list()while True:current = input(«Next item: «)if current == «end»:breakshoppingList.append(current)
Python3.8
shoppingList = list()while (current := input(«Next item: «)) != «end»:shoppingList.append(current)
Здесь мы используем оператор моржа для создания временной переменной, currentкоторая назначается как строка ввода пользователя. Он также оценивается при присвоении, чтобы увидеть, соответствует ли оно «концу». Программа повторяет цикл и добавляет новый элемент в конец списка.
Эта программа может создать весь управляемый вводом список с помощью всего 3 строк кода!
Отладка f-String
Относительно новые «f-строки» также получили обновление в Python 3.8. Напоминаем, что f-строки — это упрощенный способ печати операторов с вычисленными переменными без объединения строк вручную. Представленные в Python 3.6, они стали одной из самых популярных частей современного Python. Фактически, они считаются основной причиной того, что так много библиотек Python совместимы только с версиями после 3.6.
F-строки — это форматированный строковый литерал, распознаваемый по кавычке fперед открывающей кавычкой строки. Любое имя переменной в фигурных скобках оценивается, и его значение плавно добавляется в строку.
Взгляните на пример:
size = «small»print( f»This is a {size} dog»)
Это позволяет легко создавать динамические строки без загроможденного синтаксиса.
Начиная с Python 3.8, теперь вы можете добавить =переменную после фигурной скобки, чтобы напечатать как выражение, так и переменную.
size = «small»print( f»{size= }»)
Это наиболее полезно для отладки, поскольку позволяет увидеть, как программа достигает этих значений.
В версиях до 3.8 вам нужно было бы повторить выражение перед фигурными скобками, чтобы получить тот же эффект:
size = «small»print (f»size = {size}»)
Вы также можете использовать выражения присваивания в f-строках для создания компактных и динамических строк:
print(f"Square has area of {(area := length**2)} perimeter of {(perimeter := length*4)}")
Только позиционные аргументы
В Python 3.8 теперь вы можете определять только позиционные аргументы для своих собственных функций. Только позиционные аргументы могут быть назначены только по их положению в аргументе функции и вызовут ошибку, если вы попытаетесь назначить их с помощью ключевых слов. Вы используете символ /в аргументах функции, чтобы обозначить, что все предыдущие аргументы должны быть только позиционными.
Например:
>>> def parkingSpace(name, /, space= "Guest Parking"): ... return f"{name}: {space}" ... >>> parkingSpace("Ryan") # `Ryan: Guest Parking' >>> parkingSpace("Jodie", space= "14G") # 'Jodie: 14G' >>> parkingSpace(name="Joe", space="9B") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: parkingSpace() got some positional-only arguments passed as keyword arguments: 'name'
В строке 1 мы указываем, что nameдолжно быть передано позиционно (после /), а spaceдолжно быть передано с его ключевым словом. В строке 4 мы успешно вызываем parkingSpaceи позиционируем значение nameсо значением по умолчанию для space. Также в строке 7 мы parkingSpaceснова успешно вызываем, но на этот раз мы присваиваем новое значение spaceс его ключевым словом. Наконец, в строке 10 мы вызываем parkingSpaceв третий раз, но назначаем nameего ключевым словом, а не позиционно, и получаем ошибку.
Только позиционные аргументы обеспечивают расширенную функциональность, но не всегда необходимы.
Используйте только позиционные аргументы, когда:
- Заголовок аргумента произвольный, например, конструктор int, не int (x=»1″)дает больше информации, чем просто int(«1«).
- Название аргумента также используется встроенной функцией, например self. Только позиционные аргументы устраняют путаницу в том, что передается.
- Вы переносите код с C или сделаете это в будущем. C не принимает аргументы ключевого слова, поэтому использование только позиционных аргументов упростит перенос.
Предупреждения синтаксиса
Python 3.8 добавляет два новых предупреждения в список Python SyntaxWarnings. Первое предупреждение, которое покажет вам, когда выбрать isболее ==. Они немного отличаются, и их легко смешать. Последний проверяет равные значения, а isвозвращает True, только это одни и те же объекты.
>>> # Python 3.8 >>> version = "3.8" >>> version is "3.8" <stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="? # returns False >>> version == "3.8" # returns True
Другое предупреждение — это исправленный SyntaxWarning, когда вы пропускаете запятую в списке. В предыдущих версиях пропущенные запятые в списке кортежей приводили к ошибке: «Кортежи не вызываются». Это сбивало с толку пользователей Python, поскольку в большинстве случаев им не хватало запятой.
Теперь Python 3.8 правильно определяет ошибку:
>>> [ ... (1, 3) ... (2, 4) ... ] <stdin>:2: SyntaxWarning:'tuple' object is not callable; perhaps you missed a comma? Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: 'tuple' object is not callable
Шпаргалка по Python 3.8
Что учить дальше
Вы только что узнали обо всех наиболее важных обновлениях Python 3 и 3.8. Если какое-либо из этих изменений кажется привлекательным, я рекомендую вам обновить его сейчас и начать реализацию этих новых функций. Важно быть современным разработчиком Python.
Даже если вас не интересует какая-либо конкретная функция, Python с каждым обновлением становится быстрее и требует меньше памяти. Если вы внесете изменения сейчас и начнете практиковать новый синтаксис, вы сможете продемонстрировать свои современные навыки интервьюеру!