Python предлагает мощные встроенные структуры данных - коллекции. В этом разделе мы рассмотрим, как типизировать коллекции для повышения надежности и читаемости кода.
Python предлагает следующие встроенные типы коллекций:
list
: Упорядоченный изменяемый набор элементов.
* Пример:[1, 2, 3, "hello"]
tuple
: Упорядоченный неизменяемый набор элементов.
* Пример:(1, 2, "hello", True)
dict
: Набор пар "ключ-значение", где ключи должны быть уникальными и неизменяемыми.
* Пример:{"name": "Alice", "age": 30}
set
: Неупорядоченный набор уникальных элементов.
* Пример:{1, 2, 3, 3}
(дубликаты игнорируются)
Для типизации коллекций используются дженерики (generics) - специальные типы, которые параметризуются другими типами. В Python дженерики представляются в виде квадратных скобок после имени типа.
Примеры:
List[int]
: список целых чисел.Tuple[str, int]
: кортеж, содержащий строку и целое число.Dict[str, float]
: словарь, где ключи - строки, а значения - числа с плавающей точкой.Set[bool]
: множество логических значений.
numbers: List[int] = [1, 2, 3]
person: Tuple[str, int] = ("Bob", 25)
prices: Dict[str, float] = {"apple": 0.99, "banana": 1.25}
active_users: Set[bool] = {True, False}
Генераторы - это функции, которые используют оператор yield
для возврата последовательности значений. Итераторы - это объекты, которые реализуют метод __next__
, позволяющий получать следующий элемент последовательности.
Типизация генераторов и итераторов использует специальные типы:
Iterator[T]
: итератор, возвращающий значения типа T.Iterable[T]
: объект, по которому можно итерироваться, возвращая значения типа T.Generator[T, R, S]
: генератор, который возвращает значения типа T, принимает значения типа R и возвращает финальное значение типа S (необязательно).
from typing import Iterator, Iterable, Generator
def even_numbers(n: int) -> Iterator[int]:
for i in range(n):
if i % 2 == 0:
yield i
numbers: Iterable[int] = even_numbers(10)
def my_generator(start: int, end: int) -> Generator[int, None, int]:
total = 0
for i in range(start, end):
total += i
yield i
return total
result: int = my_generator(1, 5)
Important
При использовании Generator
необязательно указывать все три типа.
Если генератор не принимает значений или не возвращает финальное значение, можно использовать None
.