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.mfbz.cn/a/459521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

城乡居民基本医疗信息管理系统|基于Springboot的城乡居民基本医疗信息管理系统设计与实现(源码+数据库+文档)

城乡居民基本医疗信息管理系统目录 目录 基于Springboot的城乡居民基本医疗信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、病例管理 2、医院资讯信息管理 3、医院资讯类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…

Linux中防火墙相关操作

一、查看防火墙状态 可通过两种方式查看防火墙状态&#xff0c;一种通过systemctl命令&#xff0c;另一种是通过firewall-cmd命令。 1、systemctl status firewalld 2、firewall-cmd --state 二、关闭防火墙 1、暂时关闭&#xff1a;设置暂时关闭防火墙将会在下次重启系统后失…

学点Java打小工_Day4_Homework

1 统计数字 1 int[] scores{0,0,1,2,3,5,4,5,2,8,7,6,9,5,4,8,3,1,0,2,4,8,7,9,5,2,1,2,3,9}; 求出上面数组中0-9分别出现的次数 &#xff08;双重for循环&#xff09; Testpublic void solveProblem1() {int[] scores {0,0,1,2,3,5,4,5,2,8,7,6,9,5,4,8,3,1,0,2,4,8,7,9,5,2,…

javaEE7

1. <% page pageEncoding"UTF-8"%><% page import"java.io.*"%> <% page import"java.util.*"%> <% page import"java.math.*"%> <html> <head><title>网站计数器</title></head&…

单例各样方式的写法

单例简介 特点 内存中只有一个实例&#xff0c;节约内存&#xff0c;无需频繁创建&#xff0c;减少性能开销&#xff0c;提高系统运行效率使用者无需关心类创建过程&#xff0c;整个项目中任何地方、任何时间开箱即用 缺点 单例模式没有抽象&#xff0c;扩展会有很大困难单例类…

LeetCode 热题 100 | 回溯(二)

目录 1 39. 组合总和 2 22. 括号生成 3 79. 单词搜索 菜鸟做题&#xff0c;语言是 C&#xff0c;感冒快好版 关于对回溯算法的理解请参照我的上一篇博客&#xff1b; 在之后的博客中&#xff0c;我将只分析回溯算法中的 for 循环。 1 39. 组合总和 题眼&#xff1a;c…

Vue.js+SpringBoot开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

c++入门你需要知道的知识点(上)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;c入门 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱也是好久没有更…

【实战】VMware17虚拟机以及Centos7详细安装教程

文章目录 前言技术积累VMware虚拟机的安装下载VMware安装文件VMware安装步骤VMware配置密匙 虚拟机中安装centos7准备工作创建虚拟机步骤1 自定义安装步骤2 硬盘兼容性步骤3 安装客户机操作系统步骤4 选择客户机操作系统步骤5 命名虚拟机步骤6 处理器配置步骤7 设置虚拟机内存步…

Django之Cookie

Django之Cookie 目录 Django之Cookie介绍Django操作Cookie设置Cookie浏览器查看Cookie 获取Cookie设置超时Cookie注销Cookie 模拟登录验证登录验证装饰器登录验证装饰器-升级版 介绍 当我们上网使用社交媒体或者购物时&#xff0c;浏览器需要通过一种方式来记住我们。想象一下…

构造函数、原型、instanceof运算符

通过构造函数创建对象 构造函数是学习面向对象的基础 任何函数都有原型对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

Linux--基本知识入门

一.几个基本知识 终端: CtrlAltT 或者桌面/文件夹右键,打开终端切换为管理员: sudo su 退出:exit查看内核版本号: uname -a内核版本号含义: 5 代表主版本号;13代表次版本号;0代表修订版本号;30代表修订版本的第几次微调;数字越大表示内核越新. 二.目录…

ADC架构I:Flash转换器

目录 简介 量化噪声模型 量化噪声模型 量化噪声与输入信号之间的相关性容易令人误解 SNR、处理增益和FFT噪底的关系 简介 接触ADC或DAC时您一定会碰到这个经常被引用的公式&#xff0c;用于计算转换器理论信噪比 (SNR)。与其盲目地相信表象&#xff0c;不如从根本上了解其…

单目测距+姿态识别+yolov8界面+车辆行人跟踪计数

yolov5单目测距速度测量目标跟踪&#xff08;算法介绍和代码&#xff09; 1.单目测距实现方法 在目标检测的基础上&#xff0c;我们可以通过计算物体在图像中的像素大小来估计其距离。具体方法是&#xff0c;首先确定某个物体的实际尺寸&#xff0c;然后根据该物体在图像中的像…

Linux编译器gcc/g++的功能与使用

一、程序的生成 首先&#xff0c;我们知道程序的编译分为四步&#xff1a; 1、预处理 2、编译 3、汇编 4、链接 1.1预处理 预处理功能主要包括头文件展开、宏定义、文件包含、条件编译、去注释等。 所谓的头文件展开就是在预处理时候&#xff0c;将头文件内容拷贝至源文…

【优选算法】专题1 -- 双指针 -- 移动零

前言: &#x1f4da;为了提高算法思维&#xff0c;我会时常更新这个优选算法的系列&#xff0c;这个专题是关于双指针的练习 &#x1f3af;个人主页&#xff1a;Dream_Chaser&#xff5e;-CSDN博客 一.移动零&#xff08;easy&#xff09; 描述&#xff1a; 「数组分两块」是⾮…

构建部署_Docker常用命令

构建部署_Docker常见命令 启动命令镜像命令容器命令 启动命令 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机启动&…

Netty网络编程(一)

Netty网络编程&#xff08;一&#xff09; 如何进行网络通信 Socket通信是进程通讯的一种方式&#xff0c;通过调用这个网络库的一些API函数可以实现分布在不同主机的相关进程之间的数据交换 网络编程的基本流程是什么&#xff1f; 服务端先创建socket套接字&#xff0c;然后用…

HarmonyOS 非线性容器特性及使用场景

非线性容器实现能快速查找的数据结构&#xff0c;其底层通过 hash 或者红黑树实现&#xff0c;包括 HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray 七种。非线性容器中的 key 及 value 的类型均满足 ECMA 标准。 HashMap HashMap 可用来存…

L2-002 链表去重(Python)

给定一个带整数键值的链表 L&#xff0c;你需要把其中绝对值重复的键值结点删掉。即对每个键值 K&#xff0c;只有第一个绝对值等于 K 的结点被保留。同时&#xff0c;所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15&#xff0c;你需要输出去重后…