Передача произвольного набора аргументов
В некоторых ситуациях вы не знаете заранее, сколько аргументов должно быть передано функции. К счастью, Python позволяет функции получить произвольное количество аргументов из вызывающей команды.
Для примера рассмотрим функцию для создания пиццы. Функция должна получить набор дополнений к пицце, но вы не знаете заранее, сколько дополнений закажет клиент. Функция в следующем примере получает один параметр *toppings, но этот параметр объединяет все аргументы, заданные в командной строке:
pizza.py
def make_pizza(*toppings):
. ."""Вывод списка заказанных дополнений."""
. .print(toppings)
. . . .
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
Звездочка в имени параметра *toppings приказывает Python создать пустой кортеж с именем toppings и упаковать в него все полученные значения. Результат команды print в теле функции показывает, что Python успешно справляется и с вызовом функции с одним значением, и с вызовом с тремя значениями. Разные вызовы обрабатываются похожим образом. Обратите внимание: Python упаковывает аргументы в кортеж даже в том случае, если функция получает всего одно значение:
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')
Теперь команду print можно заменить циклом, который перебирает список дополнений и выводит описание заказанной пиццы:
def make_pizza(*toppings):
. ."""Выводит описание пиццы."""
. .print(" Making a pizza with the following toppings:")
. .for topping in toppings:
. . . .print("- " + topping)
. . . .
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
Функция реагирует соответственно независимо от того, сколько значений она получила — одно или три:
Making a pizza with the following toppings:
- pepperoni
Making a pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
Этот синтаксис работает независимо от количества аргументов, переданных функции.