day10-闭包函数、函数装饰器
一 什么是闭包?
闭包函数:
闭指的是:该函数是一个内部函数
包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用
二 闭包的意义与应用
内部函数包含对外部作用域而非全局作用域的引用提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路def counter():n=0def incr():nonlocal nx=nn+=1return xreturn incrc=counter()print(c())print(c())print(c())print(c.__closure__[0].cell_contents) #查看闭包的元素
闭包函数实例
1 import requests 2 3 def outter(url): 4 # url='https://www.baidu.com' 5 def get(): 6 response=requests.get(url) 7 if response.status_code == 200: 8 print(response.text) 9 return get 10 11 baidu=outter('https://www.baidu.com') 12 python=outter('https://www.python.org') 13 14 15 baidu() 16 baidu() 17 18 python() 19 python()
View Code
三、装饰器
(1)一 为何要用装饰器
开放封闭原则:对修改封闭,对扩展开放 软件的维护应该遵循开放封闭原则开放封闭原则指的是:软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的这就用到了装饰器装饰器的实现必须遵循两大原则:1、不修改被装饰对象的源代码2、不修改被装饰对象的调用方式装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能
(2) 什么是装饰器
装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
(3)装饰器的使用
(1)无参装饰器
1 import time 2 def timmer(func): 3 def wrapper(*args,**kwargs): 4 start_time=time.time() 5 res=func(*args,**kwargs) 6 stop_time=time.time() 7 print('run time is %s' %(stop_time-start_time)) 8 return res 9 return wrapper 10 11 @timmer 12 def foo(): 13 time.sleep(3) 14 print('from foo') 15 foo()
View Code
(2) 有参装饰器
1 def auth(driver='file'): 2 def auth2(func): 3 def wrapper(*args,**kwargs): 4 name=input("user: ") 5 pwd=input("pwd: ") 6 7 if driver == 'file': 8 if name == 'isetan' and pwd == '123': 9 print('login successful') 10 res=func(*args,**kwargs) 11 return res 12 elif driver == 'ldap': 13 print('ldap') 14 return wrapper 15 return auth2 16 17 @auth(driver='file') 18 def foo(name): 19 print(name) 20 21 foo(’isetan')
View Code
(4)装饰器语法
被装饰函数的正上方,单独一行@deco1@deco2@deco3def foo():passfoo=deco1(deco2(deco3(foo)))
(5)装饰器补充
from functools import wrapsdef deco(func):@wraps(func) #加在最内层函数正上方def wrapper(*args,**kwargs):return func(*args,**kwargs)return wrapper@deco
def index():'''哈哈哈哈'''print('from index')print(index.__doc__)
实例
1 import time 2 def tran(test): 3 def f1(): 4 start = time.time() 5 test() 6 stop = time.time() 7 print('程序运行时间为: %s'%(stop-start)) 8 return f1 9 10 @ tran 11 def index(): 12 time.sleep(2) 13 print('来自底层的仰望!!!!!!!!!!!!') 14 15 index()
View Code
转载于:https://www.cnblogs.com/wcl0517/p/9168839.html
day10-闭包函数、函数装饰器相关推荐
- 名称空间与作用域、闭包函数、 装饰器
1 名称空间与作用域 2 闭包函数 3 装饰器 6.7 名称空间与作用域 内置名称空间: 存放的是:内置的名字与值的绑定关系 生效:python解释器启动 失效:Python解释器关闭 全局名称空 ...
- python中msg函数_Python 中闭包函数和装饰器
一.闭包函数的概述 闭包 closure, 是一种代码的组织结构.当一个内嵌函数引用其外部作用域的变量,就形成一个闭包函数.闭包函数有一个内嵌函数,内嵌函数引用外部函数中的变量,外部函数的返回值是内嵌 ...
- day、11闭包函数和装饰器
今日内容 2019-07-13 闭包函数 装饰器 一.闭包函数 1.什么叫闭包函数 所谓的闭包函数就是定义在函数内部的函数,且只引用外部函数作用域的变量. def outter(x, y):def m ...
- python之函数三装饰器
装饰器形成的过程 装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能 原则:开发封闭原则 开发:对扩展是开发的 封闭:对修改是封闭的 装饰器的固定模式 计算运行时间 1 import ...
- Python自学记录——返回函数、匿名函数、装饰器与偏函数
国庆节快乐~~虽说今天是假期的最后一天.. 好久没学习Python了..值得高兴的是 <怪物猎人:世界>目前所有的龙我(统枪)都打过一遍了 (/得意). 正题,开始学习.记录: 返回函数 ...
- day4 匿名函数、装饰器、生成器、迭代器、内置函数、 json 与 pickle 模块
文章目录 1.列表生成式 2.匿名函数 3.装饰器 4.生成器 5.迭代器 6.内置函数 7.json & pickle 序列化与反序列化 1.列表生成式 可通过特定语句便捷生成列表 list ...
- python装饰器函数-python 装饰器 函数被装饰+函数执行
""" func1.py 文件 1.执行到@w1 2.被装饰函数作为装饰器参数 w1(func=f1()) 3.w1 函数执行有返回值,得用变量接收,变量名为f1 合适 ...
- python中高阶函数和装饰器_三.Python高阶函数和装饰器
1高阶函数 1.1 数学概念回顾下数学知识: y=f(x) 这是最开始接触的普通函数 y=g(f(x)) 这个就是我们接触到的高阶函数 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数: ...
- Python基础之函数与装饰器
阅读目录 一.为什么要使用函数 二.函数的定义与调用 三.函数返回值 四.函数的参数 五.本章小结 六.装饰器 一.函数流程图: 函数名的命名规则: 1.函数名必须由字母下划线数字组成,不能是关键字和 ...
- python find函数_Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之 ...
最新文章
- 小学一年级计算机社团计划,一年级社团活动计划.doc
- springcloud1.5.9+zipkin链路跟踪配置
- 『数据库』 E-R图(实体联系图)你都不会,你设计什么数据库?
- gin context和官方context_Go Web 小技巧(一)简化Gin接口代码
- Flutter MaterialButton组件详细概述
- 【有容云案例系列】基于Jenkins和Kubernetes的CI工作流
- java 无符号整数_如何在java 8中使用无符号整数?
- JS:ES6-10 class类
- 23种设计模式(二十)数据结构之迭代器
- 《算法图解》第五章 散列表 课后作业
- MSSQL 构建函数提取指定的字符
- android studio 中禁用一个插件功能
- 正运动技术快速入门 | 篇十六:正运动控制器EtherCAT总线快速入门
- 他一生只做一件事,专注150万农场鸡的鸡蛋销售
- C++蜜蜂的爬行路线
- 设置夜神模拟器自动连接功能
- 港科科研 | 香港科大成立亚洲首个跨国人工智能芯片设计研发联盟
- inet_addr函数
- 杭电oj(Java版)——1713 相遇周期
- OpenCore机型设置(三码设置)备份转移