全能软件测试工程师
闭包和装饰器
大周
什么是闭包?
在一个函数,如func1中的内部定义了另一个函数func2,并且函数func1的返回值为函数func2的引用,这种情况称之为闭包。简单来说,外部函数返回内部函数的引用就叫做闭包
def func1(): print("函数1运行") def func2(): print("函数2运行") func2() return func2 f2 = func1() print(f2) f2()
@函数名
,叫装饰器,又称为语法糖import datetime def runtime(func): def warpper(): print(datetime.datetime.now()) return func() return warpper # 使用装饰器 ,直接将函数传至装饰器当中进行运行 @runtime def my_func1(): print("函数1运行") my_func1() @runtime def my_func2(): print("函数2运行") my_func2()
装饰器使用案例:龟兔赛跑
#龟兔百米赛跑 import time import random # 定义赛道长度 TRACK_LENGTH = 100 # 装饰器runtime计算赛跑时间 def runtime(func): def cal_time(): start_time = time.time() func() end_time = time.time() consume_time = end_time - start_time print(func.__name__,f"跑了{consume_time}秒") return cal_time # 乌龟的函数 @runtime def tot(): for i in range(1,TRACK_LENGTH+1): print(f"乌龟跑了{i}米") time.sleep(1) # 兔子的函数 @runtime def rabbit(): for i in range(1,TRACK_LENGTH+1): if i % 9 == 0: time.sleep(random.randint(1,10)) print (f"兔子跑了{i}米")
- 原因:因为当我们的列表大到几百万条数据时,我们只要取几百条数据的时候,如果我们把几百万条数据全取出来就需要耗费极大的内存,我们不需要把几百万条数据挨个搞出来,这个时候生成器就来了
- 解决问题:生成器是python种的一个机制,边计算边运行。
- 原理:我们把数据按照相关算法进行一个输出记录,一边计算一边运行,取到我们需要的数据即可,便不再需要把几百万数据挨个取出。
通过老师的讲解和自己的实践,对于闭包、装饰器和yield的用法有了初步的了解,下一步将继续跟着老师的节奏学习Python。