一、装饰器

  1. 装饰器本质是函数
  2. 为其他函数添加附加功能
  3. 不修改被修饰函数的源代码
  4. 不修改被修饰函数的调用方式
  • 装饰器示例
import timedef timmer(func):def wrapper(*args,**kwargs):start_time = time.time()res = func(*args,**kwargs)stop_time = time.time()print("函数的运行时间:%s" % (stop_time - start_time))return resreturn wrapper@timmer
def calc(l):s = 0for i in l:s += itime.sleep(0.1)return sprint(calc(range(20)))
  • 装饰器示例2
import timedef timmer(func):def wrapper():start_time = time.time()func()  #运行传进来的f函数stop_time = time.time()print("函数的运行时间是: %s" % (stop_time - start_time))return wrapper@timmer  #f = timmer(f)  #将f函数传给timmer
def f():time.sleep(3)print("f 函数运行完成。")f()  #执行wrapper()
  • 修饰带返回值的函数
import timedef timmer(func):def wrapper():start_time = time.time()res = func()  #运行传进来的f函数stop_time = time.time()print("函数的运行时间是: %s" % (stop_time - start_time))return res  #将f函数的返回值返回return wrapper@timmer  #f = timmer(f)  #将f函数传给timmer
def f():time.sleep(3)print("f 函数运行完成。")return "f函数的返回值"
  • 修饰带参数的函数
import timedef timmer(func):def wrapper(*args,**kwargs):start_time = time.time()res = func(*args,**kwargs)  #运行传进来的f函数stop_time = time.time()print("函数的运行时间是: %s" % (stop_time - start_time))return res  #将f函数的返回值返回return wrapper@timmer  #f = timmer(f)  #将f函数传给timmer
def f(name):time.sleep(1)print("f 函数运行完成。函数的参数是:%s" %name)return "f函数的返回值"res = f("dongfei")  #执行wrapper()
print(res)
  • 认证登录装饰器示例
def auth(func):def warpper(*args,**kwargs):username = input("your username: ")password = input("your password: ")if username == "dongfei" and password == "123":res = func(*args,**kwargs)return reselse:print("username or password error!")return warpperdef index():print("welcome to my index page.")@auth
def home(name):print("%s go home" %name)@auth
def shopping_car():print("your shopping_car")index()
home("dongfei")
shopping_car()
  • 模拟记录session
user_list = [{"username":"dongfei", "password":"123456"},{"username":"dongfei2", "password":"123456"},{"username":"dongfei3", "password":"123456"},{"username":"dongfei4", "password":"123456"},
]current_dic = {"username":None, "login_status":False}def auth(func):def warpper(*args,**kwargs):if current_dic["username"] and current_dic["login_status"]:res = func(*args, **kwargs)return resusername = input("your username: ")password = input("your password: ")for user_dic in user_list:if username == user_dic["username"] and password == user_dic["password"]:current_dic["username"] = usernamecurrent_dic["login_status"] = Trueres = func(*args,**kwargs)return reselse:print("username or password error!")return warpperdef index():print("welcome to my index page.")@auth
def home(name):print("%s go home" %name)@auth
def shopping_car():print("your shopping_car")index()
home("dongfei")
shopping_car()
  • 带参数的装饰器
user_list = [{"username":"dongfei", "password":"123456"},{"username":"dongfei2", "password":"123456"},{"username":"dongfei3", "password":"123456"},{"username":"dongfei4", "password":"123456"},
]current_dic = {"username":None, "login_status":False}def auth(auth_type):def auth_func(func):def warpper(*args,**kwargs):if auth_type == "file_db":if current_dic["username"] and current_dic["login_status"]:res = func(*args, **kwargs)return resusername = input("your username: ")password = input("your password: ")for user_dic in user_list:if username == user_dic["username"] and password == user_dic["password"]:current_dic["username"] = usernamecurrent_dic["login_status"] = Trueres = func(*args,**kwargs)return reselse:print("username or password error!")elif auth_type == "mysql_db":print("请使用%s认证:" %auth_type)else:print("无效的认证类型")return warpperreturn auth_func@auth("ldap")
def index():print("welcome to my index page.")@auth(auth_type="mysql_db")  # @auth(auth_type="mysql") 等于 @auth_func
def home(name):print("%s go home" %name)@auth(auth_type="file_db")
def shopping_car():print("your shopping_car")index()
home("dongfei")
shopping_car()

二、高阶函数

  1. 函数接受的参数是一个函数名
  2. 函数的返回值是一个函数名
  3. 满足以上条件的任意一个都是高阶函数
import timedef foo():print("from foo")time.sleep(2)def timmer(func):start_time = time.time()func()stop_time = time.time()print("函数的运行时间:%s" % (stop_time - start_time))return funcfoo = timmer(foo)
foo()

三、解压序列

>>> a,*_,c = [1,2,3,4,5,6,7,8]  #取第一个和最后一个值
>>> a
1
>>> c
8
>>> _
[2, 3, 4, 5, 6, 7]

转载于:https://www.cnblogs.com/L-dongf/p/10657651.html

190401装饰器-高阶函数-闭包相关推荐

  1. python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...

    一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰 ...

  2. python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...

    一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...

  3. python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...

    高阶函数 在Python中,函数其实也是一种数据类型. def test(): return 'hello world' print(type(test)) # 函数对应的数据类型是 function ...

  4. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  5. scala 高阶函数,闭包及柯里化

    概念 一个函数的参数或返回值还是函数,这个函数就是高阶函数 用法 参数为函数 scala> val arr=Array(1,2,3) arr: Array[Int] = Array(1, 2, ...

  6. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())

    #py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...

  7. 初学者python笔记(装饰器、高阶函数、闭包)

    一个函数被定义完成后,甚至程序发布后,后期可能需要添加某些功能,但是我们不可能每次都去修改原函数的代码,这时候装饰器就可以上场了,本篇文章将会用一个个可实现的代码,由浅入深.循序渐进得阐述装饰器的强大 ...

  8. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo():t ...

  9. 【JavaScript 笔记】— 函数高级(变量作用域、解构赋值、方法、高阶函数、闭包、箭头函数、generator)

    JavaScript个人笔记 变量作用域 变量提升 全局对象 windows 命名空间 局部作用域 常量 解构赋值 使用场景 方法 apply 装饰器 高阶函数(Array) map reduce m ...

最新文章

  1. Firefox 突然拉黑中国用户
  2. 终于可以摆脱 Pipenv 这坑货了
  3. 窗体 局部变量转换为全局_从嵌入式编程中感悟「栈」为何方神圣?
  4. 链表(Linked List)之单链表
  5. 那些读博的女生,怎样通过“九九八十一关”?
  6. 面试中,答不出产品方法论?4个方法教给你...
  7. java类与对象 演练 查找并修改姓名
  8. java实现c语言的函数_C语言tolower函数介绍、示例和实现
  9. 代码修改之后MSbuild编译不出最新的dll解决方法
  10. Mac之系统中各个文件夹详细介绍
  11. 爬取https://sc.chinaz.com/tupian/的图片
  12. python django企业固定资产管理系统pycharm项目源码lw
  13. electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)
  14. python使用pika库调用rabbitmq的交换机模式
  15. 杠杆炒股为什么会被强制平仓?
  16. 鼓励与信任让人变得更强大
  17. iOS搜索 讯飞语音的使用
  18. 【2094. 找出 3 位偶数】
  19. 使用 FFmpeg(bilibili视频m4s合成mp4)
  20. Qt setFocus无法生效问题

热门文章

  1. MySQL多实例学习笔记
  2. 组策略管理——软件限制策略(5)
  3. 如何在windows xp下使用ntfs权限控制
  4. Confluence 6 应该如何在我的空间中组织内容
  5. selenium WebDriverException: Message: unknown error: DevToolsActivePort file doesnt exist
  6. 励研(LY) CRC16算法
  7. Linux Socket编程的一些总结
  8. 多种数据DELPHI备份方式(源码)
  9. ASP.NET Ajax – History Support 續
  10. mouseOver/mouseOut 与 rollOver/rollOut的区别