Чтобы понять, как работает эта схема, рассмотрим функцию для вывода информации о домашних животных. Функция сообщает тип животного и его имя:
pets.py
(1) def describe_pet(animal_type, pet_name):
. ."""Выводит информацию о животном."""
. .print("\nI have a " + animal_type + ".")
. .print("My " + animal_type + "'s name is " + pet_name.title() + ".")
. .
(2)describe_pet('hamster', 'harry')
Из определения (1) видно, что функции должен передаваться тип животного (animal_type) и его имя (pet_name). При вызове describe_pet() необходимо передать тип и имя — именно в таком порядке. В этом примере аргумент 'hamster' сохраняется в параметре animal_type, а аргумент 'harry' сохраняется в параметре pet_name (2). В теле функции эти два параметра используются для вывода информации:
I have a hamster.
My hamster's name is Harry.
Многократные вызовы функций
Функция может вызываться в программе столько раз, сколько потребуется. Для вывода информации о другом животном достаточно одного вызова describe_pet():
def describe_pet(animal_type, pet_name):
. ."""Выводит информацию о животном."""
. .print("\nI have a " + animal_type + ".")
. .print("My " + animal_type + "'s name is " + pet_name.title() + ".")
. .
describe_pet('hamster', 'harry')
describe_pet('dog', 'willie')
Во втором вызове функции describe_pet() передаются аргументы 'dog' и 'willie'. По аналогии с предыдущей парой аргументов Python сопоставляет аргумент 'dog' с параметром animal_type, а аргумент 'willie' с параметром pet_name.
Как и в предыдущем случае, функция выполняет свою задачу, но на этот раз выводятся другие значения:
I have a hamster.
My hamster's name is Harry.
I have a dog.
My dog's name is Willie.
Многократный вызов функции — чрезвычайно эффективный способ работы. Код вывода информации о домашнем животном пишется один раз в функции. Каждый раз, когда вы захотите вывести информацию о новом животном, вы вызываете функцию с данными нового животного. Даже если код вывода информации разрастется до 10 строк, вы все равно сможете вывести информацию всего одной командой — для этого достаточно снова вызвать функцию.
Функция может иметь любое количество позиционных аргументов. При вызове функции Python перебирает аргументы, приведенные в вызове, и сопоставляет каждый аргумент с соответствующим параметром из определения функции.
О важности порядка позиционных аргументов
Если нарушить порядок следования аргументов в вызове при использовании позиционных аргументов, возможны неожиданные результаты:
def describe_pet(animal_type, pet_name):
. ."""Выводит информацию о животном."""
. .print("\nI have a " + animal_type + ".")
. .print("My " + animal_type + "'s name is " + pet_name.title() + ".")
. .
describe_pet('harry', 'hamster')
В этом вызове функции сначала передается имя, а потом тип животного. Так как аргумент 'harry' находится в первой позиции, значение сохраняется в параметре animal_type, а аргумент 'hamster' сохраняется в pet_name. На этот раз вывод получается бессмысленным:
I have a harry.
My harry's name is Hamster.
Если вы получили подобные странные результаты, проверьте, соответствует ли порядок следования аргументов в вызове функции порядку параметров в ее определении.
Именованные аргументы
Именованный аргумент представляет собой пару «имя—значение», передаваемую функции. Имя и значение связываются с аргументом напрямую, так что при передаче аргумента путаница с порядком исключается. Именованные аргументы избавляют от хлопот с порядком аргументов при вызове функции, а также проясняют роль каждого значения в вызове функции.
Перепишем программу pets.py с использованием именованных аргументов при вызове describe_pet():
def describe_pet(animal_type, pet_name):
. ."""Выводит информацию о животном."""
. .print("\nI have a " + animal_type + ".")
. .print("My " + animal_type + "'s name is " + pet_name.title() + ".")
. .
describe_pet(animal_type='hamster', pet_name='harry')
Функция describe_pet() не изменилась. Однако на этот раз при вызове функции мы явно сообщаем Python, с каким параметром должен быть связан каждый аргумент. При обработке вызова функции Python знает, что аргумент 'hamster' должен быть сохранен в параметре animal_type, а аргумент 'harry' в параметре pet_name.
Порядок следования именованных аргументов в данном случае не важен, потому что Python знает, где должно храниться каждое значение. Следующие два вызова функции эквивалентны:
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster')
примечание
При использовании именованных аргументов будьте внимательны — имена должны точно совпадать с именами параметров из определения функции.
Значения по умолчанию