Python:函数的形参与实参

注意:本文引用自专业人工智能社区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.rhkb.cn/news/275572.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发系列(二十六)·小程序运行机制(启动、前后台状态、挂起、销毁)和小程序更新机制

目录 1. 小程序运行机制 1.1 启动 1.2 前台和后台状态 1.3 挂起 1.4 销毁 2. 小程序更新机制 1. 小程序运行机制 1.1 启动 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热启动。 冷启动&#xff1a;如果用户首次打开&#xff0c;或小…

OPPO后端二面,凉了!

这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经&#xff0c;我对比较典型的一些问题进行了分类并给出了详细的参考答案。希望能对正在参加面试的朋友们能够有点帮助&#xff01; Java String 为什么是不可变的? public final class String implements java.io.Seri…

阿里云服务器安全狗免费使用多引擎智能查杀引擎

云服务器具有按量付费、降低综合成本等诸多优势&#xff0c;受到很多企业的欢迎。 因此&#xff0c;目前使用的云服务器越来越多。 阿里云是目前云服务器中最具影响力的品牌&#xff0c;因此选择阿里云服务器的用户数量也是最多的。 那么阿里云服务器需要安装杀毒软件吗&#x…

Python学习:数据类型转换

数据类型转换 对数据内置的类型进行转换&#xff0c;数据类型的转换&#xff0c;一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种&#xff1a; 隐式类型转换 - 自动完成显式类型转换 - 需要使用类型函数来转换 隐式类型转换 Python 会自动…

微信小程序一次性订阅requestSubscribeMessage授权和操作详解

一次性订阅&#xff1a;用户订阅一次发一次通知 一、授权 — requestSubscribeMessage Taro.requestSubscribeMessage({tmplIds: [], // 需要订阅的消息模板的id的集合success (res) {console.log("同意授权", res)},fail(res) {console.log(拒绝授权, res)}})点击或…

2001-2022年上市公司数字化转型程度指数测算数据(含原始数据+测算代码+计算结果)(无形资产衡量)

2001-2022年上市公司数字化转型程度指数测算数据&#xff08;含原始数据测算代码计算结果&#xff09; 1、时间&#xff1a;2001-2022年 2、指标&#xff1a;证券代码、证券简称、统计截止日期、是否发生ST或*ST或PT、、是否发生暂停上市、行业代码、行业名称、stkcd、year、…

mediapipe 实现姿态分析——举手检测

目录 人体姿态检测 效果展示 举手检测 行业应用 代码实现 代码分析 效果展示 代码修改&#xff0c;一只手举起即可 总结 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦…

【数据结构】二叉树---AVL树的实现

目录 一. 什么是AVL树 二. AVL树的结点结构定义 三. AVL树的动态平衡法 1. 左单旋转 --- RL(RotateLeft) 型调整操作 2. 右单旋转 --- RR(RotateRight) 型调整操作 3. 先左后右双旋转 --- RLR (RotateLeftRight) 型调整操作 4. 先右后左双旋转 --- RRL (RotateRightL…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

最新若依项目快速上手

最新若依项目快速上手 配套视频&#xff1a;若依项目快速上手视频 1. 下载源码 官网&#xff1a;https://ruoyi.vip/ 前端 git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git后端 git clone https://gitee.com/y_project/RuoYi-Vue.git2. 数据库 创建数据库ry-vue…

考研复习C语言初阶(3)

目录 一.函数是什么? 二.C语言中函数的分类 2.1库函数 2.2自定义函数 三.函数的参数 3.1实际参数&#xff08;实参&#xff09; 3.2 形式参数&#xff08;形参&#xff09; 四.函数的调用 4.1 传值调用 4.2 传址调用 五. 函数的嵌套调用和链式访问 5.1 嵌套调用 5…

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化&#xff0c; 线程安全&#xff0c;但会导致类加载时间变长。饿汉模式如果使用过多&#xff0c;可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁&#xff0c; 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

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

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

基于四边形网格的服装设计

前言 该篇论文对算法的描述是比较详细的&#xff0c;在Unity中复现其功能。我这边的效果是这样的。 不尽人意 正文开始 Sketch-Based Garment Design with Quad Meshes 基于草图的服装设计与四边形网格 2020/02/13 Jackdos整理翻译 Abstract摘要 Garment creation cont…

ORACLE Linux(OEL) - Primavera P6EPPM 安装及分享

引言 继上一期发布的CentOS版环境发布之后&#xff0c;近日我制作了基于ORACLE Linux的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代表取得联系…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

C++提高笔记(三)---STL容器(vector、deque)

1、vector容器 1.1vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…

qt 格式化打印 日志 QMessagePattern 格式词法语法及设置

一、qt源码格式化日志 关键内部类 QMessagePattern qt为 格式化打印日志 提供了一个简易的 pattern(模式/格式) 词法解析的简易的内部类QMessagePattern,作用是获取和解析自定义的日志格式信息。 该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qloggi…

Seata源码流程图

1.第一阶段分支事务的注册 流程图地址&#xff1a;https://www.processon.com/view/link/6108de4be401fd6714ba761d 2.第一阶段开启全局事务 流程图地址&#xff1a;https://www.processon.com/view/link/6108de13e0b34d3e35b8e4ef 3.第二阶段全局事务的提交 流程图地址…