- Часть I. Вводное руководство
- Глава 2. Использование интерпретатора
- 2.2. Интерпретатор и его среда
- 4.7.1. Значения аргументов по умолчанию
4.7.1. Значения аргументов по умолчанию
Наиболее полезный способ — установить значения по умолчанию для одного или нескольких аргументов. Таким образом, получается функция, которую можно вызывать с меньшим количеством аргументов, чем в определении, например:
def ask_ok(prompt, retries=4, complaint='Да или нет, пожалуйста!'):
while 1:
ok = raw_input(prompt)
if ok in ('д', 'да'): return 1
if ok in ('н', 'не', 'нет'): return 0
retries = retries - 1
if retries < 0:
raise IOError('Пользователь отказывается отвечать')
print complaint
Эта функция может быть вызвана так: 'ask_ok('Вы действительно хотите выйти?')', или так: 'ask_ok('Записать файл?', 2)'.
Значения по умолчанию вычисляются в месте определения функции в области видимости определения, так что
i = 5
def f(arg = i): print arg
i = 6
f()
выведет 5.
Важное замечание: значение по умолчанию вычисляется только один раз. Это отражается в том случае, когда аргумент со значением по умолчанию является объектом, допускающим изменения, таким как список или словарь. Например, следующая функция накапливает передаваемые аргументы (то есть переменная l является статической)1:
def f(a, l = []):
l.append(a)
return l
print f(1)
print f(2)
print f(3)
Результат выполнения будет следующий:
[1]
[1, 2]
[1, 2, 3]
Если Вы не хотите, чтобы аргумент по умолчанию совместно использовался при последующих вызовах, можете немного изменить функцию:
def f(a, l = None):
if l is None:
l = []
l.append(a)
return l
- Такое поведение является, скорее, нежелательной особенностью языка, использование которой может привести к трудно отлавливаемым ошибкам. В качестве статических переменных рекомендуется использовать глобальные переменные модуля.