PYTHON学习笔记02

01内部函数

特点

  1. 可以访问外部函数的变量
  2. 内部函数可以修改外部函数的可变类型的变量,比如list1
  3. 修改外部函数的变量需要声明 ***nonlocal***变量名
  4. locals() 查看本地变量有哪些,以字典的形式输出
  5. globals() 查看全局变量有哪些,以字典的形式输出(注意里面会有一些系统的键值对)
# 内部函数

def func():
    # 声明变量
    n = 100
    list1 = [5,9,7,2]

    # 声明内部函数
    def inner_func():
    	nonlocal n
    	n += 100    # 对外部函数的变量修改
        # 对list1进行加法操作
        for index,i in enumerate(list1):
            list1[index] = i + n

        list1.sort()
		
    # 调用内部函数
    inner_func()
	# 使用locals()内置函数进行查看,可以看到在当前函数中声明的内容有哪些
    # locals()是一个字典
    print(locals())
    print(list1)

# 调用函数
func()
----------------------------------------------------
{'inner_func': <function func.<locals>.inner_func at 0x000001F551927400>, 'n': 200, 'list1': [202, 205, 207, 209]}
[202, 205, 207, 209]

02闭包

条件

  1. 外部函数中定义了内部函数
  2. 外部函数是有返回值
  3. 返回值是:内部函数名,不能加()
  4. 内部函数引用了外部函数的变量
def func():
    a = 100

    def inner_func():
        b = 90
        print(a,b)
    # 把函数往外扔
    return inner_func   # 不能加括号,加括号是调用

x = func()
x()
-----------------------------------------------------
100 90

示例:

def func(a,b):
    c = 10

    def inner_func():
        s = a+b+c
        print('相加后的结果是:',s)
    # 把函数往外扔
    return inner_func   # 不能加括号,加括号是调用

ifunc = func(6,9)   #ifunc = inner_func
# 调用返出来的内部函数
ifunc()
-----------------------------------------------------
相加后的结果是: 25

作用:

保存返回闭包时的状态,不会受到a,b改变的影响

03计数器

def generate_count():
    container = [0]
    def add_one():
        container[0] = container[0]+1
        print('当前是第{}次访问'.format(container[0]))

    return add_one

counter = generate_count()
counter()
counter()
counter()
----------------------------------------------------
当前是第1次访问
当前是第2次访问
当前是第3次访问

总结

闭包的缺点:

  1. 作用域没有那么直观
  2. 因为变量不会被垃圾回收所以有一定的内存占用问题
    闭包的作用:
  3. 可以使用同级的作用域
  4. 读取其他元素的内部变量
  5. 延长作用域
  6. 闭包是理解装饰器的基础
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值