吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1544|回复: 3
收起左侧

[Python 转载] 【笔记】嵌套函数、nonlocal

[复制链接]
cccyyys 发表于 2021-6-20 19:27
嵌套函数
概念:在函数内部定义的函数
嵌套函数可以用于1、封装:用于数据隐藏,外部无法访问嵌套函数
                             2、贯彻DRY(Don't repeat Yourself)原则:避免重复代码
                             3、闭包。
[Python] 纯文本查看 复制代码
def f1():
    print('f1 running')
    def f2():
        print('f2 running')
    f2()

f1()

运行结果为:f1 running
f2 running
这是一个简单的嵌套函数,在f1内部定义f2,并调用f2,此时调用f1就相当于调用f1和f2两个函数。而且嵌套函数只在函数内部使用,函数外无法使用函数内的嵌套函数。否则会报错。
[Python] 纯文本查看 复制代码
#避免重复代码
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  用来声明全局变量
[Python] 纯文本查看 复制代码
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
好像还能把内部函数当成返回值吧,忘了咋么用了

装饰器
例子:
[Python] 纯文本查看 复制代码
def deco(old_func):
    def new_func():
        print('Start.')
        old_func()
        print('End.')
    return new_func

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

my_func()

返回值:
[Plain Text] 纯文本查看 复制代码
Start.
Running...
End.
tomato123123 发表于 2021-6-21 16:42
三滑稽甲苯 发表于 2021-6-20 21:43
装饰器
例子:
[mw_shl_code=python,true]def deco(old_func):

对,装饰器,好像还有个概念呢,叫闭包
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表