Python中函数的参数传递方式

.普通的参数传递

>>> def add(a,b):return a+b
>>> print add(1,2)
3
>>> print add('abc','123')  <pre name="code" class="python">abc123

2.参数个数可选,参数有默认值的传递

>>> def myjoin(string,sep='_'):return sep.join(string)
>>> myjoin('Test')
'T_e_s_t'
>>> myjoin('Test',';')
'T;e;s;t'                                                                                             >>> def myrange(start=0,stop,step=1):print stop,start,step 

如果一个参数是可选参数 那么它后面所有的参数都应该是可选的,另外 可选参数的顺序颠倒依然可以正确的给对应的参数赋值 但必须清楚的指明变量名和值。

3.个数可变参数

>>> def printf(fmt,*arg):print fmt%arg
>>> printf ('%d is larger than %d',2,1)  2 is larger than 1

函数中的*arg必须是最后一个参数,*表示任意多个参数,*arg会把除了前面以外所有的参数放到一个tuple里面传递给函数,可以在函数中通过arg来访问。

arg是一个tuple,可以通过访问tuple的方法在函数中访问arg。

另一种方式传递任意个数参数是通过dictionary的方式来传递 同样也可以接受多个参数 但是每个参数需要指明名称对应关系比如a=1,b=2,c=3。

>>> def printf(format,**keyword):for k in keyword.keys():print "keyword[%s] %s %s"%(k,format,keyword[k])>>> printf('is',one=1,tow=2,three=3)
keyword[three] is 3
keyword[tow] is 2
keyword[one] is 1

在定义或调用这种函数时,要遵循以下规则:

   1. arg=<value>必须在arg后
   2. *arg必须在arg=<value>后
   3. **arg必须在*arg后

在函数调用过程中,形参赋值的过程是这样的:
首先按顺序把“arg”这种形式的实参给对应的形参
第二,把“arg=<value>”这种形式的实参赋值给形式
第三,把多出来的“arg”这种形式的实参组成一个tuple给带一个星号的形参
第四,把多出来的“key=value”这种形式的实参转为一个dictionary给带两个星号的形参。
听起来好复杂,实际是是很简单的。很直观,来看例子:

 def test(x,y=5,*a,**b):print x,y,a,b

就这么一个简单函数,来看看下面对这个函数调用会产生什么结果:

test(1) ===> 1 5 () {}
test(1,2) ===> 1 2 () {}
test(1,2,3)  ===> 1 2 (3,) {}
test(1,2,3,4) ===> 1 2 (3,4)
test(x=1)   ===> 1 5 () {}
test(x=1,y=1)  ===> 1 1 () {}
test(x=1,y=1,a=1)   ===> 1 1 () {'a':1}
test(x=1,y=1,a=1,b=1)   ===> 1 1 () {'a':1,'b':1}
test(1,y=1) ===> 1 1 () {}
test(1,2,y=1) ===> 出错,说y给赋了多个值
test(1,2,3,4,a=1) ===> 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {'k':1,'t':2,'o':3}

在python中函数参数的定义主要有四种方式:
1.F(arg1,arg2,...)
这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。

例如:

def a(x,y):print x,y

调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。

2.F(arg1,arg2=value2,...)
这种方式就是第一种的改进版,提供了默认值

def a(x,y=3):print x,y

调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。

3.F(*arg1)
上面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。

>>> def a(*x):
if len(x)==0:print 'None'
else:print x
>>> a(1)
(1,)        #存放在元组中
>>> a()
None
>>> a(1,2,3)
(1, 2, 3)
>>> a(m=1,y=2,z=3)
Traceback (most recent call last):
File "<pyshell#16>", line 1, in -toplevel-a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument 'm'

4.F(**arg1)
形参名前加俩个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。

>>> def a(**x):
if len(x)==0:print 'None'
else:print x
>>> a()
None
>>> a(x=1,y=2)
{'y': 2, 'x': 1}      #存放在字典中
>>> a(1,2)            #这种调用则报错
Traceback (most recent call last):
File "<pyshell#25>", line 1, in -toplevel-a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)


Python中函数的参数传递方式相关推荐

  1. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

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

  2. python中可变参数args传入函数时储存的类型是_[转载]Python中函数的参数定义和可变参数*args与**args...

    Python中函数的参数定义和可变参数 *args与**args区别 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和** ...

  3. python中函数的参数

    函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num():a = 11 ...

  4. python怎么理解函数的参数_理解Python中函数的参数

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

  5. 深入解析Python中函数的参数与作用域

    传递参数 函数传递参数时的一些简要的关键点: 参数的传递是通过自动将对象赋值给本地变量名来实现的.所有的参数实际上都是通过指针进行传递的,作为参数被传递的对象从来不自动拷贝. 对于numbers,St ...

  6. python中函数包括参数函数吗_Python中的函数---函数的定义和参数

    本文是廖雪峰教程的笔记. 函数的定义 定义函数时,需要确定函数名和参数个数 def fun(x1,x2,x3):: 如果有必要,可以先对参数的数据类型做检查: 函数体内部可以用return随时返回函数 ...

  7. python中函数的参数_Python小知识-Python中的函数参数(基础篇)

    0 总述 这个题目分为2篇,第一篇基本上是概念以及实例,有个相对系统的认识,第二篇想写的深入一些,不同参数类型的区别以及和c/c++的函数参数对比下异同-下面开始是第一篇的内容啦- Python中的函 ...

  8. Python中函数的参数 * 与 **

    # Python中,形式参数加上 "*" 与 "**",成为动态参数. # -1- "*"表示,函数可以接受多个参数,全部放入一个元祖中. ...

  9. python中函数的参数类型( 位置参数、关键字参数、默认值参数和可变长度参数)

    目录 位置参数: 关键字参数: 默认值参数: 可变长度参数: 1.元组可变长度参数 : 2.字典可变长度参数: 附上练习代码: 位置参数: 实参与形参个数完全相同,按位置按顺序将实参传递给形参 def ...

最新文章

  1. python类_python类和对象
  2. DYNP_VALUES_READ
  3. 如何解决提示the operation % is undefined for the argument type string,int的错误
  4. 第一人称视角获得运动方向和视角的夹角
  5. 使用lua实现nginx rewrite
  6. 分红酒(广度优先搜索)
  7. Javascript隐式数据类型转换(==、+、Object)
  8. go语言的安装、环境变量配置及简单使用
  9. git回退历史版本无法上传_Git实用教程(四) | Git本地库操作(查看提交历史、版本前进回退)...
  10. 硬盘可以分为几类,监控专用硬盘和普通硬盘有什么区别?
  11. 项目开发文档编写规范
  12. Android终端系统APP应用性能测试之响应速度流畅度
  13. Leetcode应该怎么刷?【笔试】
  14. 基于FPGA的光口通信开发案例|基于Kintex-7 FPGA SFP+光口的10G UDP网络通信开发案例
  15. QQ.阿里旺旺.淘宝.在线网页链接代码及详解
  16. 【数据结构与算法】详解什么是栈,并用代码手动实现一个栈结构
  17. IDEA创建applicationContext.xml文件图标不是xml文件图标
  18. ISLR读书笔记(1)统计学习简介
  19. 智汀智能家居知识普及篇——为什么智能家居在国内不温不火?
  20. Python3 Series数据详解

热门文章

  1. 服务器安装Windows Server + Ubuntu双系统
  2. S3C6410 KeyPad驱动(下)
  3. C#对Excel的一些操作【一】
  4. 牛刀小试之Django二
  5. jmeter在linux上运行
  6. Sublime Text 3插件收集
  7. 在做性能测试之前需要知道什么
  8. centos7+samba 安装与调试记录
  9. ARM的嵌入式Linux移植体验之操作系统
  10. SpringBoot常见功能特性分析