Python基础知识学习记录 2021——1103(嵌套函数,nonlocal 关键字,LEGB 规则)

嵌套函数(内部函数)

嵌套函数:
在函数内部定义的函数!

【操作】嵌套函数定义

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值