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

01 Сопоставление с образцом

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

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 нет выражения переключателя, сопоставление с образцом можно просто рассматривать как расширенную версию переключателя.

02 Соответствие структурному образцу

На основе сопоставления с образцом структурное сопоставление с образцом может сопоставлять шаблоны со всей структурой данных.

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 Оператор итерации

В Python 3.11 представлен новый оператор «итерации», который упрощает перебор структур данных.

my_list = [1, 2, 3]
 
iterate my_list:
   print(item)
 
# Output:
# 1
# 2
# 3

08 Оператор слияния словаря

В 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 Новая функция точки останова отладки

В Python 3.11 появилась встроенная функция точки останова, которая обеспечивает стандартный и удобный способ установки точек останова в коде для отладки. Он заменяет традиционный метод 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, после чего можно проверять переменные, пошагово выполнять код и анализировать состояние программы в этой конкретной точке. Эта новая функция отладки расширяет возможности разработки и упрощает процесс поиска и устранения проблем в коде.

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

Краткое содержание

Python 3.11 содержит множество новых возможностей и функций, которые позволяют писать более эффективный и надежный код, используя преимущества новых функций, таких как сопоставление шаблонов, подсказки типов, улучшенные отчеты об ошибках и многое другое. Из-за огромного улучшения производительности, которое принес Python 3.11, в будущем (поскольку все пакеты не были полностью перенесены на 3.11) Python 3.11 определенно станет основной версией, поэтому мы знакомы с этими новыми функциями и можем написать больше в Будущий Эффективный код.