跟老齐学Python之变量和参数

那么什么这两个到底有什么区别和联系呢?我在网上搜了一下,发现很多说法,虽然大同小异,但是似乎只有下面这一段来自微软网站的比较高度抽象,而且意义涵盖深远。我摘抄过来,看官读一读,是否理解,虽然是针对vb而言的,一样有启发。

复制代码 代码如下:
参数和变量之间的差异 (Visual Basic)

多数情况下,过程必须包含有关调用环境的一些信息。执行重复或共享任务的过程对每次调用使用不同的信息。此信息包含每次调用过程时传递给它的变量、常量和表达式。

若要将此信息传递给过程,过程先要定义一个形参,然后调用代码将一个实参传递给所定义的形参。 您可以将形参当作一个停车位,而将实参当作一辆汽车。 就像一个停车位可以在不同时间停放不同的汽车一样,调用代码在每次调用过程时可以将不同的实参传递给同一个形参。

形参表示一个值,过程希望您在调用它时传递该值。

立即学习“Python免费学习笔记(深入)”;

当您定义 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(“qiwsir”,”qiwsir.github.io”,”python”)
(‘qiwsir’, ‘qiwsir.github.io’, ‘python’)

>>> foo(“qiwsir”,307,[“qiwsir”,2],{“name”:”qiwsir”,”lang”:”python”})
(‘qiwsir’, 307, [‘qiwsir’, 2], {‘lang’: ‘python’, ‘name’: ‘qiwsir’})

 不管是什么,都一股脑地塞进了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 “”, line 1, in
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(‘qiwsir’,2,”python”)
qiwsir
2
python
()
{}
>>> foo(1,2,3,4,5)
1
2
3
(4, 5)
{}
>>> foo(1,2,3,4,5,name=”qiwsir”)
1
2
3
(4, 5)
{‘name’: ‘qiwsir’}

 很good了,这样就能够足以应付各种各样的参数要求了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2291615.html

(0)
上一篇 2025年2月28日 01:10:20
下一篇 2025年2月25日 15:06:28

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 跟老齐学Python之类的细节

    这几天和几个朋友以各种途径讨论过oop的相关问题,他们是:令狐虫、frank、晋剑、小冯 大家对OOP有不同看法,所谓工程派和学院派看法不一致。从应用的角度看,工程派的观点是值得推荐的,那就是:不用太在意内部是怎么工作的,只要能够解决眼下的…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之重回函数

    函数的基本结构 Python中的函数基本结构: 复制代码 代码如下:def 函数名([参数列表]):     语句  几点说明: •函数名的命名规则要符合python中的命名要求。一般用小写字母和单下划线、数字等组合 •def是函数的开始,…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之大话题小函数(1)

    开篇就要提到一个大的话题:编程范型。什么是编程范型?引用维基百科中的解释: 复制代码 代码如下:编程范型或编程范式(英语:Programming paradigm),(范即模范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之关于类的初步认识

    在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。这些枯燥的属于解释,均来自维基百科。 1、问题空间 问题空间是问题解决者对一个问题所达到的全部认识状…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之让人欢喜让人忧的迭代

    哦,这就是真正牛x的程序员。不过,他也仅仅是牛x罢了,还不是大神。大神程序员是什么样儿呢?他是扫地僧,大隐隐于市。 先搞清楚这些名词再说别的: 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。迭代(it…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之for循环语句

    废话少说,上干活。 for的基本操作 for是用来循环的,是从某个对象那里依次将元素读取出来。看下面的例子,将已经学习过的数据对象用for循环一下,看看哪些能够使用,哪些不能使用。同时也是复习一下过往的内容。 复制代码 代码如下:>&…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之从格式化表达式到方法

    现在我们就格式化方法做一个详细一点的交代。 基本的操作 所谓格式化方法,就是可以先建立一个输出字符串的模板,然后用format来填充模板的内容。 复制代码 代码如下:>>> #先做一个字符串模板>>> t…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之print详解

    eval() 在print干事情之前,先看看这个东东。不是没有用,因为说不定某些时候要用到。 复制代码 代码如下:>>> help(eval)      #这个是一招鲜,凡是不理解怎么用,就用这个看文档 Help on b…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之正规地说一句话

    小孩子刚刚开始学说话的时候,常常是一个字一个字地开始学,比如学说“饺子”,对他/她来讲,似乎有点难度,大人也聪明,于是就简化了,用“饺饺”来代替,其实就是让孩子学会一个字就能表达。当然,从教育学的角度,有人不赞成这种方法。这个此处不讨论了。…

    编程技术 2025年2月28日
    200
  • 跟老齐学Python之玩转字符串(2)更新篇

    上一章中已经讲到连接两个字符串的一种方法。复习一下: 复制代码 代码如下:>>> a= ‘py’>>> b= ‘thon’>>> a+b&…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论