defindex(): time.sleep(3) print('Welcome to the index page’) return 200 index() #函数执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
遵循不修改被装饰对象源代码的原则,我们想到的解决方法可能是这样:
strat_time = time.time() index() # 函数执行 stop_time = time.time() print('run time is %s' %(stop_time-start_time)) 考虑到还有可能要统计其他函数的执行时间,于是我们将其做成一个单独的工具,函数体需要外部传入被装饰的函数从而进行调用,我们可以使用参数的形式传入
defwrapper(func):# 通过参数接收外部的值 start_time=time.time() res=func() stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res 但之后函数的调用方式都需要统一改成: wrapper(index) wrapper(其他函数)
deftimer(func): defwrapper():# 引用外部作用域的变量func start_time=time.time() res=func() stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper
deftimer(func): defwrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper
deftimer(func): @wraps(func) defwrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper
>>> defmy_range(start,stop,step=1): ... print('start...') ... while start < stop: ... yield start ... start+=step ... print('end...') ... >>> g=my_range(0,3) >>> g <generator object my_range at 0x104105678>
1 2 3 4 5 6 7
生成器内置有__iter__和__next__方法,所以生成器本身就是一个迭代器
>>> g.__iter__ <method-wrapper '__iter__' of generator object at 0x1037d2af0> >>> g.__next__ <method-wrapper '__next__' of generator object at 0x1037d2af0>
defeater(): print('ready to eat') whileTrue: food = yield print('get the food: %s, and start to eat' % food)
1 2 3 4 5 6 7 8 9 10 11
可以拿到函数的生成器对象持续为函数体send值:
g = eater() # 得到生成器对象 g >>> <generator object eater at 0x101b6e2b0> next(g) # 需要事先'初始化'一次,让函数挂起在food = yield,等待调用g.send()方法为其传值 >>> ready to eat g.send('包子') >>> get the food: 包子, and start to eat g.send('鸡腿') >>> get the food: 鸡腿, and start to eat
[expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ]
#类似于 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: res.append(expression)
1 2 3 4 5 6 7 8
针对下述场景:
egg_list=[] for i inrange(10): egg_list.append('鸡蛋%s' %i) 用列表生成式可以一行解决
# egg_list=['鸡蛋%s' %i for i in range(10)]
生成式表达式
1 2 3 4 5 6 7 8 9 10 11 12 13
创建一个生成器对象有两种方式: 1 调用带yield关键字的函数
2 生成器表达式 ---> 与列表生成式的语法格式相同,只需要将[]换成()即可: (expression for item in iterable if condition) 对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象
>>> [x*x for x inrange(3)] [0, 1, 4] >>> g=(x*x for x inrange(3)) >>> g <generator object <genexpr> at 0x101be0ba0>