当前位置: 首页 > article >正文

萌新学 Python 之闭包函数

闭包函数:在一个函数体内嵌套函数,是一个函数对象,允许在内部函数中修改或引用外部函数的变量

闭包函数对数据有封存功能

闭包函数需要满足以下几个条件:

1.函数必须有一个嵌套函数,在定义函数时,内部再定义一个函数

2.内部函数必须引用外部函数的变量,如果需要修改变量,必须使用关键字 nonlocal 声明变量

3.外部函数的返回值必须是内部函数名

闭包函数基本格式:

def 外部函数(外部函数形参):
    变量 = 外部函数形参

    def 内部函数(内部函数形参):
        '如果修改外部函数的变量,必须使用关键字 nonlocal 声明变量'
        nonlocal 变量
        变量 += 内部函数形参
        return f'内部函数的返回值{变量}'

    return 内部函数             # 外部函数的返回值

# 创建闭包函数
闭包函数 = 外部函数('实参')       # 通过闭包函数加小括号调用
print(type(闭包函数))           # <class 'function'>

# 调用闭包函数:当执行调用外部函数后,返回值是函数名(内部函数),赋值给闭包函数(函数对象)
闭包函数()

案例 1:创建一个计数器

# 创建计数器
def create_count(count = 0):
    '定义一个函数,count初始值为0'
    def counter():
        nonlocal count        # 声明count变量
        count += 1            # 改变外部函数的变量
        return count
    return counter            # 外部函数返回内部函数的名称

# 创建闭包函数
count_num = create_count()    # count_num 函数对象

for _ in range(10):
    print(count_num())        # 调用函数时加小括号

执行结果如下:

案例 2:定义一个计算器,实现 add 加法和 sub 减法

# 案例:定义一个计算器,实现add加法和sub减法
def calc():
    totol = 0

    def add(value):
        nonlocal totol
        totol += value
        return totol

    def sub(value):
        nonlocal totol
        totol -= value
        return totol

    return add, sub

# 创建闭包函数
res_add, res_sub = calc()

# 调用闭包函数
print(res_add(100))    # 0+100=100
print(res_add(20))     # 100+20=120
print(res_sub(40))     # 120-40=80
print(res_add(10))     # 80+10=90
print(res_sub(80))     # 90-80=10

执行结果如下:

案例 3:通过闭包函数,实现银行账号的存款和取款功能

# 案例:实现银行账号的存款和取款功能
def bank_account(balance = 0):
    # 存款
    def deposit(amount):
        nonlocal balance
        balance += amount
        return balance

    # 取款
    def withdraw(amount):
        nonlocal balance
        if amount > balance:
            return '余额不足'
        else:
            balance -= amount
        return balance

    return deposit, withdraw

# 创建闭包函数
res_deposit, res_withdraw = bank_account()

# 调用闭包函数
print(res_withdraw(3000))    # 0-3000=余额不足
print(res_deposit(5000))     # 0+5000=5000
print(res_withdraw(2000))    # 5000-2000=3000
print(res_deposit(100))      # 3000+100=3100
print(res_withdraw(4000))    # 3100-4000=余额不足

执行结果如下:


http://www.kler.cn/a/561799.html

相关文章:

  • low rank decomposition如何用于矩阵的分解
  • C++基础02(函数)
  • 编写一个程序,计算并输出1到100的和(Python版)
  • <02.25>Leetcode100
  • DeepSeek-R1技术全解析:如何以十分之一成本实现OpenAI级性能?
  • 全方位监控AWS Application Load Balancer异常情况实战
  • 基于GO语言的车牌识别api技术-港澳车牌文字识别
  • 微软开源神器OmniParser-v2.0本地部署教程
  • git | 团队协作开发注意事项
  • 【Blender】三、材质篇--01,Blender材质基础 原理化BSDF
  • 大模型输出markdown格式前端对话框
  • 深入理解C++ 线程池:动手实践与源码解析
  • 是德科技keysight N5173B信号发生器,是一款经济高效的仪器
  • Java多线程中的死锁问题
  • Docker 部署 Jenkins持续集成(CI)工具
  • Java23种设计模式案例
  • smolagents学习笔记系列(五)Tools-in-depth-guide
  • 804 唯一摩斯密码词
  • 【leetcode hot 100 1】两数之和
  • 钉钉合同审批对接腾讯电子签,实现合同全流程自动化管理