同舟 发表于 2023-1-4 15:59:39

关于新版讲函数第VI课时的疑问

import time
   
def time_master(func):
    def call_func():
      print("开始运行程序...")
      start = time.time()
      #func()
      stop = time.time()
      print("结束程序运行...")
      print(f"一共耗费了 {(stop-start):.2f} 秒。")
    return call_func
   
@time_master
def myfunc():
    time.sleep(2)
    print("I love FishC.")
   
myfunc()

输出结果是:
开始运行程序...
结束程序运行...
一共耗费了 0.00 秒。


问题是
当注释#func()后
没有执行myfunc()函数的内容(没有输出i love fishc)
func()跟myfunc()明明是不同函数名字啊。




suchocolate 发表于 2023-1-4 16:04:16

func是形参,myfunc是实参

同舟 发表于 2023-1-4 16:22:53

suchocolate 发表于 2023-1-4 16:04
func是形参,myfunc是实参

func是形参我理解,
实参一般不是func=myfunc()这样的吗?
但这里直接写func()所以不我太理解。
我试着把07行的func()改成myfunc()后,一直不停的输出
开始运行程序...
开始运行程序...
开始运行程序...
开始运行程序...
开始运行程序...

suchocolate 发表于 2023-1-4 18:26:37

同舟 发表于 2023-1-4 16:22
func是形参我理解,
实参一般不是func=myfunc()这样的吗?
但这里直接写func()所以不我太理解。



def test(x,y):
    result = x + y# 函数被调用时,传进来的x实参是5,y实参是10
    print(result)

test(5,10)
# 实参x=5, y=10

suchocolate 发表于 2023-1-4 18:31:26

本帖最后由 suchocolate 于 2023-1-4 20:29 编辑

同舟 发表于 2023-1-4 16:22
func是形参我理解,
实参一般不是func=myfunc()这样的吗?
但这里直接写func()所以不我太理解。


防止误导,参数和被装饰函数改个名
import time
   
def time_master(arg):# arg是形参,与普通函数不同,普通函数可能传入的是字符串或数字或列表,装饰器传如的是函数对象。装饰器被调用时,arg的实参就是test函数对象
    def call_func():
      print("开始运行程序...")
      start = time.time()
      arg()    #执行传入的函数对象
      stop = time.time()
      print("结束程序运行...")
      print(f"一共耗费了 {(stop-start):.2f} 秒。")
    return call_func
   
@time_master   # 调用装饰器,把test函数作为对象传给装饰器
def test():
    time.sleep(2)
    print("I love FishC.")
   
test()

同舟 发表于 2023-1-4 20:29:15

suchocolate 发表于 2023-1-4 18:31
防止误导,参数和被装饰函数改个名

{:7_112:}
原来是这样,我大概懂了。
意思是要是没有装饰器@time_master,
def time_master(arg)定义的只是普通函数,
加入装饰器后,装饰器下面的test()函数就要以实参的形式传入 time_maste()函数
非常感谢!谢谢了。
页: [1]
查看完整版本: 关于新版讲函数第VI课时的疑问