闭包

魔法属性__call__方法

一个类里面__init__对象初始化对象,初始化对象完成之后如果想向对象里面传递参数就需要使用call方法

class Line(object):
    def __init__(self, k, b):
        self.k = k
        self.b=b

    def __call__(self,x):
        print(self.k*x+self.b)

line=Line(1,2)
line(1)#实例化对象里面传递参数
缺点:为了计算多条线段的y值,需要保存多个k和b的值,浪费资源

闭包

与call方法非常类似,但是与类的call相比不会浪费资源

def line_1(k,b):
    def create_y(x):
        print(k*x+b)
    return create_y

line_1_1=line_1(1,2)#默认值是None
line_1_1(1)
调用line_1这个函数之后,会遇到create_y函数,但是这是定义的一个函数没有传递过来参数,所以不会执行。这个时候跳过create_y的函数体,我们去执行return的是create_y的函数地址 ,所以line_1_1指向的是create_y的函数,这个时候我们line_1_1传递了这个参数。(感觉非常像是函数指针)

简单来说什么叫做闭包呢,其实就是一个函数里面嵌套着另一个函数的定义,我们反而需要的是另一个函数。而且一般来说内部函数会用到外部的函数的变量,我们就把内部函数和外部函数的变量叫做闭包.

和call方法相比的好处在于,用类创建出来的实例对象的空间会大很多,闭包创建出来的空间比较纯净

一般实现简单的功能的时候我们会使用闭包,写比较大的项目的时候我们还是使用面向对象的方法。函数和闭包的区别:函数就是一段代码他没有传递参数的功能,但是闭包即是一段代码也有传递参数的功能,传递很简单的数据和功能的时候我们就使用闭包

闭包修改数据(内部函数修改外部函数传递进来的变量)

x=300
def test_1():
    x=200
    def test_2():

        print("----1----X=%d"%x)
        x = 100
        print("----2----X=%d"%x)
        return test_2

t=test_1()
t()

实际运行出现错误,因为第一个打印应该打印的是外部函数的变量,但是内部函数有局部变量,所以他想打印内部函数的变量,但是内部函数的变量是写在打印下面的,所以这段代码就挂了

x=300
def test_1():
    x=200
    def test_2():
        nonlocal  x
        print("----1----X=%d"%x)
        x = 100
        print("----2----X=%d"%x)
    return test_2

t=test_1()
t()

在改变全局变量的时候我们使用golobal,在改变闭包外部函数的变量的时候,我们需要使用nonlocal。结果如下:在这里插入图片描述

author: specyue@mail.ustc.edu.cn
github:https://github.com/zhangyuespec/mini_web

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值