python语言进阶之函数

news2025/7/19 5:41:13

目录

前言

函数的创建和调用

函数创建

调用函数

参数传递

形式参数和实际参数

位置参数

数量必须与定义时一致

位置必须与定义时一致

关键字参数

为参数设置默认值

可变参数

**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))

运行结果如下:

下一篇   面向对象程序设计

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

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

相关文章

Mybatis-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3(含mp代码生成器) Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解,很不灵活 希望用枚举类来代替这个Integer 这样的话我…

Baklib知识中台构建企业智能运营核心架构

内容概要 在数字化转型的浪潮中,企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台,通过构建智能运营核心架构,为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…

保姆级GitHub大文件(100mb-2gb)上传教程

GLF(Git Large File Storage)安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…

【16届蓝桥杯寒假刷题营】第2期DAY1I

4.有向无环的路径数 - 蓝桥云课 问题描述 给定 N 个节点 M 条边的有向无环图,请你求解有多少条 1 到 N 的路径。 由于答案可能很大,你只需要输出答案对 998244353 取模后的结果。 输入格式 第一行包含 2 个正整数 N,M,表示有向无环图的节…

DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

Ubuntu 系统 LVM 逻辑卷扩容教程

Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中,LVM(Logical Volume Manager)是一种逻辑卷管理工具,允许管理员动态调整磁盘空间,而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷,以实现…

7-Zip Final绿色版:高效压缩解压缩工具

在工作与学习旅程中,我们时常需要与各式各样的文件和文件夹打交道。为了更有效地利用存储空间或促进文件的便捷传输,压缩与解压工具自然而然地成为了我们不可或缺的助手。在众多同类工具中,7-Zip凭借其高效能、免费及开源的特性,深…

QML使用ChartView绘制饼状图

一、工程配置 首先修改CMakeLists.txt,按下图修改: find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp,按下图修改&#xff…

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装,会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码: android.injected.testOnlyfalse 最后点击“Sync now”,等待重新加载gradle资源即可 后面我们重新编译Debug安装…

Ubuntu添加桌面快捷方式

以idea为例 一. 背景 在ubuntu中,很多时候是自己解压的文件并没有桌面快捷方式,需要自己找到对应的目录的执行文件手动打开,很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…

排序算法的魔法世界:用C语言揭开数据排列的奥秘

当数据开始跳集体舞:排序的意义 想象你面前有一群调皮的数字精灵在开派对,7和3在跳探戈,9和1在玩捉迷藏,5和2在抢蛋糕。这时候就需要排序算法这位神奇的派对管家出场了!它像音乐指挥家一样挥动魔棒,让所有数字精灵乖乖排成整齐的队伍。在计算机的世界里,排序算法就是处…

网页模板免费HTML源码 HTML网页设计模板

在现代网站开发中,拥有一个美观且功能齐全的网页模板是至关重要的。对于许多开发者和设计师来说,获取高质量的免费HTML源码和网页设计模板可以大大简化开发流程。本文将探讨网页模板免费HTML源码的资源、优势以及如何有效利用这些模板。 什么是网页模板…

与传统光伏相比 城电科技的光伏太阳花有什么优势?

相比于传统光伏,城电科技的光伏太阳花有以下优势: 一、发电效率方面 智能追踪技术:光伏太阳花通过内置的智能追踪系统,采用全球定位跟踪算法,能够实时调整花瓣(即光伏板)的角度,确…

Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究

基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…

Unity DeepSeek API 聊天接入教程(0基础教学)

Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日,DeepSeek-R1正式上线,和当前市面上的主流AI相比,它在仅有极少标注数据的情况下&am…

【16届蓝桥杯寒假刷题营】第1期DAY4

4.可达岛屿的个数 - 蓝桥云课 题目背景 在一个神奇的魔法世界中,有一座古老的迷幻之城。迷幻之城被分成 n 个鸟屿,编号从 1 到 n,共有 m 座桥。迷幻之城的居民们希望能够建立起紧密的联系,每个岛屿上的居民都想知道自己最多能到…

CAN学习记录

CAN(Controller Area Network),是ISO国际标准化的串行通信协议,为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需求 低速CAN(ISO11519)通信速率10~125kbps,总线长度可达1000米 高速CAN&#…

滑动窗口算法篇:连续子区间与子串问题

1.滑动窗口原理 那么一谈到子区间的问题,我们可能会想到我们可以用我们的前缀和来应用子区间问题,但是这里对于子区间乃至子串问题,我们也可以尝试往滑动窗口的思路方向去进行一个尝试,那么说那么半天,滑动窗口是什么…

001-监控你的文件-FSWatch-C++开源库108杰

fswatch 原理与应用简介fswatch 安装fswatch 实践应用具体应用场景与细节补充 1. 简介 有些知识,你知道了不算厉害,但你要是不知道,就容易出乱。 很多时候,程序需要及时获取磁盘上某个文件对象(文件夹、文件&#xff0…