python函数作用域与闭包

本文介绍了Python中的闭包概念,展示了如何使用闭包来创建灵活的函数,并提供了具体的例子,包括成绩判断逻辑和函数装饰器的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

L: local 函数内部作用域
E: enclosing 函数内部与内嵌函数之间
G: global 全局作用域
B: build_in 内置作用域

python函数的闭包,python的闭包函数,内部的函数会将外部函数的参数变成内部函数的一个属性,以元组的形式储存下来。

方式1:

描述:我们想要写一个判断学生成绩的代码,当科目满分为150,那么及格线为90分,如果科目满分为100,那么及格线为60分。
要求:实现查询学生是否通过考试

def set_passline(passline):
    def judge(score):
        if score>=passline:
            print('good')
        else:
            print('bad')
    return judge

当我们第一次调用时候传进去一个参数:

set_one =set_passline(150)

set_passline函数执行完会返回judge函数,并且把外层函数传进来的passline作为自己的属性用一个不可变的元组保存(passline,)

set_one(80)

然后调用函数set_one,并传入学生成绩,就能进行判断,set_one函数里的passline,就是在运行的时候保存下来的。

f= set_passline(150)(80)

这种调用方式也是可以的。

方式2:

描述:有两个函数把他们用闭包的方是合起来:

#求和
def add(*arg):
    if len(arg)==0:
        return 0
    for val in arg:
        if not isinstance(val,int):
            return 0
    return sum(arg)

#求平均值
def val(*arg):
    if len(arg)==0:
        return 0
    for val in arg:
        if not isinstance(val,int):
            return 0
    return sum(arg)/len(arg)
处理后
#求和
def add(*arg):
    return sum(arg)

#求平均值
def val(*arg):
    return sum(arg)/len(arg)

def dec(func):
    def in_dec(*arg):
            if len(arg)==0:
        return 0
        for val in arg:
            if not isinstance(val,int):
                return 0
        func(*arg)
    return in_dec

分析:

首先我们调用dec,并且把想要运行的函数传递进去

add =dec(add)

在这一步,程序完成了执行dec(add),把func=add,存了下来,并且把函数in_dec返回给了add.此时的add就是in_dec(*arg),携带了一个属性:(func = add),func指向了之前的add的函数。

add(1,2,3,4,5)

这一步实际上执行的是in_dec(1,2,3,4,5)这个函数把*arg接收后,传给了内部函数func ,并且执行了func(*arg)。也就是执行了之前的那个add函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值