Python高阶函数,闭包以及装饰器的简单使用
计算一段代码的执行时间
import time #time模块可以获取当前的时间
思路如下:
#代码运行之前获取一下时间
start = time.time() #time模块里的time方法,可以获取当前时间的时间戳,时间戳是从1970-01-01 00:00:00 UTC 到现在的秒数
print('start=',start)
x=0
for i in range(1,10000000)
x+=i
print(x)
end=time.time()
print('代码运行耗时时间:',end-start)
优化计算时间
import time
start = time.time()
print('start=',start)
x=0
for i in range(1,10000000)
x+=i
print(x)
end=time.time()
print('代码运行耗时时间:',end-start)
y=1
for j in range(1,1000000)
y*=y
print(y)
print('hello')
time.sleep(3)
print(' world')
def cal_time(fn):
start=time.time()
fn()
end=time.time()
print('代码运行耗时时间:',end-start)
def dome():
x=0
for i in range(1,10000000)
x+=i
print(x)
cal_time(dome)
def foo():
y=1
for j in range(1,1000000)
y*=y
print(y)
cal_time(foo)
装饰器的使用
import time
def cal_time(fn):
def inner():
start =time.time()
fn()
end=time.time()
print('代码运行耗时时间:',end-start)
return inner
@cal_time
def dome():
x=0
for i in range(1,10000000):
x+=i
print(x)
cal_time(dome)
@cal_time#第一件事调用cal_time;第二件事把被装饰的函数传递给fn
def foo():
y=1
for j in range(1,1000000):
y*=y
print(y)
print('hello')
time.sleep(3)
print('world')
#第三件事:当再次调用demo函数是,此时的demo函数已经不再是上面的demo函数了
print('装饰后的demo={}'.format(demo))
demo()
foo()
装饰器详解
def cal_time(fn):
print('我是外部函数,我被调用了')
def inner():
start =time.time()
fn()
end=time.time()
print('代码运行耗时间:',end-start)
return inner
@cal_time
def foo():
y=1
for j in range(1,1000):
y*=y
print(y)
print('hello')
time.sleep(3)
print('world')
return y
foo()
m=foo()
print('m的值是:',m)#结果是None
#为什么拿不到y 的值?怎么样才能拿到?
#原因是foo函数已经不是foo了,变成了inner函数,仅需在inner函数里修改即可
def inner():
start =time.time()
s=fn()
end=time.time()
print('代码运行耗时间:',end-start)
return s
return inner
下面我们希望
n=int(input("输入n的值:"))
def foo(n):#我们自己为foo函数传参,于是我们需要修改inner(里面的参数,变成inner(x),当然fn()函数也需要修改,因为fn函数现在才是原来的foo函数了,fn(x)这里的x是实参了,不能使用其他变量了
当我们需要取消print('代码运行耗时间:',end-start)这行代码时可以return s,end-start,这时m的值就是一个元组,包含了求和的结果和运行时间
修改 def inner(n,*args,**kwargs),这时候可以修改m=demo(1000000,'good',y='hello')
装饰器的使用(2)
def can_play(fn):
def inner(x,y,*args,**kwargs):
if args[0]<=22:
fn(x,y)
else:
print('太晚了,不行')
return inner
@can_play
def play_game(name,game):
print('{}正在玩{}'.format(name,game))
play_game('张三','王者荣耀',18)
play_game('李四','绝地求生',22)
如果要使用**kwargs,可以这样修改:
play_game('张三','王者荣耀',clock=18)
clock=kwargs['clock']
if clock<=22:
fn(x,y)
但是修改了会有begud,可以修改为clock = kwargs.get('clock',23 )
生命依靠吸收负熵,避免了趋向平衡的衰退

浙公网安备 33010602011771号