Новые интересные функции в Python 3.8

Новые интересные функции в Python 3.8

Https://www.python.org/downloads/release/python-380/[newest версия Python выпущена]! Python 3.8 был доступен в бета-версиях с лета, но на Oto October 14th, 2019 первая официальная версия готова. Теперь мы все можем начать играть с новыми функциями и пользоваться последними улучшениями.

Что Python 3.8 приносит на стол? Https://docs.python.org/3.8/whatsnew/3.8.html[documentation] дает хороший обзор новых функций. Тем не менее, эта статья более подробно расскажет о самых значительных изменениях и покажет, как вы можете использовать преимущества Python 3.8.

*В этой статье вы узнаете о:*
  • Использование выражений присваивания для упрощения некоторых конструкций кода

  • Использование только позиционных аргументов в ваших собственных функциях

  • Указание более точных подсказок типа

  • Использование f-строк для более простой отладки

За некоторыми исключениями, Python 3.8 содержит множество небольших улучшений по сравнению с более ранними версиями. В конце статьи вы увидите многие из этих менее привлекающих внимание изменений, а также обсуждение некоторых оптимизаций, которые делают Python 3.8 быстрее, чем его предшественники. Наконец, вы получите несколько советов по обновлению до новой версии.

*Бесплатный бонус:* ссылка: [Нажмите здесь, чтобы получить доступ к главе из Python Tricks: The Book], которая показывает вам лучшие практики Python с простыми примерами, которые вы можете применить мгновенно, чтобы написать более красивый + код Python.

Морж в комнате: выражения заданий

Самое большое изменение в Python 3.8 - это введение выражений присваивания . Они написаны с использованием новой записи (+: = +). Этот оператор часто называют оператором моржа , так как он похож на глаза и бивни моржа на боку.

Выражения присваивания позволяют вам присваивать и возвращать значение в одном выражении. Например, если вы хотите присвоить переменную и вывести ее значение, вы обычно делаете что-то вроде этого:

>>>

>>> walrus = False
>>> print(walrus)
False

В Python 3.8 вам разрешено объединять эти два оператора в один, используя оператор моржа:

>>>

>>> print(walrus := True)
True

Выражение присваивания позволяет вам присвоить + True + для + walrus + и сразу же вывести значение. Но имейте в виду, что оператор моржа не делает то, что без него невозможно. Это только делает определенные конструкции более удобными, и иногда может более четко сообщать о намерениях вашего кода.

Один из примеров, демонстрирующий некоторые сильные стороны оператора моржа, - это цикл + , в то время как вам нужно инициализировать и обновить переменную. Например, следующий код запрашивает ввод у пользователя, пока он не наберет ` quit +`:

inputs = list()
current = input("Write something: ")
while current != "quit":
    inputs.append(current)
    current = input("Write something: ")

Этот код не идеален. Вы повторяете оператор + input () +, и каким-то образом вам нужно добавить + current + в список before, запрашивая его у пользователя. Лучшее решение - установить бесконечный цикл + while + и использовать + break +, чтобы остановить цикл:

inputs = list()
while True:
    current = input("Write something: ")
    if current == "quit":
        break
    inputs.append(current)

Этот код эквивалентен приведенному выше, но избегает повторения и каким-то образом сохраняет строки в более логичном порядке. Если вы используете выражение присваивания, вы можете еще больше упростить этот цикл:

inputs = list()
while (current := input("Write something: ")) != "quit":
    inputs.append(current)

Это переместит тест обратно в строку + while +, где и должно быть. Однако сейчас в этой строке происходит несколько вещей, поэтому для ее правильного чтения требуется немного больше усилий. Используйте свои лучшие суждения о том, когда оператор моржа помогает сделать ваш код более читабельным.

PEP 572 описывает все детали выражений присваивания, включая некоторые обоснования для их введения в язык, а также https://www .python.org/dev/peps/pep-0572/# примеры [несколько примеров] того, как можно использовать оператор моржа.

Только позиционные аргументы

Встроенная функция + float () + может использоваться для преобразования текстовых строк и чисел в объекты + float +. Рассмотрим следующий пример:

>>>

>>> float("3.8")
3.8

>>> help(float)
class float(object)
 |  float(x=0,/)
 |
 |  Convert a string or number to a floating point number, if possible.

[...]

Посмотрите внимательно на подпись + float () +. Обратите внимание на косую черту (/) после параметра. Что это значит?

*Примечание:* Подробное обсуждение нотации `+/+` см. В https://www.python.org/dev/peps/pep-0457/[PEP 457 - Нотация только для позиционных параметров].

Оказывается, что хотя один параметр + float () + называется + x +, вам не разрешено использовать его имя:

>>>

>>> float(x="3.8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: float() takes no keyword arguments

При использовании + float () + вам разрешено указывать аргументы только по позиции, а не по ключевому слову. До Python 3.8 такие только для позиционирования аргументы были возможны только для встроенных функций. Не было простого способа указать, что аргументы должны быть только позиционными в ваших собственных функциях:

>>>

>>> def incr(x):
...     return x + 1
...
>>> incr(3.8)
4.8

>>> incr(x=3.8)
4.8

Возможно https://github.com/python/cpython/blob/3.7/Lib/collections/init.py#L1000[simulate] позиционные аргументы используя + *args +, но это менее гибко, менее читабельно и заставляет вас реализовать собственный анализ аргументов. В Python 3.8 вы можете использовать / для обозначения того, что все аргументы перед ним должны быть указаны позицией. Вы можете переписать + incr () +, чтобы принимать только позиционные аргументы:

>>>

>>> def incr(x,/):
...     return x + 1
...
>>> incr(3.8)
4.8

>>> incr(x=3.8)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: incr() got some positional-only arguments passed as
           keyword arguments: 'x'

Добавляя / после + x +, вы указываете, что + x + является только позиционным аргументом. Вы можете комбинировать обычные аргументы с позиционными только, поместив обычные аргументы после косой черты:

>>>

>>> def greet(name,/, greeting="Hello"):
...     return f"{greeting}, {name}"
...
>>> greet("Łukasz")
'Hello, Łukasz'

>>> greet("Łukasz", greeting="Awesome job")
'Awesome job, Łukasz'

>>> greet(name="Łukasz", greeting="Awesome job")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: greet() got some positional-only arguments passed as
           keyword arguments: 'name'

В + greet () + косая черта находится между + name + и + приветствие +. Это означает, что + name + является аргументом только для позиции, в то время как + приветствие + является обычным аргументом, который может передаваться либо по позиции, либо по ключевому слову.

На первый взгляд, позиционные аргументы могут показаться немного ограниченными и противоречащими мантре Python о важности читабельности. Вы, вероятно, обнаружите, что не так много случаев, когда позиционные аргументы улучшают ваш код.

Однако при правильных обстоятельствах позиционные аргументы могут дать вам некоторую гибкость при разработке функций. Во-первых, позиционные аргументы имеют смысл, когда у вас есть аргументы, которые имеют естественный порядок, но трудно дать хорошие, описательные имена.

Еще одно возможное преимущество использования позиционных аргументов состоит в том, что вы можете легче реорганизовать свои функции. В частности, вы можете изменить имя ваших параметров, не беспокоясь о том, что другой код зависит от этих имен.

Аргументы только для позиции хорошо дополняют аргументы* только для ключевых слов. В любой версии Python 3 вы можете указывать аргументы только для ключевых слов, используя звездочку (+ +). Любой аргумент after +

Related