Python 闭包实现的计数器,每调用一次就 +1,多个计数器之间互不干扰

Python 闭包实现的计数器,每调用一次就 +1,多个计数器之间互不干扰

flyfish

cpp 复制代码
How Closures are Created
A closure is formed when:

	A function is defined inside another function (nested function).
	The inner function references variables from the outer function.
	The outer function returns the inner function.
cpp 复制代码
闭包是如何形成的
三个形成条件
	一个函数定义在另一个函数内部(这就是嵌套函数)。
	内部函数引用了外部函数的变量(自由变量)。
	外部函数将内部函数返回。

举例

cpp 复制代码
def say():
    greeting = 'Hello'

    def display():
        print(greeting)

    display()

闭包就是其中的

cpp 复制代码
greeting = 'Hello'

def display():
    print(greeting)

实现计数器,每调用一次就 +1,多个计数器之间互不干扰

实现方式1

nonlocal = 非局部

在嵌套 / 内部函数中,声明要修改的变量来 自外层函数 ,既不是当前函数的局部变量,也不是全局变量。

python 复制代码
def create_counter():
    # 自由变量:只属于当前闭包的状态
    count = 0

    # 嵌套内部函数
    def add():
        # 引用外部作用域的变量 count
        nonlocal count
        count += 1
        return count

    # 外部函数返回内部函数
    return add


# 创建两个独立的计数器
counter1 = create_counter()
counter2 = create_counter()

# 各自计数,互不干扰
print(counter1())  # 1
print(counter1())  # 2
print(counter1())  # 3

print(counter2())  # 1
print(counter2())  # 2

实现方式2

python 复制代码
def create_counter():
    # 用可变对象列表存储计数(绕过lambda不能赋值/nonlocal的限制)
    count = [0]
    # 返回 lambda 匿名函数(闭包:引用外部自由变量 count)
    return lambda: (count.__setitem__(0, count[0] + 1), count[0])[1]

# 创建两个独立计数器
counter1 = create_counter()
counter2 = create_counter()

# 执行结果和原版完全一致!
print(counter1())  # 1
print(counter1())  # 2
print(counter1())  # 3

print(counter2())  # 1
print(counter2())  # 2

实现方式3

python 复制代码
def create_counter():
    count = [0]
    return lambda: (count.__setitem__(0, count[0] + 1), count[0])[1]

# 创建两个独立计数器
counter1 = create_counter()
counter2 = create_counter()

# 执行结果和原版完全一致!
print(counter1())  # 1
print(counter1())  # 2
print(counter1())  # 3

print(counter2())  # 1
print(counter2())  # 2
    
    
相关推荐
jufeng13077 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 11 篇】
python·ai agent·mcp
En^_^Joy7 小时前
Django项目配置全攻略:settings配置文件
后端·python·django
for_ever_love__8 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
AC赳赳老秦8 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
麻雀飞吧9 小时前
零基础选量化工具,先把问题说清楚
人工智能·python
段一凡-华北理工大学9 小时前
AI推动工业智能化转型~系列文章20:工业 AI 平台架构:云-边-端协同的技术体系
人工智能·python·架构·工业平台·云-边协同
CodeBlog-star9 小时前
Harness Engineering:Pi Agent 架构深度解析
人工智能·python·架构·harness工程
简不变9 小时前
将components下的文件夹复制到别一个文件夹下,并重新生成CMakelist.txt文件
python
AC赳赳老秦10 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw