python函数的参数匹配
版本:一般用python2.7.6
python3.4.3会标注
1、不可变对象(整数、字符串)通过对象引用进行传递,在函数内部不可改变。
1 >>> def f(a): 2 ... a=100 3 ... 4 >>> b=88 5 >>> f(b) 6 >>> b 7 88
2、可变对象(列表、字典)也是通过对象引用进行传递,在函数内部可以改变。(原对象本地改变,但是重新赋值不会改变)
1 >>> def F(a): 2 ... a=[1,2,3] 3 ... 4 >>> b=[] 5 >>> F(b) 6 >>> b 7 []
1 >>> def F(a): 2 ... a.append(3) 3 ... 4 >>> F(b) 5 >>> b 6 [3]
3、参数匹配
默认参数和关键字参数
1 >>> def F(a): 2 ... a.append(3) 3 ... 4 >>> F(b) 5 >>> b 6 [3] 7 >>> 8 KeyboardInterrupt 9 >>> def F(a,b,c): 10 ... print(a,b,c) 11 ... 12 >>> F(1,2,3) 13 (1, 2, 3) 14 >>> F(c=3,a=1,b=2) 15 (1, 2, 3) 16 >>> def F(a,b=2,c=3): 17 ... print(a,b,c) 18 ... 19 >>> F(1,4) 20 (1, 4, 3)
4、任意参数匹配
*和**支持任意数目的参数
*把参数收集到一个元组。
1 >>> def F(*arges): 2 ... print (arges) 3 ... 4 >>> F(1,'a',['2',3],{'a':1,'b':2}) 5 (1, 'a', ['2', 3], {'a': 1, 'b': 2})
**只对关键字参数有效,将关键字参数传递给一个字典,之后可以用字典进行处理。
1 >>> def F(**arges): 2 ... print(arges) 3 ... 4 >>> F() 5 {} 6 >>> F(a:1) 7 File "<stdin>", line 1 8 F(a:1) 9 ^ 10 SyntaxError: invalid syntax 11 >>> F(a=1,b=2) 12 {'a': 1, 'b': 2} 13 >>> F(1=a,2=b) 14 File "<stdin>", line 1 15 SyntaxError: keyword can't be an expression 16 >>> F('1'=a,'2'=b) 17 File "<stdin>", line 1 18 SyntaxError: keyword can't be an expression 19 >>> F(1='a',2='b') 20 File "<stdin>", line 1 21 SyntaxError: keyword can't be an expression 22 >>> F('a'=1,'b'=2) 23 File "<stdin>", line 1 24 SyntaxError: keyword can't be an expression 25 >>> F(a=1,b=2) 26 {'a': 1, 'b': 2} 27 >>> F(a=[1],b=2) 28 {'a': [1], 'b': 2} 29 >>>
可以传递多个参数的形式
1 >>> def F(*a,**b): 2 ... print (a,b) 3 ... 4 >>> F(1,'a',[3,3],x=1,y='e') 5 ((1, 'a', [3, 3]), {'y': 'e', 'x': 1})
1 >>> def F(a,*b,**c): 2 ... print(a,b,c) 3 ... 4 >>> F('s','s','s',s='s') 5 ('s', ('s', 's'), {'s': 's'}) 6 >>>
上面第二个和第三个‘s'被收集到一个元组
只能用关键字的参数(python3以上)
1 >>> def F(a,*b,c): 2 ... print (a,b,c) 3 ... 4 >>> F(1,2,'a',c=3) 5 1 (2, 'a') 3
1 >>> def F(a,*,b,c): 2 ... print (a,b,c) 3 ... 4 >>> F(1,b='a',c=3) 5 1 a 3
第一个例子*b后的关键字c必须使用c=3等式方式赋值
第二个例子*后的b和c必须使用等式赋值的方式