闭包函数 装饰器

闭包函数

什么是闭包函数:

​ 闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体

闭包函数注意事项:

  1. 闭包函数必须在函数内部定义
  2. 闭包函数可以引用外层函数的名字
#直接传参
def func(x):
    print(x)
    
func(1000)

1000

#通过闭函数传参
def outer(number):
    def inner():
        print(number)

    return inner


func = outer(1000)  # --->inner地址 ----> func变量名

func() #---> inner地址   

装饰器

什么是装饰器 : 在函数中用来给添加新功能的工具

​ 为什么要用装饰器:

			为了提高代码的可读性,防止代码的冗余

怎么用装饰器:

  1. 不修改被装饰对象的源代码
  2. 不修改被装饰对象的调用方式

被装饰对象: -----> 需要添加功能 函数

装饰器:------> 被装饰对象添加的新功能 的 函数

time_record --- > 装饰器

# 统计下载电影函数的运行时间
import time
def download_movie():
    print('电影开始下载...')
    time.sleep(3)
    print('电影下载完成...')
start_time = time.time()
download_movie()
end_time = time.time()
print(f'消耗时间:{end_time - start_time}')

电影开始下载...
电影下载完成...
消耗时间:3.000986099243164
# 装饰器写法:

import time
def download_movie():
    print('电影开始下载...')
    time.sleep(3)
    print('电影完成下载...')
def time_record(func):
    def inner():
        start_time = time.time()
        func()
        end_time = time.time()
        print(f'消耗数间:{end_time - start_time}')
    return inner

download_movie = time_record(download_movie)
download_movie()

装饰器的语法糖 ,是属于装饰器的

@: 装饰器的语法糖

注意: 在使用装饰器语法糖时,装饰器必须定义在被装饰对象之上

import time 
#统计函数执行时间装饰器
def wrapper(func):
    def inner(*args, **kwargs):# 被装饰对象
        #调用前新增功能
        start_time = time.time()
        #调用被装饰对象,并接收返回值
        res = func(*args, **kwargs)
        #调用后添加新功能
        end_time = time.time()
        print(end_time - start_time)
        
        return res
    return inner

         
原文地址:https://www.cnblogs.com/127-2933/p/11867932.html