Python---闭包,函数式编程的应用

文章聚焦函数式编程中的闭包,阐述了闭包的意义及注意事项,还介绍了如何用闭包简单地解决问题,为理解和运用闭包提供了相关思路。

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

文章内容:

1.函数式编程——闭包的意义及注意事项
2.如何简单地用闭包去解决一个问题

#与有些语言不同的是,在python中,一切皆对象
def curve_pre():
    a=12
    def curve(x):
        return a*x*x
    return curve

f=curve_pre()#在python中,一切皆对象
print(f(2))#48,f(2)==curve(2)

#闭包的现象
#闭包=函数+环境变量
def curve_pre():
    a=12#环境变量
    def curve(x):
        return a*x*x
    return curve
a=10#################
f=curve_pre()
print(f.__closure__)#(<cell at 0x000000000BB3E528: int object at 0x000000006978C850>,)
print(f.__closure__[0].cell_contents)#12
print(f(2))#48

#闭包的意义:保存一个环境,不受外部影响

#闭包的注意事项
def f1():
    a=10
    def f2():
        a=20#局部变量不会影响到外部的变量
        print(a)
    print(a)
    f2()
    print(a)
f1()
#10
#20
#10

#########################
def f1():
    a=10
    def f2():
        a=20
    f2()
f=f1()#f为空值,因为没有返回任何结果
print(f.__closure__)#AttributeError: 'NoneType' object has no attribute '__closure__'

def f1():
    a=10
    def f2():
        a=20
    return a
f=f1()#f为10,返回了a的值
print(f.__closure__)#AttributeError: 'int' object has no attribute '__closure__'

def f1():
    a=10
    def f2():
        a=20
    return f2()
f=f1()#f为f2()
print(f.__closure__)#AttributeError: 'NoneType' object has no attribute '__closure__'
#########################

def f1():
    a=10
    def f2():
        a=20
        c=2*a
        return c
    return f2()
f=f1()
print(f)#40,这不是一个闭包
#把上面调整成闭包
def f1():
    a=10
    def f2():
        c=2*a
        return c
    return f2()
f=f1()
print(f)#20


"""
用闭包解决问题,通过简单的问题去了解闭包的使用
如何简单地进行数的累计?
"""
a=0
def Accumulate(x):
    c=a+x#没有定义a,则去全局中寻找a
    return c
print(Accumulate(2))#2
print(Accumulate(3))#3
print(Accumulate(4))#4
#没有达到目的,这是错误的,进行修改如下
a=0
def Accumulate(x):
    c=a+x#在赋值之前引用了局部变量a,错误,因为定义了局部变量a,它会去寻找局部定义的a
    a=c#这里a就认为是局部变量了
    return c
print(Accumulate(2))
print(Accumulate(3))
print(Accumulate(4))
#错误实例,再修改
a=0
def Accumulate(x):
    global a#定义a为全局变量
    c=a+x
    a=c
    return c
print(Accumulate(2))#2
print(Accumulate(3))#5
print(Accumulate(4))#9
#达到目的,进行了累加计算,但用的是非闭包的方法,再次修改使用闭包的方法
start=0
def Accumulate(x):
    def Go(number):
        nonlocal x#强制标注为非局部变量
        new_x=x+number
        x=new_x
        return x
    return Go
f=Accumulate(start)
print(f(2))#2
print(f(3))#5
print(f(4))#9,每次都记住了x
#达到目的,进行了累加计算,用了闭包的方法,函数式编程事例

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值