5.1 Python 函数的参数类型

1. 实参与形参

形参: 函数定义阶段, 括号内定义的参数名(变量名), 形参的表现形式只有一种就是参数命.
实参: 函数调用阶段, 括号内传入的参数值(变量值), 实参的表现形式有很多种(核心: 可以引用到值).两者之间的关系:
函数调用阶段 --> 实参的值绑定给形参名.
函数调用完毕 --> 解除绑定.
def aa(x, y):  #  x, y 是形参z = x + yaa(10, 20)  #  10, 20 是实参a = 10
b = 20
aa(a, b)  #  a, b 是实参

2. 位置形参与位置实参

位置形参: 定义函数阶段, 按照从左到右的顺序依次定义的形参.
特点: 形参必须被传值.位置实参: 在函数调用阶段, 按照从左到右的顺序依次传入的值.
特点: 按顺序依次为形参赋值.* 形参与实参的数量必须相等.
# 实参与形参的个数相匹配, 不能多, 不能少, 一个萝卜一个坑.
def aa(x, y, z):print(x, y, z)aa(1, 2, 3)  
aa(3, 2, 1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

aa(3, 2)少了一个参数错误提示:
: TypeError: aa() missing 1 required positional argument: 'x'.
: : 类型错误:aa()缺少1个必需的位置参数:“x”.aa(3, 2, 1, 0)多了一个参数错误提示:
: TypeError: aa() takes 3 positional arguments but 4 were given.
: TypeError:aa()接受3个位置参数,但给出了4.

3. 关键字实参

关键字实参:在函数调用阶段, 按name=value的格式传入值.
特点: 不用记住形参的顺序, 可打乱顺序赋值.* 形参与实参的数量必须相等.
位置实参与关键字实参一起混用时的使用规则:
* 1. 关键字实参不能位置参数前.
* 2. 不能为同一个形参多次赋值.
* 越简单的格式写在前面, 越复杂的格式写在后面.
# 正常示例
def bb(x, y, z): print(x, y, z)# 顺序可乱
bb(x=1, z=3, y=2)  
bb(z=3, x=1, y=2)          
# 错误示例1
def aa(x, y, z):print(x, y, z)# 关键字在位置实参前面, 报错.
aa(x=1, 2, z=3)  
: SyntaxError: positional argument follows keyword argument.
: 语法错误:位置参数跟在关键字参数后面.
# 错误示例2
def aa(x, y, z):print(x, y, z)# z被赋值两次
aa(1, 2, 3, z=3)  
: TypeError: aa() got multiple values for argument 'z'.
: 类型错误: aa() 为参数“z”获取了多个值.

4. 默认形参

默认形参: 在函数定义阶段, 以key=value的形式为形参赋值, 如果传值, 以实参值为准.
特点: 定义阶段已经为形参赋值, 在调用阶段可以不用为其传值.位置形参和默认形参混用一起混用时的使用规则:
* 1. 位置形参在前, 位置实参在后面.
* 2. 默认形参只在函数定义阶段赋值一次.
* 3. 默认形参的值推荐指向不可变类型.
# 正常示例
def aa(x, y=2, z=3):print(x, y, z)# 提供一个参数, 其它参数设置了默认参数, 会使用默认参数.
aa(1)   #  1 2 3
# 提供全部参数, 不会使用默认参数.
aa(1, 5, 6)  #  1 5 6
4.1 使用场景
# 使用场景1: 某个参数被多数重复时使用.
def func(name, age, gender='male'):print(name, age, gender)func('kid', 18)
func('qz', 19)
func('qq', 19, 'female')
运行工具窗口显示:
kid 18 male
qz 19 male
qq 19 female
# 使用场景2: 参数作为判断的条件, 改变函数体内部的执行顺序.
def add_func(x, y, is_print=False):# 判断是否打印结果if not is_print:return x + yprint(x + y)res = add_func(1, 2)
print(res)
4.2 注意事项
默认形参注意点: 默认形参是一个列表的时候, 使用方法操作时, 操作同一个列表共用同一个内存空间.
class A:def __init__(self, a=[]):# self.a是形参a的别名...# __init__在定义阶段就固定a指向这个空列表, 后续创建的实例还是引用这个列表.self.a = aprint(id(a), id(self.a))a1 = A()  # 2063452295040 2063452295040
a2 = A()  # 2063452295040 2063452295040
def aa(x=[]):x.append(1)print(x, id(x))aa()  # 第一次调用函数, 创建一个空列表, 1被添加进y的列表内    [1] 2341886946240
aa()  # 第二次调用函数, 不在创建空列表, 1被添加进原来的列表内  [1, 1] 2341886946240
aa()  # 第三次调用函数, 不在创建空列表, 1被添加进原来的列表内  [1, 1, 1] 2341886946240
当定义函数后, 就会将函数体存到内存中去, 默认形参, 也包含在内.

2022-12-10_01673

在调用的时候, 调用的同一个函数体, 默认形参没有修改, 操作的列表的话, 操作的是函数体中的创建好的空间.
* 函数体中的列表下次使用, 肯定不是最初的列表, 而是被修的列表.

image-20221210184844929

5. 可变长参数

*  ** 搭配参数名使用时有特殊的作用.
5.1 形参中使用
在位置形参中带 * : 将溢出的位置实参汇总成元组, 赋值给紧跟*其后的变量.
在关键字形参中带 ** : 将溢出的位置实参汇总成字典, 赋值给紧跟**其后的变量.
1. *的使用
def aa(x, *y):print(x, y)aa(1)  # 1 () 没有溢出就输出空元组
aa(1, 2)  # 1 (2,)
aa(1, 2, 3)  # 1 (2, 3)
2. **的使用
def aa(x, **y):print(x, y)aa(1)  # 1 {}   没有溢出就输出空字典
aa(1, a=1, b=2)  # 1 {'a': 1, 'b': 2}
5.2 实参中使用
在位置实参中带 * : 将紧跟*其后的序列类型值(能被for遍历的), 解包赋值给多个位置形参.
在关键字形参中带 ** : 将紧跟**其后的字典类型值, 解包赋值给多个关键字形参.
1. *的使用
# 实参与形参值长度相等
def aa(x, y, z):print(x, y, z)aa(*[1, 2, 3])  # 1 2 3   
aa(*'qwe')  # q w e
2. **的使用
# 实参与形参值长度相等
def aa(x, y, z):print(x, y, z)  aa(**{'x': 1, 'y': 2, 'z': 3})  # 1 2 3
5.3 通用搭配
形参中约定俗成的规定:
*  后面的变量名为 args
** 后面的变量名为 kwargs 
def func(*args, **kwargs): 可变长参数的长度不固定, 接收任意长度的的参数.
def func(*args, **kwargs):x1, x2 = args  # 元组的值解包给 x1 x2y1, y2 = kwargs.values()  # 字典的值解包复制给 y1 y2print(x1, x2, y1, y2)  # 10 20 30 40func(*(10, 20), **{'y': 30, 'a': 40})
def func(*args, **kwargs):print('func')# 可以不提供任何参数
func()  # func

6. 命名关键字参数

命名关键字参数: 在定义函数时, 出现在***之间的参数, (出现在*后面, 看起来像位置参数, **可以不出现).
特点: 在调用函数时, 命名关键字参数必须按照key=value的形式传值, (一般出现在面试题中).
def func1(*args, x, **kwargs):  # *args 后面的x就是命名关键字参数.print('func1')# 命名关键字参数的以key=value的方式传值
func1(x=1)def func2(*args, x):  # *args 后面的x就是命名关键字参数.print('func2')# 命名关键字参数的以key=value的方式传值
func2(x=1)

7. 混用规则

混用规则: 越简单的格式写在前面, 越复杂的格式写在后面.
混用顺序: 位置参数, 可变长位置参数, 命名关键字参数, 关键字参数, 可变长关键字参数.
def func1(x, *args, y, z=None, **kwargs): print(x, args, y, z, kwargs)func1(0, y=1, z=2)  # 0 () 1 0 {}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1451831.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA,需要先按照Graphql插件,步骤如下: (1)打开插件管理 在IDEA中,打开主菜单,选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …

什么是快乐?

什么是快乐? What is Happiness? 1. 快乐不是追求外在的物质,而是内心的平静与满足。当我们学会感恩,懂得珍惜眼前的一切,心中自然会充满喜悦。快乐并非来自拥有更多,而是感受到已经拥有的足够。每一天都怀抱感激之情…

最新情侣飞行棋高阶羞羞版,解锁私密版情侣小游戏,文末有福利!

今天要跟大家聊聊一种特别有意思的游戏——情侣飞行棋羞羞版。别急着脸红,这可是专为情侣设计的游戏,让你们在轻松愉快的氛围中,增进了解,加深感情。 谈恋爱,不就是两个人在一起,做些有趣的事情吗&#xf…

【INTEL(ALTERA)】Quartus® 软件 Pin Planner 中 Agilex™ 5 FPGA的 HSIO 库可以选择 1.8V VCCIO?

目录 说明 解决方法 说明 由于 Quartus Prime Pro Edition 软件版本 24.1 存在一个问题,Quartus 软件 Pin Planner 中的 I/O 组属性 GUI 允许用户选择 1.8V 作为 HSIO 银行位置的 VCCIO。HSIO bank 支持的有效 VCCIO 电压仅为 1.0V、1.05V、1.1V、1.2V 和 1.3V。…

【SpringBoot + Vue 尚庭公寓实战】地区信息管理接口实现(九)

【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现(九) 文章目录 【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现(九)1、业务说明2、数据逻辑模型3、接口实现3.1、查询省份信息列表3.2、根据省份ID查询城市信息列表3…

Http协议JSON格式

1. 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 思考:计算机网络…

基于matlab提取一维数组中非nan的数据

一、使用逻辑索引 使用逻辑索引来选择数组中所有非NaN的元素。逻辑索引是与原数组同型的逻辑数组,true对应的位置将会被选中。 % 假设a是一维数组 a [1, 2, NaN, 4, NaN, 6];% 使用逻辑索引提取非NaN元素 non_nan_elements a(~isnan(a)); 二、使用isnan函数和fi…

程序猿大战Python——容器——知识补充

字典遍历方法 目标:了解遍历字典的遍历方法。 当要遍历字典的元素内容,即获取字典的键、值。 常用方法: 函数名含义keys()以列表的形式,返回一个字典所有的键。values()以列表的形式,返回一个字典所有的值。items()返…

光学雨量监测站:科技赋能,精准监测降水过程

TH-YJ3随着科技的不断进步,光学雨量监测站作为一种先进的降水监测设备,正逐渐在气象、水文、农业等领域发挥重要作用。光学雨量监测站以其高精度、高可靠性、实时性强的特点,为降水数据的收集和分析提供了强有力的支持,为相关领域…

深入解析B树:数据结构、存储结构与算法优势

一、引言 在计算机科学中,数据结构和算法是核心内容。它们的选择和应用直接影响程序的效率和性能。B树(B-Tree)作为一种自平衡的多叉树数据结构,广泛应用于数据库和文件系统中。本文将详细介绍B树的数据结构模型、存储结构&#…

IDEA 配置方法模板无法获取到参数值和返回值(methodParameters()、methodReturnType()获取不到值)

问题现象: 我在 review 同事代码时候,发现方法上有注释,但是注释上又没有方法参数和返回值,这不是IDEA 配置了方法模板就可以自动生成的嘛,我出于好奇去问了下该同事是怎么回事,该同事有点不好意思的说我配…

Linux---系统的初步学习【 项目二 管理Linux文件和目录】

项目二 管理Linux文件和目录 2.1项目知识准备 ​ 文件是存储在计算机上的数据集合。在Windows系统中,我们理解的文件可以是文本文档、图片、程序、音乐、视频等。在Linux中,一切皆文件,也就是除了Windows中所理解的文件,目录、字…

【测试】软件测试方案—实际项目直接套用(Word原件)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

2024 年最新使用 Node 搭建QQ开放平台官方 QQ 频道机器人详细教程(更新中)

注册 QQ 开放平台账号 QQ 开放平台是腾讯应用综合开放类平台,包含 QQ 机器人、QQ 小程序、QQ 小游戏 等集成化管理,也就是说你注册了QQ 开放平台,你开发 QQ 机器人还是 QQ 小程序都是在这个平台进行部署上线和管理。 如何注册 QQ 开放平台账…

小熊家政帮day22-day23 订单系统优化(订单状态机、练习分库分表、索引、订单缓存)

目录 1 状态机1.1 状态机介绍1.1.1 当前存在的问题1.1.2 使用状态机解决问题 1.2 实现订单状态机1.2.1 编写订单状态机1.2.1.1 依赖引入1.2.1.2 订单状态枚举类1.2.1.3 状态变更事件枚举类1.2.1.4 定义订单快照类1.2.1.5 定义事件变更动作类1.2.1.5 定义订单状态机类1.2.1.6 状…

明天二战六级

明天二战六级,各位程序员们,加油

HTML静态网页成品作业(HTML+CSS)—— 明星吴磊介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

最新Sublime Text软件安装包分享(汉化版本)

Sublime Text 是一款广受欢迎的跨平台文本编辑器,专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称,深受开发者和写作者的喜爱。 一、下载地址 链接:https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…

EasyGBS服务器和终端配置

服务器配置 修改easygbs.ini sip/host为本机IP,否则终端能登录,无法视频。 [sip] host192.168.3.190 终端用于登录的用户名和密码 default_usertest default_passwordtest1234 default_guest_userguest default_guest_passwordtest1234终端配置 关…

2024 年最新基于 LLOneBot NT 框架搭建 QQ 机器人详细教程(更新中)

LLOneBot 概述 llonebot(LLOneBot)是一个与OneBot(也称为CQHTTP)协议兼容的机器人框架,它允许开发者使用不同的编程语言(如Python、Go、JavaScript等)编写机器人应用,并与各种支持 …