简明 Python 教程(第5章 函数)
本章介绍了函数的基本概念和使用方法,包括定义函数、传递参数、局部变量、全局变量、默认参数、关键字参数、返回值和文档字符串。
掌握这些概念对于编写结构化和可维护的Python代码至关重要。
定义函数
-
使用
def关键字
定义函数始于def关键字,它告诉Python接下来是一个函数定义。
-
函数名
def关键字之后是函数名,它应该清晰地反映函数的功能。函数名遵循与变量相同的命名规则:必须以字母或下划线开头,不能使用Python的保留字,并且是大小写敏感的。
-
圆括号和参数
函数名后面跟着一对圆括号,其中包含零个或多个参数。参数是传递给函数的值,它们允许函数具有灵活性和通用性。
-
参数列表
- 必需参数:在圆括号中按顺序列出,函数调用时必须提供。
- 关键字参数:使用
=后跟默认值定义,如果函数调用时没有提供相应的实参,将使用默认值。 - 可变参数列表:使用
*(用于非关键字参数)或**(用于关键字参数)定义,允许函数接受任意数量的额外参数。
-
函数体
函数的定义以冒号(:)结束,后跟一个缩进的代码块,这是函数体。函数体中的代码定义了函数执行的操作。
-
返回值
使用return语句从函数返回值。当return语句执行时,函数将立即结束,并返回指定的值给调用者。如果函数没有返回值,return可以不带任何表达式,或者根本不写return语句(在这种情况下,函数默认返回None)。
-
示例
下面是一个简单的函数定义示例,该函数接受两个参数,计算它们的和,并返回结果:
def add_numbers(a, b): """ 计算并返回两个数字的和。 参数: a (int/float): 第一个数字。 b (int/float): 第二个数字。 返回: int/float: 两个数字的和。 """ result = a + b return result
# 调用函数
sum = add_numbers(3, 5)
print("两个数的和是:", sum) # 输出: 两个数的和是: 8
在这个例子中,add_numbers是一个函数名,它接受两个参数a和b。函数体只有一行代码,计算a和b的和,并将结果存储在变量result中。然后,使用return语句将结果返回给调用者。
函数定义是Python编程中的基础概念之一,它使得代码更加模块化、可重用和易于维护。通过定义函数,你可以创建复杂的程序结构,并将任务分解为更小、更易于管理的部分。
使用函数形参
- 形参(formal parameters)是在函数定义中指定的变量,用于接收函数调用时传入的值(实参)。
- 函数调用时,实参的顺序必须与形参的顺序相匹配。
局部变量
- 在函数内部声明的变量是局部变量,它们的作用域仅限于函数内部。
- 改变局部变量的值不会影响全局变量(除非使用
global关键字)。
使用global语句
-
何时使用
global语句
-
当你想要在函数内部修改一个全局变量的值时。
- 当你想要在函数内部创建一个新的全局变量时(不推荐,因为这可能会导致命名冲突和代码难以理解)。
- 当你想要确保函数内部使用的变量是全局作用域中的变量,而不是在函数内部新定义的局部变量时。
-
如何使用
global语句
global语句通常位于函数体内部,它告诉Python解释器后续声明的变量是全局变量。以下是 使用global语句的基本语法:
def my_function(): global global_variable global_variable = "我是全局变量" # 其他代码...
# 函数外部定义全局变量
global_variable = "原始全局变量值"
# 调用函数 my_function()
# 打印全局变量的值,以验证它已被函数修改
print(global_variable) # 输出: 我是全局变量
在这个例子中,global语句在函数my_function内部声明了global_variable为全局变量。这意味着当函数内部对global_variable进行赋值操作时,它实际上是在修改全局作用域中的变量,而不是在函数内部创建一个新的局部变量。
-
注意事项
- 过度使用
global语句可能会导致代码难以理解和维护,因为它破坏了函数的封装性和局部性。 - 在函数内部尽量避免修改全局变量,这可能会导致代码中的bug更难发现和修复。
- 在同一个函数中,如果你需要声明多个全局变量,可以在
global语句后面列出所有这些变量的名字,用空格分隔,例如:global var1, var2, var3。 - 在Python 3中,如果你想要修改一个全局变量,除了使用
global语句外,还可以使用nonlocal语句来声明一个变量为嵌套作用域中的变量(当函数内部有多层嵌套作用域时使用)。
默认参数值
在Python中,函数默认参数值是一个非常方便的特性,它允许在定义函数时为参数指定默认值。这意味着在调用函数时,如果没有为这些参数提供值,Python将自动使用它们的默认值。通过使用默认参数值,你可以编写出更加灵活和用户友好的函数,使它们更容易被调用和重用。
-
定义带有默认参数值的函数
当你定义一个函数时,可以在参数列表中为参数赋予默认值。这通过在参数名后面直接指定一个等号和默认值来实现。例如:
def greet(name, greeting='Hello'): print(greeting, name)
在这个例子中,greet函数有两个参数:name和greeting。greeting参数的默认值是'Hello'。当你调用greet函数时,如果没有提供greeting参数,它将自动使用'Hello'作为默认值。
-
调用带有默认参数值的函数
调用带有默认参数值的函数时,可以省略具有默认值的参数:
greet('Alice') # 输出: Hello Alice greet('Bob', 'Good morning') # 输出: Good morning Bob
在第一个调用中,我们只提供了name参数的值,greeting参数使用了默认值'Hello'。在第二个调用中,我们提供了name和greeting两个参数的值,所以greeting参数的值被覆盖为'Good morning'。
-
注意事项
-
默认参数值在函数定义时被计算一次,并在函数的整个生命周期内保持不变。这意味着如果你将可变对象(如列表或字典)作为默认值,那么所有调用该函数的实例都将共享同一个对象。例如:
def func(a, b=None):b = b or areturn a + bprint(func(1)) # 输出: 2,因为b是None,所以返回1+1 print(func(1, 2)) # 输出: 3
在这个例子中,
b被初始化为None,然后使用or运算符赋值为a的值。这意味着每次调用func(1)时,都会返回2,因为b被设置为1。 -
从Python 3开始,不建议使用可变对象作为默认参数值,因为这可能导致意外的行为。如果你需要一个默认的可变对象,最好在函数内部创建一个新的对象实例。
-
默认参数值应该用于那些你希望在大多数情况下保持不变的值,而不是用于那些可能会频繁变化的值。
关键字参数(命名参数)
在Python中,关键字参数(也称为命名参数)允许你在调用函数时明确指定参数的名称和值。这种语法提供了一种清晰的方式来传递参数,尤其是当函数有很多参数时,它可以使得代码更易读和更易于维护。关键字参数是Python中一个非常有用的功能,它提高了函数的可读性和灵活性。通过使用关键字参数,你可以编写出更加清晰和易于维护的代码。
-
基本语法
当你定义一个函数时,你可以使用关键字参数来指定参数的名称和默认值。在调用函数时,你可以通过在参数值前加上参数名和等号来明确地传递每个参数:
def func(a, b, c=0): return a + b + c
# 使用关键字参数调用函数
result = func(a=1, b=2, c=3)
在这个例子中,func函数有三个参数:a、b和c。c是一个具有默认值0的关键字参数。在调用func时,我们使用了关键字参数来指定每个参数的值。
-
优点
- 清晰性:关键字参数使得函数调用更易于理解,因为参数的用途在调用时就被明确了。
- 灵活性:你可以只传递具有默认值的参数,或者按需传递任意数量的参数。
- 顺序无关性:使用关键字参数调用函数时,不需要按照函数定义中的参数顺序。
-
与位置参数结合使用
关键字参数可以与位置参数结合使用,但必须在位置参数之后:
def func(first, second, third='third'): return first + second + third
# 混合使用位置参数和关键字参数
result = func(1, second=2, third='other third')
在这个例子中,我们首先通过位置传递了first参数的值1,然后使用关键字参数传递了second和third的值。
-
注意事项
- 确保在使用关键字参数时,所有必需的位置参数都已经提供了值,否则你会遇到
TypeError。 - 如果函数定义中使用了
*args或**kwargs,那么所有的关键字参数都应该放在*args或**kwargs之后。 - 在文档字符串(DocString)中明确指出哪些参数是必需的,哪些有默认值,以及它们的含义,这有助于其他开发者理解和使用你的函数。
可变参数列表
在Python中,可变参数列表允许函数接受任意数量的位置参数或关键字参数,提供了极大的灵活性。这在你需要创建一个可以接受多种参数组合的函数时特别有用。以下是两种主要的可变参数列表:
-
非关键字可变参数(*args)
使用*符号定义非关键字可变参数,通常称为args。这允许函数接受任意数量的位置参数,并将它们作为一个元组处理。
def my_function(*args): for arg in args: print(arg)
调用这个函数时,可以传递任意数量的参数:
my_function(1, 2, 3, 'a', 'b')
在这个例子中,args是一个元组,包含了所有传递给my_function的参数。
-
关键字可变参数(**kwargs)
使用**符号定义关键字可变参数,通常称为kwargs。这允许函数接受任意数量的关键字参数,并将它们作为一个字典处理。
def my_function(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}")
调用这个函数时,可以传递任意数量的关键字参数:
my_function(name='Alice', age=25, city='Wonderland')
在这个例子中,kwargs是一个字典,包含了所有传递给my_function的关键字参数。
-
同时使用两种可变参数
你可以在同一个函数定义中同时使用*args和**kwargs,但*args必须在**kwargs之前:
def my_function(*args, **kwargs): print("Positional arguments:", args) print("Keyword arguments:", kwargs)
my_function(1, 2, 'a', name='Alice', age=25)
在这个例子中,args将接收所有位置参数,而kwargs将接收所有关键字参数。
-
注意事项
- 当使用可变参数列表时,函数内部的参数列表中出现的普通参数(非可变参数列表)必须在可变参数列表之前定义。
- 如果你使用
*args,那么所有跟随其后的位置参数都将被视为可变参数列表的一部分。 - 类似地,如果你使用
**kwargs,那么所有跟随其后的关键字参数都将被视为关键字可变参数列表的一部分。 - 可变参数列表使得函数调用更加灵活,但也可能导致函数的签名不够明确,因此在设计函数时应当谨慎使用。
通过使用可变参数列表,你可以创建更加通用和灵活的函数,以适应各种不同的调用场景。
return语句
return语句用于从函数中返回一个值给调用者。- 如果函数没有返回值,
return可以不带任何值。 - 没有
return语句的函数默认返回None。
使用DocStrings
DocStrings(文档字符串)是Python中用于记录函数、类、模块等元素的文档信息的一种约定。它们通常位于被记录元素的直接下方,并被三引号(单引号'''或双引号""")包围。DocStrings提供了一种标准的方式来嵌入文档到Python代码中,这些文档可以通过内置的__doc__属性来访问。
-
基本语法
DocStrings的基本语法是在三引号内编写文本,可以包含多行文本:
def my_function(): """ 这是一个文档字符串的例子。 这里可以包含多行文本,用于描述函数的功能、参数、返回值等。 """ pass
-
内容约定
- 首行:通常是最重要的一行,应该简洁地描述函数或类的作用。
- 后续行:提供更详细的描述,包括参数的说明、函数的副作用、返回值的描述等。
- 格式:推荐使用reStructuredText(reST)格式,这是一种用于文档的轻量级标记语言。
-
访问DocStrings
你可以通过__doc__属性来访问任何对象的DocString:
print(my_function.__doc__)
-
使用DocStrings的最佳实践
- 始终使用:即使是简单的函数或类,也应该有一个DocString来描述它们的基本功能。
- 保持更新:随着代码的变化,确保DocStrings也同步更新,以保持信息的准确性。
- 清晰的描述:DocStrings应该清晰、准确地描述元素的功能和用法。
- 参数和返回值:如果函数有参数或返回值,应该在DocString中详细说明。
- 例子:如果适用,提供一个使用函数的简短示例可以增加文档的可读性。
-
示例
下面是一个包含DocString的函数示例,以及如何访问和打印它的DocString:
def greet(name, greeting='Hello'): """ 打印问候语。 参数: name (str): 要问候的人的名字。 greeting (str): 问候语的开始部分,默认为 'Hello'。 返回: str: 完整的问候语字符串。 """ return f"{greeting}, {name}!" # 访问并打印函数的DocString
print(greet.__doc__)
# 调用函数并打印结果
print(greet('Alice')) # 输出: Hello, Alice!
在这个例子中,greet函数的DocString详细描述了函数的作用、参数和返回值。通过打印greet.__doc__,我们可以看到完整的文档字符串。
DocStrings是Python文档化的一个重要部分,它们使得代码更加自解释,有助于其他开发者理解和使用你的代码。
相关文章:
简明 Python 教程(第5章 函数)
本章介绍了函数的基本概念和使用方法,包括定义函数、传递参数、局部变量、全局变量、默认参数、关键字参数、返回值和文档字符串。 掌握这些概念对于编写结构化和可维护的Python代码至关重要。 定义函数 使用def关键字 定义函数始于def关键字,它告诉P…...
flutter 保存一堆多语言翻译词条,由key和value组成
原理: 1.从String列表里面获取某个value: List<String> jsonStrings [{"name": "John", "age": 30},{"name": "Jane", "age": 25},{"name": "Bob", "age…...
3月25日,每日信息差
🎖 素材来源官方媒体/网络新闻 🎄 京东汽车将和小米汽车进行深度合作 🌍 百度将为苹果国行iPhone16提供AI功能?百度方面称暂无回应 🌋 国产结核病新型mRNA疫苗即将问世 🎁 美国发布严重地磁暴预警ÿ…...
Git常用指令使用
摘要:之前代码管理都是借助于fork、sourceTree等图形工具,最近发现直接用命令也好用,就总结Git常用的指令 1、Git的介绍 1.1 git官网 安装: Git - Downloading Packagehttps://git-scm.com/download/mac Mac上安装,直接使…...
数据结构与算法 顺序表的基本运算
一、实验内容 编写一个程序实现,实现顺序表的各种基本运算(假设顺序表的元素类型为char),并以此为基础设计一个程序完成下列功能: (1)初始化顺序表; (2)采…...
docker部署nacos(单机与集群)
拉去nacos镜像 [rootlocalhost keepalived]# docker search nacos NAME DESCRIPTION STARS OFFICIAL nacos/nacos-server This project contains a Docker image meant t… 464 …...
开启Safari手势支持
在使用Safari 的时候,大家有没有觉得不支持手势使用起来不是很方便, 触摸板只支持少量简单的手势,如缩放,滚动等。如果使用鼠标的用户,则完全无法使用手势。经过折腾研究,使用CirMenu应用可以完美解决这个要…...
Amuse:.NET application for stable diffusion
目录 Welcome to Amuse! Features Why Choose Amuse? Key Highlights Paint To Image Text To Image Image To Image Image Inpaint Model Manager Hardware Requirements Compute Requirements Memory Requirements System Requirements Realtime Requirements…...
Java冒泡排序详细讲解
冒泡排序是一种简单但效率较低的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。具体实现如下: 算法步骤: 比较相邻的元素:从第一个元素开始,依次…...
python数据解析xpath
前言一、安装?二、使用步骤1.基本使用**【2】谓语(Predicates)**案例 前言 xpath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但xp…...
工业镜头常用参数之实效F(Fno.)和像圈
Fno. 工业镜头中常用到的参数F,有时候用F/#,Fno.来表示,指的是镜头通光能力的参数。它可用镜头焦距及入瞳直径来表示,也可通过镜头数值孔径(NA)和光学放大倍率(β)来计算。有效Fno.…...
what is apache?
Apache 通常指 Apache Software Foundation (ASF) 或 Apache HTTP Server,两者都是计算机软件领域的重要实体。 Apache 软件基金会 (ASF):Apache 软件基金会是一个开发开源软件项目的非营利组织。它为涵盖软件开发各个方面的广泛项目提供支持,…...
【二叉树】Leetcode 94. 二叉树的中序遍历【简单】
二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 解题思路 中序遍历是一种二叉树遍历方式,按照“左根右”的顺序遍历二叉树节点。 1、递归…...
Linux进程控制(等待)
进程等待 为什么要进行进程等待 进程等待是什么? 怎么进行进程等待? 回到我们之前进程状态的代码, 我们知道, 在这段代码中,父进程对子进程没有做任何的操作, 所以当子进程在退出后, 会一直处于…...
结构体-C语言
目录 前言 一、定义结构 结构体变量的创建和初始化 二、结构的特殊声明 特别注意: 结构的⾃引⽤ 三、结构体内存对⻬ 对⻬规则 优化结构体 #pragma 结构体传参 四、结构体实现位段 位段的内存分配 位段的跨平台问题 前言 C 数组允许定义可存储相同类…...
Unity DOTS中的baking(四)blob assets
Unity DOTS中的baking(四)blob assets blob assets表示不可变的二进制数据,在运行时也不会发生更改。由于blob assets是只读的,这意味着可以安全地并行访问它们。此外,blob assets仅限于使用非托管类型,这意…...
第三十天-Flask模板 Jinja2
目录 1.什么是模板 2.模板引擎Jinja2 默认配置 全局对象 全局函数 上下文处理器 3.模板中变量的使用 4.模板标签 条件判断if else for循环 添加注释 设置变量 转义显示 5.过滤器 过滤器使用 自定义过滤器 6.全局函数 7.模板中的宏 模板的基础 包含语法 8.…...
在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】
MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步:1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志(relay log)3). slave重做中继日志中的事件,将数据变更反映它自…...
Fragment 与 ViewPager的联合应用(2)
5.创建底部布局bottom_layout <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:layout_width"match_parent"android:layout_height"55dp"android:background&qu…...
OriginBot智能机器人开源套件
详情可参见:OriginBot智能机器人开源套件——支持ROS2/TogetherROS,算力强劲,配套古月居定制课程 (guyuehome.com) OriginBot智能机器人开源套件 最新消息:OriginBot V2.1.0版本正式发布,新增车牌识别,点击…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
