luofeiyu_cu 发表于 2014-08-03 15:46

python函数的可变长度参数

def myadd(*tuple):
    sum=0
    for element in tuple:
      sum=sum+element
    return(sum)

上面这个函数很简单,现在我调用它。
myadd(*(1,2,3,4))可以得到结果,我明白。

myadd(1,2,3,4)
为何可以得出10这个结果?
我的理解是根本就不应该接受参数,它根本就不是*args 这样的模式?请多谈谈大道理。

q1208c 发表于 2014-08-04 10:22

小声问一下, *args 这是什么用法呀?

难道是 C 中的指针么? :em03:

icymirror 发表于 2014-08-04 10:55

回复 2# q1208c
*arg:是把对应的参数当作tuple处理
**arg: 是把对应的参数按照dict方式处理

q1208c 发表于 2014-08-04 11:08

回复 3# icymirror

多谢指点. :em02: :em02:
   

icymirror 发表于 2014-08-04 11:16

本帖最后由 icymirror 于 2014-08-04 11:20 编辑

回复 1# luofeiyu_cu
*arg是把对应的所有参数作为一个tuple来处理。引入这个的另外一个原因是为了一定程度的确保输入参数不会被修改。
你使用*()相当于显式的做了处理。
通常情况下,(*arg)相当于是arg = tuple(所有传入的参数)
略具体点的理解可以试下下面的代码:def myTupFun(*arg):
    for item in arg:
      print item
myTupFun()
输出


myTupFun(, )
输出



myTupFun(1, 2, 3, 4)
输出
1
2
3
4

myTupFun((1234))
输出
(1, 2, 3, 4)

luofeiyu_cu 发表于 2014-08-04 21:54

感觉这里没有处理好,语义与语形的关系,用语义来传递这种含义。
严格的说,当你这样定义:

    def myTupFun(*arg):
      for item in arg:
            print item

myTupFun(1,2,3,4) 这样就应当报错,只能这样用myTupFun(*(1,2,3,4) )或者 myTupFun(* ) ,这样才能从形式化方面讲得通,个人坚持认为这是一个小bug.

ssfjhh 发表于 2014-08-05 09:43

回复 6# luofeiyu_cu


    如果这个已经写进手册了,这就是一个特性,而不是一个BUG了。:wink:
页: [1]
查看完整版本: python函数的可变长度参数