Шаг 2.
Python: сборник рецептов. Структуры данных и алгоритмы. Распаковка последовательности в отдельные переменные

    На этом шаге мы рассмотрим особенности распаковки.

Задача

    У вас есть кортеж из N элементов или последовательность, которую вы хотите распаковать в коллекцию из N переменных.

Решение

    Любая последовательность (или итерируемый объект) может быть распакована в переменные с помощью простого присваивания. Единственное обязательное условие заключается в том, чтобы количество и структура переменных совпадали с таковыми у последовательности. Например:

>>> p = (4, 5)
>>> x, y = p
>>> x
4
>>> y
5
>>> 
>>> data = ['ACME', 50, 91.1, (2012, 12, 21)]
>>> name, shares, price, date = data
>>> name
'ACME'
>>> date
(2012, 12, 21)
>>> 
>>> name, shares, price, (year, mon, day) = data
>>> name
'ACME'
>>> year
2012
>>> mon
12
>>> day
21
>>> 

    При несовпадении количества элементов вы получите ошибку. Например:

>>> p = (4, 5)
>>> x, y, z = p
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    x, y, z = p
ValueError: not enough values to unpack (expected 3, got 2)
>>> 


Обсуждение

    Распаковка работает с любым итерируемым объектом, а не только с кортежами и списками. Это строки, файлы, итераторы и генераторы. Например:

>>> s = 'Hello'
>>> a, b, c, d, e = s
>>> a
'H'
>>> b
'e'
>>> e
'o'
>>> 

    При распаковке вы иногда можете захотеть отбраковать некоторые значения. Специального синтаксиса для этого в Python нет, но вы можете назначить переменные, которые потом отбросите. Например:

>>> data = ['ACME', 50, 91.1, (2012, 12, 21)]
>>> _, shares, price, _ = data
>>> price
91.1
>>>

    Но убедитесь, что вы уже не использовали где-то эту переменную.

    На следующем шаге мы рассмотрим распаковку элементов из последовательности произвольной длины.




Предыдущий шаг Содержание Следующий шаг