Python编程思想(21):原来函数内部还可以定义函数(局部函数)

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

《Python编程思想》总目录

《Python编程思想》专栏

在前面的文章中所有的函数都是在全局范围内定义的,这些函数都称为全局函数。 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个不同的函数,所以该函数的返回值就是函数本身,因此,不能直接输出该函数的返回值,要按函数的方式调用后,才能得到计算结果。

-----------------支持作者请转发本文,也可以加李宁老师微信:unitymarvel,或扫描下面二维码加微信--------

欢迎关注  极客起源  微信公众号,更多精彩视频和文章等着你哦!

猜你喜欢

转载自blog.csdn.net/nokiaguy/article/details/106936174
今日推荐