首页 > 试题广场 >

有如下函数定义,执行结果正确的是? def dec(f):

[单选题]
有如下函数定义,执行结果正确的是?
def dec(f):
    n = 3
    def wrapper(*args,**kw):
        return f(*args,**kw) * n
    return wrapper

@dec
def foo(n):
    return n * 2


  • foo(2) == 12
  • foo(3) == 12
  • foo(2) == 6
  • foo(3) == 6
牛客的回答编辑器不知道什么时候才能改改,错误格式和字符乱码简直不忍直视,考虑到下面解析中含有许多特殊符号,只能以图片的形式进行讲解,还请各位见谅!

图片说明

图片说明


本题有关装饰器与函数参数的详细介绍可参考:

如何理解Python装饰器?
Python 装饰器
Python 函数的参数

编辑于 2018-03-29 00:17:40 回复(19)
装饰器,看到f2不执行f,而是将函数f以参数的形式送去到装饰器函数dec中,执行dec中所有东西包括dec中的f2 就可以得到以下结果
发表于 2022-01-30 10:42:29 回复(0)
装饰器将被装饰函数赋值给了装饰函数
发表于 2020-11-13 21:49:08 回复(0)
@dec 装饰器,先执行dec(), 并将 @dec 下面的 函数 作为dec()的参数。 (装饰器的作用:为已经存在的对象添加额外的功能)
foo(n) = n * 2 * 3
发表于 2018-03-05 11:31:24 回复(4)
@修饰符  
                将被修饰的函数作为参数,运行修饰函数
1.先运行被修饰的函数
        n=3
        f * n
2.将被修饰的函数作为参数
        f * 3
3.运行修饰函数
        (2 * 3) * 2

发表于 2018-03-18 22:34:57 回复(6)
*args是非关键字参数,用于元组,**kw是关键字参数,用于字典
发表于 2018-06-26 11:23:48 回复(0)
  1. @funA
  2. @funB
  3. @funC
  4. def fun():
  5. #...
函数如上, 则:  fun = funA( funB ( funC (fun) ) )
编辑于 2020-09-04 22:27:13 回复(0)
都忘记装饰器的使用顺序了。。。
@dec  就相当于在foo函数下执行 语句:foo=dec(foo)
发表于 2018-03-06 20:08:46 回复(0)
调用本质 :原函数名称 = 函数装饰器名称(原函数名称)
调用函数foo(2)执行的过程:2*2*3=12
调用foo(2),执行wrapper(),wrapper()函数调用foo()函数,foo函数的返回值是2*2=4,回到wrapper函数4*3=12,返回值为12。
小tips:把wrapper函数里面return f(*args,**kw) * n ,拆为两步走(先res=f(*args,**kw) * n 再return res),debug看一下执行顺序就知道了。

发表于 2022-03-06 18:51:46 回复(0)
原式等价于dec(foo(2))  继续简化一下就是return 2*2*3  
第一个2就是foo(2)的2,后面的3就是dec里面的n
所以正确答案就是foo(2) = 12      foo(3) = 18
发表于 2019-02-22 19:58:04 回复(0)
python 装饰器就是把某个A函数当做参数传入一个新B函数中。B(A) 。这样给A函数添加了新功能,但同时又没有改动A函数源码,不影响其他函数带调用A函数。(80 条消息) 如何理解Python装饰器? - 知乎 (zhihu.com)
发表于 2022-03-02 20:27:29 回复(0)
闭包-装饰器-装饰器的使用-语法糖@
发表于 2018-05-16 12:50:38 回复(0)
CXM头像 CXM
装饰器。foo(2) = 2 * 2 * 3 = 12
发表于 2018-03-04 18:44:12 回复(0)
a
发表于 2018-03-02 15:45:42 回复(0)
@修饰符  
                将被修饰的函数作为参数,运行修饰函数
1.先运行被修饰的函数
        n=3
        f * n
2.将被修饰的函数作为参数
        f * 3
3.运行修饰函数
        (2 * 3) * 2

发表于 2022-03-30 19:15:26 回复(0)
可以把装饰器想象成洋葱,由近及远对函数进行层层包裹,执行的时候就是拿一把刀从一侧开始切,直到切到另一侧结束。
def test1(func):
    def wrapper(*args, **kwargs):
        print('before test1 ...')
        func(*args, **kwargs)
        print('after test1 ...')
    return wrapper #返回内层函数的引用

def test2(func):
    def wrapper(*args, **kwargs):
        print('before test2 ...')
        func(*args, **kwargs)
        print('after test2 ...')
    return wrapper #返回内层函数的引用

@test2
@test1
def add(a, b):
    print(a+b)

add(1, 2) #正常调用add

输出:
before test2 ...
before test1 ...
3
after test1 ...
after test2 ...
图片理解(参考知乎姜小白):
所以回到本题,foo(2) = (2 * 2) * 3 = 12 ;foo(3) = (3 * 2) * 3 = 18
发表于 2021-11-19 11:54:17 回复(0)
@dec 表示foo=dec(foo)
发表于 2021-03-15 11:03:01 回复(0)
foo(2) == (2*2)*3 == 12
foo(3) == (3*2)*3 == 18


发表于 2018-10-23 21:40:26 回复(0)
def dec(f):
    n = 3

    def wrapper(*args, **kw):
        return f(*args, **kw) * n

    return wrapper


@dec  # 加了装饰器相当于乘以6
def foo(n):
    return n * 2


for i in range(10):
    print(foo(i))
输出结果:
可见,装饰器之效果相当于乘以6
发表于 2018-04-04 18:49:56 回复(0)
装饰器。foo(2) = 3 * 2 * 2 = 12
发表于 2018-03-04 19:36:30 回复(0)