python实参_python的形参和实参

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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

校招碎碎念

前两天拿了去哪儿(Qunar)的offer,不打算接着找了,心累,结束我的校招生涯吧,写写这段时间的经历。 本科生一只,普通一本,非211/985学校,出了省就没人认那种,计算机专业,目…

pyQuery

pyquery – PyQuery complete API 选择器基本支持jQuery用法 class pyquery.pyquery.PyQuery(*args, **kwargs)The main class class FnHook for defining custom function (like the jQuery.fn): >>> fn lambda: this.map(lambda i, el: PyQuery(this).outerHtml())…

python配置pip_Python pip源配置

pipy国内镜像目前有:Win7下配置pip源:1、在win7用户目录下创建pip目录,以用户user为例:C:\Users\user\pip2、在pip目录下新建pip.ini文件:C:\Users\user\pip\pip.ini3、配置文件内容:以下是一个简单的配置示…

Github Pages建立个人博客

使用Github Pages可以建立个人博客。官方教程:https://pages.github.com/步骤(以下步骤中假设用户名为username):1.建立一个项目,项目名为username.github.io2.初始化项目,上传网页代码到github。转载于:ht…

判断该网页是在什么设备打开。

为什么80%的码农都做不了架构师&#xff1f;>>> <script type"text/javascript"> //判断访问终端 var browser{versions:function(){var u navigator.userAgent, app navigator.appVersion;return {trident: u.indexOf(Trident) > -1, //IE内…

python变量和常量_python变量与常量内容:

python变量与常量内容:# 变量&#xff1a;定义世间万物变化的状态height 180weight 140age 18tree_name yuyang# print(180)height 180print(height:, height)weight 140print(weight:, weight)age 18print(age:, age)tree_name yuyangprint(tree_name:, tree_name)# 变量的…

EF二级缓存

https://efcache.codeplex.com/ 转载于:https://www.cnblogs.com/shiningrise/p/5612941.html

python wordpress xmlrpc_python-markdown自动发送wordpress文章(python-xmlrpc-wordpress)

一直热衷使用Markdown&#xff0c;使用了图床&#xff0c;以及多款的MD编辑器。wp的后台太重了&#xff0c;又不想转 hexo git &#xff0c;对于文章上传至博客&#xff0c;总想办法折腾怎么上传wordprss。之前的解决办法就是&#xff0c;直接将MD编辑器生成的html复制到wordp…

Android 5.1 - 状态栏充电标志问题

Android 5.1 Ubuntu14.04 SourceInsigh电量已满&#xff0c;插着USB头&#xff0c;观察Settings - Battery&#xff0c;电量为100%&#xff0c;状态为full&#xff0c;但仍有充电图标rust之前有读过关于StatusBar的代码。这次直接用SourceInsight找到 StatusBarHeaderView.jav…

kail中tools的安装和第一个php学习笔记

安装tools 打开 鼠标右击选择 创建文件夹 mkdir cdrom 把tools文件复制到 位置——计算机——cdrom文件夹下 打开 cdrom cd cdrom 复制生成的目录 解压文件夹&#xff1a;tar zxvf 粘贴目录 回车 ls 复制目录 cd 粘贴目录 ls 复制后缀为pl的目录 ./粘贴目录.d自动下载 Enjoy代表…

面试进阶题集锦-持续更新

面向对象的”六原则一法则” - 单一职责原则&#xff1a;一个类只做它该做的事情。&#xff08;单一职责原则想表达的就是”高内聚”&#xff0c;写代码最终极的原则只有六个字”高内聚、低耦合”&#xff0c;所谓的高内聚就是一个代码模块只完成一项功能&#xff0c;在面向对象…

透明(颜色)渐变背景(颜色透明背景),兼容IE8

filter: progid:DXImageTransform.Microsoft.gradient (GradientType0, startColorstr#00000000, endColorstr#cc000000); -ms-filter: "progid:DXImageTransform.Microsoft.gradient (GradientType0, startColorstr#00000000, endColorstr#cc000000)";一般用filter就…

python pip本地安装包_python-pip install 安装包

python-pip install 安装包国内安装python包&#xff0c;有时会因为网络问题&#xff0c;导致package安装失败&#xff0c;so,换一种方法解决&#xff1b;pip install package_name;(直接安装&#xff1b;推荐使用&#xff0c;但因网络问题&#xff0c;有时安装失败)pip instal…

【CDN】域名无法访问,ping不到,tracert不到

背景&#xff1a;香港服务器&#xff0c;CDN服务商&#xff1a;Incapsula 1、首先猜测&#xff0c;域名是否被墙 原因&#xff1a;ip可以直接访问到网站&#xff0c;其他域名指向服务器也可访问 排查&#xff1a;1&#xff09;首先理解&#xff0c;怎样才算被墙&#xff1a;大陆…

python 库整理_自己整理的PYTHON库

1、操作Excel1)Pylightxl地址&#xff1a;https://pypi.org/project/pylightxl文档&#xff1a;https://pylightxl.readthedocs.io/en/latest/2)Openpyxl地址&#xff1a;https://pypi.org/project/openpyxl/文档&#xff1a;https://openpyxl.readthedocs.io/en/stable/2、操作…

PHP发送邮件

先看一下HTML如何发送邮件 HTML发送邮件首先得使用超链接标签<a> 之后使用mailto:链接收件人邮件地址 用bcc链接发件人邮箱&#xff08;加密抄送&#xff0c;cc为直接抄送&#xff09; mailto 和bcc/cc之间用?连接 subject邮件主题&#xff0c;body邮件内容&#xff0…

node.js 实现扫码二维码登录

最近在做一个扫码登录功能&#xff0c;为此我还在网上搜了一下关于微信的扫描登录的实现方式。当这个功能完成了后&#xff0c;我决定将整个实现思路整理出来&#xff0c;方便自己以后查看也方便其他有类似需求的程序猿些。 要实现扫码登录我们需要解决两个问题&#xff1a; 1.…

喇叭正反相位测试音频_FIR滤波器能给音频扩声带来怎样的帮助?

随着数字音频的快速发展&#xff0c;近些年在音频扩声领域&#xff0c;经常能听到音频技术人士讨论FIR数字滤波器&#xff0c;有些说法和厂家的宣传难免有些过于神化&#xff0c;有些厂家的技术工程师竟然宣称&#xff0c;自己的FIR滤波器能把每只扬声器或者整组扩声系统的相位…

使用c语言easy—x库实现实时钟表

先了解一下easy-x库 EasyX 是针对 C 的图形库&#xff0c;可以帮助 C语言初学者快速上手图形和游戏编程。 可以通过官网下载&#xff0c;文件很小&#xff0c; easy-x的支持头文件是 #include<graphics.h>下载之后双击打开会有所有easy-x函数的语法和作用&#xff0c;中…

java基础—方法重载(overload)

一、方法的重载 方法名一样&#xff0c;但参数不一样&#xff0c;这就是重载(overload)。 所谓的参数不一样&#xff0c;主要有两点&#xff1a;第一是参数的个数不一样&#xff0c;第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。 1 packa…