Концепция Python — упаковка и распаковка

Упаковка и распаковка — это способ расширения, расширения, объединения или замены переменных типа list, dict, set, string и tuple. Упаковка и распаковка часто используются в аргументах функции в тех случаях, когда мы хотим принять неизвестное количество аргументов в функции или аргументы ключевого слова в функции, и есть много сценариев, где мы можем это использовать, давайте обсудим это дальше.

Распаковка списка/набора/кортежа/строки

List, set, tuple и string используют один и тот же синтаксис распаковки. Символ звездочки * используется для распаковки. Давайте посмотрим пример -

a_set = {1, 2, 3}

# convert above set into list
a_list = [*a_set]
# Output -> [1, 2, 3]

# convert string into individual characters
char_list = [*'hello']
# Output -> ['h', 'e', 'l', 'l', 'o']

Представьте себе - у вас есть переменный контейнер типа set, который имеет 1, 2, 3 номеров. Вы можете открыть этот контейнер с помощью символа *, и вы можете поместить его в любой другой контейнер типа list, tuple или set.

Диктовка распаковки

Символ двойной звездочки ** используется для распаковки переменной типа dict. Давайте посмотрим пример -

dict_a = {'key_1': 5, 'key_2': 6}
# embed dict_a with another dict
dict_b = {'key_3': 7, **dict_a}

Использование двойной звездочки с переменной типа dict будет встраивать пары ключ-значение в другой dict или внутри синтаксиса dict.

Список/Набор/Кортеж Упаковка

Упаковка списка, множества и кортежа можно увидеть в следующем примере:

def add_args(*list_of_numbers):
    print(sum(list_of_numbers))
add_args(1, 2, 3)
# Output -> 6

В приведенном выше примере мы хотим передать некоторые числа в функцию add_args, которая вернет сумму заданного аргумента. Теперь я хочу передать любое количество аргументов без каких-либо ограничений, поэтому я дал один аргумент *list_of_numbers, где все позиционные аргументы упакованы в один кортеж внутри функции. Таким образом, вы можете передавать аргументы любой длины в функцию, все аргументы преобразуются в кортеж.

Нет возможности упаковать строку.

Диктовка упаковка

Упаковку диктов можно увидеть в следующем примере:

def a_function(**kwargs):
    print(kwargs)
a_function(arg_1=1, arg_2='hello')
# Output -> {'arg_1': 1, 'arg_2': 'hello'}

В функции вы можете передавать аргументы в виде ключевых слов, и это пример упаковки dict. Вы упаковываете аргументы ключевого слова в переменную kwargs в функции.

Советы и рекомендации — Использование концепции упаковки и распаковки

Принятие произвольного количества аргументов в аргументах функции и ключевого слова

Предположим, вы хотите определить такую ​​функцию, в которой вы хотите принять любое количество аргументов, тогда вы можете использовать упаковку кортежей, как показано ниже в примере:

def multiply_list(multiplier, *list_of_numbers, **kwargs):
    multiplied_list = [multiplier * num for num in list_of_numbers]
    if kwargs.get('sum'):
        return sum(multiplied_list)
    return multiplied_list
print(multiply_list(3, 1, 2, 3, 4))
# Output -> [3, 6, 9, 12]
print(multiply_list(2, 5, 10, sum=True))
# Output -> 30

Предупреждение =› Аргумент звездочки следует использовать после фиксированных позиционных аргументов и перед ключевыми словами. Например -

def a_test_func_1(arg_1, arg_2, *args, **kwargs):     # Good
    pass
def a_test_func_2(*args, arg_1, arg_2, **kwargs):  # Bad, not work
    pass
# Argument defining sequence -
# 1. Fixed positional argument.
# 2. Asterisk * arguments, variable length of arguments.
# 3. Key worded arguments.

Список для установки / Список для кортежа / Набор для приведения кортежа

Чтобы преобразовать список в набор/кортеж, доступен следующий удобный способ -

a_list = [1, 2, 3, 4]
a_set_1 = set(a_list)   # Most used way but slow.
a_set_2 = {*a_list}     # Faster then above set(a_list)
a_tuple = (*a_list,) # Comma is necessary to identify it is a tuple
# Inverse Set to list/ tuple to list
a_list_1 = [*a_set_1]
a_list_2 = [*a_tuple]

Использование методов set() или list() или tuple() для приведения выполняется медленнее, чем использование синтаксиса звездочки, потому что при использовании set()/ list()/tuple() необходимо вызывать метод перед приведением, а при использовании синтаксиса звездочки метод не вызывается. Таким образом, вы можете видеть, что дополнительный вызов кода может быть сохранен с помощью синтаксиса звездочки.

Диктовка слияния

Чтобы объединить переменные dict в одну переменную dict, доступны следующие удобные способы

dict_1 = {'key_1': 1, 'key_2': 2}
dict_2 = {'key_3': 3, 'key_4': 4}
dict_1.update(dict_2)     # Most used way but slow
dict_3 = {**dict_1, **dict_2} # Faster then above
dict_4 = dict_1 | dict_2  # Available only in python version >= 3.9

Более быстрый способ получить список ключей/список значений из dict

dict_1 = {'key_1': 5, 'key_2': 7, 'key_3': 8}
keys = list(dict_1.keys())   # Slow
keys = [*dict_1]  # Fast
values = list(dict_1.values())  # Slow
values = [*dict_1.values()]     # Fast