当前位置: 首页 > news >正文

Python之函数参数细讲

文章目录

  • 前言
  • 一、了解形式参数和实际参数
    • 1. 通过作用理解
    • 2. 通过一个比喻来理解形式参数和实际参数
  • 二、位置参数
    • 1. 数量必须与定义时一致
    • 2. 位置必须与定义时一致
  • 三、关键字参数
  • 四、为参数设置默认值
  • 五、可变参数
    • 1. *parameter
    • 2. **parameter
  • 总结


前言

  在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。函数参数在定义函数时放在函数名称的后面的一对小括号中,对于初学者来说,函数参数一般是难点。接下来针对参数展开详细介绍。


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

  在使用参数时,经常会用到形式参数实际参数,二者都叫做参数,它们的区别将先通过形式参数与实际参数的作用来进行讲解,再通过一个比喻和实例进行深入探讨。

1. 通过作用理解

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

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

  根据实际参数的类型不同,可以分为将实际参数的值传递给形式参数将实际参数的引用传递给形式参数两种情况。其中,当实际参数为不可变对象时,进行值传递当实际参数为可变对象时,进行的是引用传递。实际上,值传递和引用传递的基本区别就是,进行值传递后,改变形式参数的值,实际参数的值不变;而进行引用传递后,改变形式参数的值,实际参数的值也一同改变
  例如,定义一个名称为 function 的函数,然后为 function() 函数传递一个字符串类型的变量作为参数(代表值传递),并在函数调用前后分别输出该字符串变量,再为 function() 函数传递一个列表类型的变量作为参数(代表引用传递),并在函数调用前后分别输出该列表。代码如下:

# 定义函数
def sentence(place):print('原值:', place)place += place
# 调用函数
print('==========值传递==========')
a = '丽江'
print('函数调用前:', a)
sentence(a)  # 采用不可变对象 —— 字符串
print('函数调用后:', a)
print('==========引用传递==========')
list1 = ['昆明', '长沙', '西安']
print('函数调用前:', list1)
sentence(list1)  # 采用可变对象 —— 列表
print('函数调用后:', list1)

上面代码的执行结果如下:

==========值传递==========
函数调用前: 丽江
原值: 丽江
函数调用后: 丽江
==========引用传递==========
函数调用前: ['昆明', '长沙', '西安']
原值: ['昆明', '长沙', '西安']
函数调用后: ['昆明', '长沙', '西安', '昆明', '长沙', '西安']

  从上面的执行结果可以看出,在进行值传递时,改变形式参数的值后,实际参数的值不改变在进行引用传递时,改变形式参数的值后,实际参数的值也发生改变

2. 通过一个比喻来理解形式参数和实际参数

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


二、位置参数

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

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

  在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则将抛出 TypeError 异常,提示缺少必要的位置参数。如下图代码所示:

在这里插入图片描述

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

在调用函数时,指定的实际参数的位置必须与形式参数的位置一致,否则将产生以下两种结果。

  • 抛出 TypeError 异常。抛出异常的情况主要是因为实际参数的类型与形式参数的类型不一致,并且在函数中,这两种类型还不能正常转换。 例如下图代码所示:

在这里插入图片描述

  • 产生的结果与预期不符。在调用函数时,如果指定的实际参数与形式参数的位置不一致,但是它们的数据类型一致,那么就不会抛出异常,而是产生结果与预期不符的问题。例如下图代码所示:

在这里插入图片描述

说明由于调用函数时,传递的实际参数的位置与形式参数的位置不一致时,并不会总是抛出异常,所以在调用函数时一定要确定好位置,否则会产生 Bug,还不容易被发现。


三、关键字参数

  关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确即可。这样可以避免用户需要牢记参数位置的麻烦,使得函数的调用和参数传递更加灵活方便。比如下图代码所示:

在这里插入图片描述


四、为参数设置默认值

  调用函数时,如果漏掉忘了指定某个参数则将会抛出异常,为了解决这个问题,我们可以为参数设置默认值,即在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,则直接使用定义函数时设置的默认值。定义带有默认值参数的语法格式如下:

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

参数说明

  • functionname:函数名称,在调用函数时使用。函数名称的命名应遵循标识符命名规则,如果有多个单词,每个单词用下划线_连接。
  • parameter1 = defaultvalue1:可选参数,用于指定向函数中传递的参数,并且为该参数设置默认值为 defaultvalue1。
  • functionbody:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。

代码示例如下图所示:

在这里插入图片描述

说明在传参时,如果没有指定某个参数值,则使用形式参数中该参数的默认值;如果指定了参数值,则会覆盖默认值,使用指定的参数值;比如下图代码所示。

在这里插入图片描述

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

在这里插入图片描述

说明定义函数时,为形式参数设置默认值要牢记一点:默认参数必须指向不可变对象


五、可变参数

  在Python中,还可以定义可变参数。可变参数也称为不定长参数,即传入函数中的实际参数可以是任意多个。定义可变参数时,主要有两种形式:一种是 *parameter,另一种是 **parameter

1. *parameter

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

在这里插入图片描述

如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加 “ * ”。例如下图代码所示:

在这里插入图片描述

2. **parameter

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

在这里插入图片描述

如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加 “ ** ”。例如下图代码所示:

在这里插入图片描述


总结

  参数是学习函数必须要精通的重要一环。对初学者来说,默认值参数是易错点可变参数是难点每个参数都是要掌握的重点

相关文章:

Python之函数参数细讲

文章目录前言一、了解形式参数和实际参数1. 通过作用理解2. 通过一个比喻来理解形式参数和实际参数二、位置参数1. 数量必须与定义时一致2. 位置必须与定义时一致三、关键字参数四、为参数设置默认值五、可变参数1. *parameter2. **parameter总结前言 在调用函数时,…...

跑步耳机入耳好还是不入耳好、十大跑步运动耳机品牌排行榜推荐

健身房经常会播放一些节奏较快的歌曲,这样能够激发大家在运动过程中的动力,所以运动时聆听音乐确实比较有效果,居家运动、室外跑步时选择运动耳机就变成了刚需,首先不能影响其他人、佩戴时要稳定,音质和续航要有保证&a…...

Go语言容器之数组和切片

Go语言的容器分为值类型和引用数据类型 一、数组 1.数组的声明和初始化 (1) 数组声明的语法 var 数组变量名 [数组大小]数组类型 举例: package main import "fmt"func main(){//数组的声明var arr[10]int//打印数组长度fmt.Println("arr的长度为…...

【ROS2知识】humble下使用插件编程

Creating and using plugins (C++) — ROS 2 Documentation: Humble documentation 一、说明 接口编程的好处不言自明,有兴趣的朋友可以看看相关文章。此处在ROS2上进行接口编程,这是个技术难点,如果不能突破,那么许多方面将不能进行,比如:navigation中的costmap_2d包中…...

MySQL 主备一致

MySQL 主备一致主备切换binlog 格式statementrowmixed生产格式循环复制问题主备切换 MySQL 主备切换流程 : 状态 1 : 客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只将 A 的更新都同步过来 , 并本地执行。来保持节点 B 和 A 的数据是相同当切换…...

玩转CodeQLpy之用友GRP-U8漏洞挖掘

0x01 前言CodeQLpy是作者使用python3实现的基于CodeQL的java代码审计工具,github地址https://github.com/webraybtl/CodeQLpy。通过CodeQLpy可以辅助代码审计人员快速定位代码中的问题,目前支持对SprintBoot的jar包,SpringMVC的war包&#xf…...

GMP调度模型总结

优秀文章 什么是GMP调度模型 Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 什么是Goroutine Goroutine Golang Coro…...

蓝桥回文日期题

题目 题目描述 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202 是 “千年…...

【2023】某python语言程序设计跟学第三周内容

目录1.数字类型与操作:整数:浮点数:复数数值运算操作符数字之间关系数值运算函数2.案例:天天向上的力量第一问:1‰的力量第二问:5‰和1%的力量第三问:工作日的力量第四问:工作日的努…...

c++11右值引发的概念

右值引用右值&&左值c11增加了一个新的类型,右值引用,记作:&&左值是指在内存中有明确的地址,我们可以找到这块地址的数据(可取地址)右值是只提供数据,无法找到地址(不…...

MySQL 02 :三层结构、备份删除数据库

MySQL 02 :数据库三层结构-破除MySQL神秘 请添加图片描述 通过golang操作MySQL 创建删除数据库 备份恢复数据库 第一次需要配置环境,否则会报错 报错:mysqldump: Got error: 1045: Access denied for user ‘root’‘localhost’ (using …...

质量员错题合集

项目部质量员根据规范要求认为,接地用的绝缘铜电线规定最小截面为( )mm。4 项目部质量员根据规范要求认为,接地用的绝缘铜电线规定最小截面为4mm,是从( )性能考虑的。机械、 案例中所使用的ZST型闭式喷头的工作压力是( )MPa。1.2 案例中所…...

请教大神们,pmp考试和复习有什么攻略诀窍吗?

PMP考试通过率挺高的,很多考生也是朝九晚五甚至天天加班的打工人,还是有很多人通过了的,我也是下班后和周末才有时间学习的,3A通过,但不是什么考试大神,每天抽出3-4个小时跟着培训机构制定的学习计划学习&a…...

Go语言基础之接口

Go语言基础之接口1.Go语言接口类型2.类型与接口的关系一个类型实现多个接口多种类型实现同一接口3.空接口4.类型断言1.Go语言接口类型 每个接口类型由任意个方法签名组成,接口的定义格式如下: type 接口类型名 interface{方法名1( 参数列表1 ) 返回值列…...

【Go自学第一节】GoLang 数据类型

和Java类型,go拥有多种数据类型,可以把它分为四个大类基础类型、聚合类型、引用类型和接口类型 一、基本数据类型 基本数据类型又可以细分为:数字类型(整型、浮点型)、布尔类型、字符串类型 整型 Go 的整型分为有符号…...

学习ForkJoin

学习ForkJoin一、普通解决多线程方式1、案例一2、效果图二、ForkJoin一、普通解决多线程方式 1、案例一 大数据量的List问题处理,多线程分批处理,需要解决的问题: 下标越界。线程安全。数据丢失。 private static ThreadPoolExecutor thre…...

System has not been booted with systemd as init system (PID 1). Can‘t operate.

今天想查看防火墙的状态,但是对防火墙的操作还不熟悉,网上搜到的命令是这样的systemctl status firewalld 结果输入之后出现了这样的错误: System has not been booted with systemd as init system (PID 1). Can’t operate. 然后接着去网上…...

使用Endnote自定义参考文献格式

使用Endnote自定义参考文献格式 使用Endnote插入参考文献,若要设置期刊指定格式或自己想要的参考格式,使用EndNote自定义方法,步骤如下。 注:有的期刊会给出EndNote的格式文件,那样直接导入就行。 文章目录使用Endnot…...

jsPlumb Components Crack

jsPlumb Components Crack 为支持Vue 2,所有组件都添加了包装器。 已为所有组件添加了包装器以支持Svelte。 改进了在流程图生成器中编辑多个选定节点。 jsPlumb组件是一组可嵌入的组件,可将可视连接快速集成到网页中。jsPlumb组件基于jsPlumb Toolkit库…...

Java接口

目录 为什么有接口? 接口的定义和使用 注意 接口的基本使用 接口成员的特点 接口和类之间的关系 为什么有接口? 接口就是一种规则 对行为的抽象 接口侧重于行为 接口的定义和使用 接口用于关键字interface来定义public interface 接口名{ }接口不…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

离线语音识别方案分析

随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...