见下面代码及注释:
1 def calc(value): 2 sum=0 3 for m in value: 4 sum=sum+m 5 return sum 6 7 data=[1,2,3,4,5,6,7,8,9,10] 8 print(str(calc(data))) 9 print(calc([1,2,3])) 10 print(calc((1,2,3))) 11 #print(calc(1,2,3)) 这句会报错,不过可以用可变参数改造函数calc 12 13 def calc1(*value): 14 sum=0 15 for m in value: 16 sum=sum+m 17 return sum 18 #函数calc1为可变参数 19 print(calc1(1,2,3)) 20 print(calc1()) #甚至还可以零参数调用 21 22 #如果有一个list或者tuple要调用可变参数怎么搞 23 nums=[1,2,3] 24 #print(calc1(nums)) 这句报错: unsupported operand type(s) for +: 'int' and 'list' 25 #像下面这样调用就可以 26 print(calc1(nums[0],nums[1],nums[2])) 27 #也可以这样调用,表示把nums这个list的所有元素做为一个可变参数传递进去 28 print(calc1(*nums)) 29 30 #下面演示关键字参数 31 #关键字参数允许你传入0个或任意个含参数名的参数, 32 # 这些关键字参数在内部自动装为一个dict 33 def person(name,age,**kw): 34 print('name:',name,'age:',age,'other:',kw) 35 36 print(person('刘小勇',30)) 37 print(person('刘小勇',35,city='北京',job='软件工程师')) 38 39 data1={'city':'北京','job':'卖菜'} 40 print(person('刘小能',45,city=data1['city'],job=data1['job'])) 41 print(person('刘小勇',45,**data1)) 42 43 #命名关键字参数 44 def person1(name,age,*,city,job): 45 print(name,age,city,job) 46 47 print(person1("刘小勇",45,city="武汉",job="总统")) 48 #命令关键字参数只接受city,job,下面的调用因此会报错 49 #person1() got an unexpected keyword argument 'bby' 50 #print(person1("lxy",32,bby="kkk",job2="kkk2")) 51 52 #命名关键勃参数还可以有缺省值 53 def person2(name,age,*,city="wuhan",job): 54 print(name,age,city,job) 55 56 print(person2('xly2',23,job='222')) 57 58 #参数组合 59 #5种参数组合,必须按以下列顺序组合 60 #必选参数、默认参数、可变参数/命名关键字参数和关键字参数 61 62 def f1(a,b,c=0,*args,**kw): 63 print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw) 64 def f2(a,b,c=0,*,d,**kw): 65 print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw) 66 67 print(f1(1,2)) 68 print(f1(1,2,c=3)) 69 print(f1(1,2,3,'a','b')) 70 print(f1(1,2,3,'a','b',x=33)) 71 print(f2(1,2,d=99,ext=None)) 72 73 #你甚至可以通过一个tuple和dict调用上面的函数 74 args=(1,2,3,4) 75 kw={'d':99,'x':'#'} 76 print(f1(*args,**kw)) 77 78 args=(1,2,3) 79 kw={'d':88,'x':'#'} 80 print(f2(*args,**kw)) 81 #所以,对于任意函数,都可以通过类似fun(*args,**kw)的形式调用它,无论它的参数 82 #是如何定义的 83 84 #几点总结 85 #默认参数一定要用不可变的对象 86 #*args是可变参数,接受一个tuple或list 87 #**kw是关键字参数,接受一个dict