python函数的参数传递

前面我们已经学习过了函数的基本知识,下面我们来更深入的学习一下函数内部参数的传递。⑅❛ ᵕ ❛⑅

函数的调用过程

程序调用函数通常需要执行以下四个步骤:
1.调用程序在调用处暂停执行
2.在调用时将实参复制给函数的形参
3.执行函数体语句
4.调用结束,给出返回值,程序回到调用前的暂停处继续执行
还是举我们之前老师的那个例子叭(什么?你不知道老师那个例子是什么例子?难道你不是我的老粉吗?扎心了(・_-。 ))
期中考试过后,班里的成绩出来了,这时辅导员把学习委员叫到了办公室,辅导员想要学习委员了解一下班里(小刘,小王,小魏)的成绩,此时接到任务后学习委员就打开电脑查询他们三个的成绩,并把成绩反馈给辅导员,辅导员决定要不要和他们仨谈话。
其中可以把辅导员看成是调用者,学习委员抽象成用于查询成绩的函数,辅导员(调用者)说出人名(传入参数)然后此时辅导员需要根据成绩来进行是否需要找他们仨谈话的决定,因此需要等一个反馈结果,此时辅导员不决策(程序运行到调用处暂停执行),学习委员开始查询成绩并反馈结果(函数开始执行并且返回结果),接到反馈结果后辅导员开始决定要不要找他们谈话(此时程序返回调用者处接着执行接下来的程序)
不知道这样说我说明白了没有,反正你就是细品,细品,仔细地品( ͡° ͜ʖ ͡°)✧

def search(name1,name2,name3):
    score1=90
    score2=80
    score3=55
    return score1,score2,score3
score=search('小张','小魏','小王')
if score[0]>=60:
    print("小张不叫家长")
else :
    print("小张叫家长")
if score[1]>=60:
    print("小魏不叫家长")
else :
    print("小魏叫家长")
if score[2]>=60:
    print("小王不叫家长")
else :
    print("小王叫家长")

我把上述情景模拟了一下,大家可以康康(◕‿◕✿)


函数的参数传递

可选参数和可变参数
前面我们讲到过许多函数,他们有的参数只有一两个,有的没有参数,有的参数有七八个,那么这七八个参数都要给定才能使用函数吗?那得有多麻烦啊,于是,我们就有了可选参数和可变参数的概念了。
在定义函数时,如果有些参数存在默认值,即部分参数不一定需要调用程序输入,可以在定义函数时直接为这些参数指定默认值,当函数被调用时如果没有传入对应的参数,则可使用默认值代替

def hap_bir(name ,words='birthday'):
    print("happpy {} to {}".format(words,name))
hap_bir('小明')
hap_bir('小赵','New Year')

结果是:
在这里插入图片描述
我们发现第一次调用hap_bir函数时只传入了一个参数’小明’,第二个参数没有传入,默认为设定的birthday。
第二次调用时输入了两个参数’小赵’和’new year’,由于第二个参数已传入,则函数执行时使用传入的第二个参数进行。
这里有一个小细节:(拿小本本记好)
由于传递参数时需要按顺序传入,因此定义参数时,可选参数必须定义在非可选参数后面。

我们在定义参数时也可以定义可变参数,在参数前加*号即可。带有*号的参数必须定义在参数列表的最后,调用时这些参数被当作元组类型传递到函数中:

def sumf(a,*b):
    for i in b:
        a+=i
    return a
s=sumf(1,9,8,7,6,5)
print(s)

在这里,参数调用时,a被赋值为1,b被赋值为元组[9,8,7,6,5]。
你学废了吗


如果我们的函数设计的参数非常多的话,使用者调用起来很麻烦,很可能一不小心就会输入错参数,由于我们的参数需要按顺序传递,所以必须从头开始逐个检查看看哪个参数赋值错误,因此python提供了另一种参数的赋值方法即按照形参的名称输入实参的方法进行传递

def func(x1,y1,z1,x2,y2=2,z2=3):
    return 3
result=func(x1=1,y1=3,z1=4,x2=6)
print(result)

这样输入参数检查的时候就会比较直观,因此在一个函数参数数量非常多的时候我们就会考虑使用按照形参名称的方式来输入。
你get到了吗๑乛◡乛๑


函数的返回值
return语句用来退出函数并将函数返回到被调用的位置继续执行。return语句可以同时将0个或多个运算的结果返回给被调用处的变量。
函数也可以没有return,此时函数并不返回值
例如辅导员让学习委员督促大家好好学习,至于效果如何不需要学习委员反馈。


函数对变量的作用

一个程序中的变量包括两类,一个是全局变量,一个是局部变量,全局变量是指在函数定义之外的变量,局部变量是指在函数内部使用的变量,仅在函数内部有效,当函数退出时,局部变量将不存在。

def func(x1):
    s=0
    s+=x1
    print("函数内部的s是:{}".format(s))
    return s
print(func(3))
print("函数调用完成后s的值是:{}".format(s))

结果为:
在这里插入图片描述
说明我们在使用完一个函数时,其内部定义的变量也消失不见了。
那如果函数内部使用了全局变量呢?

n=3
def func(a,b):
    n=b     #此时n是全局变量
    return a*b
s=func("zzzzz ",6)
print("s的值为:{},n的值为{}".format(s,n))

结果为:
在这里插入图片描述
从结果可以发现,在函数内部n的值确实发生了改变(因为字符串复制了6次)但是调用函数结束以后n的值却没有发生改变。
我们可以理解为在函数内部,它将n=b理解为了把b赋值给一个名为n的局部变量,没错,全局变量在函数内部被当作了局部变量使用。而函数执行结束后,属于这个函数的内存空间被释放,所有变量都消失了,局部变量n也消失了,但是全局变量n并没有消失且值未改变。
那我如果想要函数把n当成全局变量改变n的值我要怎么办嘛(๑>m<๑)。那你告诉函数一声n是全局变量不就得了吗๑乛◡乛๑
我们可以在函数内部通过global关键字进行说明:

n=3
def func(a,b):
    global n #声明n是全局变量
    n=b
    return a*b
s=func('你真棒! ',6)
print("函数执行结果为:{},n的值为:{}".format(s,n))

结果为:
在这里插入图片描述
可以看到声明为全局变量以后,函数内部就不再生成新的局部变量了,因此在函数内部对全局变量的操作就会保存下来,不会因为函数的消失而消失。
什么?为什么全局变量不会消失?因为全局变量占用的存储空间分配时是和整个程序一块分配的,函数定义时会单独分配内存,当函数调用结束时,内存空间被释放,但是此时整个程序并未结束执行,因此全局变量还有内存空间,所以当然不会消失啦(全局变量:明明给我分配的空间还没有被释放你就想让我消失了?٩͡[๏̯͡๏]举手抗议)
值得一提的是列表如果是全局变量的话,你会得到一个神奇的结果
来试试呗

ls=[1,2,3,4,5]
def func(a,b):
    ls.append(b)
    return a*b
a=func(7,9)
print("函数执行的结果是:{},ls的内容是:{}".format(a,ls))

此时你会惊讶的发现,依照我们之前的分析得出结论ls应该不变啊,一顿分析猛如虎,一看结果懵成鼠(别问我为啥是鼠,比较押韵)
在这里插入图片描述

我们之前说过,列表类型只有使用[]对其赋值时才会被真实创建,否则只是对它的一次引用,(参考之前说的购物袋买文具例子)。在func函数内部没有[]对列表赋值,说明列表并没有真实创建,但是执行append操作需要一个真实创建的列表才行,所以此时func函数会去自动关联整个程序,在全局的内存空间中寻找已经真实创建且名为ls的列表,所以在func内部修改ls的值即修改了全局变量ls的值。

简单地说,对于列表类型,函数可以直接使用全局列表而不需要使用global声明。
由于列表是组合类型这一家子的,因此对于组合类型来说,这一点同样适用。
那么你今天学的如何呢 ꒰๑´•.̫ • `๑꒱

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值