Что нового в Python 3.8?

Android

Member
Регистрация
05.07.2019
Сообщения
86
Оценка реакций
26
CEE37ADA-E14D-4AD7-94DD-1FA27C143201.png
Последняя версия Python скоро будет доступна, и мы составили список новых функций, о которых вам нужно знать.

Последняя (лучшая) версия Python скоро выйдет в бета-версии. Хотя до окончательной стабильной версии еще есть время, стоит взглянуть на все новое. Python 3.8 добавляет некоторый новый синтаксис в язык, несколько незначительных изменений в существующем поведении и в основном кучу улучшений скорости - поддерживая традицию более раннего выпуска 3.7.

В этом посте описаны наиболее важные дополнения и изменения, которые вы должны знать о Python 3.8. Взглянуть!

1. Оператор моржа

Выражения назначения пришли в Python с оператором «морж»: =. Это позволит вам присваивать значения переменной как часть выражения. Основным преимуществом этого является то, что он экономит некоторые строки кода, когда вы хотите использовать, скажем, значение выражения в последующем условии.

Итак, как то так:

длина = длина (my_list)
если длина> 10:
print (f "Список слишком длинный ({length} элементов, ожидается <= 10)")

Теперь можно написать так:

if (length: = len (my_list))> 10:
print (f "Список слишком длинный ({length} элементов, ожидается <= 10)")
Да, для краткости, но некоторые могут сказать, что это влияет на читабельность кода - можно утверждать, что первый вариант здесь более четкий и явный. Эта дискуссия была центром серьезного противоречия в сообществе Python.

2. Позиционные аргументы

Специальный маркер / теперь можно использовать при определении аргументов метода, чтобы указать, что функционал принимает только позиционные аргументы слева от маркера. Аргументы только для ключевых слов были доступны в Python с маркером * в функциях, а добавление / marker для аргументов только для позиционирования улучшает согласованность языка и позволяет создать надежную структуру API.

Возьмите пример этой функции:

def pow (x, y, z = нет, /):
г = х ** у
если z не None:
r% = z
возврат г
Маркер / здесь означает, что передача значений для x, y и z может выполняться только позиционно, без использования аргументов ключевых слов. Поведение иллюстрируется ниже:
>>> pow (2, 10) # действует
>>> pow (2, 10, 17) # действует
>>> pow (x = 2, y = 10) # недействителен, вызовет ошибку TypeError
>>> pow (2, 10, z = 17) # недействителен, вызовет ошибку TypeError
Более подробное объяснение мотивации и вариантов использования можно найти в PEP 570.

3. f-строки теперь поддерживают «=»

Программисты Python часто используют отладку в стиле «printf». В старые времена это было довольно многословно:

print "foo =", foo, "bar =", bar
F-строки делают это немного лучше:

print (f "foo = {foo} bar = {bar}")
Но вам все равно придется повторяться: вы должны написать строку «foo», а затем выражение «foo».

Спецификатор =, используемый как f '{expr =}', расширяется до текста выражения, знака равенства, а затем до выражения вычисляемого выражения. Теперь вы можете просто написать:

print (f "{foo =} {bar =}")
Небольшой шаг для языка, но гигантский скачок для всех, кто разбрасывает операторов print () для отладки!

4. reversed () теперь работает с dict

Начиная с Python 3.7, словари сохраняют порядок вставки ключей. Встроенный reversed () теперь можно использовать для доступа к словарю в обратном порядке вставки - точно так же, как OrderedDict.

>>> my_dict = dict (a = 1, b = 2)
>>> список (полностью измененный (my_dict))
['b', 'a']
>>> список (полностью измененный (my_dict.items ()))
[('b', 2), ('a', 1)]
5. Упрощенная повторяемая распаковка для возврата и выхода

Это непреднамеренное поведение существует с Python 3.2, который запрещает распаковывать итерируемые элементы без скобок в операторах return и yield.

Итак, было разрешено следующее:

def foo ():
отдых = (4, 5, 6)
t = 1, 2, 3, * отдых
возврат т
Но это привело к синтаксической ошибке:

def baz ():
отдых = (4, 5, 6)
возврат 1, 2, 3, * отдых
def baz ():
отдых = (4, 5, 6)
выход 1, 2, 3, * отдых
Последний выпуск исправляет это поведение, поэтому теперь разрешены два вышеуказанных подхода.

6. Новый синтаксис предупреждений

Интерпретатор Python теперь генерирует SyntaxWarning в некоторых случаях, когда пропущена запятая перед кортежем или списком. Поэтому, когда вы случайно делаете это:

данные = [
(1, 2, 3) # упс, пропущена запятая!
(4, 5, 6)
]
Вместо того, чтобы показывать TypeError: объект 'tuple' не вызывается, который на самом деле не говорит вам, что не так, будет показано полезное предупреждение, указывающее, что вы, вероятно, пропустили запятую. Довольно полезно при отладке!

Компилятор теперь также генерирует SyntaxWarning, когда проверки идентичности (есть и нет) используются с определенными типами литералов (например, строки, целые числа и т. Д.). Вы редко хотите сравнивать идентификаторы с литералами, отличными от None, и предупреждение компилятора может помочь избежать ряда неуловимых ошибок.

7. Улучшения производительности

В этом выпуске добавлен ряд повышений производительности интерпретатора в соответствии с предыдущим выпуском 3.7.

operator.itemgetter () теперь на 33% быстрее. Это стало возможным благодаря оптимизации обработки аргументов и добавления быстрого пути для общего случая одиночного неотрицательного целочисленного индекса в кортеж (что является типичным случаем использования в стандартной библиотеке).

Поиск в полях в коллекциях. Namedtuple () теперь более чем в два раза быстрее, что делает их самой быстрой формой поиска переменных экземпляра в Python.

Конструктор списка не перераспределяет внутренний буфер элементов, если итерация ввода имеет известную длину (ввод реализует len). Это делает созданный список на 12% меньше в среднем.

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

Вызов некоторых простых встроенных программ и методов теперь происходит на 20-50% быстрее. Затраты на преобразование аргументов в эти методы снижаются.
uuid.UUID теперь использует слоты для уменьшения объема используемой памяти.

Резюме:
Предстоящий выпуск Python добавляет несколько замечательных новых функций в язык и значительно повышает производительность благодаря фундаментальным исправлениям ускорения. Существует небольшое количество изменений в поведении, которые могут потребовать изменения существующего кода при обновлении до Python 3.8, но прирост производительности и новый синтаксис делают его полностью стоящим усилий. Подробный журнал изменений всего нового можно найти на их сайте.