在前面的文章中所有的函数都是在全局范围内定义的,这些函数都称为全局函数。 Python还支持在函数体内定义函数,这种被放在函数体内定义的函数称为局部函数。
在默认情况下,局部函数对外部是隐藏的,局部函数只能在函数体内调用。函数也可以返回局部函数,以便程序在其他作用域中使用局部数。
示例代码:local_func_test.py
def multi_math_func(type, value) : # 定义一个计算平方的局部函数 def square(n) : return n * n # 定义一个计算立方的局部函数 def cube(n) : return n * n * n # 定义一个计算阶乘的局部函数 def factorial(n) : result = 1 for index in range(2, n + 1) : result *= index return result # 调用局部函数 if type == "square" : return square(value) elif type == "cube": return cube(value) else: return factorial(value) print(multi_math_func("square", 5)) # 输出25 print(multi_math_func("cube", 7)) # 输出343 print(multi_math_func("", 4)) # 输出24
在这段代码中定义了一个全局函数multi_math_func,在该函数中定义了3个局部函数,而 multi_math_func()函数则根据参数选择调用不同的局部函数。
如果multi_math_func函数没有返回局部函数,那么局部函数只能在multi_math_func函数内部调用,如上面程序所示。
另外,还会出现一种情况,如果multi_math_func函数将局部函数返回,且程序使用变量保存了multi_math_func函数的返回值,那么这些局部函数的作用域就会被扩大。因此程序完全可以自由地调用它们,就像它们都是全局函数一样。下面就看一下如何使用局部函数。
示例代码:return_func.py
# 定义函数,该函数会返回局部函数的计算结果 def multi_math_func(type) : # 定义一个计算平方的局部函数 def square(n) : return n * n # 定义一个计算立方的局部函数 def cube(n) : return n * n * n # 定义一个计算阶乘的局部函数 def factorial(n) : result = 1 for index in range(2, n + 1) : result *= index return result # 调用局部函数 if type == "square" : return square # 返回square函数 elif type == "cube": return cube # 返回cube函数 else: return factorial # 返回factorial函数 # 调用get_math_func(),程序返回一个嵌套函数 math_func = multi_math_func("cube") # 得到cube函数 print(math_func(7)) # 输出343 math_func = multi_math_func("square") # 得到square函数 print(math_func(3)) # 输出9 math_func = multi_math_func("other") # 得到factorial函数 print(math_func(6)) # 输出720
这段代码中的multi_math_func函数根据type参数值返回了3个不同的函数,所以该函数的返回值就是函数本身,因此,不能直接输出该函数的返回值,要按函数的方式调用后,才能得到计算结果。