免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3398 | 回复: 6
打印 上一主题 下一主题

python函数的可变长度参数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-03 15:46 |只看该作者 |倒序浏览
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 这样的模式?请多谈谈大道理。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-08-04 10:22 |只看该作者
小声问一下, *args 这是什么用法呀?

难道是 C 中的指针么?

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
3 [报告]
发表于 2014-08-04 10:55 |只看该作者
回复 2# q1208c
*arg:是把对应的参数当作tuple处理
**arg: 是把对应的参数按照dict方式处理

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
4 [报告]
发表于 2014-08-04 11:08 |只看该作者
回复 3# icymirror

多谢指点.
   

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
5 [报告]
发表于 2014-08-04 11:16 |只看该作者
本帖最后由 icymirror 于 2014-08-04 11:20 编辑

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

myTupFun([2, 3, 4], [2, 3, 4, 5])
输出
[2, 3, 4]
[2, 3, 4, 5]

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

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

论坛徽章:
0
6 [报告]
发表于 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(*[1,2,3,4] ) ,这样才能从形式化方面讲得通,个人坚持认为这是一个小bug.  

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
7 [报告]
发表于 2014-08-05 09:43 |只看该作者
回复 6# luofeiyu_cu


    如果这个已经写进手册了,这就是一个特性,而不是一个BUG了。:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP