python语言进阶之函数

目录

前言

函数的创建和调用

函数创建

调用函数

参数传递

形式参数和实际参数

位置参数

数量必须与定义时一致

位置必须与定义时一致

关键字参数

为参数设置默认值

可变参数

**parameter

返回值

变量的作用域

局部变量

全局变量

匿名函数


前言

提到函数,大家可能会想到数学函数,函数是数学中最重要的一个模块,贯穿整个数学。在Python中,函数的应用非常广泛。在前面我们已经多次接触过函数。例如,用于输出的print()函数、用于输入的input()函数,以及用于生成一系列整数的range()函数。但这些都是Python 内置的标准函数,可以直接使用。除了可以直接使用的标准函数之外,Python还支持自定义函数,即通过将一段有规律的、重复的代码定义为函数,以达到一次编写、多次调用的目的。使用函数可以提高代码的重复利用率。

函数的创建和调用

函数创建

创建函数也称为定义函数,可以理解为创建一个具有某种用途的工具。使用 def 关键字实现。

语法格式如下:

def functionname([parameterlist]):

["comments"]

[functionbody]

其中:functionname为函数名称,在调用函数时使用,parameterlist为可选参数,用于指定想函数中传递的参数,如果有多个参数,则各参数间使用逗号‘,’分割,如果不指定,则表示该函数没有参数,在调用时,也不指定参数,"comments"为可选参数,表示为函数指定注释,也称为文档字符串,其内容通常是说明该函数的功能、要传递的参数的作用等,可以为用户提供油耗提示和帮助的内容。Functionbody为可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。如果函数有返回值,可以使用return语句返回。

举例:

def result(a,b):"""功能:用于计算a和b之间的计算结果a和b为输入的数字"""return a*b+a

这样我们就完成了函数的创建,接下来我们看如何调用函数。

调用函数

调用函数也就是执行函数。如果把创建的函数理解为创建一个具有某种用途的工具,那么调用函数就相当于使用该工具。

语法格式如下:

functionname([parametersvalue])

其中,functionname为函数名称,要调用的函数名称必须是已经创建好的,parametersvalue为可选参数,用于指定各个参数的值,如果需要传递多个参数值,则各参数值间使用逗号分割,如果该函数没有参数,则直接写一对小括号即可。

举例:

调用上述创建的result函数

def result(a,b):"""功能:用于计算a和b之间的计算结果a和b为输入的数字"""return a*b+aprint(result(4,9))

运行结果如下:

参数传递

在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。

形式参数和实际参数

在使用函数时,经常会用到形式参数和实际参数。它们都被叫作参数,下面将先通过形式参数与实际参数的作用来讲解二者之间的区别。

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

形式参数:在定义函数时,函数名后面括号中的参数为形式参数

实际参数:在调用一个函数时,函数名后面括号中的参数为实际参数,也就是将函数的调用者提供给函数的参数。

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

举例:

#定义函数tool
def tool(list):str = '我叫%s,我今年%d岁了。'print(str%list)
#声明变量
a = ('小明',7)
b = ('小刚',8)
#调用函数
tool(a)
tool(b)

运行结果如下:

位置参数

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

数量必须与定义时一致

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

例如上面例子中,调用函数tool()时,传递两个参数:

位置必须与定义时一致

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

抛出异常信息

抛出TypeEror 的异常信息,其主要原因在于,实际参数的类型与形式参数的类型不一致,并且在函数中,这两种类型不能正常转换。

举例:

#定义函数tool
def tool(a,b,c):print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool(7,'小明',98)

运行结果如下:

产生的结果与预期不符

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

举例:

#定义函数tool
def tool(a,b,c):print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool('小明',98,7)

运行结果如下:

关键字参数

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

举例:

#定义函数tool
def tool(a,b,c):print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool(b = 7,a = '小明',c = 98)

运行结果如下:

为参数设置默认值

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

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

[functionbody]

其中,functionname为函数名称,在调用函数时使用,parameter1 = defaultvalue1为可选参数,用于指定向函数中传递的参数,并且为该参数设置默认值为defaultvalue1,functionbody为可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。

举例:

#定义函数tool
def tool(a,b,c = 100):print('我的名字叫:'+a,'我的年龄是'+str(b),'岁,我的成绩是'+str(c))
#调用函数
tool('小明',7)

运行结果如下:

可变参数

在Python中,还可以定义可变参数。可变参数也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个到任意个。

定义可变参数时,主要有两种形式:一种是*parameter;另一种是**parameter。

*parameter

*parameter 形式表示接收任意多个实际参数并将其放到一个元组中。例如,定义一个函数,让其可以接收任意多个实际参数。

举例:

#定义函数sum
def sum(*temp):print('\n我喜欢的水果有:')for i in temp:print(i)
#调用函数
sum('苹果')
sum('苹果','香蕉','梨')
sum('香蕉','榴莲','火龙果','李子','哈密瓜')

运行结果如下:

**parameter

**parameter形式表示接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中。

举例:

def printsign(**sign):# 定义输出姓名和星座的函数# 输出一个空行# 遍历字典# 输出组合后的信息print()for key, value in sign.items():print("["+ key+"]的星座是:"+ value)printsign(绮梦='水瓶座',冷伊一='射手座')

运行结果如下:

返回值

到目前为止,我们创建的函数都只是为我们做一些事,做完即结束。但实际上,有时还需要对事的结果进行获取。为函数设置返回值的作用就是将函数的处理结果返回给调用它的函数。

在Python 中,可以在函数体内使用return 语句为函数指定返回值。该返回值可以是任意类型,并县无论retun 语句出现在函数的什么位置,只要得到执行,就会直接结束函数的执行。

举例:

def sum(a,b):return a+b          #返回a+b的和
#调用函数
print(sum(1,7))

运行结果如下:

变量的作用域

变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“局部变量”和“全局变量”。下面分别对这两个变量进行介绍。

局部变量

局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。也就是说,函数内部的名字只在函数运行时才会创建,在函数运行之前或者运行完毕之后,所有名字都将不存在。所以,如果在函数外部使用函数内部定义的变量,就会出现抛出NameError异常。

举例:

def sum():c = '世界之大,无奇不有'print(c) 
print(sum())print(c)

运行结果如下:

全局变量

与局部变量对应,全局变量为能够作用于函数内外部的变量。全局变量主要有以下两种情况。

1、如果一个变量在函数外部被定义,那么它不仅可以在函数外部被访问到,而且也可以在函数内部被访问到。在函数外部定义的变量是全局变量。

举例:

c = '世界之大,无奇不有'
def sum():print('函数内部:'+c)
#调用函数
sum()
#直接输出全局变量c
print('函数外部:'+c)

运行结果如下:

注意:当局部变量与全局变量重名时,对函数内部的变量进行赋值后,不影响函数外部的变量。

2、在函数内部定义,在使用global 关键字修饰后,该交量将变为全局变量。在函数外部也可以访问到该变量,且还可以在函数内部对其进行修改。

举例:

def sum():c = '世界那么大,我想去看看'print('函数内部c=:'+c)
#调用函数
sum()
print('函数外部c='+c)def sun():global cc = '世界那么大,我想去看看'print('函数内部c='+c)
#调用函数
sun()
#直接输出全局变量c
print('函数外部c=:'+c)

运行结果如下:

从上述结果中可以看出,在函数内部定义的变量即使与全局变量重名,也不影响全局变量的值。那么想要在函数内部改变全局变量的值,需要在定义局部变量时,使用global 关键字修饰,就可以在函数内部修改全局变量的值。

注意:尽管 Python 允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。

匿名函数

匿名函数是指没有名字的函数,应用在需要一个函数但是又不想费神命名这个函数的场合。通常情况下,这样的函数只使用一次。在pyhon中,使用lambda 表达式创建匿名函数,其

法格式如下:

result = lambda [arg1 [,arg2.,argn]]:expression

其中,result用于调用lambda表达式,[arg1 [,arg2.,argn]]为可选参数,用于指定要传递的参数列表,多个参数间使用逗号分割,expression为必选参数,用于指定一个实现具体功能的表达式,如果有参数,那么在该表达式中将应用这些参数。

举例:

#常规代码
def sum(a,b):result = a +breturn result
a,b = 3,10
print(sum(a,b))#使用 lambda 表达式的代码
result = lambda a,b: a+b
print(result(a,b))

运行结果如下:

下一篇   面向对象程序设计

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

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

相关文章

Qt信号槽调用出错:Qt: Dead lock detected while activating a BlockingQueuedConnection

目录 1.现象和原因分析 2. 总结 1.现象和原因分析 就在最近的开发过程中,程序一运行在控制台就打印: Qt: Dead lock detected while activating a BlockingQueuedConnection: 咋一看,怎么出现死锁了呢?仔细看下…

Linux安装Minio

1、下载rpm包 2、rpm 安装 rpm -ivh xx.rpm3、通过查看minion状态,查看其配置文件位置 systemctl start minio可以根据情况自定义修改配置文件内容,这里暂时不做修改 4、创建数据文件和日志文件,一般在/usr/local/ 5、编写启动脚本 #!/bi…

计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程

该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…

基于Spring Boot+Vue的宠物服务管理系统(源码+文档)

项目简介 宠物服务管理系统实现了以下功能: 基于Spring BootVue的宠物服务管理系统的主要使用者分为用户管理模块,由于系统运行在互联网络中,一些游客或者病毒恶意进行注册,产生大量的垃圾用户信息,管理员可以对这些…

jenkins服务启动-排错

服务状态为active (exited) 且进程不在 查看/etc/rc.d/init.d/jenkins配置 获取配置参数 [rootfy-jenkins-prod jenkins]# cat /etc/rc.d/init.d/jenkins | grep -v #JENKINS_WAR"/usr/lib/jenkins/jenkins.war" test -r "$JENKINS_WAR" || { echo "…

vue3 分析总结响应式丢失问题原因(二)

上一篇文件理解了响应式对象应用原理了。公式: 响应式对象 代理 触发器。 但是实际使用结果和预期还是不一致。具体现象是数据修改了,但是并没有实现响应式更新界面。即出现了响应式丢失现象。 一、什么情况下对象的响应式会丢失? 一般网…

【网络】协议与网络版计算器

协议与网络版计算器 文章目录 1.协议的概念 1.1序列化与反序列化 2.网络版计算器 2.1封装套接字2.2协议定制 2.2.1Jsoncpp2.2.2报文处理 2.3会话层:TcpServer2.4应用层:Calculate2.5表示层:Service2.6应用层、表示层和会话层->应用层 …

C# 添加图标

一、前言 为应用程序添加图标是优化用户界面、提升应用辨识度的重要操作。合适的图标能帮助用户快速识别和区分不同应用,增强应用的易用性和专业性。 本指南旨在为你提供详细、易懂的步骤,教你如何为应用程序的窗体添加图标。从图标素材的获取到具体的…

使用新版本golang项目中goyacc依赖问题的处理

背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析,文法分析等功能,可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc,需要生成goyacc的可执行文件。 而项目…

WPS的AI助手进化跟踪(灵犀+插件)

Ver V0.0 250216: 如何给WPS安装插件用以支持其他大模型LLM V0.1 250217: WPS的灵犀AI现在是DeepSeek R1(可能是全参数671B) 前言 WPS也有内置的AI,叫灵犀,之前应是自已的LLM模型,只能说是属于“能用,有好过无”,所…

计算机视觉:卷积神经网络(CNN)基本概念(一)

第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…

rabbitmq详解

有需要的直接看狂神的视频,讲得很好 简介 RabbitMQ 是一个开源的 消息队列中间件,实现了 AMQP(Advanced Message Queuing Protocol,先进消息队列协议)。它允许 应用程序、服务、系统之间异步地传递消息,并…

moveable 一个可实现前端海报编辑器的 js 库

目录 缘由-胡扯本文实验环境通用流程1.基础移动1.1 基础代码1.1.1 data-* 解释 1.2 操作元素创建1.3 css 修饰1.4 cdn 引入1.5 js 实现元素可移动1.6 图片拖拽2.缩放3.旋转4.裁剪 懒得改文案了,海报编辑器换方案了,如果后面用别的再更。 缘由-胡扯 导火…

计算机视觉中图像的基础认知

第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、图像/视频的基本属性…

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…

Next.js【详解】CSS 样式方案

全局样式 Global CSS 默认已创建,即 src\app\globals.css,可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…

彻底解决Idea控制台中文乱码问题

中文乱码我相信每一个程序员都会遇到这种问题。 但有时候我们按照网上教程去设置,确实编码好了,但是有时候按照教程来却没能达到我们的预期。 在此之前我将所有编码都设置成了UTF-8,文件编码,项目编码,尝试(最终不需要…

[实现Rpc] 客户端划分 | 框架设计 | common类的实现

目录 3. 客户端模块划分 3.1 Network模块 3.2 Protocol模块 3.3 Dispatcher模块 3.4 Requestor模块 3.5 RpcCaller模块 3.6 Publish-Subscribe模块 3.7 Registry-Discovery模块 3.8 Client模块 4. 框架设计 4.1 抽象层 4.2 具象层 4.3 业务层 ⭕4.4 整体设计框架…

Java里ArrayList和LinkedList有什么区别?

大家好,我是锋哥。今天分享关于【Java里ArrayList和LinkedList有什么区别?】面试题。希望对大家有帮助; Java里ArrayList和LinkedList有什么区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ArrayList 和 LinkedL…

【Java】分布式锁Redis和Redisson

https://blog.csdn.net/weixin_44606481/article/details/134373900 https://www.bilibili.com/video/BV1nW421R7qJ Redis锁机制一般是由 setnx 命令实现,set if not exists,语法setnx key value,将key设置值为value,如果key不存在…