Программирование

Хитрости Python: распаковка итерируемых объектов

Вам не всегда нужны индексы

Добро пожаловать в серию коротких постов, каждый из которых содержит полезные приемы Python, которые помогут вам стать лучшим программистом на Python. В этом блоге мы рассмотрим, как распаковывать итерируемые объекты.

Вам не нужны индексы.

Скажем, у вас есть кортеж ("a", "b", "c").

Если вы хотите присвоить первый элемент a, второй элемент b и третий элемент c, вам на самом деле не нужно использовать индексы:

# Don't do this
t = ("a", "b", "c")
a = t[0]
b = t[1]
c = t[2]
# Do this instead
t = ("a", "b", "c")
a, b, c = t

На самом деле, это работает не только для кортежей:

a, b, c = [0, 1, 2]              # List
a, b, c = "abc"                  # String
a, b, c = range(3)               # Range
a, b, c = (i for i in range(3))  # Generator
a, b, c = iter([0, 1, 2])        # Iterator
a, b, c = {0, 1, 2}              # Set
a, b, c = {0: 0, 1: 1, 2: 2}     # Dictionary

Среди вышеперечисленных наборы и словари ведут себя несколько иначе:

  1. Наборы: порядок распаковки может не сохраняться и относиться к хэшам элементов (попробуйте a, b, c = {3, 2, 1}, чтобы проверить самостоятельно)
  2. Словари: распаковываются ключи, а не значения, и порядок ключей будет таким же, как при создании

Пропуск и группировка значений при распаковке

Все приведенные выше примеры имеют точное количество элементов для распаковки (например, [0, 1, 2] имеет 3 элемента для распаковки в 3 переменные a, b, c). Что, если список вместо этого [0, 1, 2, 3, 4, 5, 6], но нам нужны только значения 0, 1 и 6?

Мы все еще можем использовать распаковку:

a, b, *_, c = [0, 1, 2, 3, 4, 5, 6]

В этом примере есть два важных вывода:

  1. _ имеет соглашение об использовании в качестве отбрасываемой/фиктивной переменной
  2. * — это оператор для распаковки всех значений, которые еще не были присвоены. Это означает, что другие переменные будут предпочтительно назначены до определения того, сколько значений будет присвоено переменной за * (_ в нашем случае) из

Но подожди. Что, если в нашем списке всего три элемента?

a, b, *_, c = [0, 1, 2]
a # 0
b # 1
c # 2
_ # []

Поскольку в нашем примере значения будут предпочтительно присвоены a, b и c, каждому из них будет присвоено одно значение, что не оставляет ничего, что можно было бы присвоить _. По умолчанию _ станет пустым списком.

Ограничение распаковки

Хотя распаковка выглядит аккуратно, она также имеет несколько ключевых ограничений:

  1. Длина итерируемого ≥ Количество переменных без звездочки. Или вы получите ValueError: not enough value to unpack
  2. У вас может быть только 1 переменная *. Или вы получите SyntaxError: multiple starred expression in assignment

Вот об этом для этого сообщения в блоге! Я надеюсь, что вы нашли это полезным. Если вас интересуют другие приемы Python, я составил для вас список этих коротких блогов:

Если вы хотите узнать больше о Python, науке о данных или машинном обучении, вы можете проверить эти сообщения:

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