ПРИМЕЧАНИЕ
Иногда в литературе термины «аргумент» и «параметр» используются как синонимы . Не удив-
ляйтесь, если переменные в определении функции вдруг будут названы аргументами, а значения,
переданные при вызове функции, — параметрами .
УПРАЖНЕНИЯ
8-1 . Сообщение: напишите функцию display_message() для вывода сообщения по теме, рас-
сматриваемой в этой главе . Вызовите функцию и убедитесь в том, что сообщение выво-
дится правильно .
8-2 . Любимая книга: напишите функцию favorite_book(), которая получает один пара-
метр title . Функция должна выводить сообщение вида «One of my favorite books is Alice in
Wonderland» . Вызовите функцию и убедитесь в том, что название книги правильно пере-
дается как аргумент при вызове функции .
Передача аргументов
Определение функции может иметь несколько параметров, и может оказаться, что
при вызове функции должны передаваться несколько аргументов. Существуют
несколько способов передачи аргументов функциям. Позиционные аргументы
перечисляются в порядке, точно соответствующем порядку записи параметров;
именованные аргументы состоят из имени переменной и значения; наконец, суще-
ствуют списки и словари значений. Рассмотрим все эти способы.
Позиционные аргументы
При вызове функции каждому аргументу должен быть поставлен в соответствие
параметр в определении функции. Проще всего сделать это на основании порядка
перечисления аргументов. Значения, связываемые с аргументами подобным об-
разом, называются позиционными аргументами.
Чтобы понять, как работает эта схема, рассмотрим функцию для вывода информа-
ции о домашних животных. Функция сообщает тип животного и его имя:
pets.py
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')
138 Глава 8 • Функции
Из определения видно, что функции должен передаваться тип животного
(
animal_type
) и его имя (
pet_name
). При вызове
describe_pet()
необходимо пере-
дать тип и имя — именно в таком порядке. В этом примере аргумент
'hamster'
сохраняется в параметре
animal_type
, а аргумент
'harry'
сохраняется в параметре
pet_name
. В теле функции эти два параметра используются для вывода инфор-
мации:
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):
"""Выводит информацию о животном."""
Передача аргументов 139
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')
Достарыңызбен бөлісу: |