在 Python 中,函数被视为一等公民。意味着在python中,函数在整个过程中被统一处理。它们可以存储在数据结构中、作为参数传递或在控制结构中使用。
函数具有以下特征:
- 函数是对象类型的一个实例。
- 可以将函数存储在一个变量中。
- 你可以将函数作为参数传递给另一个函数。
- 你可以从一个函数中返回另一个函数。
- 你可以将它们存储在诸如哈希表、列表等数据结构中。
嵌套函数
将一个函数定义在另一个函数中被称为嵌套函数。嵌套函数可以访问封闭范围的变量。使用嵌套函数是为了保护它们免受函数外部造成的影响。
# Python program to illustrate nested functions
def outerFunction(text):
text = text
def innerFunction():
print(text)
innerFunction()
if __name__ == '__main__':
outerFunction('Hey !')
在上面的示例中,innerFunction()已在 outerFunction()中定义,使其成为内部函数。要调用 innerFunction(),我们必须首先调用 outerFunction()。outerFunction()将继续调用 innerFunction(),因为它已在其中定义。重要的是必须调用外部函数,以便内部函数可以执行。
嵌套函数中的变量范围
我们可以找到变量并在需要时访问它的位置称为变量的范围。我们知道如何访问函数内部的全局变量,但是,如何访问外部函数的变量呢?
def f1():
s = 'hello world'
def f2():
s = '你好'
print(s)
f2()
print(s)
# Driver's code
f1()
你好
hello world
在上述示例中,可以看到,f1和f2都定义了s变量,s是不可变类型,s在各自的函数范围内起作用,不会被相互改变。
如果将s换成可变数据类型,结果就不一样了。
def f1():
s = ['hell world']
def f2():
s[0] = '你好'
print(s)
f2()
print(s)
# Driver's code
f1()
['你好']
['你好']
以上示例中,变量s换成了列表类型,嵌套函数改变了s变量的值。当s为不可变类型如字符串时,嵌套的函数也可以改变s变量的值,我们可以使用nonlocal关键字在嵌套函数中进行变量声明。
def f1():
s = 'hello world'
def f2():
nonlocal s
s = '你好'
print(s)
f2()
print(s)
# Driver's code
f1()
你好
你好
Python 闭包
闭包是一个函数对象,即使封闭作用域中的变量值不在内存中,它也能记住这些值。
闭包与普通函数不同,它允许函数通过闭包对那些捕获的变量的值或引用的副本进行访问,即使在这些变量的作用域之外调用该函数。
def outerFunction(text):
text = text
def innerFunction():
print(text)
return innerFunction
if __name__ == '__main__':
myFunction = outerFunction('你好')
myFunction()
你好
上面的代码中,函数 innerFunction 应当只能在outerFunction 函数范围内被调用,但是通过使用闭包,我们可以轻松扩展其范围,在函数outerFunction之外调用innerFunction。
以下示例是输出函数执行情况的日志,在嵌套函数中返回了另一个函数用于动态输出函数的调用过程。
def logger(func):
def log_func(*args):
print('Running "{}" with arguments {}'.format(func.__name__, args))
print('result:',func(*args))
# 闭包起作用的关键,返回函数
return log_func
def add(x, y):
return x + y
def sub(x, y):
return x-y
add_logger = logger(add)
sub_logger = logger(sub)
add_logger(3, 3)
add_logger(4, 5)
sub_logger(10, 5)
sub_logger(20, 10)
##结果
Running "add" with arguments (3, 3)
result: 6
Running "add" with arguments (4, 5)
result: 9
Running "sub" with arguments (10, 5)
result: 5
Running "sub" with arguments (20, 10)
result: 10
为什么使用嵌套函数
内部类在 Python 中被使用有几个原因:
- 封装:将一个类封装在另一个类中,提供更好的结构并隐藏内部类以防止外部访问。
- 逻辑分组:将相关的类分组在一起,使代码更加模块化和更易于理解。
- 访问外部类:内部类可以访问外部类的成员,这在某些设计模式中很有用。