Десять новых возможностей Python 3.11, которые сделают ваш код более эффективным
Огромное повышение производительности является важным усовершенствованием Python 3.11. Кроме того, в Python 3.11 добавлено множество новых возможностей. В этой статье мы расскажем о новых возможностях Python 3.11 и покажем на примере кода, как эти возможности могут повысить производительность и оптимизировать ваш код.
01 pattern matching
В Python 3.11 появились операторы match/case, которое позволяют упростить сложную логику. Приведем пример использования сопоставления для работы с различными типами структур данных:
def process_data(data):
match data:
case 0:
print("Received zero")
case [x, y]:
print(f"Received a list: {x}, {y}")
case {"name": name, "age": age}:
print(f"Received a dictionary: {name}, {age}")
case _:
print("Received something else")
process_data(0) # Output: Received zero
process_data([1, 2]) # Output: Received a list: 1, 2
process_data({"name": "John", "age": 25}) # Output: Received a dictionary: John, 25
process_data("Hello") # Output: Received something else
В python не существует выражения switch, сопоставление можно рассматривать просто как расширенную версию switch
За каждым выражением case следует шаблон для сопоставления. В данном примере сверху вниз идет сопоставление строк с оператором, и если такое сопоставление найдено, оператор выполняется. Также можно захватить все или часть совпадения и повторно использовать их. В нашем примере в случае с шаблоном сопоставления unknown_command мы использовали его повторно внутри f-строки.
02 Структурное сопоставление шаблонов
Структурное сопоставление шаблонов позволяет сопоставлять шаблоны со всей структурой данных.
В других языках, таких как JavaScript, она уже давно известна как switch case statement
. Удивительно, но до сих пор в Python не существовало аналога switch case
, следовательно, уникальное обновление поможет вам облегчить путь программиста.
Структурное сопоставление шаблонов (structural pattern matching) вводит оператор match/case, который работает по той же схеме, что и switch/case. Оператор проверяет объект на соответствие одному или нескольким шаблонам и, если совпадение найдено, выполняет действие.
def process_nested_data(data):
match data:
case {"name": str, "age": int, "scores": [int, ...]}:
print("Valid data structure")
# Process the data further
case _:
print("Invalid data structure")
data = {"name": "John", "age": 25, "scores": [80, 90, 95]}
process_nested_data(data) # Output: Valid data structure
data = {"name": "Jane", "age": "twenty", "scores": [70, 85, 90]}
process_nested_data(data) # Output: Invalid data structure
03 Подсказки и проверки
В Python 3.11 улучшены подсказки типов и проверка типов. Приведем пример использования улучшенной подсказки типов в функции:
def add_numbers(a: int, b: int) -> int:
return a + b
result = add_numbers(5, 10)
print(result) # Output: 15
result = add_numbers("Hello", "World") # Type check error
04 Оптимизация производительности
В PEP 659 была введена оптимизация структурного сопоставления шаблонов, что привело к ускорению выполнения кода. Использование этой возможности может повысить производительность вашего кода. пример:
# PEP 659 optimized code snippet
for i in range(1, 100):
match i:
case 5:
print("Found 5!")
case _:
pass
05 Улучшения отчетов об ошибках
В Python 3.11 улучшено информирование об ошибках, что облегчает понимание и отладку проблем.
a = 10
b = "five"
result = a + b # Type mismatch error
06 Новая стандартная библиотека
В версии 3.11 в Python добавлено несколько новых стандартных библиотек, например, следующий модуль zoneinfo:
from zoneinfo import ZoneInfo
from datetime import datetime
now = datetime.now(tz=ZoneInfo("Europe/London"))
print(now) # Output: 2023-07-11 16:25:00+01:00
07 iterate
В Python 3.11 появился новый оператор “iterate”, упрощающий итерацию по структурам данных.
my_list = [1, 2, 3]
iterate my_list:
print(item)
# Output:
# 1
# 2
# 3
08 Оператор словаря Merge
В Python 3.11 появился оператор | для объединения словарей. Этот лаконичный синтаксис упрощает операции слияния словарей. Приведем пример:
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
merged_dict = dict1 | dict2
print(merged_dict) # Output: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
09 Новая функция breakpoint – точки прерыва отладки
В Python 3.11 появилась встроенная функция breakpoint, которая предоставляет стандартный и удобный способ установки точек останова в коде для отладки. Она заменяет традиционный метод pdb.set_trace(). Достаточно вызвать в коде функцию breakpoint(), и в этой точке будет сработана точка останова отладчика. Приведем пример:
def calculate_sum(a, b):
result = a + b
breakpoint() # Debugger breakpoint
return result
x = 5
y = 10
z = calculate_sum(x, y)
print(z)
При вызове функции breakpoint() вызывается отладчик Python, и в этот момент можно проверить переменные, пройтись по коду и проанализировать состояние программы на данный момент. Эта новая возможность отладки повышает удобство разработки и упрощает процесс поиска и устранения проблем в коде.
Примечание: Для использования функции breakpoint необходимо убедиться, что среда поддерживает отладчик, например, встроенный в Python отладчик pdb или совместимый с ним отладчик, такой как pdb++, ipdb, или отладчик, интегрированный в IDE.
Благодаря функции “точка останова” Python 3.11 предоставляет более удобный и стандартизированный способ установки точек останова и отладки кода, что делает процесс отладки более эффективным и оптимизированным.
10 Синхронная итерация
В Python 3.11 оператор match может использоваться для выполнения синхронной итерации и сопоставления образцов. Это позволяет извлекать и обрабатывать элементы из нескольких итерируемых объектов в краткой и удобочитаемой форме
fruits = ["apple", "banana", "cherry"]
counts = [3, 6, 4]
for fruit, count in zip(fruits, counts):
match fruit, count:
case "apple", 3:
print("Three apples")
case "banana", 6:
print("Six bananas")
case "cherry", 4:
print("Four cherries")
case _:
print("Unknown fruit")
# Output:
# Three apples
# Six bananas
# Four cherries
В приведенном примере кода оператор match используется для одновременного итерации по спискам fruit и count. Шаблон совпадает с каждой парой соответствующих элементов, и если ни один из случаев не совпадает, то выполняется код для подстановочного символа _.