⚖️ Подход из урока и современная практика

⚡ Кратко

  • Подход из источника актуален: кортежи, распаковка и enumerate() активно используются в Python 3.x.
  • Для учебных задач без новых коллекций можно накапливать результат через result += (value,).
  • В реальном коде для частого добавления обычно удобнее список, а кортеж сделать в конце через tuple(result).
  • Если данные имеют имена полей, кортеж может быть хуже словаря, dataclass или namedtuple.

Что осталось актуальным

Основной материал урока не устарел. Кортежи, for, распаковка, оператор *, enumerate(), count() и index() — базовые возможности современного Python.

Одноэлементный кортеж

Ловушка

value = (5)
print(type(value))  # <class 'int'>

Скобки группируют выражение, но не создают кортеж.

Правильно

value = (5,)
print(type(value))  # <class 'tuple'>

Запятая делает значение кортежем.

Накопление результата

Учебный вариант из темы

numbers = (1, 2, 2, 3)
unique = tuple()

for number in numbers:
    if number not in unique:
        unique += (number,)

Хорош для понимания неизменяемости: каждый раз создаётся новый кортеж.

Практичнее для частого добавления

numbers = (1, 2, 2, 3)
unique_list = []

for number in numbers:
    if number not in unique_list:
        unique_list.append(number)

unique = tuple(unique_list)

Список предназначен для накопления, кортеж фиксирует итог.

Проверить по документации: списки эффективнее для частых добавлений, потому что кортеж неизменяем и при конкатенации создаётся новый объект.

Индексы в цикле

Через range(len(...))

languages = ("Python", "Java", "C++")

for index in range(len(languages)):
    print(index, languages[index])

Работает, но индекс используется только чтобы снова получить элемент.

Через enumerate()

languages = ("Python", "Java", "C++")

for index, language in enumerate(languages):
    print(index, language)

Читается прямо: цикл сразу даёт индекс и значение.

Распаковка вместо ручных индексов

Через индексы

point = (10, 20)
x = point[0]
y = point[1]

Через распаковку

point = (10, 20)
x, y = point

Распаковка лучше показывает намерение: в кортеже ожидаются ровно два значения.

Когда кортежа мало

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

# Кортеж быстро становится неочевидным:
person = ("Alice", 29, "Python")

# Словарь понятнее по именам:
person = {"name": "Alice", "age": 29, "language": "Python"}
Проверить по документации: для именованных полей в стандартной библиотеке есть collections.namedtuple и dataclasses.dataclass; эти темы выходят за рамки текущего урока.