python 变量和参数
对于变量和参数, x=3中x是变量,它不是参数,但是在函数y=3x+4中,x是变量,也是参数。下面这一段来自微软网站的比较高度抽象,而且意义涵盖深远。
参数和变量之间的差异 (Visual Basic)
多数情况下,过程必须包含有关调用环境的一些信息。执行重复或共享任务的过程对每次调用使用不同的信息。此信息包含每次调用过程时传递给它的变量、常量和表达式。
若要将此信息传递给过程,过程先要定义一个形参,然后调用代码将一个实参传递给所定义的形参。 您可以将形参当作一个停车位,而将实参当作一辆汽车。 就像一个停车位可以在不同时间停放不同的汽车一样,调用代码在每次调用过程时可以将不同的实参传递给同一个形参。
形参表示一个值,过程希望您在调用它时传递该值。
当您定义 Function 或 Sub 过程时,需要在紧跟过程名称的括号内指定形参列表。对于每个形参,您可以指定名称、数据类型和传入机制(ByVal (Visual Basic) 或 ByRef (Visual Basic))。您还可以指示某个形参是可选的。这意味着调用代码不必传递它的值。
每个形参的名称均可作为过程内的局部变量。形参名称的使用方法与其他任何变量的使用方法相同。
实参表示在您调用过程时传递给过程形参的值。调用代码在调用过程时提供参数。
调用 Function 或 Sub 过程时,需要在紧跟过程名称的括号内包括实参列表。每个实参均与此列表中位于相同位置的那个形参相对应。
与形参定义不同,实参没有名称。每个实参就是一个表达式,它包含零或多个变量、常数和文本。求值的表达式的数据类型通常应与为相应形参定义的数据类型相匹配,并且在任何情况下,该表达式值都必须可转换为此形参类型。
这段引文,发现里面有几个关键词:参数、变量、形参、实参。本来想弄清楚参数和变量,结果又冒出另外两个东东,更混乱了。
在Python中,没有这么复杂。
看完上面让人晕头转向的引文之后,再看下面的代码,就会豁然开朗了。
>>> def add(x): #x是参数 ... a = 10 #a是变量 ... return a+x ... >>> x = 3 #x是变量,只不过在函数之外 >>> add(x) #这里的x是参数,但是它由前面的变量x传递对象3 13 >>> add(3) #把上面的过程合并了 13
全局变量和局部变量
下面是一段代码,注意这段代码中有一个函数funcx(),这个函数里面有一个变量x=9,在函数的前面也有一个变量x=2
x = 2 def funcx(): x = 9 print "this x is in the funcx:-->",x funcx() print "--------------------------" print "this x is out of funcx:-->",x
那么,这段代码输出的结果是什么呢?看:
this x is in the funcx:--> 9 -------------------------- this x is out of funcx:--> 2
从输出看出,运行funcx(),输出了funcx()里面的变量x=9;然后执行代码中的最后一行,print "this x is out of funcx:-->",x
特别要关注的是,前一个x输出的是函数内部的变量x;后一个x输出的是函数外面的变量x。两个变量彼此没有互相影响,虽然都是x。从这里看出,两个X各自在各自的领域内起到作用,那么这样的变量称之为局部变量。
有局部,就有对应的全部,在汉语中,全部变量,似乎有歧义,幸亏汉语丰富,于是又取了一个名词:全局变量
x = 2 def funcx(): global x x = 9 print "this x is in the funcx:-->",x funcx() print "--------------------------" print "this x is out of funcx:-->",x
以上两段代码的不同之处在于,后者在函数内多了一个global x,这句话的意思是在声明x是全局变量,也就是说这个x跟函数外面的那个x同一个,接下来通过x=9将x的引用对象变成了9。所以,就出现了下面的结果。
this x is in the funcx:--> 9 -------------------------- this x is out of funcx:--> 9
好似全局变量能力很强悍,能够统帅函数内外。但是,要注意,这个东西要慎重使用,因为往往容易带来变量的换乱。内外有别,在程序中一定要注意的。
不确定参数的数量
在设计函数的时候,有时候我们能够确认参数的个数,比如一个用来计算圆面积的函数,它所需要的参数就是半径(πr^2),这个函数的参数是确定的。
然而,有很多不确定性,那么函数的参数的个数,也当然有不确定性,函数怎么解决这个问题呢?python用这样的方式解决参数个数的不确定性:
def add(x,*arg): print x #输出参数x的值 result = x print arg #输出通过*arg方式得到的值 for i in arg: result +=i return result print add(1,2,3,4,5,6,7,8,9) #赋给函数的参数个数不仅仅是2个
运行此代码后,得到如下结果:
1 #这是函数体内的第一个print,参数x得到的值是1 (2, 3, 4, 5, 6, 7, 8, 9) #这是函数内的第二个print,参数arg得到的是一个元组 45 #最后的计算结果
上面这个输出的结果表现相当不界面友好,如果不对照着原函数,根本不知道每行打印的是什么东西。
从上面例子可以看出,如果输入的参数过多,其它参数全部通过*arg,以元组的形式传给了参数(变量)arg。这里用了一个模糊的词语:参数(变量),这样的表述意思是,在传入数据的前,arg在函数头部是参数,当在函数语句中,又用到了它,就是变量。也就是在很多时候,函数中的参数和变量是不用那么太区分较真的,只要知道对象是通过什么渠道、那个东西传到了什么目标即可。
为了能够更明显地看出args(名称可以不一样,但是符号必须要有),可以用下面的一个简单函数来演示:
>>> def foo(*args): ... print args #打印通过这个参数得到的对象 ... >>> #下面演示分别传入不同的值,通过参数*args得到的结果 >>> foo(1,2,3) (1, 2, 3) >>> foo("hiekay","hiekay.github.io","python") ('hiekay', 'hiekay.github.io', 'python') >>> foo("hiekay",307,["hiekay",2],{"name":"hiekay","lang":"python"}) ('hiekay', 307, ['hiekay', 2], {'lang': 'python', 'name': 'hiekay'})
不管是什么,都一股脑地塞进了tuple中。
除了用args这种形式的参数接收多个值之外,还可以用*kargs的形式接收数值,不过这次有点不一样:
>>> def foo(**kargs): ... print kargs ... >>> foo(a=1,b=2,c=3) #注意观察这次赋值的方式和打印的结果 {'a': 1, 'c': 3, 'b': 2}
如果这次还用foo(1,2,3)的方式,会有什么结果呢?
>>> foo(1,2,3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() takes exactly 0 arguments (3 given)
到这里可能想了,不是不确定性吗?我也不知道参数到底会可能用什么样的方式传值呀,这好办,把上面的都综合起来。
>>> def foo(x,y,z,*args,**kargs): ... print x ... print y ... print z ... print args ... print kargs ... >>> foo('hiekay',2,"python") hiekay 2 python () {} >>> foo(1,2,3,4,5) 1 2 3 (4, 5) {} >>> foo(1,2,3,4,5,name="hiekay") 1 2 3 (4, 5) {'name': 'hiekay'}
很good了,这样就能够足以应付各种各样的参数要求了。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
12月24日云栖精选夜读 | 刚刚,阿里开源首个深度学习框架 X-Deep Learning!
刚刚,阿里妈妈正式对外发布了X-Deep Learning(下文简称XDL)的开源代码地址,开发者们可以在Github上自主下载。 此前,在11月底,阿里妈妈就公布了这项开源计划,引来了业界的广泛关注。 热点热议 刚刚,阿里开源首个深度学习框架 X-Deep Learning! 作者:技术小能手发表在:阿里技术 周博通 | 阿里开源首个 DL 框架、4000台服务器真实数据集;明年1月开源Blink 作者:技术小能手发表在:阿里技术 阿里重磅开源!4000台服务器真实数据集,揭秘世界级数据中心 作者:技术小能手发表在:阿里技术 知识整理 Kubernetes 实战教学,手把手教您运行第一个 Nginx 集群 作者:docker公司 发表在:Docker公司 搭梯子教程(科学上网) —— CentOS7 + SS 作者:小小雁 01.Java基础问题 作者:潇湘剑雨 MyBatis开发框架的四大核心 作者:1208844749354524 02.Java面向对象问题 作者:潇湘剑雨 美文回顾 java之常量折叠 作者:养码青年 SpringBoot(十四)_springboot使用内置定...
- 下一篇
03.Java数据结构问题
目录介绍 3.0.0.1 在arrayList中System.arraycopy()和Arrays.copyOf()方法区别联系?System.arraycopy()和Arrays.copyOf()代码说明? 3.0.0.2 SparseArray基本介绍,相比HashMap为什么性能会好? 3.0.0.3 Arrays和Collections 对于sort的不同实现原理?说一说它们的区别…… 3.0.0.4 Java集合框架中有哪些类?都有什么特点?Java集合的快速失败机制 “fail-fast”? 3.0.0.5 ArrayList,Vector和LinkList的区别,底层分别是怎么实现的,存储空间是如何扩容的?什么是加载因子? 3.0.0.6 如何理解ArrayList的扩容消耗?Arrays.asList方法后的List可以扩容吗?ArrayList如何序列化? 3.0.0.7 如何理解list集合读写机制和读写效率?什么是CopyOnWriteArrayList,它与ArrayList有何不同? 3.0.1.0 HashSet和TreeSet的区别?是如何保证唯一值的,底...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范