千字长文讲解python闭包

1.闭包的作用
a.闭包可以保存函数内的变量,不会随着函数调用完而销毁
2.闭包的定义
a.在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
3.闭包示例

# 函数嵌套
def outer_func(num1):
    def inner_func(num2):
        # 内部函数使用了外部函数的变量或外部函数的参数
        num = num1 + num2
        print(f'num1: {num1}, num2: {num2}, num: {num}')
    # 外部函数返回了内部函数
    return inner_func


f = outer_func(10)

f(1)
f(2)

'''
num1: 10, num2: 1, num: 11
num1: 10, num2: 2, num: 12
'''

4.闭包和类相似,内部函数使用的外部函数的变量类似于类的属性
5.nonlocal可以在闭包内修改外部变量
a.不使用nonlocal

def outer_func(num1):
    def inner_func(num2):
        num1 = num2 + 10
        print(f'num1: {num1}')
    return inner_func


f = outer_func(10)
f(1)
f(2)

'''
num1: 11
num1: 12
'''

b.使用nonlocal

def outer_func(num1):
    def inner_func(num2):
        nonlocal num1
        num1 = num2 + 10
        print(f'num1 in inner func: {num1}')

    print(f'num1 in outer func before: {num1}')
    inner_func(1)
    print(f'num1 in outer func after: {num1}')

    return inner_func


f = outer_func(10)
f(1)
f(2)

'''
num1 in outer func before: 10
num1 in inner func: 11
num1 in outer func after: 11
num1 in inner func: 11
num1 in inner func: 12
'''

c.nonlocal实现Counter

# 定义一个函数,用于生成一个计数器
def counter():
    # 定义一个外层函数的局部变量,用于存储计数值,初始为0
    count = 0

    # 定义一个嵌套函数,用于返回并修改计数值
    def next():
        # 使用nonlocal关键字声明要修改的外层函数的局部变量
        nonlocal count
        # 将计数值加1
        count += 1
        # 返回计数值
        return count

    # 返回嵌套函数
    return next


c = counter()
print(c())
print(c())
print(c())

'''
1
2
3
'''

相关推荐

  1. 长文讲解python

    2024-07-20 19:50:01       17 阅读
  2. 9、python-

    2024-07-20 19:50:01       55 阅读
  3. Python

    2024-07-20 19:50:01       50 阅读
  4. Python

    2024-07-20 19:50:01       39 阅读
  5. Python

    2024-07-20 19:50:01       36 阅读
  6. python基础---

    2024-07-20 19:50:01       28 阅读
  7. Python与装饰

    2024-07-20 19:50:01       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 19:50:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 19:50:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 19:50:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 19:50:01       55 阅读

热门阅读

  1. 网友提问:display:flex和display:box有什么区别?

    2024-07-20 19:50:01       16 阅读
  2. 每天一个数据分析题(四百三十八)- A/Btest

    2024-07-20 19:50:01       17 阅读
  3. 为了Python换源,我开发了一个库「pipco 0.0.19」

    2024-07-20 19:50:01       20 阅读
  4. Python3 第十九课 -- 迭代器与生成器

    2024-07-20 19:50:01       22 阅读
  5. SQL

    SQL

    2024-07-20 19:50:01      15 阅读
  6. python环境搭建步骤记录

    2024-07-20 19:50:01       18 阅读
  7. 【Linux常用命令】之sed命令

    2024-07-20 19:50:01       18 阅读
  8. 简单工厂模式、工厂模式和抽象工厂模式的区别

    2024-07-20 19:50:01       15 阅读
  9. minishell

    minishell

    2024-07-20 19:50:01      12 阅读