装饰器一

一:函数名解析

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

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

打印结果:

解读:首先打印111,是因为执行了func()这个函数。

           其次打印的是空,none,是因为函数没有返回值。

           在次打印得是函数名内存地址,因为定义函数本身就是一个变量。

           最后打印()是因为里面没有东西,放什么打印什么

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()()

猜你喜欢

转载自my.oschina.net/u/3648651/blog/1808404