5.1 Python 函数的参数类型

news2024/11/7 23:30:08

1. 实参与形参

形参: 函数定义阶段, 括号内定义的参数名(变量名), 形参的表现形式只有一种就是参数命.
实参: 函数调用阶段, 括号内传入的参数值(变量值), 实参的表现形式有很多种(核心: 可以引用到值).

两者之间的关系:
函数调用阶段 --> 实参的值绑定给形参名.
函数调用完毕 --> 解除绑定.
def aa(x, y):  #  x, y 是形参
    z = x + y

aa(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 + y
    print(x + y)


res = add_func(1, 2)
print(res)

4.2 注意事项
默认形参注意点: 默认形参是一个列表的时候, 使用方法操作时, 操作同一个列表共用同一个内存空间.
class A:
    def __init__(self, a=[]):

        # self.a是形参a的别名...
        # __init__在定义阶段就固定a指向这个空列表, 后续创建的实例还是引用这个列表.
        self.a = a
        print(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 x2
    y1, y2 = kwargs.values()  # 字典的值解包复制给 y1 y2
    print(x1, x2, y1, y2)  # 10 20 30 40


func(*(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.coloradmin.cn/o/1819423.html

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

相关文章

技术革新,智绘未来丨悦数图数据库 v5.0 重磅亮相 WAIC 2024

本次 WAIC(世界人工智能大会)2024 将于7 月 4 日- 7 日在上海世博展览馆**举行,本次 WAIC 2024 围绕“以共商促共享 以善治促善智”为主题,杭州悦数科技有限公司将携最新的悦数图数据库 v5.0 亮相 E805 展位。作为国内领先的图数据…

【Linux】进程控制2——进程等待(waitwaitpid)

1. 进程等待必要性 我们知道,子进程退出,父进程如果不管不顾,就可能造成"僵尸进程”的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为…

node配置热更新nodemon

nodemon 安装 全局或者开发依赖都可以 npm install nodemon -g npm install nodemon -D配置 文件配置nodemon.json {"watch": [ // 改动后需要编译成es5的源文件目录和配置等目录以及文件"./src","./conf",".env"],"ext&quo…

QT——设计概述

一、QT的概述 1、QT是什么? Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。 2、QT可以做什么? Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应…

同三维T80005EH4 H.265 4路高清HDMI编码器

同三维T80005EH4 H.265 4路高清HDMI编码器 4路HDMI输入2路3.5音频输入,第1路和第2路HDMI可支持4K30,其它支持高清1080P60 产品简介: 同三维T80005EH4 4路HDMI高清H.265编码器采用最新高效H.265高清数字视频压缩技术,具备稳定…

【动态规划算法题记录】70. 爬楼梯——递归/动态规划

题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 题目分析 递归法(超出时间限制) 递归参数与返回值 void reversal(int i, int k) 每次我们处理第i个台阶到第k个…

具有不确定性感知注意机制的肺结节分割和不确定区域预测| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 Lung Nodule Segmentation and UncertainRegion Prediction With an Uncertainty-Aware Attention Mechanism 具有不确定性感知注意机制的肺结节分割和不确定区域预测 01 文献速递介绍 肺结节分割在肺癌计算机辅助诊断(CAD)系统中至关重…

什么是1+N+b模式的费用直投门店管理体系?

在快消行业,为争夺市场份额,企业每年需投入大量资金。在此过程中,您是否也像李总一样面临着如下困惑: 为解决李总所面临的难题,纷享销客秉承“终端为王”的经营理念,创造性地推出了基于1Nb模式的费用直投门…

携手知名律所,合合信息旗下名片全能王打造数字化名片“新范式”

在低碳办公理念盛行的当下,数字名片成为商务交流的新方式,以数字化智能化赋能绿色化。近期,合合信息旗下名片全能王企业数字名片升级,与上海市律师协会、广州市律师协会、北京大成(上海)律师事务所等多家律…

如何用Xinstall CPS结算系统打破传统营销桎梏,实现用户增长?

在互联网流量红利逐渐衰退的今天,App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系,成为了众多企业急待解决的问题。而在这个关键时刻,Xinstall CPS结算系统应运而生,以其独特的优势帮助企业解决了一系列…

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(2)

接前一篇文章:ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(1) 上一回讲了笔者在进行ESP-IDF的OTA调试和测试时遇到了一个新问题:大升级文件下载失败。 在网上寻找解决办法无果后,求助于乐鑫的技术支持,答复说官方例程没有问题。笔…

Django之云存储(一)

一、介绍 用户上传的文件以及项目中使用的静态文件,除了保存在本地服务器,还在可以保存在云服务中,比如: 阿里云七牛云(课程选用)亚马逊云等1.1、使用方式 注册账号 七牛云开发者平台 实名认证 创建空间

【高频电子线路】选频网络概述

什么是选频网络 选频网络是用来“滤波”的电路,用来滤除特定频率的信号以得到目标信号。 选频网络的分类 知识补充 电容和电感的基本性质 在电容中,电流与电压的变化率成正比,电流超前90。 在电感中,电压与电流的变化率成正…

算法:模拟题目练习

目录 题目一:替换所有的问号 题目二:提莫攻击 题目三:N字形变换 题目四:外观数列 题目五:数青蛙 首先先解释一下模拟算法是什么,其实模拟算法就是题目让我们干什么我们就干什么,思路比较简…

kettle从入门到精通 第六十八课 ETL之kettle kettle随机数生成的一些方案

1、在做ETL数据抽取的时候,会用到生成随机数的功能,今天我们一起来学习下如何生成随机数据。如下图所示 2、将生成随机数拉倒画布即可,然后设置字段名称和选择合适的类型,如下图所示: 类型: 随机数字&…

【后端】Java学习笔记(二周目-1)

环境 安装JDK8并配置环境变量 jvm核心类库jre jre开发工具jdk Java基础运行流程,代码从上到下,从左往右,只运行一次 桌面—>新建文件夹—>新建记事本—>打开编写代码 public class Hello{public static void main(String[] arg…

sizeof和strlen

1.sizeof和strlen的对比 1.1sizeof sizeof是计算变量所占内存空间大小的,单位是:字节 如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。 sizeof只关注占用内存空间的大小,不在乎内存中存放的是什么数据 …

深入理解MySQL分区技术

前言: 在数据量不断增长的当今时代,数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统,提供了多种性能优化手段,其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

ArcGIS Pro SDK (三)Addin控件 2 窗格界面类

ArcGIS Pro SDK (三)Addin控件 2 窗格界面类 目录 ArcGIS Pro SDK (三)Addin控件 2 窗格界面类15 ArcGIS Pro 后台选项卡15.1 添加控件15.2 Code15.2.1 选项卡按钮15.2.2 选项卡页 16 ArcGIS Pro 窗体16.1 添加控件16.2 Code 17 A…

Bean基础配置

黑马程序员SSM 文章目录 一、Bean基础配置二、bean别名配置2.1 ban的别名配置2.2 注意事项 三、Bean作用范围配置3.1 Bean作用范围3.2 bean作用范围说明 一、Bean基础配置 二、bean别名配置 2.1 ban的别名配置 2.2 注意事项 获取bean无论是通过id还是name获取,如果…