标签:默认参数 -- 关键字 return ret 求值 efi 语句 可变对象
在传入参数时有两个特殊参数,*args,**kwargs,功能如下:
def foo(*args, **kwargs): print ‘args = ‘, args print ‘kwargs = ‘, kwargs print ‘---------------------------------------‘ if __name__ == ‘__main__‘: foo(1,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a=1,b=2,c=3) foo(‘a‘, 1, None, a=1, b=‘2‘, c=3)
输出结果如下:
args = (1, 2, 3, 4) kwargs = {} --------------------------------------- args = () kwargs = {‘a‘: 1, ‘c‘: 3, ‘b‘: 2} --------------------------------------- args = (1, 2, 3, 4) kwargs = {‘a‘: 1, ‘c‘: 3, ‘b‘: 2} --------------------------------------- args = (‘a‘, 1, None) kwargs = {‘a‘: 1, ‘c‘: 3, ‘b‘: ‘2‘} ---------------------------------------
也就是说*args是传入一个tuple,*kwargs是传入一个dict。
利用这个特性,我们可以仿造出一个switch关键字来。
python中没有类似
switch():
Case 1:pass
Case 2:pass
这类的switch语句,因此要转换一下。
这里有两种方法
(1) lambda法,适合case是单语句的:
switch={
‘case1‘: lambda: pass,
‘case2‘: lambda: pass,
‘case3‘: lambda: pass
}
switch[‘case1‘]()
(2) dict法,适合case是多行语句或者带参数的:
def switch (case, *args, **kwargs):
def case1(a):
pass
def case2(a,b):
pass
go ={
‘case1‘: case1,
‘case2‘: case2
}
go[case](*args, **kwargs)
switch(case ,args)
关于python的参数还有一点,默认参数只在函数定义(即执行def语句)时被求值一次,以后每次调用函数时都使用以前的值(参考 function definitions)。由此可知,当默认参数的默认值是一个可变对象的时候,如果函数内部对默认参数有修改,就会影响到下一次调用函数时的默认值(一般情况下,这可能不是你想要的行为)。
形如
def fo(a,b=[]):
pass
每次调用fo,b都指向了同一对象
可以这么试验:
def fo(a,b=[]): print(id(b)) fo(1) fo(5) fo(10)
得到的结果都是同样的。
这个特性可以实现这么一个函数,f(3)(2)(1)(0)=6,就是说有这么一个函数f(a)(b)(c)(0)=a+b+c,当传入0时触发。
def fo(a,b=[]): if(a==0): re=sum(b) b.clear() return re else: b.append(a) return fo
标签:默认参数 -- 关键字 return ret 求值 efi 语句 可变对象
原文地址:http://www.cnblogs.com/fsh01/p/7226030.html