python装饰器

python装饰器

霸气de小男生 提交于 2020-01-25 05:29:37
1 写在前面 python中使用@放在函数上方便定义一个装饰器,很多朋友觉得使用装饰器太魔幻,始终不知道怎么灵活使用。 要想做到灵活使用,得首先明白它的本质。今天,我试着用最通俗的语言,几行代码和小例子来解释装饰器的本质。 2 小例子 这是一个装饰器: def call_print ( f ) : def g ( ) : print ( 'you\'re calling %s function' % ( f . __name__ , ) ) return g 使用call_print装饰器: @call_print def myfun ( ) : pass @call_print def myfun2 ( ) : pass myfun ( ) 后返回: In [ 27 ] : myfun ( ) you're calling myfun function In [ 28 ] : myfun2 ( ) you're calling myfun2 function 3 使用call_print 你看,@call_print放置在任何一个新定义的函数上面,都会默认输出一行,你正在调用这个函数的名。 这是为什么呢?注意观察新定义的call_print函数 ( 加上@后便是装饰器 ) : def call_print ( f ) : def g ( ) : print ( 'you\'re

关于Python中闭包和装饰器

北城以北 提交于 2020-01-25 05:12:02
装饰器 1.作为Python面试中必问到的关键点—装饰器,程序开发中用的好,开发如虎添翼; 主要运用在 不能对被修饰的函数源代码进行修改, 和调用方式进行更改的情况下, 为函数添加其他功能; 2装饰器本质:使用“@函数装饰器名称”修饰原函数,等同于创建与原函数名称相同的变量,关联内嵌函数;故调用原函数时执行内嵌函数。 3.装饰器主要的作用如下: 1、引入日志 2、函数执行时间统计 3、执行函数前预备处理 4、执行函数后清理功能 5、权限校验等场景 6、缓存 4.装饰器大致流程如下: 1.执行外部函数, 原函数作为参数传递给到外层函数的形参 2.定义一个内层函数, 并且内层函数使用外层函数的变量,并调用传递进来的原函数的引用 3.外层函数的返回内层函数的引用,且调用内层函数 def 函数装饰器名称 ( func ) : def 内嵌函数 ( * args , ** kwargs ) : 需要添加的新功能 return func ( * args , ** kwargs ) return wrapper @ 函数装饰器名称 def 原函数名称 ( 参数 ) : 函数体 原函数 ( 参数 ) 5.被装饰器修饰的函数或者方法,可以是无参数的, 有参数的,不定参数的, 也可以是有返回值的, 也可以是无返回值的,也可以用作类装饰器(当然这个资源消耗较高,不建议使用), 装饰器大致的模板如下:

day12 python学习 装饰器

﹥>﹥吖頭↗ 提交于 2020-01-24 07:25:15
闭包函数: 内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数 #函数内部定义的函数称为内部函数 闭包函数获取网络应用 from urllib.request import urlopen def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read() return get xiaohua = index() #层层调用层层返回的一个函数# content = xiaohua() #每一层得到的返回值都是下一层的函数,执行返回值 #就是执行下一层函数。 print(content) 判断闭包函数的公式print(inner.__closure__) 输出的__closure__有cell元素 :是闭包函数 def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) return inner 函数名的本质:   就是一个变量,保存了函数所在的内存地址 2.装饰器 装饰器的本质:一个闭包函数   装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展 ##完美的装饰器 def warpper(func): #warpper 是装饰器的名字

Python中装饰器(Decorator)的理解

对着背影说爱祢 提交于 2020-01-23 21:19:03
之前经常看到‘@’这个符号在代码里出现,后来才知道这是装饰器,借这个机会,看了一些博客,写了一些demo,记录一下浅显的理解 主要内容 语法糖(Syntactic sugar) 装饰器(Decorator) 无参数装饰器 多参数的装饰器 多装饰器 装饰器的返回值 语法糖(Syntactic sugar) 由英国计算机科学家Peter.J.Landin发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。(这段来自百度) 语法糖的存在是为了方便开发人员进行代码的编写,加了糖后的代码块与加糖前相比,运行完全等价,但结构却更加简单,代码更加简洁。 一个Python中的例子:列表生成式 #普通生成一个1至10的列表 test_list = [] for i in range(10): test_list.append(i) #列表生成式 test_list = [i for i in range(10)] 所得结果都是一样的,但是使用列表生成式的代码更加简洁流畅。 装饰器(Decorator) 首先引入 闭包 的概念,闭包(Closure)可以简单理解为一个定义在函数中的子函数,它可以作为函数与外界沟通的桥梁,使得定义在函数中的局部变量在脱离这个上下文后仍然得以存在。 一个例子: #闭包 def msg(): t = "Decorator

python DAY_12(2) 函数装饰器

泄露秘密 提交于 2020-01-23 03:14:46
学习内容: 函数装饰器的相关操作 Tips: 1.在学习之前,我先回顾一下之前学习的内容(参考他人) 2.函数在嵌套时,可直接调用嵌套的内层函数 def greeting ( ) : def hello ( ) : print ( "hello" ) return hello 如果直接调用greeting(),那么指向一个hello所在的地址,调用greeting()()就会调用到hello()显示结果就是打印出来的hello 3.变量在不同的域 从低到高分别是local,encapsulation,globa,build-in 如何调用不同域内的变量需要自己多加练习 重点 1.装饰器的定义和使用 虽然之前也接触和使用,但是这里还是要认真仔细的学习一遍 1)函数定义装饰器 def p_decorate ( func ) : def wrapper ( * m1 , ** m2 ) : return '< % % >' + func ( * m1 , ** m2 ) + '< @ # >' return wrapper @p_decorate def get_text ( text ) : return text . upper ( ) if __name__ == '__main__' : print ( get_text ( "wwwe.sada.com" ) ) 结果如下 2

python语法拾遗-高阶函数

允我心安 提交于 2020-01-22 07:36:01
title: python语法拾遗 date: 2019-11-12 12:23:49 categories: Python Python语法相关 tags: python 语法使用 description: python高阶函数(迭代器,装饰器,map-reduce等) python高阶函数(迭代器,装饰器,map-reduce等) 高级特征 迭代 迭代通过 for...in 来完成,作用对象可以是list,tuple,dict,str之类的可迭代对象。如下迭代dict类型: d = { 'a' : 1 , 'b' : 2 , 'c' : 3 } for key in d : print ( key ) #a,b,c 注:dict字典数据类型,内部原始没有顺序,故输出顺序可能不同。dict默认迭代key值,如要迭代value值,需要使用 for value in d.values() ;如要迭代键值对,要使用 for k,v in d.items() 。 可迭代对象的判断方法,使用collections模块的Iterable类型判断: from collections import Iterable isinstance ( 'abc' , Iterable ) # 返回True,即str为可迭代对象 enumerate 函数,可以将list变成索引-元素对: for i , v

python基础三大器之装饰器

喜夏-厌秋 提交于 2020-01-22 06:02:21
闭包 由于闭包这个概念比较难以理解,尤其是初学者来说,相对难以掌握,所以我们通过示例去理解学习闭包。 给大家提个需求,然后用函数去实现:完成一个计算不断增加的系列值的平均值的需求。 例如:整个历史中的某个商品的平均收盘价。什么叫平局收盘价呢?就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值:平均值要考虑直至目前为止所有的价格。 比如大众推出了一款新车:小白轿车。 第一天价格为:100000元,平均收盘价:100000元 第二天价格为:110000元,平均收盘价:(100000 + 110000)/2 元 第三天价格为:120000元,平均收盘价:(100000 + 110000 + 120000)/3 元 ........ series = [] def make_averager(new_value): series.append(new_value) total = sum(series) return total / len(series) print(make_averager(100000)) print(make_averager(110000)) print(make_averager(120000)) 从上面的例子可以看出,基本上完成了我们的要求,但是这个代码相对来说是不安全的,因为你的这个series列表是一个全局变量,只要是全局作用域的任何地方

面试准备——python知识

两盒软妹~` 提交于 2020-01-20 04:25:04
1、range和xrange的用法和区别 在Python2中,range()与xrange()功能是一样的,多用于for循环。但是不同的是 range产生的是一个list对象,而xrange是一个生成器对象 。从性能上,xrange优于range。 因此要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。 在python3中xrange()已经不存在了,range()就是xrange()。 2、可变对象和不可变对象 不可变对象,该对象所指向内存中的值不能被改变 当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 不可变变量性质的优点在于减少了重复的值对内存空间的占用。 可变对象,该对象所指向的内存中的值可以被改变 变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。 Python中,数值类型(int和float),字符串str, 元组tuple 都是不可变类型。而列表list,字典dict,集合set都是可变类型。 在除了tuple的不可变变量中,只要两个变量的数据类型相同并且值也相等,那么这两个变量的地址也相同。 作为函数参数 对于python中的可变与不可变对象

Python函数进阶:闭包、装饰器、生成器、协程

南楼画角 提交于 2020-01-19 13:21:34
/*--> */ /*--> */ 返回目录 本篇索引 (1) 闭包 (2) 装饰器 (3) 生成器 (4) 协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++、Java、JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现。 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包。” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量。 闭包的优点是:实现起来比类稍微轻巧一点(意思就是可以少敲一些代码),并且运行速度比类要快得多(据说约快50%)。下面是一个定义闭包的简单例子: def foo(x, y): def hellofun(): print('hellofun x is %d, y is %d.' %(x,y)) return hellofun a = foo(1,2) b = foo(30,40) a() b() # 运行结果为: hellofun x is 1, y is 2. hellofun x is 30, y is 40. 上例中,foo就定义了一个闭包,它将内部定义的函数hellofun返回(但并不运行这个函数), 同时将入参x,y作为以后hellofun要运行时的环境

回顾Python装饰器

纵然是瞬间 提交于 2020-01-19 12:05:17
函数装饰器(function decorator) 可以对函数进行“标注”,给函数提供更多的特性。 在理解装饰器之前需要理解 闭包(closure) 。Python3.0 引入了保留关键字 nonlocal ,使用闭包同样也离不开 nonlocal。顺便说一句,闭包除了用在装饰器上,对于异步编程也是很重要的概念。 装饰器(decorator) 是一个可调用的装饰函数,它接收另一个函数作为参数。 假设已经定义好了一个装饰器 decorate (decorate 实际上是一个接收函数并且返回函数的函数),那么以下两段代码是等价的。 @decorate def target(): print('running target()') 和 def target(): print('running target()') target = decorate(target) 可以看到,@标注这种语法实际上是一个语法糖。target 经过标注后已经成为了另一个函数 decorate(target)。 我们再看看一个实际定义 decorate 的例子: def decorator(func): def inner(): print('running inner()') return inner @decorator def target1(): print('running target1()')