Python学习笔记(九)

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

图示:
图示

扩展:

  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)
原文地址:https://www.cnblogs.com/ryomahan/p/7561108.html