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