032-函数的嵌套与LEGB原则

函数的嵌套

函数也是可以嵌套的。

也就是可以在一个函数内部定义和运行另一个函数。举个例子:

>>> def funa():
    print('funa()正在被调用')
    def funb():
        print('funb()正在被调用')
    funb()

    
>>> funa()
funa()正在被调用
funb()正在被调用

在上述举例中,我们先定义了一个函数funa(),定义的内容包括几个部分:

  1. 打印'funa()正在被调用'
  2. 定义funb()函数
    2.1 funb()的内容是打印'funb()正在被调用'
  3. 运行funb()函数

因此,最终执行的结果是:
funa()正在被调用——对应1
funb()正在被调用——对应3

注意:在嵌套函数中,内部变量可以引用外部变量,但外部变量不能引用内部变量。这就好比国家的法律在河南省好使,河南省的法规在洛阳市也好使,但洛阳市的条例在郑州就不管用,在北京更不管用。

>>> def funa():
    x = 88
    def funb():
        print(x)
    funb()

    
>>> funa()
88  # 内部函数funb()引用了外部函数funa()定义的变量x
>>> def funa():
    print(y)
    def funb():
        y = 66
    funb()

    
>>> funa()
Traceback (most recent call last):
  File "", line 1, in 
    funa()
  File "", line 2, in funa
    print(y)
NameError: name 'y' is not defined  # 当外部函数funa()尝试调用内部函数funb()的变量y时,系统报错,提示y这个变量未被定义。

LEGB原则

先看示例:

x = 66
print('x在global中的值是:',x,',id是:',id(x))
def funa():
    x = 88
    print('x在外层函数中的值是:',x,',id是:',id(x))
    def funb():
        x = 99
        print('x在内层函数中的值是:',x,',id是:',id(x))
    funb()

funa()

----------执行结果如下----------

x在global中的值是: 66 ,id是: 2960384610704
x在外层函数中的值是: 88 ,id是: 2960384611408
x在内层函数中的值是: 99 ,id是: 2960384611760

我自认为我这个距离比教科书上的举例更优雅,更完整。(^_^)

你可能感兴趣的:(032-函数的嵌套与LEGB原则)