Python中不定长参数

测试输入如下,一个tuple,一个dict

lls = (78, 'stupid')
dds = dict(k1=1, k2=2, k3=3, name='stupid', num=76)

元组传入固定参数函数

通过*拆包

def unpack(num, word):
    print('hope num...{}'.format(num))
    print('hope stupid..'+word)
    
unpack(*lls)

输出如下:

hope num...78
hope stupid..stupid



不定长参数*args

传入元组时仍当作单个参数处理,同上拆包

def unpack2(*content):
    print(repr(content))
    print(', '.join('hope num...{}'.format(num) for num in content))
    unpack2(lls)#((78, 'stupid'),)

值得注意的是

    #unpack2(*lls, 96) #SyntaxError: only named arguments may follow *expression
    unpack2(96, *lls) # 拆包符号仅能作最后一个参数
    unpack2(*(lls+(1,))) #Solution

引用StackOverFlow的一篇回答

只允许星号表达式作为参数列表中的最后一项。这将简化拆包代码,并使得允许将星号表达式分配给一个迭代器。这种行为被拒绝了,因为这太令人吃惊了。(违反了'最少惊讶原则')

但这种情况只会出现在Python2中。
Python3有“仅限关键字参数”
>>> def f(a, *, b):
··· return a, b
···
>>> f(1, b=2)
(1,2)


不定长参数/dict的拆包表达式:**args

**dict将每个键值对元素作为单个元素作为参数传入。

**dict放在形式参数末尾,键值对与其他形式参数名匹配,剩余的存入形参dict。

def depack(func):
    def unpack3(name, num, **content):
        print(repr(content)) #{'k3': 3, 'k2': 2, 'k1': 1}
        print(', '.join(name*time for name,time in content.items())) #k3k3k3, k2k2, k1
        func(num, name)
    return unpack3

@depack
def unpack(num, word):
    print('hope num...{}'.format(num)) #hope num...76
    print('hope stupid..'+word) #hope stupid..stupid

unpack(**dds)

输出如下:

{'k3': 3, 'k2': 2, 'k1': 1}
k3k3k3, k2k2, k1
hope num...76
hope stupid..stupid

end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 5,934评论 0 3
  • 两本不错的书: 《Python参考手册》:对Python各个标准模块,特性介绍的比较详细。 《Python核心编程...
    静熙老师哈哈哈阅读 8,623评论 0 80
  • 昨宵难寐东窗倚,愁恨东风,愁恨东风,不送思情至帐中。 沧桑阅尽红尘里,惟愿相逢,惟愿相逢,又恐相逢是梦中。
    戚北林阅读 1,768评论 0 0
  • 夏季,比起酷热难耐的白昼更喜欢微风徐徐的夜晚。窝在沙发里,闭着眼睛,四肢摊开,就那么静静躺着… 对于驾校教练这一职...
    Shero栗子阅读 1,768评论 0 0
  • 《你人生最重的枷锁是什么》 一 放弃部分安全感的有3个 《1 放弃求全,深入聚焦 现在是资讯爆炸的时代,人也没有那...
    剑有偏锋阅读 1,306评论 0 1