标签:函数调用 其他 -- def 嵌套 time() 条件 字符串类 字符
1 #统计函数运行时间 2 import time 3 #装饰器 4 def timmer(func): 5 def wrapper(*args,**kwargs): 6 start_time=time.time() 7 func() 8 stop_time =time.time() 9 print("the func time is %s"%(stop_time-start_time)) 10 11 #函数 12 @timmer 13 def test1(): 14 time.sleep(3) 15 print(‘in the test1‘) 16 17 test1()
上面函数运行会出现报错:
1 import time 2 def bar(): 3 time.sleep(3) 4 print(‘in the bar‘) 5 #装饰器, 6 def test1(func): 7 print(func) 8 start_time=time.time() 9 func() #run bar 10 stop_time = time.time() 11 print(‘the func runtime is %s‘%(stop_time-start_time)) 12 13 test1(bar) #改变了函数原本的调用方式
1 #装饰器中,使用函数作为变量,通过变量也能调用该函数。 2 3 func=bar() 4 5 func() 6 7 #此处和bar()的执行结果是一样的
刚开始写装饰器时,对函数调用方式有疑惑。上面代码最后的语句:test(bar)改变函数原本调用方式很不理解。
1 import time 2 #函数的调用方式没有改变 3 def bar(): 4 time.sleep(3) 5 print(‘in the bar‘) 6 #装饰器 7 def test2(func): 8 print(func) 9 return func 10 print(‘--->‘,test2(bar))#t=test2(bar) print(t) 二者实现的效果是一样的 11 t=test2(bar) 12 t()#等同于bar() 13 14 bar=test2(bar) 15 bar()#等同于 run bar
上面内容:把函数bar传给func,print(func),实质是打印下来bar的内存地址,return func 的返回值就是test2(bar)的运行结果。 print(‘--->‘,test2(bar))就是将test2(bar)的运行结果(即return func)的运行结果打印下来
第11行中:test2(bar())和test2(bar)的区别?
前者是将bar的运行结果传给test2,(即字符串类型),不符合高阶函数中返回值是函数名这一原则。
后者将bar的内存地址返回给test2,之后执行。
4.局部作用域和全局作用域的访问顺序
1 #局部作用域和全局作用域的访问顺序 2 x=0 3 def test1(): 4 x=1 5 print(x) 6 def test2(): 7 x=2 8 print(x) 9 def test3(): 10 x=3 11 print(x) 12 test3() 13 test2() 14 test1() 15 print(x)
通过上面实现可以看出:
若将test2()注释掉,则将不能访问进入test3()。函数外层输出的x的结果仍旧是0,因为它是全局变量。
标签:函数调用 其他 -- def 嵌套 time() 条件 字符串类 字符
原文地址:https://www.cnblogs.com/bocaimao/p/10336819.html