python装饰器

python语法基础-函数-装饰器-长期维护

白昼怎懂夜的黑 提交于 2020-02-10 07:20:14
############### 装饰器的初成和开放封闭原则 ############## # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 # # 需求:计算程序执行的时间, import time def func(): start = time.time() time.sleep(0.01) print(123) end = time.time() print(end-start) func() # 这种写法如果有100个函数,你都要加一遍这是不行的,太麻烦了, # 第二版 def func(): time.sleep(0.01) print(123) def timer(f): start = time.time() f() end = time.time() print(end-start) timer(func) # 专门写了一个函数用来计算函数的执行时间, # 闭包的写法 def func(): time.sleep(0.01) print(123) def timer(f): def inner(): start = time.time() f() end = time.time() print(end-start) return inner # 这就是一个闭包,因为是函数的嵌套,并且函数内部调用函数外部的参数, #

python语法生成器、迭代器、闭包、装饰器总结

三世轮回 提交于 2020-02-09 09:44:40
1、生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, 4, 6, 8] # 生成器 G = ( x*2 for x in range(5)) # 此时的G是,<generator object <genexpr> at 0x7f626c132db0> 创建列表生成式和生成器的区别只是最外层的()和[],列表生成式是一个列表,而生成器事宜个可迭代对象。生成器对象可以通过for语句遍历每个元素。 for each in G: print(each) # 打印结果是 0 2 4 6 8 (2)通过函数来实现 generator非常强大,如果推算的算法比较复杂,用类似的列表生成式的for循环无法实现的时候,可以通过函数来实现。 以著名的斐波拉契数列(Fibonacci), 除第一个和第二个数外,任意一个数都可以由前两个数相加得到:1,1,2,3,5,8,13…. 斐波拉契数列用列表生成式不容易写出来,但是用函数把它打印出来很容易: def fib(times): n = 0 a, b = 0, 1 while n < times: yield b # 这里用的yield将b的值返回到生成器中。 a, b = b, a+b n += 1

Python学习4

久未见 提交于 2020-02-09 01:25:27
匿名函数: 1 没有函数名,在内存中会被回收,如果想在内存中储存,需要定义变量 # calc= lambda x:x*3 # print(calc(3)) # def sayhi(n): # print(n) # sayhi(3) # (lambda n:print(n))(5) # hi=lambda n:print(n) # hi(7) res=filter(lambda n:n>5,range(10)) #filter过滤 for i in res: print(i) print(res) res=map(lambda n:n*2,range(10)) #map 相当于列表生成式[i*2 for i in range(10)] for i in res: print(i) print(res) import functools res= functools.reduce(lambda x,y:x+y,range(10)) #累加 print(res) 装饰器 #装饰器:本质是函数,用来(装饰其他函数),就是为其他函数添加附加功能 #原则:1.不能修改被装饰的函数的源代码 #2.不能修改被装饰函数的调用方式 #3. def logger(): print('logging') def tset1(): pass logger() def tesr2(): pass logger

Python学习week4

五迷三道 提交于 2020-02-08 22:50:14
装饰器:本质是函数,用来装饰其他的函数,为其它函数添加附加功能。 原则:不能改变被装饰函数的源代码和调用方式。 1、函数即‘变量’,定义一个函数相当于把函数体赋值给函数名,匿名函数相当于只有函数体没有函数名 def func1(): print('in the function') func2=func1 #和普通的整数赋值一样:a=2 b=a print(b) func2() 2、高阶函数 3、嵌套函数 装饰器=高阶函数+嵌套函数 高阶函数: 1、把一个函数名当作实参传递给另外一个函数;(在不修改被装饰函数源代码的情况下为其添加功能) 2、返回值中包含函数名。(不修改函数的调用方式) import time def bar(): time.sleep(2) print('in the bar') def timer(func): start_time=time.time() func() stop_time=time.time() print('the time of running is %s'%(stop_time-start_time)) timer(bar) 输出: in the bar the time of running is 2.0002079010009766 函数执行计时器 import time def bar(): time.sleep(2) print(

python 有参数的装饰器

淺唱寂寞╮ 提交于 2020-02-07 02:59:03
怎么样为装饰器加参数 import time current_user = {'user':None} def auth(engine = "file") def deco(func): def wrapper(*args,**kwargs): if current_user['user']: #已经登录过 res = func(*args,**kwargs) return res user = input("username>>>:").strip() pwd = input("password>>>:").strip() if engine == 'file': #基于文件的认证 if user == “egon‘ and pwd == "123": print('login successful') current_user['user'] = user res = func(*args,**kwargs) return res else: print('user or password error') elif engine == 'mysql': print('基于MySQL的认证') elif engine == 'mysql': print('基于MySQL的认证') elif engine == 'ldap': print('基于ldap的认证') else:

Python装饰器探究——装饰器参数

别来无恙 提交于 2020-02-07 02:58:38
Table of Contents 1. 探究装饰器参数 1.1. 编写传参的装饰器 1.2. 理解传参的装饰器 1.3. 传参和不传参的兼容 2. 参考资料 探究装饰器参数 编写传参的装饰器 通常我们见到的简单装饰器这样的: import json import functools def json_output(func): @functools.wraps(decorated) def inner(*args, **kwargs): result = func(*args, **kwargs) return json.dumps(result) return inner @json_output def f(): return {'status': 'done'} 当装饰器应用于函数 f 上时,它接受 f 作为其参数,返回一个函数 inner ,且将他绑定到变量f上。 示例中我们编写的装饰器 json_output 只接受一个隐式参数——即被装饰的方法,在使用此装饰器时本身看上去是并没有参数的。然而有时候需要让装饰器自身带有一些需要的信息,从而使装饰器可以使用恰当的方式装饰方法。比如上面的例子中,我们想通过向装饰器传入不同的参数来控制输出结果的缩进(indent)和排序(sort)。我们可以这么做: import json import functools def json

python 装饰器--对有无参数的函数进行装饰

ぃ、小莉子 提交于 2020-02-07 02:57:30
# 使用装饰器无参数的函数进行装饰 # def func(funcionName):   # print('-----1------')   # def func_in():     # print('--func_in---')     # funcionName()     # print('--func_2---')   # print('-----2------')   # print('-----3------')   # return func_in # @func # test = func(test) # def test():   # print('----testa=%d,b=%d-----'%) # test() # -----1------ # -----2------ # -----3------ # --func_in--- # ----test----- # --func_2--- # 使用装饰器对有参数的函数进行装饰 # def func(funcionName):   # print('-----1------')   # def func_in(a,b): #如果a,b没有定义,那么会导致40号调用失败     # print('--func_in---')     # funcionName(a,b) # 如果没有把a,b当做实参进行传递

python基础面试集锦(51-100)

南楼画角 提交于 2020-02-06 21:32:54
目录 51、把aaabbbcccdd这种形式的字符串压缩成a3b3c3d2的形式? 52、给你一个字符串'abc',打印出该字符串的所有排列组合? 53、执行以下代码后,x的值为? 54、对于一个非空字符串,判断其是否可以有一个子字符串重复多次组成,字符串 只包含小写字母且长度不超过 10000 55、从0-99这100个数中随机取出10个不重复的值? 56、介绍一下try except的用法和作用? 57、在python中如何抛出,捕获,处理异常? 58、enumerate的作用是什么? 59、python递归最大深度? 60、列举常见的内置函数? 61、filter、map、reduce的作用? 62、一行代码实现9x9乘法表? 63、什么是闭包? 64、用装饰器,限制函数被调用的频率,如1秒一次 65、请实现一个装饰器,通过 一次调用时函数重复执行5次 66、一行代码输出1-100偶数列表。(列表推导式,filter) 67、解释生成器与函数的不同,并实现和简单使用generator 68、写出打印结果? 69、简述yield和yieldfrom关键字 70、以下代码输出的结果? 71、以下代码输出结果? 72、从一个列表中剔除重复的,然后求和 73、map(str,[1,2,3])输出是什么? 74、请简述标准库中functools.wraps的作用 75

Python内置函数

不想你离开。 提交于 2020-02-06 11:28:12
Duang! 68个内置函数 分类记忆 数学运算 × 7 abs() 、 divmod() 、 max() 、 min() 、pow() 、round() 、sum() 类型转换 × 24 bool() 、 int() 、 float() 、 complex() 、str() 、 ord() 、 chr() 、 bytearray() 、 bytes() 、 memoryview() 、 bin() 、 oct() 、 hex() 、 tuple() 、 list() 、 dict() 、 set() 、 frozenset()、 enumerate() 、 range() 、 iter() 、 slice() 、super() 、object() 序列操作 × 8 all() 、any() 、 filter() 、 map() 、next() 、reversed() 、sorted() 、zip() 对象操作 × 9 help() 、dir() 、 id() 、hash() 、type() 、len() 、ascii() 、format() 、vars() 反射操作 × 8 Import() 、isinstance() 、issubclass() 、hasattr() 、getattr() 、setattr() 、delattr() 、callable() 变量操作 × 2

Python中的装饰器

倾然丶 夕夏残阳落幕 提交于 2020-02-06 03:39:41
Python中的装饰器 1. 什么是装饰器 2. 装饰器的用法 3. 语法糖(@修饰符) 1. 什么是装饰器 把一个函数当作参数传递给另一个函数,返回一个替代版的函数; 本质上就是一个返回函数的函数,在不改变原函数的基础上,给函数增加功能,函数可以作为参数被传递。 2. 装饰器的用法 举例1: def say ( ) : print ( 'hello' ) #定义一个装饰器(装饰器本身也是一个函数,只不过它的返回值也是函数) def fun ( f ) : def inner ( ) : print ( '*********' ) f ( ) print ( '############' ) return inner ( ) a = fun ( say ) print ( a ) 输出结果: ** ** ** ** * hello ############ None 举例2: def say_hello ( name ) : return f "Hello {name}" def be_some ( name ) : return f "Your {name}" def greet_bob ( func ) : return func ( "Bob" ) print ( greet_bob ( say_hello ) ) #将say_hello函数当作参数传递给greet