Десять новых возможностей 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. Шаблон совпадает с каждой парой соответствующих элементов, и если ни один из случаев не совпадает, то выполняется код для подстановочного символа _.

+1
0
+1
2
+1
0
+1
0
+1
1

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *