函数的嵌套
函数也是可以嵌套的。
也就是可以在一个函数内部定义和运行另一个函数。举个例子:
>>> def funa():
print('funa()正在被调用')
def funb():
print('funb()正在被调用')
funb()
>>> funa()
funa()正在被调用
funb()正在被调用
在上述举例中,我们先定义了一个函数funa(),定义的内容包括几个部分:
- 打印'funa()正在被调用'
- 定义funb()函数
2.1 funb()的内容是打印'funb()正在被调用' - 运行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 "<pyshell#92>", line 1, in <module>
funa()
File "<pyshell#91>", 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
我自认为我这个距离比教科书上的举例更优雅,更完整。(^_^)