day11--装饰器初识

一,函数名的运用

函数名可以像变量一样,进行赋值操作

1,函数名的内存地址   打印函数名(不加括号),打印出来的是一个地址

def func():
    print("呵呵")
print(func)
#<function func at 0x1024cb048>

2,函数可以作为容器(list,tuple,dict)的元素,保存在容器内

def func1():
    print("哈哈")
def func2():
    print("呵呵")
def func3():
    print("哈哈哈")
lst = [func1,func2,func3]
for i in lst:
    i()
# 哈哈
# 呵呵
# 哈哈哈

3,函数可以作为返回值返回

def func1():
    print("哈哈")
    def func2():
        print("哈哈2")
    print("哈哈1")
    return func2

fn = func1()
fn()
# 哈哈
# 哈哈1
# 哈哈2

4,函数可以作为参数进行传递

def func():
    print("哈哈")

def func2(fn):  #这里的fn是func
    print("我是func2")
    fn()    #执行传递过来的fn
    print("我是func2")

func2(func)
# 我是func2
# 哈哈
# 我是func2

5,函数名可以赋值给其他变量

def func():
    print("呵呵")

a = func
a()
#呵呵

二,闭包

1,目的:让内存永远记住一个变量  (闭包的作用就是让一个变量能够常驻内存,供后面的程序使用)

在内层函数里面访问外层函数的局部变量,叫闭包,这个时候,外层的这个局部变量,将会常驻内存

def func1():
    name = "alex"
    def func2():
        print(name)  #这个地方引用了上层的name,就是闭包
    func2()
func1()
#alex

我们可以使用_closure_来检测函数是否是闭包,使用函数名._closure_返回cell就是闭包,返回None就不是闭包

def func1():
    name = "alex"
    def func2():
        print(name)   #alex
    func2()
    print(func2.__closure__) #(<cell at 0x102a7c048: str object at 0x1025b05a8>,)
func1()

在函数外边调用内部函数

def outer():
    name = "alex"
    def inner():
        print(name)
    return inner

fn = outer() 
fn()

三,装饰器初识

开闭原则(开放封闭原则):对添加功能开放,对修改代码封闭,优点是代码好维护

装饰器的作用就是在不修改原有代码的基础上,给函数扩展功能

def wrapper(fn):
def innre(*args,**kwargs):
'''目标函数之前要做什么'''
ret = fn(*args,**kwargs)
'''目标函数之后要做什么"
return ret
return inner
 
@wrapper #语法糖
def target()
pass

猜你喜欢

转载自www.cnblogs.com/lianghui-lianghui/p/9183965.html