Что осталось актуальным
Основной материал урока не устарел. Кортежи, 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; эти темы выходят за рамки текущего урока.