Концепция 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