Python小程序解析之--函数 powersum

>>> def powersum(power, *args):
...     '''Return the sum of each argument raised to specified power.'''
...     total = 0
...     for i in args:
...          total += pow(i, power)
...     return total
...
>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100
解析:
>>> def powersum(power, *args):
...     '''Return the sum of each argument raised to specified power.'''
函数定义时只有一个行参power,其实参将按位置匹配原则传值
args是用来存储多余的参数,即按位置匹配不上的参数
...     total = 0
...     for i in args:
...          total += pow(i, power)
pow是求幂的函数pow(i, power)是求i的power次方
...     return total
...
>>> powersum(2, 3, 4)
25
实参2按位置匹配给了行参power
3和4按位置匹配不上,因此被作成列表[3, 4]给了args
>>> powersum(2, 10)
100
实参2按位置匹配给了行参power
10按位置匹配不上,因此被作成列表[10]给了args
于*args用法类似的还有**args,但传给*
*args的实参将被作成字典,因此实参传递时会写成foo=bar的形式
例如:
def foo(a, b, c, **args):
        print a, b, c
        for k in args.keys():
               print k, args[k]
foo(1, 2, 3, d=5, e=6, abc='abc')
传实参时foo=bar格式中的foo将被作成字典的key
,并且是字符串类型,而bar则被原样保留
先按位置匹配,多余参数的如果不是foo=bar格式则传给*arg,否则传给**args
例如
def func(a, b, c, *listarg, **dictarg):
        pass
func(1, 2, 3)          # a=1, b=2, c=3, listarg=[], dictarg={}
func(1, 2, 3, 4, 5)  # a=1, b=2, c=3, listarg=[4, 5], dictarg={}
func(1, 2, 3, 4, 5, x=6, y=7, z=8)   # a=1, b=2, c=3, listarg=[4, 5],
dictarg={'x'=6, 'y'=7, 'z'=8}
给函数设计*arg和**args是为了能方便的扩充函数功能,因为这样函数将不受行参个数限制,不论多少个实参都可以成功调用,否则实参必须严格匹配行参才可以调用