Python基础(7)闭包函数、装饰器
一、闭包函数
- #最简单的无参闭包函数
- def func1()
- name='ares'
- def func2()
- print(name)
- #有参和返回值的闭包函数
- def timmer(func):
- def wrapper(*args,**kwargs):
- start_time = time.time()
- res=func(*args,**kwargs)
- stop_time=time.time()
- print('run time is %s' %(stop_time-start_time))
- return res
- return wrapper
二、高阶函数
- #高阶函数应用1:把函数当做参数传给高阶函数
- import time
- def foo():
- print('from the foo')
- def timmer(func):
- start_time=time.time()
- func()
- stop_time=time.time()
- print('函数%s 运行时间是%s' %(func,stop_time-start_time))
- timmer(foo)
- #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
- #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
- import time
- def foo():
- print('from the foo')
- def timmer(func):
- start_time=time.time()
- return func
- stop_time=time.time()
- print('函数%s 运行时间是%s' %(func,stop_time-start_time))
- foo=timmer(foo)
- foo()
- #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
- #函数的嵌套定义
- def f1():
- def f2():
- def f3():
- print('from f3')
- print('from f2')
- f3()
- print('from f1')
- f2()
- # print(f1)
- f1()
- '''
- from f1
- from f2
- from f3
- '''
四、装饰器
- #这就是一个实现一个装饰器最基本的架子
- def timer(func):
- def wrapper():
- func()
- return wrapper
例:
- def deco(fn):
- def wapper():
- fn()
- return wapper
- @deco
- def foo():
- print('what are you 弄啥嘞')
- foo()
统计一个函数运行时间的装饰器
- import time
import random
#装饰器
def timmer(func):
# func=index
def wrapper():
start_time = time.time()
func() #index()
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#被装饰函数
def index():
time.sleep(random.randrange(1,5))
print('welecome to index page')- def home():
time.sleep(random.randrange(1,3))
print('welecome to HOME page')- index=timmer(index) #index=wrapper
home=timmer(home)- index() #wrapper()
home()
装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=timmer(index)
- import time
- import random
- #装饰器
- def timmer(func):
- def wrapper():
- start_time = time.time()
- func()
- stop_time=time.time()
- print('run time is %s' %(stop_time-start_time))
- return wrapper
- #被装饰函数
- @timmer #index=timmer(index)
- def index():
- time.sleep(random.randrange(1,5))
- print('welecome to index page')
- # @timmer #home=timmer(home)
- # def home():
- # time.sleep(random.randrange(1,3))
- # print('welecome to HOME page')
- index() #wrapper()
- # home()
加多个装饰器:
- #加多个装饰器
- import time
- import random
- #装饰器
- def timmer(func):
- def wrapper():
- start_time = time.time()
- func()
- stop_time=time.time()
- print('run time is %s' %(stop_time-start_time))
- return wrapper
- def auth(func):
- def deco():
- name=input('name: ')
- password=input('password: ')
- if name == 'egon' and password == '':
- print('login successful')
- func() #wrapper()
- else:
- print('login err')
- return deco
- #被装饰函数 #多个装饰函数,从上往下添加,调用时从下往上
- @auth #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco
- @timmer #index=timmer(index) #index=wrapper
- def index():
- # time.sleep(random.randrange(1,5))
- time.sleep(3)
- print('welecome to index page')
- def home():
- time.sleep(random.randrange(1,3))
- print('welecome to HOME page')
- # index() #deco()
- # home()
装饰器修订:
- #装饰器修订
- import time
- import random
- #装饰器
- def timmer(func):
- def wrapper(*args,**kwargs):
- start_time = time.time()
- res=func(*args,**kwargs) #接收参数
- stop_time=time.time()
- print('run time is %s' %(stop_time-start_time))
- return res #增加返回值
- return wrapper
- #被装饰函数
- @timmer
- def index():
- time.sleep(random.randrange(1,5))
- print('welecome to index page')
- @timmer
- def home(name):
- time.sleep(random.randrange(1,3))
- print('welecome to %s HOME page' %name)
- return 123123123123123123123123123123123123123123
- index()
- res1=index()
- print('index return %s' %res1)
- res2=home('egon') #wraper()
- print('home return %s' %res2)
扩展:
- """
- python内置装饰器
- 在python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod、property.
- @staticmethod 是类的静态方法,其跟成员方法的区别是没有self参数,并且可以在类不进行实例化的情况下调用
- @classmethod 与成员方法的区别在于所接收的第一个参数不是self(类实例的指针),而是cls(当前类的具体类型)
- @property 是属性的意思,表示可以通过类实例直接访问的信息
- """
- class Foo(object):
- def __init__(self,var):
- super(Foo,self).__init__()
- self._var=var
- @property
- def var(self):
- return self._var
- @var.setter
- def var(self,var):
- self._var=var
- f=Foo('var1')
- print(f.var)
- f.var='var2'
- print(f.var)
- """
- 注意,对于Python新式类(new-style class),如果将上面的 “@var.setter” 装饰器所装饰的成员函数去掉,
- 则Foo.var 属性为只读属性,使用 “foo.var = ‘var 2′” 进行赋值时会抛出异常。
- 但是,对于Python classic class,所声明的属性不是 read-only的,所以即使去掉”@var.setter”装饰器也不会报错。
- """
Python基础(7)闭包函数、装饰器的更多相关文章
- python基础16_闭包_装饰器
不了解是否其他语言也有类似 python 装饰器这样的东西. 最近才发现ECMAScript6也是有生成器函数的,也有 yield generator 装饰器的基础知识是闭包: # 闭包:嵌套函数, ...
- Python基础(七) 闭包与装饰器
闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...
- Python基础编程闭包与装饰器
闭包的定义 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 闭包格式: def func(): lst=[] def inner(a): lst.append(a ...
- Python基础(闭包函数、装饰器、模块和包)
闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()
- 十一. Python基础(11)—补充: 作用域 & 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- python学习日记(函数--装饰器)
楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...
- 21.python中的闭包和装饰器
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...
- python基础整理4——面向对象装饰器惰性器及高级模块
面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...
- python中的闭包和装饰器
重新学习完了函数,是时候将其中的一些重点重新捋一捋了,本次总结的东西只有闭包和装饰器 1.闭包 闭包是python函数中的一个比较重要功能,一般闭包都是用在装饰器上,一般学完闭包就会去学习装饰器,这俩 ...
随机推荐
- sshd 防止暴力破解
- stm32--USB(作为U盘)+FatFs的实现
一.USB功能的添加(作为U盘) 添加文件 将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹: usb class为硬件相关(Library\Class): usb dri ...
- linux里面的fork函数创建一个新进程
由fork创建的新进程成为子进程,fork函数被调用一次,但是返回两次,
- 指纹识别人脸识别 iOS
//1.判断iOS8及以后的版本 if([UIDevice currentDevice].systemVersion.doubleValue >= 8.0){ //从iPhone5S开始,出现指 ...
- python接口自动化: CAS系统验证,自动完成登录并获取token,遇到302请求重定向设置(requests模块 allow_redirects=False)即可
import requestsimport re import requests import re class Crm_token(object): try: username=int(input( ...
- 生产者与消费者-N:1-基于list
多个生产者/一个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...
- ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息
在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...
- Python之tornado框架实现翻页功能
1.结果如图所示,这里将html页面与网站的请求处理放在不同地方了 start.py代码 import tornado.ioloop import tornado.web from controlle ...
- Delphi中取得程序版本号
Delphi做的程序,如果想包含版本信息, 必须在Delphi的集成编辑环境的菜单“Project/Options/Version Info”里面添加版本信息.即在Version Info 选项卡中选 ...
- 开发一个delphi写的桌面图标管理代码
参加工作了就很少有时间去玩delphi了,这个适合初学者看看,大神勿喷 工具 delhpi7.0 access数据库 原则win下有安装office就可用 当初不太熟悉sqlite所有没用这做数据库. ...