装饰器一

一:函数名解析闭包

首先,咱们定义一个函数,分别打印他们函数和变量名app

def func():
    print(111)
print(func())
print(func)
print(())

打印结果:函数

解读:首先打印111,是由于执行了func()这个函数。测试

           其次打印的是空,none,是由于函数没有返回值。spa

           在次打印得是函数名内存地址,由于定义函数自己就是一个变量。内存

           最后打印()是由于里面没有东西,放什么打印什么for循环

 

2 函数名能够赋值。变量

def func():
    print(111)
def func1():
    print(222)
def func2():
    print(333)
f=func
x=func1
y=func2
f()
x()
y()
l1=[f(),x(),y()]
for i in l1:
    print(i)

打印结果:循环

解读:引用

第一次先打印111,222,333是由于函数调用结果

第二次打印此结果是由于for循环打开这个函数,上面分别调用而成。

第三次打印是none是由于函数没有返回值,打印这个函数,就是none。

 

函数名练习2

def func2():
    print(111)
def func3(x):
    print(222)
    x()
func3(func2)

执行结果:222,111

解读:func3(fuc2)将func2传值给x,打印222,x()执行上面func2函数,打印111

 

练习3

def func2():
    print(222)
def func3(x):
    print(a)  # func2()
    return a
a = 3
ret = func3(a)
print(ret)

打印结果:3,3

解析:没通过func2函数,因此不执行222

def func2():
    print(222)
def func3(x):
    # print(x)  # func2()
    return x
f = func2
f()
ret = func3(func2)  # x func2
ret()
func3(func2)()

打印结果:222,222,222

第一个打印222,f()调用执行了一次。

第二次打印 return x给了fun3(fun2)   而x=func2  ret接收这个x   ret()就是print222

第三次func3(func2)()   就至关于x()  也就是又打印了一遍222

 

二:闭包函数

内部函数引用外部函数(非全局变量)的变量

def  func():
    x=1
    def func1():
         print(x)
    func1()
    print( func1.__closure__)
func()

测试是否是闭包函数的方法

函数名.__closure__,而后打印出来包含cell就是闭包

以下图就不是一个闭包,由于是全局变量,打印结果是1,NONE,none就说明不是一个闭包。

闭包陷阱

# 在外层函数的内部,执行inner()
# return inner
def wrapper():
    def inner():
        print(666)
    return inner
# wrapper()  # inner
wrapper()()

执行过程是什么?

首先在内存开辟一个临时空间将wrapper函数存储里面,而后wrapper()开始执行函数,返回inner,给最后,此时inner=wrapper(),后面加上(),开始执行inner里面函数,打印666,此时结束。

为何不是闭包,由于没有传值,返回值显示none,内部不没有调用外部的值,谈什么闭包。

def wrapper():
    def i():
        def inner():
            print(666)
        print(inner.__closure__)
        return inner
    return i
# wrapper()  # inner
wrapper()()
相关文章
相关标签/搜索