转自  http://www.douban.com/note/13413855/

Python中函数参数的传递是通过“赋值”来传递的。但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题”,也就说没有回答怎么赋值的问题。函数参数的使用可以分为两个方面,一是函数参数如何定义,二是函数在调用时的参数如何解析的。而后者又是由前者决定的。函数参数的定义有四种形式:

1. F(arg1,arg2,...)

2. F(arg2=,arg3=...)

3. F(*arg1)

4. F(**arg1)

第1 种方式是最“传统”的方式:一个函数可以定义不限个数参数,参数(形式参数)放在跟在函数名后面的小括号中,各个参数之间以逗号隔开。用这种方式定义的函数在调用的时候也必须在函数名后的小括号中提供相等个数的值(实际参数),不能多也不能少,而且顺序还必须相同。也就是说形参和实参的个数必须一致,而且想给形参1的值必须是实参中的第一位,形参与实参之间是一一对应的关系,即“形参1=实参1 形参2=实参2...”。很明显这是一种非常不灵活的形式。比如:"def addOn(x,y): return x + y",这里定义的函数addOn,可以用addOn(1,2)的形式调用,意味着形参x将取值1,主将取值2。addOn(1,2,3)和addOn (1)都是错误的形式。

第2种方式比第1种方式好一点,在定义的时候已经给各个形参定义了默认值。因此,在调用这种函数时,如果没有给对应的形式参数传递实参,那么这个形参就将使用默认值。比如:“def addOn(x=3,y=5): return x + y”,那么addOn(6,5)的调用形式表示形参x取值6,y取值5。此外,addOn(7)这个形式也是可以的,表示形参x取值7,y取默认值5。这时候会出现一个问题,如果想让x取默认值,用实参给y赋值怎么办?前面两种调用形式明显就不行了,这时就要用到Python中函数调用方法的另一大绝招 ──关健字赋值法。可以用addOn(y=6),这时表示x取默认值3,而y取值6。这种方式通过指定形式参数可以实现可以对形式参数进行“精确攻击”,一个副带的功能是可以不必遵守形式参数的前后顺序,比如:addOn(y=4,x=6),这也是可以的。这种通过形式参数进行定点赋值的方式对于用第1种方式定义的函数也是适用的。

上面两种方式定义的形式参数的个数都是固定的,比如定义函数的时候如果定义了5个形参,那么在调用的时候最多也只能给它传递5个实参。但是在实际编程中并不能总是确定一个函数会有多少个参数。第3种方式就是用来应对这种情况的。它以一个*加上形参名的方式表示,这个函数实际参数是不一定的,可以是零个,也可以是N个。不管是多少个,在函数内部都被存放在以形参名为标识符的tuple中。比如:

对这个函数的调用addOn() addOn(2) addOn(3,4,5,6)等等都是可以的。

与第3种方式类似,形参名前面加了两个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中。这时候调用函数必须采用key1=value1、key2=value2...的形式。比如:

1. def addOn(**arg):

2.     sum = 0

3.     if len(arg) == 0: return 0

4.     else:

5.        for x in arg.itervalues():

6.           sum += x

7.     return sum

那么对这个函数的调用可以用addOn()或诸如addOn(x=4,y=5,k=6)等的方式调用。

上面说了四种函数形式定义的方式以及他们的调用方式,是分开说的,其实这四种方式可以组合在一起形成复杂多样的形参定义形式。在定义或调用这种函数时,要遵循以下规则:

1. arg=必须在arg后

2. *arg必须在arg=后

3. **arg必须在*arg后

在函数调用过程中,形参赋值的过程是这样的:

首先按顺序把“arg”这种形式的实参给对应的形参

第二,把“arg=”这种形式的实参赋值给形式

第三,把多出来的“arg”这种形式的实参组成一个tuple给带一个星号的形参

第四,把多出来的“key=value”这种形式的实参转为一个dictionary给带两个星号的形参。

听起来好复杂,实际是是很简单的。很直观,来看例子:

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

2.     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中函数参数传递的三种方式_python中函数参数传递的几种方法相关推荐

  1. python读取文件的三种方式_python中读取文件的f.seek()方法

    用于二进制文件中 F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 ...

  2. python中判断文件是否存在的三种方式_Python中判断文件是否存在的方法

    Python中判断文件是否存在的方法 发布时间:2020-08-06 11:15:42 来源:亿速云 阅读:58 作者:小新 这篇文章主要介绍Python中判断文件是否存在的方法,文中介绍的非常详细, ...

  3. 用python的五种方式_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  4. python字符串换行的三种方式_python中的字符串内部换行方法

    python中的字符串内部换行方法 python里有两种在字符串内部换行的方式(使用一个print打印多行字符串). 首先使用\n的方法大家肯定都知道了. 然后是使用 ''' 三个单引号大方法. 在交 ...

  5. python下载文件的11种方式_Python 中常见的几种下载文件方法

    下载比较小的文件: # 方法一:使用urllib库 # -*- coding:utf-8 -*- import urllib import time url = 'http://mvideo.spri ...

  6. python获取公网ip的几种方式_python获取外网ip地址的方法总结

    本文实例总结了python获取外网ip地址的方法.分享给大家供大家参考.具体如下: 一.利用脚本引擎库直接获取 import console; import web.script import ine ...

  7. python爬虫有多少种方式_python爬虫-----Python访问http的几种方式

    爬取页面数据,我们需要访问页面,发送http请求,以下内容就是Python发送请求的几种简单方式: 会使用到的库  urllib   requests 1.urlopen import urllib. ...

  8. python函数参数传递的两种方式_Python函数的参数传递方式

    Python函数的参数传递方式 一.普通 def add(a,b): return a+b print(add(1,2)) #输出结果:3 二.可选参数 def myjoin(string,sep=' ...

  9. python函数调用的三种方式_python函数调用的四种方式

    原标题:python函数调用的四种方式 第一种:参数按顺序从第一个参数往后排#标准调用 运行结果: 第二种:#关键字调用 注意:关键调用从哪开始的,从哪以后都必须使用关键字调用除了'*'收集参数.不能 ...

最新文章

  1. 功能分支重新设置后,Git推送被拒绝
  2. Java数据结构和算法:二叉树
  3. Android:打造“万能”Adapter与ViewHolder
  4. 关于web技术的一些见解
  5. 文献记录(part69)--公平性机器学习中基于分类间隔的歧视样本发现和消除算法
  6. java类的实现_java类的实现
  7. 电脑老是弹出vrvedp_m_解答电脑启动项如何设置
  8. hadoop应用开发技术..._Hadoop
  9. VC++动态链接库(DLL)编程(二)--非MFC DLL
  10. 斐波那契数(动态规划和递归)
  11. Delphi Sysem.JSON 链式写法(转全能中间件)
  12. 小程序的网络请求封装
  13. 迷惘_飘云羽逸_新浪博客
  14. 华为交换机ntp自动校时配置
  15. IDEA突然没有SVN了是怎么回事
  16. [SV]SystemVerilog学习笔记之struct union
  17. 论文阅读:Gradient Harmonized Single-stage Detector
  18. 富士康c语言试卷答案,富士康笔试真题分享
  19. 网站盈利模式分析分类——别人的网站是怎么赚钱的
  20. 【D^3CTF】D^3CTF部分题复现

热门文章

  1. 程序员用10分钟写了个旅游管家APP,女友用了直呼贴心
  2. centos7虚拟机联网全过程
  3. Debian9安装与启用sudo命令
  4. C# 自动按比例裁剪去除图片色边(一般是黑边或者白边)
  5. 在浏览器上调试公众号网页的操作流程
  6. 如何添加打印机端口(LPT3)(转)
  7. 2022-2028全球及中国冷凝式即热型热水器行业研究报告
  8. 百度网盘好友发来的文件手动输入JS选择代码批量保存
  9. WiFiManager
  10. 逆水寒服务器列表文件,逆水寒目前服务器