嵌套函数(内部函数)
嵌套函数:
在函数内部定义的函数!
【操作】嵌套函数定义
def f1():
print('f1 running...')
def f2():
print('f2 running...')
f2()
f1()
执行结果:
f1 running...
f2 running...
上面程序中,f2()就是定义在 f1 函数内部的函数。f2()的定义和调用都在 f1()函数内部。
【操作】使用嵌套函数避免重复代码
def printChineseName(name,familyName):
print("{0} {1}".format(familyName,name))
def printEnglishName(name,familyName):
print("{0} {1}".format(name, familyName))
#################################################
#使用 1 个函数代替上面的两个函数
def printName(isChinese,name,familyName): #利用第一个布尔变量判断中文还是英文
def inner_print(a,b):
print("{0} {1}".format(a,b))
if isChinese:
inner_print(familyName,name)
else:
inner_print(name,familyName)
printName(True,"悟空","孙") #True代表中文姓名
printName(False,"George","Bush") #False代表英文姓名
执行结果:
孙 悟空
George Bush
nonlocal 关键字
nonlocal 用来声明外层的局部变量。
global 用来声明全局变量。
【操作】使用 nonlocal 声明外层局部变量
#测试 nonlocal、global 关键字的用法
a = 100
def outer():
b = 10
def inner():
nonlocal b #声明外部函数的局部变量
print("inner b:",b)
b = 20
global a #声明全局变量
a = 1000
inner()
print("outer b:",b)
outer()
print("a:",a)
执行结果:
inner b: 10
outer b: 20
a: 1000
LEGB 规则
Python 在查找“名称”时,是按照 LEGB 规则查找的:
Local–>Enclosed–>Global–>Built in
Local 指的就是函数或者类的方法内部
Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global 指的是模块中的全局变量
Built in 指的是 Python 为自己保留的特殊名称。
如果某个 name 映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域
(enclosed)进行搜索,如果闭包作用域也没有找到,Python 就会到全局(global)命名空间中进行查找,最后会在内建(built-in)命名空间搜索 (如果一个名称在所有命名空间中都没有找到,就会产生一个 NameError)


91

被折叠的 条评论
为什么被折叠?



