Python可变长参数

引言

假如我们已经从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】,分享有意思的干货。


这里写图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,387评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,845评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,091评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,308评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,662评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,795评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,008评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,466评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,687评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,181评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,531评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,177评论 3 239
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,126评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,862评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,734评论 2 274

推荐阅读更多精彩内容