猪脑过载,函数装饰器

闭包函数简介

1.闭包函数必须是在函数内再嵌套一个函数并且内函数必须使用外函数的函数名的函数被称作闭包函数.

def func(name):  # 首先创造一个函数并建一个参数
    # name = 'joseph'
    def index():  # 在函数中嵌套一个我们真正需要调用的额函数
        print(name)  # 我们想要在内函数中调用外函数的参数
    return index  # 返回值打印内函数

res = func('joseph')  # 返回的结果就是内函数
print(res)  # 打印一下func()现在对应的是什么
res()  # 调用上方函数
"""
<function func.<locals>.index at 0x000001F27B70A4C0>
joseph
"""

闭包函数的实际应用

装饰器简介

1.装饰器的本质其实就是在不改变其原有调用方法和内部代码的情况下给这个函数增加功能
2.最初计算机操作系统是32位,⽽时间也是⽤32位表⽰。
System.out.println(Integer.MAX_VALUE);
2147483647
Integer在JAVA内⽤32位表⽰,因此32位能表⽰的最⼤值是2147483647。
另外1年365天的总秒数是31536000,
2147483647/31536000 = 68.1
也就是说32位能表⽰的最长时间是68年,⽽实际上到2038年01⽉19⽇03时14分07秒,便会到达最⼤时间,过了这个时间
点,所有32位操作
系统时间便会变为
10000000 00000000 00000000 00000000
也就是1901年12⽉13⽇20时45分52秒,这样便会出现时间回归的现象,很多软件便会运⾏异常了。
到这⾥,我想问题的答案已经出来了:
因为⽤32位来表⽰时间的最⼤间隔是68年,⽽最早出现的UNIX操作系统考虑到计算机产⽣的年代和应⽤的时限综合取了
1970年1⽉1⽇作为
UNIX TIME的纪元时间(开始时间),⽽java⾃然也遵循了这⼀约束。
⾄于时间回归的现象相信随着64为操作系统的产⽣逐渐得到解决,因为⽤64位操作系统可以表⽰到292,277,026,596年
12⽉4⽇15时30分08秒,相信我们的N代⼦孙,哪怕地球毁灭那天都不⽤愁不够⽤了,因为这个时间已经是千亿年以后了。
3.
import time
print(time.time())  # 1657005758.141524  距离纪元开始时间已经过了这么多秒
start_time =time.time()  # 首先我们先将这个程序开始的时间做一个标记
for i in range(10000):  # 设置一个循环次数
    print(i)  # 将循环一次打印
end_time = time.time()  # 设置一个循环结束时间,每次运行的速度都是不一样的根据你系统的卡顿情况定
print('for循环中循环一共花了多长时间:%s'% (end_time - start_time))  # 打印循环结束减去循环开始的时
间就是我们程序一共运行了多久
"""
for循环中循环一共花了多长时间:0.05267834663391113
"""
start_time =time.time()
time.sleep(3)
"""可以让程序先行停下来休息一小会儿再开始运行接下来的代码"""
print('joseph')
end_time = time.time()
print('for循环中循环一共花了多长时间:%s'% (end_time - start_time))
"""
joseph
for循环中循环一共花了多长时间:3.0020039081573486
"""

装饰器前戏

1.
import time  # 首先调用时间模块
def outer():  # 创造一个函数
    time.sleep(2)  # 睡眠时间为2秒
    print('joseph')  # 睡眠时间结束后打印joseph
start_time = time.time()  # 开始一个计数
outer()  # 调用outer开始运行,因为上方设置会停两秒所以两秒之后才会开始运行这个程序
end_time = time.time()  # 计算停止时间
print(end_time - start_time)  # 计算这程序从开始到运行结束一共花了多久
"""
joseph
2.011749267578125
当我们遇到多个类似条件时那么就会显得臃肿每个还是都需要写额外的
"""
2.
import time  # 首先调用时间模块
def again_outer():  # 创造一个函数
    time.sleep(5)  # 睡眠时间为5秒
    print('Joseph')  # 打印约瑟夫富歇
    start_time = time.time()  # 开始一个计数
    again_outer()  # 调用outer开始运行,因为上方设置会停两秒所以两秒之后才会开始运行这个程序
    end_time = time.time()  # 计算停止时间
    print(end_time - start_time)  # 计算这程序从开始到运行结束一共花了多久
"""
Joseph
5.009907007217407
"""
3.
import time  # 首先调用时间模块
def outer():  # 创造一个函数
    time.sleep(2)  # 睡眠时间为2秒
    print('joseph')  # 睡眠时间结束后打印joseph
def home():  # 创建一个新的函数
    time.sleep(4)  # 设定睡眠时间为4秒
    print('lili')  # 睡眠结束后打印莉莉
def get_time(x, *args,**kwargs):  
    start_time = time.time()
    x(*args,**kwargs)
    end_time = time.time()
    print(end_time - start_time)
get_time(outer)
get_time(home)
"""
lili
4.0153868198394775
"""

装饰器推导

import time

def outer(xxx):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = xxx(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)  
        return res
    return get_time()


def home():
    time.sleep(3)
    print('from home')
    return '打印的是home函数中的值'


def func(name):
    time.sleep(1)
    print('from func')
    return'打印来自func函数中的值'

装饰器最终版

from functools import wraps
def outer(func_name):
    @wraps(func_name)  # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
    def inner(*args, **kwargs):
        print('执行被装饰对象之前可以做的额外操作')
        res = func_name(*args, **kwargs)
        print('执行被装饰对象之后可以做的额外操作')
        return res
    return inner


import time


def home():
    time.sleep(1)
    print('from home')
    return 'home返回值'

home = outer(home)
res = home()
print(res)

"""

执行被装饰对象之后可以做的额外操作
home返回值
"""

装饰器语法糖

@outer  #  home = outer(真正的函数名home)
def home():
    '''我是home函数 我要热死了!!!'''
    time.sleep(1)
    print('from home')
    return 'home返回值'

help(home)
print(home)
home()

"""
home()
    我是home函数 我要热死了!!!

<function home at 0x000001D9F0F27820>
执行被装饰对象之前可以做的额外操作
from home
执行被装饰对象之后可以做的额外操作
"""
posted @ 2022-07-05 19:46  Joseph-bright  阅读(24)  评论(0编辑  收藏  举报