def func(a=1,b=2,c=3): #形参有默认值
print a,b,c
func()
func(4,5,6)
func(5,6)
func(7)
func(a=8)
func(a=9,b=10)
func(11,c=12) #func(11,a=12)和func(a=12,13)是错误的
def calcSum(*args):#可以接受任意数量的参数
sum=0
for i in args:
sum+=i
print sum
#调用:
calcSum(1,2,3)
calcSum(123,456)
calcSum()
#在变量前加上*,调用时的参数会存储在一个tuple(元组)对象中,赋值给形参。
#在函数内部需要对参数进行处理时,只要对这个tuple类型的形参进行操作就可以了
#因此函数在定义时不需要指明参数个数,就可以处理任意参数个数的情况
#tuple是有序的,所以args中元素的顺序受到赋值时的影响
def printALL(*args):
for i in args:
print i,
print
printALL(1,2,3)
printALL(3,2,1)
#可以按照函数名传递参数,不受位置的限制,也可以像tuple传递一样不受限制
#func2(**kargs)则是把参数以键值对字典的形式传入
def printAll(**kargs):
for k in kargs:
print k,':',kargs[k]#字典是无序的,故在输出的时候,不一定按照提供参数的顺序
#调用时,参数的顺序无所谓,只要对应合适的形参名就可以
printAll(a=1,b=2,c=3)
printAll(x=4,y=5)
#混合的参数调用方式
def func3(x,y=5,*a,**b):
print x,y,a,b
func3(1) #混合使用时,首先注意函数的写法,必须遵守:
func3(1,2) #带有默认值的形参(arg=)须在无默认值的形参之后;
func3(1,2,3) #元组参数(*args)须在带有默认值的形参(arg=)之后;
func3(x=1) #字典参数(**kargs)须在元组参数(*args)之后
func3(x=1,y=1)
func3(x=1,y=1,a=1,b=1) #可以省略某种类型的参数,仍需保证此顺序规则
func3(1,y=1) #调用时遵守
func3(1,2,3,4,a=1) #指定参数名称的参数要在没指定名称的参数之后
func3(1,2,3,4,k=1,t=0,o=3) #不可以重复传递
'''
#函数被调用时,参数的传递过程为:
#1.按顺序把没指定参数的实参赋给形参
#2.把指定参数名称(args=v)的实参赋给对应的形参;
#3.将多余的没指定参数的实参打包成一个tuple传递给元组参数(*args);
#4.将多余的指定参数名的实参打包成一个dict传递给字典参数(**kargs)
'''