Python中的函数参数传递问题
作者:ζ小菜鸡 发布时间:2023-09-28 05:38:12
一、前言
在调用函数时,大多数情况下,主调函数和被调函用之间有数据传递关系,这就是有参数的函数形式。
函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。
函数参数在定义函数时放在函数名称后面的一对小括号中,如图所示:
二、了解形式参数和实际参数
在使用函数时,经常会用到形式参数(形参)和实际参数(实参)。
两者都叫做参数二者之间的区别先通过形式参数和实际参数的作用来进行讲解,再通过比喻进行理解。
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
:可选参数,用于指定向函数中传递的出纳室,并且为该参数设置默认值为defaultvalue1functionbody
:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码
注意:在定义函数时,指定默认的形参必须在所有参数的最后,否则将产生语法错误。
使用可变对象作为函数参数的默认值时,多次调用可能会导致意料之外的情况,例如,编写一个名称为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) # 通过字典指定函数的可变参
执行结果如下:
来源:https://blog.csdn.net/weixin_45191386/article/details/124485582


猜你喜欢
- 主库执行CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;us
- Django 中的时区在现实环境中,存在有多个时区。用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统。所以如果网站面
- 环境准备创建QQ互联应用创建一个QQ互联应用,并获取到App ID和App Key。QQ互联官网:https://connect.qq.co
- 本文实例讲述了php输出xml必须header的解决方法。分享给大家供大家参考。具体方法如下:问题描述:最近在做一个xml输出时发现我们直接
- 纵观各大编程语言在 2017 年的发展情况,我们会发现涌现出诸如 Go、Swift 这类后起之秀,而其中最为耀眼的当属 Python。之所以
- 一些大型站点都有着非常一流的视觉外观,它们很可能在设计时使用了网格系统。网格可以是页面布局显得紧凑而且稳定,为设计师在设计站点时提供一个逻辑
- 本文为大家分享了多种方法求质数python实现代码,供大家参考,具体内容如下题目要求是求所有小于n的质数的个数。 求质数方法1: 穷举法:
- N久没有开始写博客了,总觉得要随便记点东西,岁月蹉跎,曾经搞得一些东西、技术、工具,说丢也就丢了,点点滴滴还是要记录一下吧。。。在windo
- 上期我们介绍了函数式编程,这期内容就是关于递归的函数内容,本期还是按照老规矩,给大家进行核心整理,内容通俗易懂,搭配实际应用,以供大家理解。
- 本文实例讲述了Python将阿拉伯数字转换为罗马数字的方法。分享给大家供大家参考。具体实现方法如下:def numToRomanNum(Nu
- 1. 引言在使用Python的时候,通常会出现如下场景:array = [1, 2, 3, 3, 2, 1, 0, 2]获取array中元素
- 问题查看 tensorflow api manual 时,看到关于 variable.read_value() 的注解如图:那么在 tens
- 本文为大家分享了SQL Server数据库附加失败的具体解决方法,供大家参考,具体内容如下1、错误3415问题:附加数据库的时候,发现总是附
- openpyxl模块是一个读写Excel 文档的Python库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。op
- 此站:http://www.cbmland.com/ 的页面离开时的效果非常NB!佩服的很。一开始,我以为是用事件 onunload,试了一
- 如下所示:import cv2import mathimport numpy as npdef move(img): height, wid
- yagmail 实现发邮件yagmail 可以更简单的来实现自动发邮件功能。1、安装pip install yagmail2、简单举例imp
- 前言 1.实验环境: Python 3.6;2.示例代码地址:下载示例; 3.本文中元素是指列表、元组、字典等集合类数据类型中的下一级项目(
- 正则表达式很神奇啊# -*- coding:utf-8 -*-import redef print_match_res(res): &nbs
- Django版本为:2.1.7Python的web框架,MTV思想MVCModel(模板文件,数据库操作) view(视图模板文