首页 > 其他分享 >28:函数闭包与装饰器

28:函数闭包与装饰器

时间:2024-08-28 17:27:58浏览次数:9  
标签:闭包 res 28 test func time print 装饰 def

l=[1,3]
l.__iter__() #迭代器
# 装饰器:本质就是函数,功能是为其他函数添加附加功能
# 原则:
# 1.不修改被修饰函数的源代码
# 2.不修改被修饰函数的调用方式
# 装饰器的知识储备
# 装饰器=高阶函数+函数嵌套+闭包
#a
def cal(l):
    res=0
    for i in l:
        res+=i
    return res
print (cal (range(100)))

  

#b
import time
def cal(l):
    start_time=time.time ()
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    stop_time = time.time ()
    print('函数的运行时间是%s'%(stop_time-start_time))
    return res
print(cal (range(100)))

  

#c
import time

def timmer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        stop_time = time.time()
        print('函数运行时间是%.2f秒' % (stop_time - start_time))
        return res
    return wrapper

@timmer
def cal(l):
    res = 0
    for i in l:
        time.sleep(0.1)
        res += i
    return res

res = cal(range(20))
print(res)

  



# 高阶函数
# 高阶函数定义:
# 1.函数接收的参数是一个函数名
# 2.函数的返回值是一个函数名
# 3.满足上述条件任意一个,都可称之为高阶函数
# 高阶函数示范
# 1把函数当做参数传给高阶函数
def foo():
    print('你好啊诸葛孔明')

def test(func):
    print(func)
    func()

test(foo)

  

# 2把函数当做参数传给高阶函数
import time
def foo():
    time.sleep(3)
    print('你好啊诸葛孔明')

def test(func):
    print(func)
    start_time=time.time()
    func()
    stop_time = time.time()
    print('函数运行时间是  %s' % (stop_time-start_time))
foo()
test(foo)

# 函数返回值是函数名
def foo():
    print('from the foo')
def test(func):
    return func

res=test(foo)
print(res)
res()

foo=test(foo)
print(res)
foo()

  

#2
import time
def foo():
    time.sleep(3)
    print('来自foo')

#不修改foo源代码
#不修改foo调用方式


#多运行了一次,不合格

def timer(func):
    start_time=time.time()
    func()
    stop_time = time.time()
    print('函数运行时间是  %s' % (stop_time-start_time))
    return func
foo=timer(foo)
foo()

  

# 高阶函数总结
# 1.函数接收的参数是一个函数名
# 作用:在不修改函数源代码的前提下,为函数添加新功能
# 不足:会改变函数的调用方式
# 2.函数的返回值是一个函数名
# 作用:不修改函数的调用方式
# 不足:不能添加新功能

import time  # 导入time模块


def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()  # 记录开始时间
        result = func(*args, **kwargs)  # 调用原函数
        stop_time = time.time()  # 记录结束时间
        print('函数运行时间是  %s 秒' % (stop_time - start_time))
        return result  # 返回原函数的返回值

    return wrapper  # 返回新的函数


# 假设有一个函数 foo
def foo():
    time.sleep(1)  # 模拟函数执行时间


# 使用装饰器
foo = timer(foo)

# 调用被装饰的函数
foo()

  



#函数嵌套作用域
# def bar():
#     print('from bar')
#
# def foo():
#     print('from foo')
#     def test():
#         pass

def father(auth_type):
    # print('from father %s' %name)
    def son():
        # name='zhugekongming_1'
        # print('我的爸爸是%s' %name)
        def grandson():
            print('我的爷爷是%s' %auth_type)
        grandson()
    # print(locals())
    son()
# father('zhugekongming')
father('filedb')

  



#装饰器的架子
def timmer(func):
    def wrapper ():
        print(func)
        func ()
    return wrapper

#装饰器实现
import time
def timmer(func): #func=test
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在运行test()
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
    return wrapper

@timmer #test=timmer(test)
def test():
    time.sleep(3)
    print('test函数运行完毕')
test()

# res=timmer(test)  #返回的是wrapper的地址
# res()  #执行的是wrapper()

# test=timmer(test)  #返回的是wrapper的地址
# test()  #执行的是wrapper()

#  @timmer  就相当于 test=timmer(test)

  



#加上返回值
import time
def timmer(func): #func=test
    def wrapper():
        start_time=time.time()
        res=func() #就是在运行test()
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper

@timmer #test=timmer(test)
def test():
    time.sleep(3)
    print('test函数运行完毕')
    return '这是test的返回值'

res=test()  #就是在运行wrapper
print(res)

  



#加上参数
import time
def timmer(func): #func=test1
    def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}
        start_time=time.time()
        res=func(*args,**kwargs) #就是在运行test()         func(*('linhaifeng'),**{'age':18})
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper

# @timmer #test=timmer(test)
def test(name,age):
    time.sleep(3)
    print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
    return '这是test的返回值'

@timmer
def test1(name,age,gender):
    time.sleep(1)
    print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
    return '这是test的返回值'

# res=test('zhugekongming',age=18)  #就是在运行wrapper
# # print(res)
# test1('alex',18,'male')

test1('alex',18,'male')


# def test2(name,age,gender): #test2(*('alex',18,'male','x','y'),**{})
#     #name,age,gender=('alex',18,'male','x','y')
#     print(name)
#     print(age)
#     print(gender)
#
# def test1(*args,**kwargs):
#     test2(*args,**kwargs)  #args=('alex',18,'male','x','y') kwargs={}
#
# # test2('alex',18,gender='male')
#
# test1('alex',18,'male')

  

#验证功能装饰器:
user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'zhugeliang','passwd':'123'},
    {'name':'zhaoyun','passwd':'123'},
    {'name':'guanyu','passwd':'123'},
]
current_dic={'username':None,'login':False}


def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic['username'] and current_dic['login']:
            res = func(*args, **kwargs)
            return res
        username=input('用户名:').strip()
        passwd=input('密码:').strip()
        for user_dic in user_list:
            if username == user_dic['name'] and passwd == user_dic['passwd']:
                current_dic['username']=username
                current_dic['login']=True
                res = func(*args, **kwargs)
                return res
        else:
            print('用户名或者密码错误')

    return wrapper

@auth_func
def index():
    print('欢迎来到京东主页')

@auth_func
def home(name):
    print('欢迎回家%s' %name)

@auth_func
def shopping_car(name):
    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))

print('before-->',current_dic)
index()
print('after--->',current_dic)
home('产品经理')
# shopping_car('产品经理')

  

标签:闭包,res,28,test,func,time,print,装饰,def
From: https://www.cnblogs.com/liu-zhijun/p/18385182

相关文章

  • 序列化;RPC 【2024年8月28日随笔】
    序列化什么是序列化序列化:把对象转化为可传输的字节序列过程称为序列化反序列化:把字节序列还原为对象的过程称为反序列化为什么序列化序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机......
  • 2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount
    2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,val)可以返回数组arr中大于val的元素数量。按照以下规则进行n次操作,将nums中的元素分配到两个数组arr1和arr2中:1.第一次操作将nums[1]加入arr1。2.第二次操作将nums[2]加入arr2。3.对......
  • 洛谷 P3128 [USACO15DEC] Max Flow P
    洛谷P3128[USACO15DEC]MaxFlowP题意给定一棵\(n\)个点的树,给定\(k\)个点对\((u,v)\),把\(u\)到\(v\)路径上所有点的点权加一,最后求最大点权。思路树上差分模版。维护\(a_i\)表示每个点到根的加法标记。对于每个点对\((u,v)\),把\(a_u\),\(a_v\)加一,\(a_{LCA......
  • 8.28 模拟赛
    比赛复盘浏览所有题后发现所有题都是普及难度。A。数据范围这么小,暴力DP就行。不对\(10^{40}\)的答案……要高精度!!尝试了vector写高精乘发现异常简单。B。一年前我就能不看题解独立切。很快写完了。我清晰地记着分数加分数时分子分母要开__int128。C。又是小\({\Omega......
  • 南沙找信奥家教老师:2028:【例4.14】百钱买百鸡
    ​【题目描述】百钱买百鸡问题。鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?【输入】无【输出】输出各种鸡翁、鸡母、鸡雏的数量,依次由小到大,每种情况各占一行,每行三个数之间用一个空格隔开。【输入样例】无【输出样例】无#inclu......
  • 28-目标检测
    importtorchimportmatplotlib.pyplotaspltfromsympy.physics.control.control_plotsimportmatplotlibfromd2limporttorchasd2l#plt.figure(figsize=(3.5,2.5))img=d2l.plt.imread('./image/catdog.jpg')#plt.imshow(img)#plt.show()de......
  • limu|P28|Batch Normalization批量规范化
    目录为什么需要批量规范化困难原因需求如何实现批量规范化公式使用部位为什么卷积层的通道维相当于全连接层的特征维?补充:为什么1*1卷积层相当于逐像素全连接层?深入思考BN的作用代码实现Q&ABatchNorm和LayerNorm的解释与对比为什么需要批量规范化困难训练深层神经网络并使其在较......
  • 国标GB28181视频监控EasyCVR视频汇聚平台国标注册被陌生IP入侵如何处理?
    GB28181国标/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存......
  • 283:vue+openlayers 4326和3857坐标系下的分辨率区别
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第283个示例文章目录一......
  • 基于springboot停车场管理系统的设计与实现-附源码191428
    目 录摘要1绪论1.1选题目的与意义1.2国内外研究现状1.3系统开发技术的特色1.4论文结构与章节安排2 停车场管理系统 系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.3.2数据修改流程2.3.3数据删除流程2.3系统功能分析2.3.1功......