0511Python基础-函数名应用-闭包-装饰器

1、昨日内容回顾

    动态参数

    *args:接受的是所有的位置参数。

    **kwargs:所有的关键字参数。

    形参顺序:位置参数,*args,默认参数,**kwargs

    *的模型用法:

    在函数的定义的时候,*代表聚合。

    在函数的执行的时候,*代表打散。

    内置名称空间

    全局名称空间

    局部名称空间

    全局作用域:内置名称空间,全局名称空间

    局部作用域:局部名称空间

    加载顺序:

        内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时)

    取值顺序:

    局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间

        LEGB

    执行顺序:

        当代码运行时,从上至下依次执行。

    函数的嵌套。

    global

    1,声明一个全局变量。

    2,更改一个全局变量。

    nonlocal

    1,不能改变一个全局变量。

 2,....

2、函数名的应用(第一对象)。

1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>

def func1():

    print(666)

print(func1)

2,函数名可以赋值运算。

def func1():

    print(666)

f1 = func1

f1()

3, 函数名可以作为函数的参数。

def func1():

    print(666)

def func2(x):

    x()

    print(555)

func2(func1)

4,函数名可以作为容器类数据类型的元素。

 def func1():

    print(666)

def func2():

    print(222)

def func3():

    print(111)

def func4():

    print(777)

l1 = [func1, func2, func3, func4]

for i in l1:

    i()

dic1 = {

    1:func1,

    2:func2,

    3:func3,

    4:func4,

}

dic1[1]()

  

函数名可以当做函数的返回值

def func1():

    print(666)

def func2(x):  # x = func1

    print(222)

    return x

ret = func2(func1)

ret()

3、闭包。

内层函数对外层函数非全局变量的引用就叫闭包

判断是不是闭包 函数名.__closure__

返回的None则不是闭包,返回的是cell.... 则是闭包

闭包有什么用?

当执行一个函数时,如果解释器判断此函数内部闭包存在,这样

Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。

def func1():

    name = '老男孩'

    def inner():

        print(name)

    inner()

    print(inner.__closure__)  # <cell at 0x000000000282A768: str object at 0x0000000002856E10>

func1()

def func1():

    global name

    name = '老男孩'

    def inner():

        print(name)

    inner()

    print(inner.__closure__)  # None

func1()

思考题

def func():

    def func1():

        name ="老男孩"

    def func2():

        nonlocal name

        name = "alex"

    def func3():

        global name

        name = "太白"

    name = "日天"

    func1()

    print(name)  # 1 日天

    func2()

    print(name)  # 2,alex

    func3()

    print(name)  # 3,alex

func()

print(name)  # 4,太白

4、装饰器。

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景

import time

'''第一版本,测试函数low'''

def login():

    time.sleep(0.3)

    print('洗洗更健康...')

def timmer():

    start_time = time.time()

    login()

    end_time = time.time()

    print('此函数的执行时间%s' % (end_time - start_time))

timmer()

改变了我原来执行函数的执行方式,不好

def login():

    time.sleep(0.3)

    print('洗洗更健康...')

# login()

def register():

    time.sleep(0.4)

    print('洗洗更健康22222...')

# register()

def timmer(f):

    start_time = time.time()

    f()

    end_time = time.time()

    print('此函数的执行时间%s' % (end_time - start_time))

timmer(login)

timmer(register)

虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码。改

def login():

    time.sleep(0.3)

    print('洗洗更健康...')

# login()

def timmer(f):

    start_time = time.time()

    f()

    end_time = time.time()

    print('此函数的执行时间%s' % (end_time - start_time))

f1 = login  # 将login函数名给了f1

login = timmer  # 将timmer函数名给了login

login(f1)  # timmer(login)

初级装饰器

def login():

    time.sleep(0.3)

    print('洗洗更健康...')

# login()

def timmer(f):  # f = login函数名

    def inner():

        start_time = time.time()

        f()  # login()

        end_time = time.time()

        print('此函数的执行时间%s' % (end_time - start_time))

    return inner

login = timmer(login)  # inner 此login是新变量

login()  # inner()

name = 'alex'

name = '老男孩'

简单版装饰器  语法糖

def timmer(f):  # f = login函数名

    def inner():

        start_time = time.time()

        f()  # login()

        end_time = time.time()

        print('此函数的执行时间%s' % (end_time - start_time))

    return inner

@timmer  # login = timmer(login)  # inner 此login是新变量

def login():

    time.sleep(0.3)

    print('洗洗更健康...')

login()

@timmer  # register = timmer(register)

def register():

    time.sleep(0.2)

    print('洗洗更健康22...')

login()  # inner()

被装饰的函数带参数的装饰器

def timmer(f):  # f = login函数名

    def inner(*args,**kwargs):  # args (2, 3)

        start_time = time.time()

        f(*args,**kwargs)  # login() *(2, 3) 2,3

        end_time = time.time()

        print('此函数的执行时间%s' % (end_time - start_time))

    return inner

@timmer  # login = timmer(login)  # inner 此login是新变量

def login(a,b):

    print(a,b)

    time.sleep(0.3)

    print('洗洗更健康...')

login(2,3)  # inner(2,3)

@timmer  # register = timmer(register)

def register(a):

    time.sleep(0.2)

    print('洗洗更健康22...')

register(1)  # inner(1)

def func1(x):

    x = 0

    print(x)

func1(0)

函数带返回值的装饰器 (万能装饰器)

def timmer(f):  # f = login函数名

    def inner(*args,**kwargs):  # args (2, 3)

        start_time = time.time()

        ret = f(*args,**kwargs)  # login() *(2, 3) 2,3

        end_time = time.time()

        print('此函数的执行时间%s' % (end_time - start_time))

        return ret

    return inner

@timmer  # login = timmer(login)  # inner 此login是新变量

def login(a,b):

    print(a,b)

    time.sleep(0.3)

    print('洗洗更健康...')

    return 666

print(login(2,3))  # inner(2,3)

def wrapper(f):

    def inner(*args,**kwargs):

        '''执行被装饰函数之前的操作'''

        ret = f(*args,**kwargs)

        """执行被装饰函数之后的操作"""

        return ret

    return inner

装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等.

猜你喜欢

转载自www.cnblogs.com/dzh0394/p/9026551.html
今日推荐