Python可变长参数

作者: 冰不语 | 来源:发表于2018-01-10 16:37 被阅读28次

    引言

    假如我们已经从Excel中读取到了一列数据,比如说是一队人的分数。我们尝试用Python来编写一个求总分的函数。

    如果事先已知人数

    如果人数实现已知,比如说只有两个人的时候,我们可能会编写如下函数:

    def sum1(a,b):
        print('a = ',a)
        print('b = ',b)
        print('sum = ',a+b)
        
    # a = 10
    # sum1(a) # TypeError: sum1() missing 1 required positional argument: 'b'
    # b = 20
    # sum1(a,b)
    

    这个函数的级别等同“hello world“。让我们来看下这个函数的参数。这个函数的这种参数称为必选参数。也就是活,你必须给函数sum1传递两个确定的参数,他才能输出正确结果。如果你只传递了一个,对不起,函数撂挑子不干了。而且会给你拽一句英文:

    TypeError: sum1() missing 1 required positional argument: 'b'

    这里写图片描述

    如果某人分数也已知

    标题中”也“的意思是说,人数已知的同时某人分数也已知,比如为10。这时候也许你会编写出下面这样的函数:

    def sum2(a,b=10):
        print('a = ',a)
        print('b = ',b)
        print('sum = ',a+b)
    

    这个时候,再遇到上一节的只传递一个函数的情况,函数就不会撂挑子了,而是会给出正确结果。

    但是,转折来了:一般情况下,我们很有可能不知道我们到底从excel读取了多少个数据,而且一般数量还还不小,即使知道了也不能用上面的方式去写了。论括号里到底可以写多少个参数??

    可变长参数

    当函数参数不可知的时候,也许,就需要写一个可变长参数的函数了。

    在Python中,有两种可变长常数可选,分别是:

    • 元组变长参数,参数名前面有一个*
    • 字典变长参数,参数名前面有两个*

    我们分别来看一下。

    元组变长参数

    我们用元组变长参数重写一个上面的那个求总分的函数:

    def sum3(*nums):
        print('nums: ',nums)
    
        sum = 0
        for num in nums:
            sum += num
    
        print('sum = ',sum)
        
    a = 11
    b = 22
    c = 33
    sum3(a,b,c)
    

    运行下试试,结果如下:

    nums:  (11, 22, 33)
    sum =  66
    

    可以看到输出的nums是被圆括号包含的三个数字,大家都知道,在Python中圆括号括起来的正是元组tuple(圆括号,元组......感觉名字还挺符合的,都是yuan)。

    不定长参数,没有参数可不可以呢?

    运行sum()试试看。

    输出结果:

    nums:  ()
    sum =  0
    

    字典可变长参数

    我们用字典变长参数重写一个上面的那个求总分的函数:

    def sum4(a=0,**nums):
        print('nums: ',nums)
    
        sum = a
        for key in nums:
            sum += nums[key]
    
        print('sum = ',sum)
        
    sum4(a=11,b=22,c=33)
    

    运行一下,输出结果如下:

    a =  11
    nums:  {'b': 22, 'c': 33}
    sum =  66
    

    可以看到输出的nums是被花括号包含的三个数字,大家都知道,在Python中花括号括起来的正是字典。

    字典可变长参数,或者叫关键字参数,允许你将不定长度的键值对, 作为参数传递给一个函数。

    当然,与元组可变参数一样,这个参数也是可以为空的。

    如果我们按照元组可变长参数的方式给sum4传递参数会发生什么呢?

    比如我们运行下这么一句:

    sum4(a,b,c)
    

    结果函数又撂挑子不干了,而且对你说了一句英语:

    TypeError: sum4() takes from 0 to 1 positional arguments but 3 were given

    这里写图片描述

    公众号【CVPy】,分享有意思的干货。


    这里写图片描述

    相关文章

      网友评论

        本文标题:Python可变长参数

        本文链接:https://www.haomeiwen.com/subject/bnionxtx.html