欢迎你来到站长学堂,学习站长在线出品的在线课程《零基础 Python完全自学教程》今天给大家分享的是第22课《在Python中函数的参数传递》。本文是一个大课程分成了下面5节小课程:在Python函数中理解形式参数和实际参数、在Python函数中参数传递的位置参数详解、在Python函数中的关键字参数详解、在Python函数中的默认参数详解、在Python函数中的可变参数详解。
22.1、在Python函数中理解形式参数和实际参数
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python函数中理解形式参数和实际参数》。本文的主要内容有:Python中形式参数的概念和特点,Python中实际参数的概念和特点,实际参数的 值传递和引用传递。
我们在上一节课中,讲到了函数的调用。在Python中调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。函数参数在定义函数时放在函数名称后面的一对小括号中:
def a (x):
其中,a是函数名,x是函数参数。
我们先来了解形式参数和实际参数
在使用函数时,经常会用到形式参数和实际参数。两者都叫作参数。
22.1.1、Python中形式参数的概念和特点
概念:在定义函数时,函数名后面括号中的参数为“形式参数”。
特点:形式参数就是变量名。
如:def a(x) 其中x就是形式参数。
22.1.2、Python中实际参数的概念和特点
概念:在调用一个函数时,函数名后面括号中的参数为“实际参数”。也就是将函数的调用者提供给函数的参数称为实际参数。
特点:实际参数就是变量值。
如:def a(‘python’) 其中,python就是实际参数。
22.1.3、实际参数的值传递和引用传递。
根据实际参数的类型不同,可以分为:
22.1.3.1、将实际参数的值传递给形式参数。
22.1.3.2、将实际参数的引用传递给形式参数。
其中:
当实际参数为不可变对象时,进行的是值传递;
当实际参数为可变对象时,进行的是引用传递。
实际上,值传递和引用传递的基本区别就是:
进行值传递后,改变形式参数的值,实际参数的值不变;
进行引用传递后,改变形式参数的值,实际参数的值也一同改变。
例如,定义一个名称为demo的函数,然后为demo()函数传递一个字符串类型的变量作为参数(代表值传递),并在函数调用前后分别输出该字符串变量,再为demo()函数传递一下列表类型的变量作为参数(代表引用传递),并在函数调用前后分别输出该列表。 代码如下:
#定义函数
def demo(obj):
print("原值:",obj)
obj += obj
#调用函数
print("=========值传递========")
mot="人生苦短,我用Pyhon。"
print("函数调用前:",mot)
demo(mot)
#采用不可变对象--字符串
print("函数调用后: ",mot)
print("=========引用传递========")
#采用 可变对象--列表
list1 =["优雅","明确","简单"]
print("函数调用前: ",list1)
demo(list1)
print("函数调用后: ",list1)
运行代码如下:
=========值传递========
函数调用前: 人生苦短,我用Pyhon。
原值: 人生苦短,我用Pyhon。
函数调用后: 人生苦短,我用Pyhon。
=========引用传递========
函数调用前: ['优雅', '明确', '简单']
原值: ['优雅', '明确', '简单']
函数调用后: ['优雅', '明确', '简单', '优雅', '明确', '简单']
>>>
从上面的执行结果中可以看出,在进行值传递时,改变形式参数的值后,实际参数的值不改变;在进行引用传递时,改变形式参数的值后,实际参数的值也发生改变。
函数定义时参数列表中的参数就是形式参数,而函数调用时传递进来的参数就是实际参数。
就像剧本选主角一样,剧本的角色相当于形式参数,而演角色的演员就相当于实际参数。
22.2、在Python函数中参数传递的位置参数详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python函数中参数传递的位置参数详解》。本文的主要内容有:实参和形参数量必须与定义时一致和实参和形参位置必须与定义时一致。
位置参数,有时也称必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。
22.2.1.实参和形参数量必须与定义时一致
在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则将抛出TypeError异常,提示缺少必要的位置参数。如:
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print (str)
return
# 调用 printme 函数,不加参数会报错
printme()
运行结果为:
Traceback (most recent call last):
File "D:\Python\Python310\Doc\000.py", line 8, in
printme()
TypeError: printme() missing 1 required positional argument: 'str'
>>>
22.2.2、实参和形参位置必须与定义时一致
在调用函数时,指定的实际参数的位置必须与形式参数的位置一致,否则将产生以下两种结果。
22.2.2.1、抛出TypeError异常
抛出异常的情况主要是因为实际参数的类型与形式参数的类型不一致,并且在函数中,这两种类型不能正常转换。如:
def div (height,width):
return height*width/2
print(div("站长在线",3))
运行结果:
Traceback (most recent call last):
File "D:\Python\Python310\Doc\000.py", line 3, in
print(div("站长在线",3))
File "D:\Python\Python310\Doc\000.py", line 2, in div
return height*width/2
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>>
22.2.2.2、产生的结果与预期不符
站长在线提醒你:由于调用函数时,传递的实际参数的位置与形式参数的位置不一致时并不会总是抛出异常,所以在调用函数时一定要确定好位置,否则产生Bug,还不容易被发现。
例如,设计一个求梯形面积的函数,并利用此函数求上底为 4cm,下底为 8cm,高为 5cm 的梯形的面积。但如果交互高和下低参数的传入位置,计算结果将导致错误:
def area(upper_base,lower_bottom,height):
return (upper_base+lower_bottom)*height/2
print("正确结果为:",area(4,8,5))
print("错误结果为:",area(4,5,8))
运行结果为:
正确结果为: 30.0
错误结果为: 36.0
>>>
22.3、在Python函数中的关键字参数详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python函数中的关键字参数详解》。本文的主要内容有:关键字参数的含义和关键字参数的应用举例。
22.3.1、关键字参数的含义:
关键字参数是指使用形式参数的名字来确定输入的参数值。
通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确即可。这样可以避免用户需要牢记参数位置的麻烦,使得函数的调用和参数传递更加灵活方便。
22.3.2、关键字参数的应用举例:
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
例如:定义一个同学的语文,数学,英语的成绩,并且输出他的成绩,
#可写函数说明
def chengji(yuwen,shuxue,yingyu):
"打印任何传入的字符串"
print ("语文: ",yuwen)
print ("数学: ",shuxue)
print ("英语: ",yingyu)
return
#调用chengji函数
chengji(shuxue=98,yingyu=90,yuwen=92)
运行结果为:
语文: 92
数学: 98
英语: 90
>>>
从上面的结果中可以看出,虽然在指定实际参数时,顺序与定义函数时不一致,但是运行结果与预期是一致的。
22.4、在Python函数中的默认参数详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python函数中的默认参数详解》。本文的主要内容有:默认参数的概念和默认参数的示例、默认参数不能设置可变对象。
在调用函数时如果不指定某个参数,Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值。
22.4.1、默认参数的概念
默认参数也叫参数的默认值,即在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,则直接使用定义函数时设置的默认值。
定义带有默认值参数的函数的语法格式如下:
def functionname(...,[parameter1 = defaultvalue1]):
[functionbody]
其中,相关参数说明如下:
functionname:函数名称,在调用函数时使用;
parameter1 = defaultvalue1:可选参数,用于指定向函数中传递的参数,并且为该参数设置默认值为defaultvalue1;
functionbody:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。
当然,上面的内容也可以使用中文说明:
def 函数名(...,形参名,形参名=默认值):
代码块
站长在线特别提醒:在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
22.4.2、默认参数的示例
例如:定义一个同学的语文,数学,英语的成绩,并且输出他的成绩,
#可写函数说明
def chengji(shuxue=98,yingyu=90,yuwen=92):
"打印任何传入的字符串"
print ("语文: ",yuwen)
print ("数学: ",shuxue)
print ("英语: ",yingyu)
return
#调用chengji函数
chengji(shuxue=100,yingyu=100,yuwen=100)
print("----------")
chengji(shuxue=80,yingyu=80)
运行结果如下:
语文: 100
数学: 100
英语: 100
----------
语文: 92
数学: 80
英语: 80
>>>
从上面的运行结果可以看出,我们对上面的成绩定义了两次,第一次全部定义为100分,结果显示为100分,第二次定义了两个80分的,有一个没有定义,就调用了默认参数了。
Pyhton 中,可以使用“函数名.__defaults__”查看函数的默认值参数的当前值,其返回值是一个元组。以本节中的 chengji() 函数为例,在最后一行代码后面添加如下代码:
print(chengji.__defaults__)
运行以后,结果为:
语文: 100
数学: 100
英语: 100
----------
语文: 92
数学: 80
英语: 80
(98, 90, 92)
>>>
22.4.3、默认参数不能设置可变对象
使用可变对象作为函数参数的默认值时,多次调用可能会导致意料之外的情况。例如,编写一个名称为demo()的函数,并为其设置一个带默认值的参数,代码如下:
def demo(a=[]): # 定义函数并为参数a指定默认值
print("a的值: ",a)
a.append(1)
调用demo()函数,代码如下:
def demo(a=[]): # 定义函数并为参数a指定默认值
print("a的值: ",a)
a.append(1)
demo() # 调用demo()函数
将显示以下结果:
a的值: []
连续两次调用demo()函数,并且都不指定实际参数,代码如下:
def demo(a=[]): # 定义函数并为参数a指定默认值
print("a的值: ",a)
a.append(1)
demo() # 调用demo()函数
demo() # 调用demo()函数
将显示以下结果:
a的值: []
a的值: [1]
>>>
从上面的结果看,这显然不是我们想要的结果。为了防止出现这种情况,最好使用None作为可变对象的默认值,这时还需要加上必要的检查代码。修改后的代码如下:
def demo(a=None):
if a==None:
a=[]
print("a的值: ",a)
a.append(1)
demo()
demo()
运行结果如下:
a的值: []
a的值: []
>>>
上面的问题,就告诉我们:定义函数时,为形式参数设置默认值要牢记一点:默认参数必须指向不可变对象。
22.5、在Python函数中的可变参数详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python函数中的可变参数》。本文的主要内容有:可变参数的定义、带一个星号*的可变参数和带两个星号**的可变参数。
我们在上一节内容《在Python函数中的默认参数详解》中,提到了默认参数不能设置可变对象。这一节内容,我们就来专门讲讲可变参数。
22.5.1、可变参数的定义
可变参数也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个甚至任意个。
定义可变参数时,主要有两种形式,一种是带一个星号的*,另一种是带两个星号的**。下面分别进行介绍。
22.5.2、带一个星号*的可变参数
一个星号:函数可以接收任意个数的参数,只需要在形参前面加一个*(星号),一个星号形参的函数会把多个位置参数值当成元祖的形式传入,也就是传入的多个参数值可以在函数内部进行元祖遍历。
例如,定义一个函数,让其可以接收多个实际参数,代码如下:
def kecheng(*jianzhan): # 定义输出建站课程的函数
"打印任何传入的参数"
print ("\n要学习的建站课程有: ")
for item in jianzhan:
print (item) # 输出建站课程的内容
# 调用kecheng 函数3次,分别指定不同多个实际参数
kecheng('html','CSS','JavaScript')
kecheng('php','MySQL')
kecheng('Thinkphp')
运行上面的代码如下:
要学习的建站课程有:
html
CSS
JavaScript
要学习的建站课程有:
php
MySQL
要学习的建站课程有:
Thinkphp
>>>
如果使用,一个已经存在的列表作为函数的可变参数,可以在列表的名称前加“*”。例如下面的代码:
def kecheng(*jianzhan): # 定义输出建站课程的函数
"打印任何传入的参数"
print ("要学习的建站课程有: ")
for item in jianzhan:
print (item) # 输出建站课程的内容
jianzhan = ['HTML','CSS','JavaScript'] # 定义一个列表
kecheng(*jianzhan) # 通过列表指定函数的可变参数
运行结果如下:
要学习的建站课程有:
HTML
CSS
JavaScript
>>>
22.5.3、带两个星号**的可变参数
两个星号:形参前面加两个*(星号),注意是两个星号哦,两个星号形参的函数会把关键字参数值当成字典的形式传入,在函数内部会把关键字参数当成字典在函数内部进行遍历。
例如,定义一个函数,让其可以接收任意多个显式赋值的实际参数,代码如下:
def chengji(**chengji): # 定义输出课程和成绩的函数
print () # 输出一个空行
for key ,value in chengji.items(): # 遍历字典
print(key,"的成绩是:",value) # 输出组合后的信息
调用两次chengji()函数,代码如下:
def chengji(**chengji): # 定义输出课程和成绩的函数
print () # 输出一个空行
for key ,value in chengji.items(): # 遍历字典
print(key,"的成绩是:",value) # 输出组合后的信息
chengji(语文=92,数学=98,英语=90)
chengji(历史=88,地理=90)
运行结果如下:
语文 的成绩是: 92
数学 的成绩是: 98
英语 的成绩是: 90
历史 的成绩是: 88
地理 的成绩是: 90
>>>
同理,如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加“**”。例如下面的代码:
def chengji(**chengji): # 定义输出课程和成绩的函数
print () # 输出一个空行
for key ,value in chengji.items(): # 遍历字典
print(key,"的成绩是:",value) # 输出组合后的信息
dict1 = {'语文':92,'数学':98,'英语':90} # 定义一个字典
chengji(**dict1) # 通过字典指定函数的可变参数
上述代码调用了chengji()函数后,运行结果如下:
语文 的成绩是: 92
数学 的成绩是: 98
英语 的成绩是: 90
>>>
到此为止,在Python中函数的参数传递中的在Python函数中理解形式参数和实际参数、在Python函数中参数传递的位置参数详解、在Python函数中的关键字参数详解、在Python函数中的默认参数详解、在Python函数中的可变参数详解。就讲解完毕了。
相关阅读:
《零基础Python完全自学教程》目录
1、认识python
2、安装python及写第一个Python程序
3、Python开发工具介绍
4、Python语法特点
5、Python中的变量
6、Python中的基本数据类型
7、Python中的基本输入和输出
8、Python中常用的运算符
9、Python中运算符的优先级和条件表达式
10、Python中的三大程序结构
11、Python中的选择语句
12、Python中的循环语句
13、Python中的break语句、continue语句和pass语句
14、Python中的序列知识详解
15、Python中的列表
16、Python中的元组系列知识
17、Python中的字典完全解读
18、Python中的集合完全解读
19、Python中字符串完全解读
20、Python中使用正则表达式完全解读
21、Python中函数的创建和调用
22、在Python中函数的参数传递
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~