Python闭包函数和装饰器

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 innerdemo = 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 timedef 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 wrapperdef 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 twodef 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----
Python闭包函数和装饰器
文章图片
图片.png-18.5kB
【Python闭包函数和装饰器】如上图所示,红色箭头标记“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 + lt2def concatList2(lt1,lt2): lt1.extend(lt2) return lt1def 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

    推荐阅读