Python3-2020-测试开发-16- 嵌套函数(内部函数 )&nonlacal声明外部函数的局部变量&LEGB规则
一、嵌套函数(内部函数 )
作用:1.封装-数据隐藏,外部无法访问“嵌套函数”;2.避免重复代码使用3.闭包
def printName(isChinese,name,familyName): def inner(a,b): print("{0}{1}".format(a,b)) if isChinese: inner(name,familyName) else: inner(familyName,name) printName(True,"褚","六") printName(False,"lusy","tony")
输出:
褚六
tonylusy
二、nonlacal声明外部函数的局部变量
2.1 不可修改外部函数的局部变量
def outer01(): b = 10 def inner(): print("inner ",b) b = 20 # local variable 'b' referenced before assignment inner() outer01()
输出:
local variable 'b' referenced before assignment
2.2 使用nonlacal,可修改变量
def outer02(): b = 10 def inner(): nonlocal b # nonlacal声明外部函数的局部变量 print("inner ",b) b = 20 inner() outer02()
三、LEGB规则
"""
Python在查找“名称”时,是按照LEGB规则查找的
Local ---> Enclosed ---> Global ---> Built in
Local 指的是函数或者类的方法内部
Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global 指的是模块中的全局变量
Built in 指的是Python为知己保留的特殊名称
如果某个name映射在局部(local)命名空间中咩有找到,接下来会在闭包作用域(enclosed)进行搜索
如果闭包作用域也没有找到,Python就会到全局(Global)命名空间中进行查找,最后会在内建(built in )命名空间查找
如果一个名称在所有命名空间中都没有找到,就会产生一个NameError
"""
3.1 Local
def legb_outer01(): str = "b" def inner(): str = "a" print(str) # a inner() legb_outer01()
3.2 Enclosed
def legb_outer02(): str = "b" def inner(): # str = "a" print(str) # b inner() legb_outer02()
3.3 Global
str = "c" def legb_outer03(): # str = "b" def inner(): # str = "a" print(str) # c inner() legb_outer03()
3.4 Built in
# str = "c" def legb_outer04(): # str = "b" def inner(): # str = "a" print(str) # <class 'str'> inner() legb_outer04()
当有些人一出生就有的东西,我们要为之奋斗几十年才拥有。但有一样东西,你一辈子都不会有,那就是我们曾经一无所有。