Python делает все возможное, чтобы сделать это для вас.Когда вы определяете функцию внутри функции, вы можете использовать переменные из внешней функции во внутренней функции.Это верно для любой глубины вложения (то есть, вы можете иметь функцию внутри функции внутри функции внутри функции ... на любую глубину ... и самая внутренняя функция может использовать переменные из любой из вмещающих функций).Если есть конфликтующие имена, используется самая внутренняя переменная с запрошенным именем.
Более того, Python фактически захватывает любые переменные, которые вы используете, из внешней функции и сохраняет их во внутренней функции, которая называется closure. Таким образом, вы можете не только передать функцию другой функции, как вы делаете, но вы можете вернуть функцию из функции и переменные, которые вы используете из внешней функции, которые были вэффект, когда функция была определена, все еще будет доступна из возвращенной функции, даже если внешняя функция больше не работает.Это довольно продвинутая функция, но она позволяет вам делать что-то вроде этого:
def make_adder(increment):
def adder(number):
return number + increment
adder.__name__ = "adder(%s)" % increment
return adder
Эта функция является функцией, которая создает функцию, которая добавляет к ней указанное значение.Например:
add1 = make_adder(1)
add5 = make_adder(5)
print add1(10) # 11
print add5(10) # 15
В этом случае значение, которое вы передаете make_adder
, захватывается и сохраняется в возвращаемой функции.Это позволяет вам создавать набор функций, которые добавляют любое число к своим аргументам.Это тривиальный пример, который на самом деле не очень полезен в реальной жизни, но служит для иллюстрации этой функции.