Для каждого параметра вашей функции можно определить значение по умолчанию. Если при вызове функции передается аргумент, соответствующий данному параметру, Python использует значение аргумента, а если нет — использует значение по умолчанию. Таким образом, если для параметра определено значение по умолчанию, вы можете опустить соответствующий аргумент, который обычно включается в вызов функции. Значения по умолчанию упрощают вызовы функций и проясняют типичные способы использования функций.

Например, если вы заметили, что большинство вызовов describe_pet() используется для описания собак, задайте animal_type значение по умолчанию 'dog'. Теперь в любом вызове describe_pet() для собаки эту информацию можно опустить:

def describe_pet(pet_name, animal_type='dog'):

. ."""Выводит информацию о животном."""

. .print("\nI have a " + animal_type + ".")

. .print("My " + animal_type + "'s name is " + pet_name.title() + ".")

describe_pet(pet_name='willie')

Мы изменили определение describe_pet() и включили для параметра animal_type значение по умолчанию 'dog'. Если теперь функция будет вызвана без указания animal_type, Python знает, что для этого параметра следует использовать значение 'dog':

I have a dog.

My dog's name is Willie.

Обратите внимание: в определении функции пришлось изменить порядок параметров. Так как благодаря значению по умолчанию указывать аргумент с типом животного не обязательно, единственным оставшимся аргументом в вызове функции остается имя домашнего животного. Python интерпретирует его как позиционный аргумент, и если функция вызывается только с именем животного, этот аргумент ставится в соответствие с первым параметром в определении функции. Именно по этой причине имя животного должно быть первым параметром.

В простейшем варианте использования этой функции при вызове передается только имя собаки:

describe_pet('willie')

Вызов функции выводит тот же результат, что и в предыдущем примере. Единственный переданный аргумент 'willie' ставится в соответствие с первым параметром в определении, pet_name. Так как для animal_type аргумент не указан, Python использует значение по умолчанию 'dog'. Для вывода информации о любом другом животном, кроме собаки, используется вызов функции следующего вида:

describe_pet(pet_name='harry', animal_type='hamster')

Так как аргумент для параметра animal_type задан явно, Python игнорирует значение параметра по умолчанию.

примечание

Если вы используете значения по умолчанию, все параметры со значением по умолчанию должны следовать после параметров, у которых значений по умолчанию нет. Это необходимо для того, чтобы Python правильно интерпретировал позиционные аргументы.

<p>Эквивалентные вызовы функций</p>

Так как позиционные аргументы, именованные аргументы и значения по умолчанию могут использоваться одновременно, часто существуют несколько эквивалентных способов вызова функций. Возьмем оператор describe_pets() с одним значением по умолчанию:

def describe_pet(pet_name, animal_type='dog'):

При таком определении аргумент для параметра pet_name должен задаваться в любом случае, но это значение может передаваться как в позиционном, так и в именованном формате. Если описываемое животное не является собакой, то аргумент animal_type тоже должен быть включен в вызов, и этот аргумент тоже может быть задан как в позиционном, так и в именованном формате.

Все следующие вызовы являются допустимыми для данной функции:

describe_pet('willie')

describe_pet(pet_name='willie')

describe_pet('harry', 'hamster')

describe_pet(pet_name='harry', animal_type='hamster')

describe_pet(animal_type='hamster', pet_name='harry')

Все вызовы функции выдадут такой же результат, как и в предыдущих примерах.

примечание

На самом деле не так важно, какой стиль вызова вы используете. Если ваша функция выдает нужный результат, выберите тот стиль, который вам кажется более понятным.

<p>Предотвращение ошибок в аргументах</p>

Не удивляйтесь, если на первых порах вашей работы с функциями будут встречаться ошибки несоответствия аргументов. Такие ошибки происходят в том случае, если вы передали меньше или больше аргументов, чем необходимо функции для выполнения ее работы. Например, вот что произойдет при попытке вызвать 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()

Python понимает, что при вызове функции часть информации отсутствует, и мы видим это в данных трассировки:

Traceback (most recent call last):

(1) File "pets.py", line 6, in

(2) . .describe_pet()

(3)TypeError: describe_pet() missing 2 required positional arguments: 'animal_

type' and 'pet_name'

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги