首页 > 代码库 > [python]关于函数传入参数

[python]关于函数传入参数

  

在传入参数时有两个特殊参数,*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

 

[python]关于函数传入参数