Наконец, наименее часто используемая опция, это когда функция вызываться с произвольным числом аргументов. Обычно они указываются последними в списке формальных параметров, потому что собирают все оставшиеся входные аргументы, которые передаются в функцию.
При определении функции, параметры с произвольным числом аргументов указывают как:
*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