python 11

# 一、闭包
#
# 判断:函数名.__closure__
# 若返回cell,则是闭包,返回None则不是闭包。
#
# 闭包:内层函数对外层函数非全局变量的引用就叫闭包。


def func1(x):
    def func2():
        print(x)
    func2()
    print(func2.__closure__)
    return x


name = '小明'
func1(name)

# 以上这个函数,其实在执行func1(x)的时候,创建了一个x = '小明'的变量,所以,判断为闭包。
# 用处:当执行一个函数时,如果解释器判断此函数内部存在闭包,这样python就触发一个机制,闭
# 包的所在的临时名称空间不会随着函数的执行完毕而消失。(爬虫可以抓一次数据多次读取。)
# 二、装饰器

import time


def timmer(f):
    def inner():
        str_time = time.time()
        f()
        end_time = time.time()
        print('此函数执行时间为:%s' % (end_time - str_time))

    return inner


def login():
    time.sleep(3)
    print('洗洗更健康...')


login = timmer(login)

# 在函数上一行加入 @装饰器函数名 ,等同于执行了 函数名 = 装饰器函数名(函数名)
import time


def timmer(f):
    def inner():
        str_time = time.time()
        f()
        end_time = time.time()
        print('此函数执行时间为:%s' % (end_time - str_time))

    return inner

@timmer
def login():
    time.sleep(3)
    print('洗洗更健康...')

 

# 在优化一下,让装饰器可以接受多个值,并且返回该函数的返回值。

import time


def timmer(f):
    def inner(*args, **kwargs):
        str_time = time.time()
        ret = f(*args, **kwargs)
        end_time = time.time()
        print('此函数执行时间为:%s' % (end_time - str_time))
        return ret
    return inner


@timmer
def login(a, b):
    time.sleep(3)
    print('洗洗更健康...%s, %s' % (a, b))
    return 666

 

posted on 2018-05-11 13:01  leonraw  阅读(141)  评论(0编辑  收藏  举报

导航