Python:Рецепты/Распаковка последовательности произвольной длины: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Строка 38: Строка 38:


===№2===
===№2===
Допустим у вас есть записи о пользователях(имя, почта и произвольное количество номеров телефонов), в данном случае распаковка будет выглядеть следующим образом:


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
 
record = ['John', 'John@example.com', '777-888-999', '666-777-888', '123-456-789']
name, email, *phones = record
</syntaxhighlight>
</syntaxhighlight>


Строка 46: Строка 49:


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
 
>>> name
'John'
>>> email
'John@example.com'
>>> phones
['777-888-999', '666-777-888', '123-456-789']
</syntaxhighlight>
</syntaxhighlight>



Версия от 20:57, 15 апреля 2020

Проверка/Оформление/Редактирование: Мякишев Е.А.


Распаковка последовательности произвольной длины

Задача

Необходимо распаковать N-элементов из итерируемого объекта, который может содержать больше N-элементов и избежать генерирования исключения "too many values to unpack"(слишком много значений для распаковки)

Решение

Для решения данной задачи используется "выражение со звездочкой"(*).

Пример

№1

Допустим у вас есть 15 значений, первое и последнее из которых необходимо проигнорировать, а по остальным посчитать среднее значение.

numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
first, *middle, last = numbers
avg = sum(middle)/len(middle)

Результат:

>>> avg
8.0
>>> first
1
>>> last
15
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

№2

Допустим у вас есть записи о пользователях(имя, почта и произвольное количество номеров телефонов), в данном случае распаковка будет выглядеть следующим образом:

record = ['John', 'John@example.com', '777-888-999', '666-777-888', '123-456-789']
name, email, *phones = record

Результат:

>>> name
'John'
>>> email
'John@example.com'
>>> phones
['777-888-999', '666-777-888', '123-456-789']

№3

Результат:

№4

Результат:

Результат:

№5

Результат:

№6

Результат:

См.также

Внешние ссылки