Программирование
Хитрости 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
Среди вышеперечисленных наборы и словари ведут себя несколько иначе:
- Наборы: порядок распаковки может не сохраняться и относиться к хэшам элементов (попробуйте
a, b, c = {3, 2, 1}
, чтобы проверить самостоятельно) - Словари: распаковываются ключи, а не значения, и порядок ключей будет таким же, как при создании
Пропуск и группировка значений при распаковке
Все приведенные выше примеры имеют точное количество элементов для распаковки (например, [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]
В этом примере есть два важных вывода:
_
имеет соглашение об использовании в качестве отбрасываемой/фиктивной переменной*
— это оператор для распаковки всех значений, которые еще не были присвоены. Это означает, что другие переменные будут предпочтительно назначены до определения того, сколько значений будет присвоено переменной за*
(_
в нашем случае) из
Но подожди. Что, если в нашем списке всего три элемента?
a, b, *_, c = [0, 1, 2]
a # 0
b # 1
c # 2
_ # []
Поскольку в нашем примере значения будут предпочтительно присвоены a
, b
и c
, каждому из них будет присвоено одно значение, что не оставляет ничего, что можно было бы присвоить _
. По умолчанию _
станет пустым списком.
Ограничение распаковки
Хотя распаковка выглядит аккуратно, она также имеет несколько ключевых ограничений:
- Длина итерируемого ≥ Количество переменных без звездочки. Или вы получите
ValueError: not enough value to unpack
- У вас может быть только 1 переменная
*
. Или вы получитеSyntaxError: multiple starred expression in assignment
Вот об этом для этого сообщения в блоге! Я надеюсь, что вы нашли это полезным. Если вас интересуют другие приемы Python, я составил для вас список этих коротких блогов:
- Python Tricks: выравнивание списков
- Трюки Python: как проверить слияние таблиц с помощью Pandas
- Python Tricks: упрощение операторов if и логических вычислений
- Трюки с Python: проверка нескольких переменных по одному значению
Если вы хотите узнать больше о Python, науке о данных или машинном обучении, вы можете проверить эти сообщения:
- 7 простых способов улучшить рабочий процесс обработки данных
- Эффективная условная логика в Pandas DataFrames
- Эффективность использования памяти в стандартных структурах данных Python
- Параллелизм с Python
- Основное расширение Jupyter для настройки науки о данных
- Эффективные алгоритмы поиска корней в Python
Если вы хотите узнать больше о том, как применять машинное обучение в трейдинге и инвестировании, вот еще несколько постов, которые могут вас заинтересовать:
- Генетический алгоритм оптимизации торговой стратегии на Python
- Генетический алгоритм — остановите переоснащение торговых стратегий
- Рекомендательная система ANN для выбора акций