Python学习笔记(九):

  1. 装饰器(函数)
  2. 内置函数

1. 装饰器

1. 作用域

2. 高阶函数

3. 闭包

  • 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
def outer():
    x = 10
    def inner():    # 条件一:inner是内部函数
        print(x)    # 条件二:外部环境的一个变量
    return inner()  # 结论:内部函数inner就是一个闭包
# 两种调用inner的方法
outer()()
f = outer()
f()
# 闭包=内部函数+定义函数时的环境

4. 装饰器

代码示例:

import time

def show_time(f):           # 装饰器函数
    def inner():            # 通过闭包实现的装饰器
        start = time.time()
        f()
        end = time.time()
        print(start - end)
    return inner

@show_time
def foo():          # 功能函数
    print("foo...")
    time.sleep(2)

foo()

图示:
<span class='yzk_title_177'>Python学习笔记(九)</span>-一只小白

扩展:
1. 功能函数加参数

代码示例:

def show_time(f):       # 装饰器函数
    def inner(*args):   # 通过闭包实现装饰
        start = time.time()
        f(*args)
        end = time.time()
        print("spend %s"%(end - start))
    return inner

@show_time
def add(*args):         # 功能函数
    sums = 0
    for i in args:
        sums += i
    print(sums)
    time.sleep(1)

add(1,2,3,4,5)
  1. 装饰器函数加参数

代码示例:

def logger(flag=''):        # 给装饰器函数再嵌套一层函数并传参
    def show_time(f):       # 装饰器函数
        def inner(*args):   # 通过闭包实现装饰效果
            start = time.time()
            f(*args)
            end = time.time()
            print("spend %s"%(end - start))
            if flag == 'true':  # 通过闭包传入装饰器的参数
                print("日志")
        return inner
    return show_time

@logger('true')  # = @show_time
def add(*args):
    sums = 0
    for i in args:
        sums += i
    print(sums)
    time.sleep(1)

add(1,2,3,4,5)

@logger()
def bar():
    print("bar...")
    time.sleep(2)