鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 小甲鱼

[知识点备忘] 第046讲:函数(VI)- 装饰器

[复制链接]
发表于 2023-1-4 09:39:23 | 显示全部楼层
  1. def call_func():
  2.             start = time.time()
  3.             func()
  4.             stop = time.time()
复制代码

这段中的func()搞不懂是什么意思。
上下面都见到def func()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2023-1-15 21:11:40 | 显示全部楼层
无言之梦 发表于 2022-9-1 15:45
装饰器第一部分的闭包过程中不打 return call_func  为什么报错

应该是使用return才会执行call_func中的内容。当然不使用return可以直接用call_func()代替。
个人理解。不知道对不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-31 21:18:35 | 显示全部楼层
不使用装饰器的话,funA和msg可以同时传入外层函数,可以少嵌套一层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-25 03:49:03 | 显示全部楼层
七钱五 发表于 2022-10-16 16:47
测试函数不能带参数,不然会报错,这是为什么呢?比如只能funA(),而不能是funA(x)

可以带参数,参数要放在内部的嵌套函数中传递哦~

  1. def dec(func):
  2.     def call_func(x, y):
  3.         print(f"装饰器来过,x = {x}, y = {y}")
  4.     return call_func

  5. @dec
  6. def test(x, y):
  7.     pass

  8. test(3, 4)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-25 03:49:56 | 显示全部楼层
Loafer0 发表于 2022-11-25 20:51
我也遇到了同样的问题,想知道后面怎么解决了?

可以带参数,详见 #28 楼回复~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 20:51:57 | 显示全部楼层
import time
   
def time_master():                   #将func拿到内层#
    def call_func(func):              #这么写为什么会报错,不懂,求解#
        print("开始运行程序...")
        start = time.time()
        func()
        stop = time.time()
        print("结束程序运行...")
        print(f"一共耗费了 {(stop-start):.2f} 秒。")
    return call_func
   
def myfunc():
    time.sleep(2)
    print("I love FishC.")
   
myfunc = time_master(myfunc)
myfunc()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-14 23:08:40 | 显示全部楼层
看不出哪里有问题,报错了
  1. import time


  2. def time_master(func):
  3.     def call_func():
  4.         print("程序开始运行...")
  5.         start = time.time()
  6.         func()
  7.         stop = time.time()
  8.         print("程序运行结束...")
  9.         print(f"一共运行了{(stop - start).2f}秒。")
  10.     return call_func


  11. @time_master
  12. def myfunc():
  13.     time.sleep
  14.     print("Hello,FishC!")

  15.    
  16. myfunc()
复制代码
报错.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-16 10:50:43 | 显示全部楼层
同舟 发表于 2023-1-4 09:39
这段中的func()搞不懂是什么意思。
上下面都见到def func()

定义中
  1. def time_master(func):
复制代码
里面有,相当于形参吧,下面定义中的myfunc相当于实参,个人理解。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 09:44:44 | 显示全部楼层
import time ,random
def time_master(fun):
    def cu():
        print("程序开始")
        start = time.time()
        fun()
        print("程序结束")
        end = time.time()
        print("程序共运行了%.2f秒"%(end-start))
    return cu

@time
KeyboardInterrupt
@time_master()
def test():
    time.sleep(random.randrange(1,5))
    print("welcome to FishC.com")
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-12 16:28:28 | 显示全部楼层
FengHL 发表于 2023-4-14 23:08
看不出哪里有问题,报错了

格式化字符串里面没加冒号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-22 15:49:35 | 显示全部楼层
多层可以理解成递归里面不断向下调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-7 20:12:57 | 显示全部楼层
@classmethod
def funA()

等价于
>>>funA = classmethod(funA)
>>>funA()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-2 22:08:23 | 显示全部楼层
def login(level):
    print("ff")
    def fun2(func):
        def fun3():
            func()
        return fun3
    return fun2

@login(level = 1)
def funA():
    print("gg")

   
ff
为什么在第一个和第二个函数之间加一句输出后,写完语法糖直接就输出了,而去掉那句print就会正常
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-13 10:55:06 | 显示全部楼层
有点没懂为啥视频那个例子结果是65,即便是从下往上,它会记住X的值吗,为啥呢,没理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-20 11:52:19 | 显示全部楼层
本帖最后由 涉水鱼 于 2023-12-20 16:36 编辑

好难
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-1-10 08:27:41 | 显示全部楼层
请问为什么装饰器函数一定要是闭包函数呢?
如果装饰器不是闭包函数:
def call_time(func):
    start=
    func()
    stop=
    return print()

@call_time
def myfunc():

然后把设定改为加在myfunc()函数上的@call-time语法糖的实际意思是myfunc()=call_time(func),感觉好像也不影响使用,这是为什么呢,搞不太清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 10:47:18 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-2 12:23:38 | 显示全部楼层
fishcyou 发表于 2022-5-2 19:01
装饰器可以实现在不修改原来代码的前提下增加新功能。

(通过将原来代码作为函数,传入装饰器,返回新的 ...

这里的(msg='A')不理解,为什么要给logger函数的msg参数赋值为‘A’呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-13 20:05:23 | 显示全部楼层
根据进入函数的学习,有点蒙了,特别是装饰器,各个函数之间的调用关系和执行的逻辑有些搞不清楚了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-13 20:08:13 | 显示全部楼层
import time


def delay(func):
    def call_func():
        time.sleep(2)
        func()

    return call_func


def fib():
    back1, back2 = 0, 1

    @delay
    def func():
        nonlocal back1, back2
        back1, back2 = back2, back1 + back2
        print(back1, end=' ')

    return func


def get_fib(n):
    f = fib()
    for i in range(n):
        f()
n = int(input("请输入需要获取的斐波那契数:"))
get_fib()

这个斐波那契数的函数的运行和调用逻辑 一直没搞明白!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-1 00:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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