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

也就是说*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]关于函数传入参数的更多相关文章

  1. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  2. Python进阶-函数默认参数

    Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 ...

  3. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  4. 讲讲python中函数的参数

    python中函数的参数 形参:定义函数时代表函数的形式参数 实参:调用函数时传入的实际参数 列如: def f(x,y): # x,y形参 print(x, y) f(1, 2) # 1, 2 实参 ...

  5. 命令行运行Python脚本时传入参数的三种方式

    原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...

  6. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  7. python函数传入参数(默认参数、可变长度参数、关键字参数)

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...

  8. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  9. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

随机推荐

  1. 【mysql-server】遇到的坑

    一.前提 最近因为工作原因,不得不用windows电脑,发现windows装mysql真的坑太多 23333: 二.环境 windows 环境 mysql 5.7(不建议用5.8坑更多) 三.步骤 3 ...

  2. 关于地形altas的处理

    前几天在群里跟人讨论地形atlas的问题,因为Blade也是用的4x4的atlas(16张纹理),但是大概是几年前做的,所以一些细节忘记了,在这里做下备忘. 1.atlas就是图集,图册,把多个纹理打 ...

  3. Python循环_for&while

    格式:for x in xs['James','Lily','Candy']: print(x) —————————————————————————————————— for循环就是把每个元素代入变量 ...

  4. Cookie 简单设置使用

    cookie的理解可以为,存放在用户浏览器上的一个文件,里面是键值对数据,用于跟服务端通讯.前端可以通过jquery cookie插件设置和读取,后端直接设置 1.获取Cookie: 1 2 3 4 ...

  5. Guava - Ordering

    guava中Ordering类是对Compartor接口的实现,但它也只是一个抽象类. 当调用Ordering.natural()方法时,它就会返回一个NaturalOrdering的对象,Natur ...

  6. [转]Windows 经验集

    Windows Server 2012 R2 显示 这台电脑 图标方法: 来自:https://jingyan.baidu.com/article/f25ef2544f6883482c1b82e5.h ...

  7. JS代码简单一段即可破解QQ空间删除说说

    代码如下: 简单的一段代码即可搞定啦!!是不是很简单! var delay = 1000; function del() { document.querySelector('.app_canvas_f ...

  8. 前端使用nginx 达到前后分离的开发目的

    前言: 由于现在要开发一套基于python 的日志分析系统,设计到日志收集,分析,可视化输出,所以我使用前后端分离的做法.记录学习的过程: 00x1: 下载配置nginx:在E盘创建Service 目 ...

  9. 搭建Mock Server

    1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server. ...

  10. Winform 实现跨线程以及Timer

    https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?redirectedfrom=MSDN&am ...