cccyyys 发表于 2021-6-20 19:27

【笔记】嵌套函数、nonlocal

嵌套函数
概念:在函数内部定义的函数
嵌套函数可以用于1、封装:用于数据隐藏,外部无法访问嵌套函数
                           2、贯彻DRY(Don't repeat Yourself)原则:避免重复代码
                           3、闭包。
def f1():
    print('f1 running')
    def f2():
      print('f2 running')
    f2()

f1()
运行结果为:f1 running
f2 running
这是一个简单的嵌套函数,在f1内部定义f2,并调用f2,此时调用f1就相当于调用f1和f2两个函数。而且嵌套函数只在函数内部使用,函数外无法使用函数内的嵌套函数。否则会报错。
#避免重复代码
def printChineseName(name,FamliyName):
    print('{0} {1}'.format(FamliyName,name))
def printEnglishName(name,FamliyName):
    print('{0} {1}'.format(name, FamliyName))

def printName(isChinese,name,FamliyName):
    def inner_name(a,b):
      print('{0} {1}'.format(a,b))
    if isChinese:
      inner_name(FamliyName,name)
    else:
      inner_name(name,FamliyName)

可以使用嵌套函数避免重复代码。
nonlocal 关键字
nonlocal与global类似
nonlocal用来声明外部函数的局部变量
global用来声明全局变量
def outer():
a = 10
def inner():
nonlocal a #声明外部函数的局部变量
print('inner a:',a)
a = 20 #修改外部函数的局部变量必须先用nonlocal声明,否则会报错
inner()
print('outer a:',a)
outer()
注意如果嵌套函数内部只是读取外部函数局部变量的值,可以不用声明直接读取,如果需要修改的话,必须先用nonlocal声明。

tomato123123 发表于 2021-6-20 20:40

好像还能把内部函数当成返回值吧,忘了咋么用了

三滑稽甲苯 发表于 2021-6-20 21:43

tomato123123 发表于 2021-6-20 20:40
好像还能把内部函数当成返回值吧,忘了咋么用了

装饰器
例子:
def deco(old_func):
    def new_func():
      print('Start.')
      old_func()
      print('End.')
    return new_func

@deco
def my_func():
    print('Running...')

my_func()
返回值:
Start.
Running...
End.

tomato123123 发表于 2021-6-21 16:42

三滑稽甲苯 发表于 2021-6-20 21:43
装饰器
例子:
def deco(old_func):


对,装饰器,好像还有个概念呢,叫闭包
页: [1]
查看完整版本: 【笔记】嵌套函数、nonlocal