Python:函数的形参与实参

news2024/11/15 11:06:57

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

函数基本概念

在Python中,函数是一种将代码封装以进行重复使用的机制。它们允许你定义一段代码,以便在程序的多个位置调用,而不必重写相同的代码。这不仅有助于减少冗余,还使得程序更易于维护和调试。

函数的组成

  • 函数头:定义函数的起始部分,包括def关键字、函数名和括号内的形式参数列表。
  • 形参:在函数头中定义的参数。它们是变量的名称,代表了函数可以接收的数据。
  • 函数体:包含一系列定义函数应如何操作输入参数的语句。可以包括逻辑运算、数据处理等。
  • 返回值:函数可以选择性地返回值。这是函数处理过的数据,可以是任何数据类型。

形式参数(形参)

形参是在函数定义中声明的变量,它们在函数被调用之前没有具体的值。它们是一种占位符,用于表示函数可以接受的数据类型和数量。当函数被调用时,这些形参将被赋予实际的值(实参)。

实际参数(实参)

实参是在调用函数时传递给函数的具体值。它们“填充”了形参定义的占位符。实参可以是硬编码的值、变量或者是其他函数的返回值。当函数被调用时,每个实参都被赋给相应的形参,从而使函数可以使用这些具体的值来执行其任务。

参数的类型

  • 实参的位置参数
  • 实参的关键字参数
  • 形参的缺省参数
  • 形参的不定长参数

详细的代码示例

Python中的函数, 在开发程序时,很容易遇到一个情景:某些代码在整个项目中需要被用到很多次,为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数的概念和作用。

函数的定义

1. 函数的格式

定义函数的命令如下:

def 函数名():    
    代码

代码如下:

# 定义一个函数,能够完成打印信息的功能    
def printInfo():    
    print('------------------------------------')     
    print('         人生苦短,我用Python' )    
    print('------------------------------------')
    
printInfo()
------------------------------------
         人生苦短,我用Python
------------------------------------

定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它。调用函数很简单,通过“函数名()”即可完成调用。

2. 函数的参数

先思考一个问题:现在需要定义一个函数,这个函数能够完成2个数的乘法运算,并且把结果打印出来,以下的代码可以实现吗?这样设计有什么缺陷吗?代码如下:

def mul2():    
    a = 7    
    b = 9    
    c = a*b    
    print (c)

以上代码可以完成两个数值的相乘,但只适用于特定的两个数值。如果要使该函数更通用,即能计算任意两个数的乘积,在定义函数的时候可以让函数接收要处理的数据,就解决了这个问题,这就是函数的参数。 定义带有参数的函数代码如下:

def mul2(a, b):     
    c = a*b    
    print (c)

调用上面函数的方法是调用函数名字,并且在括号里输入函数要处理的具体数据“(参数)”,代码如下:

def mul2(a, b):     
    c = a*b    
    print (c)
    
mul2(8,9) #调用带有参数的函数时,需要在小括号中传递数据  
72

另外,关于函数参数,有两个具体的概念“形参”和“实参”:

(1)定义时,小括号中的参数,用来接收参数用的,称为 “形参”。

(2)调用时,小括号中的参数,用来传递给函数用的,称为 “实参”。

其中,形参可以分别是缺省参数,不定长参数; 实参可以分为位置参数和关键字参数。

1)实参的位置参数

函数调用时,按形参的位置,从左往右,一一匹配传递参数。位置参数必须一一对应,缺一不可,代码如下:

def mul2(a, b):     
    c = a*b    
    print (c)
    
mul2(7.,9) #7,9这两个实参的传递方法是位置参数
63.0
2)实参的关键字参数

函数调用时,通过“形参=值”方式为函数形参传值,不用按照位置为函数形参传值,这种方式叫关键字参数,代码如下:

def mul2(a, b):     
    c = a*b    
    print (c)
mul2(9, b=7) #7,9这两个实参的传递方法是关键字参数,传入顺序可与形参定义顺序不同
63

注意:

(1)关键字参数必须在位置参数的右边,且对同一个形参不能重复传值。

(2)如果位置参数和关键字参数同时混合使用,那么顺序上必须先传位置参数,再传关键字参数。

3)形参的缺省参数

形参设定默认值,称为缺省参数,也叫默认参数,代码如下:

def mul2(a, b=1):     
    c = a*b    
    print (c)
mul2(7) 
mul2(7,9) #b为缺省参数,此时,调用函数时传入新的b,所以在函数计算时b等于9
7
63

注意:

(1)调用函数时,如果没有传入默认参数对应的实参,则使用默认值。

(2)默认参数必须在普通参数的后边。

4)形参的不定长参数

元组型不定长参数:形参变量名前面加上一个“*”,这个参数则为元组型不定长参数。元组型可变形参必须在形参列表的最后边,代码如下:

#hanshu.py
# *args 不定长参数,可以接收0~多个实参    
# 把实参的1,2,3, 包装成元组(1, 2, 3)再传递, 等价于args = (1, 2, 3)    
def func(*args):    
    # 函数内部使用,无需加*    
    print(args, type(args))    
# 函数调用    
func(1, 2, 3, 4) 
(1, 2, 3, 4) <class 'tuple'>

字典型不定长参数:定义参数时需要在形参名前添加“**”,则为字典型不定长参数。字典型可变形参必须在形参列表的最后边,代码如下:

#hanshu.py
# 把实参包装成 {'city': 'sz', 'age': 18}给kwargs传递    
# kwargs = {'city': 'sz', 'age': 18}    
def func(name, **kwargs):    
    # 同时存在形参name, name不会被包装到字典中    
    print(name)    
    print(kwargs)  # 函数内部使用,无需加*    
# 实参的写法: 变量=数据,变量=数据    
func(name='mike', city='sz', age=18)     
mike
{'city': 'sz', 'age': 18}

函数参数的关键要点总结:

(1)缺省参数需要在非缺省参数之后。

(2)关键字参数需要在位置参数之后。

(3)所有传递的关键字参数必须有对应参数,并且顺序不重要。

(4)参数只能赋值一次。

(5)缺省参数通常是可选的,可以不传递值。

3. 函数的返回值

返回值,就是程序中函数完成一件事情后,最后给调用者的结果。想要在函数中把结果返回给调用者,需要在函数中使用return关键字,代码如下:

def add2num(a, b):    
    return a+b 

注意,当一个函数返回了一个数据,如果想要用这个数据,那么就需要保存。 保存函数的返回值实例代码如下:

#hanshu.py
#定义函数    
def add2num(a, b):    
    return a+b    
#调用函数,顺便保存函数的返回值    
result = add2num(72,17)    
#因为result已经保存了add2num的返回值,所以在接下来的场景中,就可以使用了    
print (result) #结果等于89
89

在Python中,在关键字return后面将多个返回值用逗号隔开即可以返回多个值。

4. 引用和引用传参

在Python中,值是靠引用来传递的。可以用id()来判断两个变量是否为同一个值的引用。可以将id值理解为变量在计算机中的内存地址标示,代码如下:

#hanshu.py
a=1    
b=a    
print(id(a)) 
print(id(b)) 
a=2    
print(id(a))      
print(id(b)) 
1657366446320
1657366446320
1657366446352
1657366446320

上述代码的图例解释如1所示。

图1 图例解释

 

可变数据类型列表的引用代码如下:

#hanshu.py
a=[1,2]    
b=a    
print(id(a))
print(id(b))    
a.append(3)    
print(a) 
print(id(a)) 
print(id(b))
1657473933696
1657473933696
[1, 2, 3]
1657473933696
1657473933696

上述代码的图例解释如图2所示。

图2 图例解释

因此,数据类型可变还是不可变的本质是:在改变数据具体的值时,其内存的地址索引是否改变;改变的话当前数据为不可变数据类型,不变的话则为可变数据类型。

Python中函数参数是引用传递(注意不是值传递)。因此,可变类型与不可变类型的变量分别作为函数参数时,产生的影响是不同的。具体来说,对于不可变类型,因变量不能修改,所以函数中的运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量,代码如下:

#hanshu.py
a = (1,2,3)    
def add(arr):    
    arr += arr  
    
add(a)    
print(a)
(1, 2, 3)

此代码将输出 [1,2,3,1,2,3],而不是 [1,2,3]。

当传递一个列表(或其他可变对象)给函数时,实际上是传递了这个对象的引用。因此,函数内部对该对象的任何更改将影响函数外部的该对象。

在 add 函数内部,使用了“+=”运算符,这是一个就地修改的运算符。这意味着它会修改原始列表,而不是创建一个新的列表。因此,当执行arr += arr时,实际上是将arr列表的内容添加到自身,所以结果是 [1,2,3,1,2,3]。

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

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

相关文章

微信小程序的手工艺品定制商城溯源交易系统

管理员通过点击后台管理&#xff0c;进入页面可以获取首页、个人中心、用户管理、商品分类管理、商品信息管理、我的定制管理、我的预约管理、系统管理、订单管理等功能模块&#xff0c;进行相对应操作 用户登录到小程序首页可以查看首页、商品信息、工艺品资讯、购物车、我的等…

OpenHarmony教程指南-性能示例

介绍 本示例集成了条件渲染、动态加载以及HiDumper等场景来介绍如何提升应用性能。 效果预览 HiDumper使用说明&#xff1a; 1.点击性能示例主页的HiDumper按钮&#xff0c;进入HiDumper查看组件信息场景页。 1.点击HiDumper查看组件信息场景页的查看应用组件树进入场景页。…

msf端口转发达到远程连接

一般云服务器上搭建msf没办法远程连接这样很苦恼 这里可以使用端口转发流量来实现 1.首先确认目标机开启了远程连接 然后使用命令将对方3389的端口转发到我们的任意监听端口 portfwd add -l 6666 -p 3389 -r 192.168.78.129 转发成功后ifconfig一下发现已经变化了 然后直接…

Python使用openpyxl库或pandas库创建.xlsx格式的Excel文件,并向文件不同的sheet按行或按列写入内容

import openpyxl# 创建-一个Workbook对象 wb openpyxl.Workbook()# 创建多个工作表 sheet1 wb.active sheet1.title "s1"sheet2 wb.create_sheet("s2")# 在不同的工作表中写入数据 sheet1["A1"] Data for Sheet1 sheet1["A2"] D…

STM32 利用FlashDB库实现在线扇区数据管理不丢失

STM32 利用FlashDB库实现在线扇区数据管理不丢失 &#x1f4cd;FalshDB地址:https://gitee.com/Armink/FlashDB ✨STM32没有片内EEPROM这样的存储区&#xff0c;虽然有备份寄存器&#xff0c;仅可以实现对少量数据的频繁存储&#xff0c;但是依赖备份电源&#xff08;BAT引脚&a…

xcode15,个推推送SDK闪退问题处理办法

个推iOS推送SDK最新版本 优化了xcode15部分场景下崩溃问题&#xff0c;以及回执上传问题&#xff0c;近期您的应用有发版计划&#xff0c;建议更新SDK&#xff1a; 1&#xff09;GTSDK更新到3.0.5.0以及以上版本&#xff1b; 2&#xff09;GTCommonSDK更新到3.1.0.0及以上版本…

【PCL】(二十八)点云超体素分割

&#xff08;二十九&#xff09;点云超体素分割 论文&#xff1a;Voxel Cloud Connectivity Segmentation - Supervoxels for Point Clouds supervoxel_clustering.cpp #include <pcl/console/parse.h> #include <pcl/point_cloud.h> #include <pcl/point_ty…

Linux:kubernetes(k8s)prestop事件的使用(11)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

AI日报:一个新的“科技超级周期”正在出现

文章目录 技术周期预测可连接设备 技术周期 未来学家艾米韦伯表示&#xff0c;人工智能和其他两种通用技术将迎来一个新的“技术超级周期”&#xff0c;预计将在经济中创造“实质性和持续性”的变化。 她在SXSW 2024上表示&#xff0c;过去的科技超级周期是由通用技术引发的&…

二、HarmonyOS 操作系统以及相关生态

前言 2019年8月9日&#xff0c;华为技术有限公司在华为开发者大会上正式发布了HarmonyOS 1.0&#xff0c;同时宣布该操作系统源代码开源。 2020年9月10日&#xff0c;HarmonyOs 2.0正式发布。与HarmonyOs 1.0版本相比&#xff0c;HarmonyOs 2.0在分布式软总线、分布式数据管理、…

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案&#xff0c;它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括&#xff1a; 1. **透明加密技术**&#xff1a; 天锐绿盾采用了透明加密技…

气压计LPS25HB开发(1)----轮询获取气压计数据

气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…

JAVA初阶数据结构栈(工程文件后续会上传)(+专栏数据结构练习是完整版)

1.栈的概念讲解(Stack)&#xff09; 定义&#xff1a;栈是一种先进后出的数据结构 要想拿到12就要把它头上的所有东西给移出去 2.栈的实现&#xff08;代码&#xff09; 2.1栈的方法逻辑的讲解 &#xff08;1&#xff09;新建一个测试类Frank &#xff08;2&#xff09;进…

C语言黑魔法第三弹——动态内存管理

本文由于排版问题&#xff0c;可能稍显枯燥&#xff0c;但里面知识点非常详细&#xff0c;建议耐心阅读&#xff0c;帮助你更好的理解动态内存管理这一C语言大杀器 进阶C语言中有三个知识点尤为重要&#xff1a;指针、结构体、动态内存管理&#xff0c;这三个知识点决定了我们…

Set cancelled by MemoryScratchSinkOperator

Bug信息 Caused by: com.starrocks.connector.spark.exception.StarrocksInternalException: StarRocks server StarRocks BE{host=10.9.14.39, port=9060} internal failed, status code [CANCELLED] error message is [Set cancelled by MemoryScratchSinkOperator]Bug产生的…

武汉LUG报名开启!这次我们来到了华中科技大学,3月23日(周六)来见面吧!

内容来源&#xff1a;deepin 社区 LUG 不间断&#xff0c;精彩不停歇&#xff0c;经过一个月的修整&#xff0c;2024年3月23日下午&#xff0c;我们将在华中科技大学东校区举办 3月 WHLUG&#xff0c;欢迎大家来到现场&#xff0c;和我们一起交流技术&#xff0c;分享自己学习过…

java导入导出excel用注解实现

导入&#xff1a; excel和接收类字段对应关系 Data ColumnWidth(30) public class AppVcardExcelVO {ExcelLineExcelIgnoreSchema(description "导入时候回显行号")private Long lineNum;NotBlank(message "客户名不能为空")ExcelProperty("客户名…

环形缓冲区在stm32上的使用

目录 环形缓冲区在stm32上的使用前言实验目的环形缓冲区的定义和初始化写入数据到环形缓冲区从环形缓冲区读取数据实验结果本文中的实践工程 环形缓冲区在stm32上的使用 本文目标&#xff1a;环形缓冲区在stm32上的使用 按照本文的描述&#xff0c;应该可以跑通实验并举一反三…

Talk|麻省理工学院李晨昊:发展式腿足智能-从模仿到生成

本期为TechBeat人工智能社区第578期线上Talk。 北京时间3月13日(周三)20:00&#xff0c;麻省理工学院博士生—李晨昊的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “发展式腿足智能-从模仿到生成”&#xff0c;向大家系统地介绍了专家示范(exper…

BMC模块硬件资源介绍

1 概述 FT-E2KS-BMC-D4-A&#xff08;以下简称 “BMC” &#xff09;是飞腾信息技术有限公司&#xff08;以下简称 “飞腾” &#xff09;和广东汉为信息技术有限公司&#xff08;以下简称 “汉为” &#xff09;联合设计、研发、生产的国产化服务器远程管理控制模块。服务…