用例:

#闭包的应用

def create(pos):
    def game(move_direction,step):
        '''
        实现点在坐标中移动
        :param move_ddirection: 移动方向
        :param step: 移动步长
        :return:
        '''
        x=pos[0]+move_direction[0]*step     #这里的pos[0]代表x轴初始值位置和move_direction[0]为x轴移动的方向
        y=pos[1]+move_direction[1]*step     #这里的pos[0]代表y轴初始值位置和move_direction[0]为y轴移动的方向
        pos[0]=x                            #将更新的x轴位置赋值给pos变量的x轴
        pos[1]=y                            #将更新的y轴位置赋值给pos变量的y轴
        return pos       		#返回更新后的坐标位置的函数参数
    return game         		#返回create(pos)的值为game函数名
game=create([10,1])   		 #设置坐标初始位置
print(game([1,0],2))   		 #打印移动后的位置

#装饰器的应用
import time
def count(mysums):
    mysum=0
    for mysum in range(mysums):
        mysum+=mysums

def count_time(func):    #用于传递调用的函数给装饰器函数
    def wrapper(*args,**kwargs):   #装饰器,用于包装调用的函数
        start_time=time.time()  #调用函数前
        func(*args,**kwargs)                  #调用函数
        end_time=time.time()    #执行完函数后的时间
        print(end_time-start_time)  #打印执行函数的时间
    return wrapper      #返回装饰器函数名称



f=count_time(count)     #将函数count_time(count)把count函数作为参数传递,同时把返回值wrapper(装饰器函数名称)赋值给变量f
f(10000000)      #这个相当于wrapper(1,2),也就是调用装饰器函数,同时把参数传递给被装饰的函数func作为参数使用

# @count_time     #使用装饰器,给下面的函数
#创建需要调用的函数
# def count(mysums):
#     mysum=0
#     for mysum in range(mysums):
#         mysum+=mysums

# count(1000000000)

@count_time     #这个是调用装饰器的语法,直接使用装饰器,下面写需要装饰的函数就可以了
def count(results):
    result=1
    for result in range(results):
        result*=2
    print(result)
count(1000000000)


#通过两个被装饰的函数可以知道,装饰器不需要做任何修改,就可以同时给两个功能不同的函数使用,这个装饰器的作用就是用来计算函数运行的时间,至于是什么函数它不关心,需要就只管调用就可以了,和不用装饰器实现的区别就是,多个函数如果要想使用类似计算运行时间这种功能,需要给每个函数进行条件,如果要把改变功能,需要给每个函数都做修改,而装饰器就不需要,直接对装饰器修改,所有的函数就都会根据改变的功能应用上,无论是使用功能还是修改功能上都极大的节省了时间和代码量