博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day20 Python 高阶函数,函数,嵌套,闭包 装饰器
阅读量:5890 次
发布时间:2019-06-19

本文共 7003 字,大约阅读时间需要 23 分钟。

高阶函数定义

1.函数接收的参数是一个函数名

2.函数的返回值是一个函数名

3.满足上述条件任意一个都可以称之为高阶函数

一、函数的接收参数是一个函数名

import timedef foo():    time.sleep(3)    print('name is charon')def test(func):    #print(func)    start_time=time.time()    func()    stop_time=time.time()    print('run time %s' %(stop_time-start_time))#foo()test(foo)结果:name is charonrun time 3.0033559799194336

 二、函数的返回参数是一个函数名,实现不了这个功能

import timedef 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()将timmer函数赋值给foo函数,上面return给timmer函数#没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能def timer(func):    start_time=time.time()    return func    stop_time = time.time()    print('函数运行时间是  %s' % (stop_time-start_time))foo=timer(foo)foo()

 函数嵌套定义

在def里面又定义了一个def,函数里面定义了一个函数

def father(name):    print('from father %s' %name)    def son():        name='linhaifeng_1'        print('我的爸爸是%s' %name)        def grandson():            name='linhaifeng_2'            print('我的爷爷是%s' %name)        grandson()    # print(locals())    son()# father('linhaifeng')father('linhaifeng')如果:我的爸爸是linhaifeng_1我的爷爷是linhaifeng_2

闭包定义

一层一层的

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

 装饰器=高阶函数+函数嵌套+闭包

1.不修改原函数的源代码

2.不修改函数的调用方式

import timedef timmer(func):#func=test    def wrapper():        start_time=time.time()        #print(func)        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=timmer(test)test()# res=timmer(test)  #返回的是wrapper的地址# res()  #执行的是wrapper()# test=timmer(test)  #返回的是wrapper的地址# test()  #执行的是wrapper()#  @timmer  就相当于 test=timmer(test)

 加上返回值

import timedef 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()  #就是在运行wrapperprint(res)结果:test函数运行完毕运行时间是3.001859188079834这是test的返回值

 加上参数

import timedef timmer(func): #func=test1    def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}  *args,**kwargs:接收任意可变长参数,        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的返回值'@timmerdef test1(name,age,gender):    time.sleep(1)    print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))    return '这是test的返回值'# res=test('linhaifeng',age=18)  #就是在运行wrapper# # print(res)# test1('alex',18,'male')test('charon',19)test1('alex',18,'male')结果:test函数运行完毕,名字是【charon】 年龄是【19】运行时间是3.003596305847168test1函数运行完毕,名字是【alex】 年龄是【18】 性别【male】运行时间是1.0006954669952393加上*,**让怎么来怎么出去# 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')

 闭包补充解压序列

l = [10,3,2,3,3,5,31,4]a,b,c,d,e,f,g,h=lprint(a)a,*_,c=lprint(a)print(c)a,b,*_,c,d = lprint(a,b,c,d)结果:1010410 3 31 4

 换值

a=1b=2x=aa=bb=xprint(a,b)结果:2 1f1 = 1f2 = 2f1,f2 = f2,f1print(f1,f2)结果:2 1

 闭包函数为函数加上认证功能

user_list=[    {'name':'alex','passwd':'123'},    {'name':'linhaifeng','passwd':'123'},    {'name':'wupeiqi','passwd':'123'},    {'name':'yuanhao','passwd':'123'},    {'name':'charon','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('username is:').strip()        password = input('password is:').strip()        for usr_dic in user_list:            if username == usr_dic['name'] and password == usr_dic['passwd']:                current_dic['username'] = username                current_dic['login'] = True                res = func(*args,**kwargs)                return res        else:            print('username or password error')    return wrapper@auth_funcdef index():    print('欢迎来到京东主页')@auth_funcdef home(name):    print('欢迎回家%s' % name)@auth_funcdef shopping_car(name):    print('%s的购物车里有[%s,%s,%s]' % (name, '奶茶', '妹妹', '娃娃'))print('before-->',current_dic)index()print('after--->',current_dic)home('产品经理')结果:before--> {'username': None, 'login': False}username is:charonpassword is:123欢迎来到京东主页after---> {'username': 'charon', 'login': True}欢迎回家产品经理

 闭包函数为装饰函数加上参数

user_list=[    {'name':'alex','passwd':'123'},    {'name':'linhaifeng','passwd':'123'},    {'name':'wupeiqi','passwd':'123'},    {'name':'yuanhao','passwd':'123'},]current_dic={'username':None,'login':False}def auth(auth_type='filedb'):    def auth_func(func):        def wrapper(*args,**kwargs):            print('认证类型是',auth_type)            if auth_type == 'filedb':                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('用户名或者密码错误')            elif auth_type == 'ldap':                print('鬼才特么会玩')                res = func(*args, **kwargs)                return res            else:                print('鬼才知道你用的什么认证方式')                res = func(*args, **kwargs)                return res        return wrapper    return auth_func@auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)def index():    print('欢迎来到京东主页')@auth(auth_type='ldap')def home(name):    print('欢迎回家%s' %name)#@auth(auth_type='sssssss')def shopping_car(name):    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))# print('before-->',current_dic)# index()# print('after--->',current_dic)# home('产品经理')shopping_car('产品经理')

 

转载于:https://www.cnblogs.com/charon2/p/10391148.html

你可能感兴趣的文章
jQuery EasyUI API 中文文档 - 组合(Combo)
查看>>
10个关于 Dropbox 的另类功用(知乎问答精编)[还是转来了]
查看>>
Oracle体系结构
查看>>
用Modelsim仿真QII FFT IP核的时候出现的Error: Illegal target for defparam
查看>>
javascript Error对象详解
查看>>
nc 局域网聊天+文件传输(netcat)
查看>>
C++它 typedef void *HANDLE
查看>>
Git常用命令
查看>>
Linux下查看MySQL的安装路径
查看>>
C#获取磁盘列表与信息
查看>>
mysql学习笔记4---mysql 复制---源代码
查看>>
Linux设备驱动之semaphore机制【转】
查看>>
每天一个linux命令(25):linux文件属性详解
查看>>
【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
查看>>
HDU 3280 Equal Sum Partitions(二分查找)
查看>>
第一个之出现一次的字符
查看>>
go微服务框架go-micro深度学习(三) Registry服务的注册和发现
查看>>
expectFAQ(附一个python批量任务脚本)--持续更新
查看>>
HDU 2492 Ping pong
查看>>
JPA的Embeddable注解
查看>>