鱼C论坛

 找回密码
 立即注册
查看: 2681|回复: 5

[已解决]关于新版讲函数第VI课时的疑问

[复制链接]
发表于 2023-1-4 15:59:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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()明明是不同函数名字啊。




最佳答案
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-4 16:04:16 | 显示全部楼层
func是形参,myfunc是实参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-4 16:22:53 | 显示全部楼层
suchocolate 发表于 2023-1-4 16:04
func是形参,myfunc是实参

func是形参我理解,
实参一般不是func=myfunc()这样的吗?
但这里直接写func()所以不我太理解。
我试着把07行的func()改成myfunc()后,一直不停的输出
开始运行程序...
开始运行程序...
开始运行程序...
开始运行程序...
开始运行程序...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-4 20:29:15 | 显示全部楼层
suchocolate 发表于 2023-1-4 18:31
防止误导,参数和被装饰函数改个名


原来是这样,我大概懂了。
意思是要是没有装饰器@time_master,
def time_master(arg)定义的只是普通函数,
加入装饰器后,装饰器下面的test()函数就要以实参的形式传入 time_maste()函数
非常感谢!谢谢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 03:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表