IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python函数参数传递 -> 正文阅读

[Python知识库]Python函数参数传递


一、前言

??在调用函数时,大多数情况下,主调函数和被调函用之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。

??函数参数在定义函数时放在函数名称后面的一对小括号中,如图所示:
在这里插入图片描述


二、了解形式参数和实际参数

??在使用函数时,经常会用到形式参数(形参)和实际参数(实参)。两者都叫做参数二者之间的区别先通过形式参数和实际参数的作用来进行讲解,再通过比喻进行理解。


1.通过作用理解

??形式传参和实际参数在作用上的区别如下:

  • 形式传参:在定义函数时,函数名后面括号中的参数为“形式参数”,也称形参。
  • 实际参数:在调用一个函数时,函数名后面括号中的参数为“实际参数”。也就是将函数的调用者提供给函数的参数称为实际参数,也称为实参。
    在这里插入图片描述

??根据实参的类型不同,可以分为将实参的值传递个形参,和将实参的引用传递给形参两种情况。

  • 当实参为不可变对象时,进行的是值传递
  • 当实参为可变对象时,进行的是引用传递

??值传递和引用传递的基本区别:

  • 进行值传递后,改变形参的值,实参的值不变
  • 进行引用传递后,改变形参的值,实参的值也一同改变

实例:

# 定义函数
def demo(obj):
    print("原值:", obj)
    obj += obj


# 调用函数
print("==========值传递==========")
mot = "唯有在被追赶的时候,你才能真正地奔跑"
print("函数调用前:", mot)
demo(mot)  # 采用不可变对象-字符串
print("函数调用后:", mot)

print("==========引用传递==========")
list1 = ["小白", "小名", "小红"]
print("函数调用前:", list1)
demo(list1)  # 采用可变对象-列表
print("函数调用后:", list1)

??运行结果如下:
在这里插入图片描述


2.通过比喻来理解形参和实参

??函数定义时参数列表中的参数就是形参,而函数调用时传递进来的参数就是实参,就像剧本选主角一样,剧本的角色相对于形参,而演角色的演员就相对于实参。


三、位置参数

??位置参数也称必备参数,必须按照正确的顺序传到函数中。即调用时的数量和位置必须和定义时是一样的。


1.数量必须与定义时一致

??在调用函数时,指定的实参数量必须与形参一致,否则将抛出TypeError异常,提示缺少必要的位置参数。

??例如:定义一个函数def fun_bmi(person, height, weight),该函数中有3个参数,但调用时只传两个参数,如下代码所示:

def fun_bmi(person, height, weight):
    """
    功能:根据身高和体重计算BMI指数
    :param person: 姓名
    :param height: 身高,单位:米
    :param weight: 体重,单位:千克
    """
    print(person + "的身高:" + str(height) + "米\t 体重:" + str(weight) + "千克")
    bmi = weight / (height * height)  # 用于计算BMI指数,公式为“体重/身高的平方”
    print(person + "的BMI指数为:" + str(bmi))

    # 判断身材是否合理
    if bmi < 18.5:
        print("您的体重过轻")
    if 18.5 <= bmi < 24.9:
        print("正常范围,注意保持")
    if 24.9 <= bmi < 29.9:
        print("您的体重过重")
    if bmi > 29.9:
        print("肥胖")


fun_bmi("路人甲", 183)

??运行结果如下:
在这里插入图片描述
??如上图所示,抛出TypeError,具体意思是“fun_bmi()方法缺少一个必要的位置参数weight”。


2.位置必须与定义时一致

??在调用函数时,指定的实参位置与形参的位置一致,否则将产生一下两个结果:

  • 抛出TypeError异常
  • 产生结果与预期不符的问题

??抛出异常的情况主要是因为在调用函数时,如果指定的实参与形参的位置不一致,但是他们的类型一致,那么就不会抛出异常,而是产生结果与预期不符的问题。

例如,下列代码:

def fun_bmi(person, height, weight):
    """
    功能:根据身高和体重计算BMI指数
    :param person: 姓名
    :param height: 身高,单位:米
    :param weight: 体重,单位:千克
    """
    print(person + "的身高:" + str(height) + "米\t 体重:" + str(weight) + "千克")
    bmi = weight / (height * height)  # 用于计算BMI指数,公式为“体重/身高的平方”
    print(person + "的BMI指数为:" + str(bmi))

    # 判断身材是否合理
    if bmi < 18.5:
        print("您的体重过轻")
    if 18.5 <= bmi < 24.9:
        print("正常范围,注意保持")
    if 24.9 <= bmi < 29.9:
        print("您的体重过重")
    if bmi > 29.9:
        print("肥胖")
        
fun_bmi("路人甲", 60, 183)

??运行结果如下:
在这里插入图片描述
??函数调用后,没有抛出异常,但是从结果看,产生结果与预期结果不一致。


四、关键字参数

??关键字传参是指使用形参的名字来确定输入的参数。通过该方式指定实参时,不需要与形参位置一致,只要参数名称写正确即可。

??例如:调用def fun_bmi(person, height, weight)函数,通过关键字传参,代码如下:

fun_bmi(height=1.83, weight=60, person="路人甲")

??调用函数,将显示如下结果:
在这里插入图片描述

??从上面结果可以看出,虽然指定实际传参时,顺序与函数定义时不一致,但是运行结果与预期结果是一致的。


五、为参数设置默认值

??调用函数时,如果没有指定某个参数将抛出异常,即在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,则直接使用定义函数时设置的默认值。语法格式如下:

def functionname(...,[parameter1 = defaultvalue1]):
	[functionbody]

参数说明:

  • functionname:函数名称,在调用时使用
  • parameter1 = defaultvalue1:可选参数,用于指定向函数中传递的出纳室,并且为该参数设置默认值为defaultvalue1
  • functionbody:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码

注意:在定义函数时,指定默认的形参必须在所有参数的最后,否则将产生语法错误。


??使用可变对象作为函数参数的默认值时,多次调用可能会导致意料之外的情况,例如,编写一个名称为demo()的函数,并为其设置一个带默认值的参数,代码如下:

def demo(obj=[]):
    print("obj的值:", obj)
    obj.append(1)

??调用demo()函数,代码如下:

demo() # 调用函数

??将显示以下结果:
在这里插入图片描述
??连续两次调用,并不指定实际参数,代码如下:

demo() # 调用函数
demo() # 调用函数

??将显示以下结果:
在这里插入图片描述
??从上面结果看,这显然不是我们想要的结果,为了防止出现这种情况,最好使用Nome作为可变对象的默认值,这时还需要代码检查。修改后的代码如下:

def demo(obj=None):  # 定义一个函数
    if obj == None:  # 判断是否为空
        obj = []
    print("obj的值:", obj)  # 输出obj值
    obj.append(1)  # 连续调用并输出

??这时在连续两次调用函数demo()函数,将显示以下运行结果:
在这里插入图片描述


六、可变参数

??定义可变参,主要有两个形式:

  • *parameter
  • **parameter

1.*parameter

??这种形式表示接收任意多个实际参数并将放到一个元组中。例如,定义一个函数,让其可以接收任意多个实际参数,代码如下:

def printplayer(*name):  # 定义输出我喜欢的NBA球员的函数
    print("\n我喜欢的NBA球员有:")
    for item in name:
        print(item)  # 输出球员名称

??调用3次上面的函数,分别指定不同个数的实际参数,代码如下:

printplayer("小红")
printplayer("小红", "小白")
printplayer("小红", "小白", "小明")

??执行结果如下:
在这里插入图片描述


2.**parameter

??这个形式表示接收任意多个显式赋值的实际参数,并将其放到一个字典中。例如,定义一个函数,让其可以接收任意多个显式赋值的实际参数,代码如下:

def printsign(**sign):  # 定义输出姓名和绰号的函数
    print()  # 输出一个空行
    for key, value in sign.items():  # 遍历字典
        print("[" + key + "]的绰号是:" + value)  # 输出组合获得信息

??调用两次printsign()函数,代码如下:

printsign(小红="妖精", 小明="大聪明")
printsign(小白="菜鸡", 小李="不高兴", 小张="没头脑")

??执行结果如下:
在这里插入图片描述
??如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加“**”。例如下面代码:

dict1 = {"小白": "菜鸡", "小李": "不高兴", "小张": "没头脑"}  # 定义一个字典
printsign(**dict1)  # 通过字典指定函数的可变参

??执行结果如下:
在这里插入图片描述


  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:42:14  更:2022-05-01 15:43:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:58:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码