您现在的位置是:首页 > 文章详情

Python闭包函数和装饰器

日期:2018-07-02点击:472

2018年7月2日笔记

7.Python函数对象和闭包

1.函数对象

函数是对象,可以给函数增加属性

def funcF(x,y,z): print(x,y,z) funcF(1,2,3) funcF.abc = "hello python" print(funcF.abc 

上面一段代码的运行结果如下:

1 2 3
hello python

2.函数闭包

1.概念:在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用
示例代码:演示函数嵌套和闭包。

def outer(a): b = 10 def inner(): print(a+b) return inner demo = outer(5) demo() 

上面一段代码的运行结果如下:

15

8.Python装饰器

1.定义

装饰器实质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

2.场景

2.1 通过变量也能调用该函数

def hello(): print("我是最初的hello函数") #函数也是一个对象,而且函数对象可以赋值给变量 f = hello f() 

上面一段代码的运行结果如下:

我是最初的hello函数

2.2 场景
函数对象有一个name属性,可以获取函数的名字

def hello(): print("我是最初的hello函数") #获取函数的名字 print(hello.__name__) 

上面一段代码的运行结果如下:

hello

2.3 假设增加hello()函数的功能,而完全不改变原来的代码

def outer(func): def inner(*args,**kwargs): print("我是%s()函数" %func.__name__) return func(*args,**kwargs) return inner @outer def hello(): print("我是最初的hello函数") hello() 

上面一段代码的运行结果如下:

我是hello()函数
我是最初的hello函数

2.4 支持多个装饰器

import time def deco1(func): print("deco1 decorated") def wrapper(*args, **kwargs): print("this is deco1") startTime = time.time() func(*args, **kwargs) endTime = time.time() ms = (endTime - startTime) * 1000 print("time is %s ms" % ms) print("deco1 end here") return wrapper def deco2(func): print("deco2 decorated") def wrapper(*args, **kwargs): print("this is deco2") func(*args, **kwargs) print("deco2 end here") return wrapper @deco1 @deco2 def func(a, b): print("hello, here is func for add:") time.sleep(1) print("result is %d" % (a + b)) func(3, 4) 

上面一段代码的运行结果如下:

deco2 decorated
deco1 decorated
this is deco1
this is deco2
hello, here is func for add:
result is 7
deco2 end here
time is 1000.9815692901611 ms
deco1 end here

多个装饰器使用的调用顺序:

def one(func): print('----1----') def two(): print('----2----') func() print('----3----') return two def a(func): print('----a----') def b(): print('----b----') func() print('----c----') return b @one @a def demo(): print('----demo----') demo() 

上面一段代码的运行顺序如下:

----a----
----1----
----2----
----b----
----demo----
----c----
----3----

图片.png-18.5kB
图片.png-18.5kB

如上图所示,红色箭头标记“1”和“3”处越靠近函数的装饰器先被执行,红色箭头标记“2”处越远离函数的装饰器先被执行。

练习

1.定义一个函数,需求:去除列表中重复的元素.

def dropDuplicates(lt): new_list = [] for i in lt: if i not in new_list: new_list.append(i) return new_list ##第二种方法一行代码解决 def dropDuplicates2(lt): return list(set(lt)) 

2.定义一个函数,需求:合并两个列表

def concatList(lt1,lt2): return lt1 + lt2 def concatList2(lt1,lt2): lt1.extend(lt2) return lt1 def concatList3(lt1,lt2): for i in lt2: lt1.append(i) return lt1 

3.定义函数,需求:判断三个数中的最大值

def my_max(*args): return max(*args) def my_max1(*args): max_number = args[0] for i in args: if i > max_number: max_number = i return max_number 

4.定义一个函数,需求:实现斐波那契数列

def fibonacci(length): if length < 1: print("参数应该为正整数") if length == 1: return [1] elif length == 2: return [1,1] lt = [1,1] for i in range(2,length): lt.append(lt[i-1] + lt[i-2]) return lt 

5.将下列字符串变成字典

t = "k:1|k1:2|k2:3|k3:4" result = {x:y for x,y in [k.split(':') for k in t.split('|')]} print(result) 

字符串函数

s = 'i love You so much' print(s.ljust(22, '*')) print(s.rjust(22, '2')) print(s.center(22, '*')) print(s.zfill(22)) print(s.replace('u', '1', 1)) print(s.split(' ')) print(s.upper()) print(s.lower()) print(s.capitalize()) print(s.title()) print(s.swapcase()) print(s.count('o')) print(s.startswith('i')) print(s.endswith('!')) print(s.isalnum()) print(s.isalpha()) print(s.islower()) print(s.isupper()) print(s.istitle()) 

上面一段代码的运行结果如下:

i love You so much**** 2222i love You so much **i love You so much** 0000i love You so much i love Yo1 so much ['i', 'love', 'You', 'so', 'much'] I LOVE YOU SO MUCH i love you so much I love you so much I Love You So Much I LOVE yOU SO MUCH 3 True False False False False False False 
原文链接:https://yq.aliyun.com/articles/649247
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章