Python学习:函数
函数定义

在Python中,函数(Function)是一组用于完成特定任务或计算的语句块。定义函数可以让我们将一段代码重用多次,提高代码的可读性和可维护性。以下是定义函数的基本语法和结构:
def function_name(parameters):"""Docstring: 函数说明文档,描述函数的功能、参数和返回值等信息"""# 函数体,实现函数的具体功能result = some_operation(parameters)return result # 可选的返回值
def:关键字用于定义函数。function_name:函数的名称,标识符命名规则与变量相同。parameters:函数的参数,可以是零个或多个。参数是在函数被调用时传递给函数的值。Docstring:用于书写函数的说明文档,建议在函数开头使用三引号(单引号或双引号)多行字符串格式书写。- 函数体:包含函数执行的代码块,实现函数的具体功能。
return:可选项,用于返回函数的结果给调用者。
以下是一个简单的示例来说明如何定义一个简单的函数:
def greet(name):"""这个函数用于向指定的人打招呼"""return "Hello, " + name + "!"
上面定义了一个名为greet的函数,接受一个名为name的参数,并返回一个打招呼的消息字符串。
在Python中,函数体的缩进非常重要,用于定义函数体内的代码块范围。另外,Python中的函数也支持默认参数、可变参数等特性,使得函数更加灵活和强大。
函数调用
函数调用是指在程序中使用函数来执行特定的任务或操作。在Python中,函数调用是通过提供函数名称和必要的参数(如果有的话)来触发函数执行。下面详细解释函数调用的过程:
- 函数定义:首先,你需要定义所需的函数。函数定义包含函数名称、参数列表、函数体和返回值等内容。例如:
def greet(name):return "Hello, " + name + "!"
- 函数调用:接下来,你可以在代码中通过函数名和传递参数来调用函数。被调用的函数将会执行其中的语句并返回一个值(如果定义了返回语句)。例如:
message = greet("Alice")
print(message)
在这个例子中,我们调用了greet函数并传递了参数"Alice",函数执行后返回了一个打招呼的消息字符串并赋值给message变量,然后将这个消息打印出来。
-
参数传递:参数传递是函数调用的重要部分。在函数定义中,参数是接收函数传入数据的变量。这些参数可以是必需的,也可以是可选的(带有默认值)。根据定义的参数类型和顺序,调用函数时要传递相应的参数。
-
返回值:函数可以选择性地返回一个值。返回值是函数执行后产生的输出,可以被赋值给一个变量或者直接使用。如果函数没有明确的返回语句,它将返回
None。
当调用函数时,程序会跳转到函数体中执行相应的操作,直到遇到return语句,然后将控制权交还给调用方。
函数调用是利用函数完成特定任务或操作的方式。通过合适地定义和调用函数,可以提高代码的复用性和可读性,从而更高效地编写程序。
函数参数
在Python中,函数参数可以分为以下几种类型:位置参数、默认参数、可变位置参数、可变关键字参数和关键字参数。下面我会详细解释每种参数的特点和用法:
-
位置参数(Positional Arguments):
- 位置参数是指在调用函数时根据参数的位置顺序传递的参数,必须按照定义函数时的参数顺序进行传递。
- 示例:
def greet(name, age):
-
默认参数(Default Arguments):
- 默认参数是在定义函数时就指定初始值的参数。调用函数时如果没有传递具体参数,则会使用默认值。
- 示例:
def greet(name, age=30):
-
可变位置参数(Arbitrary Arguments):
- 可变位置参数允许函数接受任意数量的位置参数,这些参数会被收集成一个元组。
- 示例:
def sum_values(*args):
-
可变关键字参数(Arbitrary Keyword Arguments):
- 可变关键字参数允许函数接受任意数量的关键字参数,这些参数会被收集成一个字典。
- 示例:
def display_info(**kwargs):
-
关键字参数(Keyword Arguments):
- 关键字参数提供了参数名称和参数值之间的对应关系,用于明确指定参数取值,可以与位置参数混合使用。
- 示例:
def send_email(subject, body, to):
下面是一个结合以上所有参数种类的示例:
def example_func(name, age=30, *args, **kwargs):print("Name:", name)print("Age:", age)print("Extra positional arguments:", args)print("Extra keyword arguments:", kwargs)# 函数调用
example_func("Alice", 25, "extra1", "extra2", key1="value1", key2="value2")
在这个示例中,name是一个位置参数,age是一个默认参数,*args是可变位置参数,**kwargs是可变关键字参数。通过这些函数参数种类的组合,我们可以非常灵活地定义和调用函数,以适应不同的需求。
函数参数传递
在Python中,函数参数传递分为两种:传递不可变对象和传递可变对象。下面我会详细解释这两种情况下函数参数的传递方式:
1. 传递不可变对象(如数字、字符串、元组等)
当向函数传递不可变对象时,实际上是将对象的值传递给了函数,而函数内部对这个值的修改不会影响到原始对象。
def update_value(x): # x为不可变对象x = x + 10 # 对x进行修改,不影响原始对象value = 5
update_value(value)
print(value) # 输出结果为 5,原始对象未受影响
2. 传递可变对象(如列表、字典等)
当向函数传递可变对象时,实际上传递的是对象的引用(内存地址),因此在函数内部对这个对象的修改会影响到原始对象。
def append_value(lst): # lst为可变对象lst.append(10) # 在lst末尾添加元素,会影响原始对象my_list = [1, 2, 3]
append_value(my_list)
print(my_list) # 输出结果为 [1, 2, 3, 10],原始对象被修改
总的来说,在Python中,函数参数传递主要分为以下两点:
- 对于不可变对象,传递的是对象的值,函数内部对参数的修改不会影响原始对象。
- 对于可变对象,传递的是对象的引用,函数内部对参数的修改会影响原始对象。
理解函数参数传递的机制可以帮助我们更好地设计和调用函数,确保程序行为符合预期。
匿名函数
匿名函数在Python中也称为lambda函数,它是一种简洁的函数形式,用于定义一次性、简单的函数。与普通的函数不同,匿名函数没有函数名称,通过lambda关键字创建,通常用来在代码中临时定义和使用简单的函数。下面我会详细解释匿名函数的语法和用法:
语法:
lambda arguments: expression
lambda:关键字用于声明匿名函数。arguments:参数列表,类似于普通函数。expression:函数体,即函数要执行的操作,最后表达式的值作为返回值。
示例:
- 使用匿名函数求平方:
square = lambda x: x ** 2
print(square(5)) # 输出结果为 25
- 使用匿名函数进行加法操作:
addition = lambda a, b: a + b
print(addition(3, 4)) # 输出结果为 7
- 匿名函数作为排序的key函数:
students = [('Alice', 22), ('Bob', 19), ('Eve', 25)]
students.sort(key=lambda x: x[1]) # 按照年龄排序
print(students) # 输出结果为 [('Bob', 19), ('Alice', 22), ('Eve', 25)]
特点:
- 精简:匿名函数通常在需要一个简单的函数时使用,可以避免额外定义普通函数。
- 单行:通常用于单行表达式,不支持多条语句。
尽管匿名函数在一些情况下非常方便和实用,但由于其简洁的特性,复杂逻辑通常不适合使用匿名函数。在这种情况下,应该使用普通的具名函数来实现。

return 语句
在Python中,return语句用于从函数中返回一个值。return语句可以出现在函数体中的任何地方,一旦执行到return语句,函数将立即停止执行,并返回指定的值给调用者。下面我会详细解释return语句的用法和特点:
用法:
- 返回值:
return语句通常用于返回函数执行的结果,这个结果可以是任何数据类型(例如整数、字符串、列表等)。
def add(a, b):return a + bresult = add(3, 5)
print(result) # 输出结果为 8
- 终止函数:
return语句不仅用于返回值,还可以提前终止函数的执行。
def check_value(x):if x < 0:return "Value is negative"else:return "Value is positive"print(check_value(-2)) # 输出结果为 "Value is negative"
- 返回多个值:
return语句也可以用于返回多个值,实际上返回的是一个元组,利用元组的解构赋值可以获取这些值。
def calculate(a, b):total = a + bdifference = a - breturn total, differencesum_result, diff_result = calculate(8, 3)
print(sum_result) # 输出结果为 11
print(diff_result) # 输出结果为 5
特点:
- 函数执行到
return语句时会立即停止,并返回指定的值。 - 如果
return语句没有指定返回值,函数将返回None。 - 函数可以有多个
return语句,但一般只有一个return会被执行。 - 在函数的任何地方都可以使用
return语句来提前终止函数的执行。
理解return语句的作用和用法有助于控制函数的返回结果和流程。在编写函数时,合理使用return语句可以使函数更加灵活和可靠。
强制位置参数
关注我,不迷路,共学习,同进步
关注我,不迷路,共学习,同进步

相关文章:
Python学习:函数
函数定义 在Python中,函数(Function)是一组用于完成特定任务或计算的语句块。定义函数可以让我们将一段代码重用多次,提高代码的可读性和可维护性。以下是定义函数的基本语法和结构: def function_name(parameters):&…...
docker run 使用 -p 命令一直显示端口被占用
解决办法 将 -p 换成 --net host 例如: docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /root/oneapi/data:/data justsong/one-api # 换成 docker run --name one-api -d --restart always --net...
Rust 实战练习 - 1. 输入,输出,环境变量,字符,字符串
目标: 获取程序命令行参数标准输入输出获取环境变量字符串,字符初步学习 cargo传递参数,需要加上-- use std::{env, ffi::OsString, io, io::Write};fn main() {println!("OS Env: {:?} > {:?}", env::current_dir().unwra…...
RuoYi-Vue-Plus(登录流程)
一、前端登录请求 登录按钮: src\views\login.vue 页面中登录片段,调用了handleLogin 方法,如下: @click.native.prevent="handleLogin" <el-button:loading="loading"size="medium"type="primary"style="width:100%;&qu…...
【数学】 【分数】 【字符串】972. 相等的有理数
本文涉及知识点 数学 分数 字符串 LeetCode972. 相等的有理数 给定两个字符串 s 和 t ,每个字符串代表一个非负有理数,只有当它们表示相同的数字时才返回 true 。字符串中可以使用括号来表示有理数的重复部分。 有理数 最多可以用三个部分来表示&…...
【4】DongshanPI-Seven 应用开发_文件IO
目录 1.文件IO1.1 文件IO分类1.2 查看系统调用IO用法 2. open 函数3. write 函数4. read 函数5 dup函数 1.文件IO 1.1 文件IO分类 在Linux系统中,一切都是“文件”:普通文件、驱动程序、网络通信等。所有的操作都是通过文件IO来操作的。 在Linux操作文…...
SEO 的未来:GPT 和 AI 如何改变关键词研究
谷歌Gemini与百度文心一言:AI训练数据的较量 介绍 想象一下,有一个工具不仅可以理解错综复杂的关键字网络,还可以预测搜索引擎查询的变化趋势。 这就是生成式预训练 Transformer (GPT) 和其他人工智能技术发挥作用的地方,以我们从…...
面试八股文之JAVA基础
JAVA基础 DNS、CDN?如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层?应用层协议?http协议和https协议区别?传输层协…...
网络连接中——长连接和短连接详解
一、TCP功能 TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接。当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接。 TCP连接的建立是通过三次握手,而连接的释放是通过四次挥手。所以说,每个TCP连接的建立和释放都是需要消耗资源和时间…...
PEReDi 完全隐私的央行数字货币方案
第一个对完全隐私保护建模的方案,基于账户模型,要求交易双方都在线。 角色分类 中央银行 B B B:负责发行数字货币和货币政策,但不控制用户账户的状态,没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…...
yolov5+pyside6+登录+用户管理目标检测可视化源码
一、软件简介 这是基于yolov5目标检测实现的源码,提供了用户登录功能界面; 用户需要输入正确的用户名和密码才可以登录。如果是超级管理员,可以修改普通用户的信息,并且在检测界面的右上角显示【管理用户】按钮。 支持图片、视频、…...
电脑如何设置个性便签 电脑个性便签分享
每次坐在电脑前,我都仿佛置身于一片信息的海洋。工作、生活、学习,方方面面的事情都需要我用心去记录。在这样一个快节奏的时代,电脑无疑成了我最得力的助手。但记事的时候,我总希望有一个既方便又有个性的工具,能让我…...
备考ICA----Istio实验12---配置双向TLS Istio Ingress Gateway实验
备考ICA----Istio实验12—配置双向TLS Istio Ingress Gateway实验 本实验部分配置延续上个Istio实验11 1. 重新配置secret 重新配置secret使其带有ca证书可以验证客户端证书是否合法 先删除原有secret,再配置新的secret # 删除原tls类型的secret kubectl -n istio-system d…...
SpringBoot 统一后端返回格式、处理全局异常
文章目录 引言I 统一标准格式1.1 定义返回标准格式1.2 定义状态码1.3 返回数据模型1.4 枚举定义1.5 Json序列化处理1.6 获取枚举字典II 处理全局异常2.1 全局异常处理器2.2 自定义异常2.3 请求数据模型III 预备知识:注解3.1 JsonInclude3.2 JsonIgnoreProperties...
C++学习基础版(一)
目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 (1)cout输出流 (2)endl操纵符 (3)cin输入流 二、C表达式和控制语句 1、数据机构 特别:布尔类型bool 2、算数运…...
Rust 双向链表 LinkedList 和安全删除元素的方法
一、LinkedList 基本用法 在Rust中,LinkedList 是标准库中 std::collections 模块提供的一个双向链表实现。这个双向链表在每个节点中都保存了其前一个和后一个节点的引用,允许在链表的任一端进行有效的添加和移除操作。 以下是一个简单的示例…...
Android 开发中 Gradle 使用详解:构建、配置与优化技巧
文章目录 1. 基本概念2. 配置构建脚本2.1 项目级构建脚本2.2 模块级构建脚本 3. 自定义构建变体和应用 flavorDimensions4. 多模块项目4.1 创建模块4.2 配置模块依赖 5. 使用 Gradle 插件6. 使用 Gradle 命令 Gradle 是一种先进的构建工具,它被广泛应用于 Android 开…...
聚道云助力:易快报CDP无缝对接,登录同步一步到位!
一、客户介绍 某企业咨询有限公司是一家专注于为企业提供全方位、高质量咨询服务的领先机构。该公司致力于将先进的管理理念和实践经验与企业实际需求相结合,助力企业实现可持续发展。无论是战略规划、组织优化、人力资源管理,还是市场营销、财务管理等…...
Java解决幸运数字
Java解决幸运数字 01 题目 哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整 除的正整数。 例如 126 是十进制下的一个哈沙德数,因为 (126)10 mod (1 2 6) 0; 126 也是8进制下的哈沙德 数,因为(126)10 (176)8,(126)10…...
将一个nextjs项目部署到vercel
注:下面均为AI创作(本人已验证该流程可行) 将一个 Next.js 项目部署到 Vercel 是一个相对直接的过程,因为 Vercel 是由同一个团队开发的,专门为 Next.js 优化。以下是部署一个 Next.js 项目到 Vercel 的基本步骤&…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
