Наконец, наименее часто используемая опция, это когда функция вызываться с произвольным числом аргументов. Обычно они указываются последними в списке формальных параметров, потому что собирают все оставшиеся входные аргументы, которые передаются в функцию.
При определении функции, параметры с произвольным числом аргументов указывают как:
*args - произвольное число позиционных аргументов. При вызове функции, на место этого параметра передается список аргументов, заключенных в кортеж. Перед *args может быть ноль или более нормальных аргументов. Любые формальные параметры, которые появляются после параметра *args, являются аргументами "только для ключевых слов". Это означает, что следующие за *args параметры могут использоваться только как ключевые аргументы, а не как позиционные.**kwargs - произвольное число именованных аргументов. При вызове функции, на его место передается список именованных аргументов заключенных в словарь, кроме тех, имена которых были определены ранее. Параметр **kwargs может быть определен совместно с другим формальным параметром *args. Параметр **kwargs указывается последним в области определения формальных параметров функции.Примечание: один символ * в имени параметра функции args распаковывает список или кортеж для передачи позиционных аргументов, а два символа ** в имени параметра функции **kwargs распаковывает словарь для передачи ключевых аргументов в функцию при ее вызове.
Имена *args и **kwargs по негласному соглашению принято использовать в документации Python. На самом деле никто не запрещает брать любые другие имена переменных. Например, для словарей наряду c **kwargs иногда используют **options.
*args:def chees(*arguments): for arg in arguments: print(arg) word = ("It's very runny, sir.", "It's really very.", "VERY runny, sir.") chees(*word) # Выведет It's very runny, sir. It's really very. VERY runny, sir.
**kwargs:def shop(**keywords): for kw in keywords: print(kw, ":", keywords[kw]) kword = {shopkeeper:"Michael Palin", client:"John Cleese", sketch:"Cheese Shop Sketch"} shop(**kword) # Выведет shopkeeper : Michael Palin client : John Cleese sketch : Cheese Shop Sketch
Распаковку можно использовать несколько раз. На примере словаря:
def process_data(a, b, c, d): print(a, b, c, d) x = {'a': 1, 'b': 2} y = {'c': 3, 'd': 4} process_data(**x, **y) 1 2 3 4 process_data(**x, c=23, d=42) 1 2 23 42
*args и **kwargs:def cheeseshop(kind, *arguments, **keywords): print("-- Do you have any", kind, "?") print("-- I'm sorry, we're all out of", kind) for arg in arguments: print(arg) print("-" * 40) for kw in keywords: print(kw, ":", keywords[kw])
Функцию cheeseshop можно вызвать так:
word = ("It's very runny, sir.", "It's really very.", "VERY runny, sir.") kword = {shopkeeper:"Michael Palin", client:"John Cleese", sketch:"Cheese Shop Sketch"} cheeseshop("Limburger", *word, **kword)
и, конечно, функция выведет:
-- Do you have any Limburger ? -- I'm sorry, we're all out of Limburger It's very runny, sir. It's really very. VERY runny, sir. ---------------------------------------- shopkeeper : Michael Palin client : John Cleese sketch : Cheese Shop Sketch