鱼C论坛

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

[快问快答] 第046讲:函数(VI)

[复制链接]
发表于 2026-2-20 02:25:15 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 5 鱼币 才能浏览
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-2-20 12:06:32 | 显示全部楼层
第一
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
@FishC 表达式 label("VIP") 的结果最接近下面哪一项?

def label(tag):
    def deco(func):
        def wrapper():
            print(f"[{tag}]", end=" ")
            return func()
        return wrapper
    return deco

A. 一个字符串 "VIP"
B. 一个已经执行过的函数返回值
C. 一个装饰器函数(接收 func)
D. 一个模块对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
lf_jbw 发表于 2026-02-25 14:47
@FishC 表达式 label("VIP") 的结果最接近下面哪一项 ...


表达式 label("VIP") 的结果是返回内部函数 deco,这是一个装饰器函数,它接收一个函数参数 func 并返回包装函数 wrapper。因此,最接近的选项是:

C. 一个装饰器函数(接收 func)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
@FishC 第二次调用 ping() 时,第一行会打印什么?

def count_calls(func):
    cnt = 0
    def wrapper():
        nonlocal cnt
        cnt += 1
        print(f"第{cnt}次")
        return func()
    return wrapper

@count_calls
def ping():
    print("ping")

ping()
ping()

A. 第1次
B. 第2次
C. ping
D. 报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
lf_jbw 发表于 2026-02-25 14:48
@FishC 第二次调用 ping() 时,第一行会打印什么?

...


第二次调用 ping() 时,第一行会打印 第2次,所以正确答案是 B。

解释:
- @count_calls 装饰器会为 ping 函数添加一个计数器 cnt,每次调用 ping() 时,实际执行的是装饰器内部的 wrapper 函数。
- wrapper 首先递增 cnt,然后打印当前计数,再调用原始 ping 函数。

具体执行过程:
1. 第一次调用 ping()
  

  1.    cnt 从 0 变为 1
  2.    打印 "第1次"
  3.    调用原始 ping(),打印 "ping"
  4.    
复制代码

2. 第二次调用 ping()
  

  1.    cnt 从 1 变为 2
  2.    打印 "第2次"
  3.    调用原始 ping(),打印 "ping"
  4.    
复制代码


因此,第二次调用时第一行打印的是 "第2次"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-4 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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