python学习笔记--闭包

代码:
"""
author:一叶扁舟(skiff)
python的闭包
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包

"""

def closure (number):

    print("-------1------------")
    def closure_in(number_in):
        print("-------2------------")
        print("%d %d"%(number,number_in))

        return number + number_in;
    print("-------3------------")

    return  closure_in;


#传入的参数20,实际上是传到closure,返回值指向的是closure_in函数
result = closure(20)
# 传入的参数,实际传入到closure_in中的
print(result(100))
print("-"*120)
"""
或者简单这样理解:内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。

"""


# 对传入的参数自动加一

def counter(start=0):

    # 定义一个列表
    count = [start]

    def incr():
        count[0] += 1
        print("incr----%d--- "%(count[0]))
        return count[0]

    # 注意不是返回incr(),这种就是返回一个函数调用
    return incr;

ret = counter(4)
#此时ret(),调用的是conter()函数中的incr()
print(ret())



"""
如下函数:
函数line与变量k,b构成闭包。在创建闭包的时候,我们通过line_conf的参数k,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = kx + 20和y = kx + 40)。
我们只需要变换参数k,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明k,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
"""
print("-"*120)

# 定义了一个一个线性函数,斜率为k,截距为b,对于这个线性函数,k和b固定后,每次只要传入x,既可
def line_conf(k,b):

    def line(x):

        return x * k + b

    return line

line1 = line_conf(1,20)
line2 = line_conf(2,40)

# 改变x的值
print(line1(1))
print(line2(1))





输出结果:

-------1------------
-------3------------
-------2------------
20 100
120
------------------------------------------------------------------------------------------------------------------------
incr----5--- 
5
------------------------------------------------------------------------------------------------------------------------
21
42

猜你喜欢

转载自blog.csdn.net/u011662320/article/details/80963868