为了账号安全,请及时绑定邮箱和手机立即绑定

返回值带参数或者不带参数分别是什么意思?

#-*-coding:utf-8-*-

def my_sum(*args):
   return sum(args)

def my_average(*args):
   return sum(args)/len(args)



def dec(func):

   def in_dec(*args):
       if len(args)==0:
           return 0
       for val in args:
           if not isinstance(val,int):
               return 0
       return func(*args)

   return in_dec

my_new_sum = dec(my_sum)

print my_new_sum(1,2,3,4,5)

在in_dec 函数中,返回值是带*args 的,而dec 函数的返回值是不带参数的,在my_new_sum = dec(my_sum) 中,my_sum 后面也是不能带括号的。自己写的时候,完全不明白什么时候该带参数,什么时候不该带,这分别代表了什么?求大神解答。。。

正在回答

2 回答

调用dec函数时返回的是内部函数in_dec的函数地址(不带参数返回的就是函数地址),直接返回函数地址是为了这个函数的可重用性,以便下一个具有同样性质的函数(例如my_average)也可以进行相同的判断

(先执行in_dec里面的判断,再调用my_sum()函数或者my_average( )函数进行计算)

带了参数值就代表正式调用这个函数。它执行逻辑是 调用dec函数-->返回in_dec地址-->自身就是in_dec了-->执行in_dec里的判断并返回sum()函数对*arg的处理结果。

1 回复 有任何疑惑可以回复我~
#1

慕标9241536

调用过程是,我们调用dec函数,而dec函数的参数是一个函数地址my_new_sum = dec(my_sum),我们就传入一个函数地址作为参数。 而返回的是dec的内嵌函数in_dec函数地址,因此my_new_sum指向的就是in_dec函数(相当于 my_new_sum = in_dec)。 因为in_dec是dec的内嵌函数因为enclosing作用域的关系它保留了my_sum函数的属性。而我们再调用my_new_sum的时候就相当与调用in_dec,而in_dec的虚拟参数是**arg,我们在调用的new_my_sum传入参数即可
2017-09-07 回复 有任何疑惑可以回复我~
#2

慕标9241536

有些啰嗦,总结下来就是。 调用dec的时候传入的是函数地址:my_new_sum = dec(my_sum), 相当于 my_new_sum = in_dec 现在是这样my_new_sum(*arg),你传入实参就ok了,他会对你参数进行判断,并返回给你my_num(*arg)处理过后的值
2017-09-07 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python装饰器
  • 参与学习       50149    人
  • 解答问题       50    个

本门python教程将代领大家轻松搞定Python装饰器运用

进入课程

返回值带参数或者不带参数分别是什么意思?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信