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+a

print(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 c
    c = '世界那么大,我想去看看'
    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 +b
    return result
a,b = 3,10
print(sum(a,b))

#使用 lambda 表达式的代码
result = lambda a,b: a+b
print(result(a,b))

运行结果如下:

下一篇   面向对象程序设计

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

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

相关文章

STM32 如何使用DMA和获取ADC

目录 背景 ‌摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术,允许某些硬件子系统直接访问系统内存,而不需要中央处理器(CPU)的介入,从而减轻CPU的负担。我们可以通过DMA来从外设&#xf…

在linux系统中安装Anaconda,并使用conda

系统 : ubuntu20.04 显卡:NVIDIA GTX1650 目录 安装Anaconda第一步:下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令:uname -a2. 下载合适版本的Anconda 第二步:安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…

计网-数据链路层

3.1数据链路层的概述 概念 链路就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。 数据链路是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路。 数据链路层以帧为单位传输和处理数据。 网络中的主机、路由器等都必须实…

Versal - 基础5(裸机开发 AIE-ML+Vitis2024.2界面aie report介绍)

目录 1. 简介 2. 申请 License 2.1 申请网址 2.2 填写 Host 2.3 导入 License 3. 示例 3.1 vivado_platform 3.1.1 由模板创建 3.1.2 模板参数 3.1.3 修改BD参数 3.1.4 配置CIPS和MC 3.1.5 导出PFM 3.2 vitis_platform 3.2.1 创建组件 3.2.2 导入XSA并配置 3.2…

Python 字典思维导图

在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…

用pytorch实现一个简单的图片预测类别

前言: 在阅读本文之前,你需要了解Python,Pytorch,神经网络的一些基础知识,比如什么是数据集,什么是张量,什么是神经网络,如何简单使用tensorboard,DataLoader。 本次模型训练使用的是…

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

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

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下: 我们在powerbi里新建一个矩阵,然后如图加入字段: 我们就会得到这样的矩阵: 我们在“可视化”->“列”,上双击,输入空格,就能消除左上角的"类别"两字 同理修…

报名丨Computer useVoice Agent :使用 TEN 搭建你的 Mac Assistant

与 TEN 相聚在「LET’S VISION 2025」大会,欢迎来展位上跟我们交流。这次我们还准备了一场聚焦「computer use」的工作坊,功能新鲜上线,线下首波体验! 📅 TEN 展位:2025年3月1日-2日 TEN workshop&#x…

python opencv基础使用总结

1.安装opencv库:pip install opencv-python 2.基础使用范例 import cv2 #图片的基本操作#1.读取一张图片 参数 1:图片的文件名如果图片放在当前文件夹下,直接写文件名就行,如lena.jpg否则需要给出绝对路径,如D:\Ope…

【STM32】舵机SG90

1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…

OpenEuler学习笔记(三十三):在 OpenEuler 上搭建 OpenGauss 数据库环境

在 OpenEuler 上搭建 OpenGauss 数据库环境需要按照以下步骤进行。OpenGauss 是华为开源的一款高性能关系型数据库,支持高并发、高可用性和分布式部署。 1. 环境准备 确保你的 OpenEuler 系统满足以下要求: 操作系统:OpenEuler 20.03 LTS 或…

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言: GitHub Copilot 的最新更新为开发者带来了显著变化,其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令,并具备多级任务推理能力,这使得开发者在开发复杂功能时,可大幅减少…

【数据结构】(9) 优先级队列(堆)

一、优先级队列 优先级队列不同于队列,队列是先进先出,优先级队列是优先级最高的先出。一般有两种操作:返回最高优先级对象,添加一个新对象。 二、堆 2.1、什么是堆 堆也是一种数据结构,是一棵完全二叉树&#xff0c…

AI大模型的文本流如何持续吐到前端,实时通信的技术 SSE(Server-Sent Events) 认知

写在前面 没接触过 SSE(Server-Sent Events),AI大模型出来之后,一直以为文本流是用 WebSocket 做的偶然看到返回到报文格式是 text/event-stream,所以简单认知,整理笔记博文内容涉及 SSE 认知,以及对应的 D…

计时器任务实现(保存视频和图像)

下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…

力扣19题——删除链表的倒数第 N 个结点

#题目 #代码 //定义虚拟头结点ListNode curnew ListNode(0,head); //定义两个指针指向虚拟头结点ListNode lcur;ListNode rcur;for(int i0;i<n;i){rr.next;}while(r!null){rr.next;ll.next;} //l.next就是我们要删除的那个元素if(l.next!null){l.nextl.next.next;}return c…

网络工程师 (42)IP地址

一、定义与功能 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物理地址的差异。这种地址分配方式确保了用户在连网的计算机上操作时&#xff0c;能够高效且方便地从众多计算机中选出自己所需…

记忆力训练day19

万能字母组合编码法 所有的文字和字母的背后都有画面 练的不是记单词&#xff0c;练的是注意力给到单词&#xff0c;出什么画面&#xff0c;然后画面与画面之间进行连接 拆的过程就是找熟词的过程 要关注自己的回忆路径是什么&#xff1f;也就是你是怎么回忆起来的&#xff0c…