简明 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版本正式发布,新增车牌识别,点击…...

Java Web-Maven
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具 Maven的作用 1.依赖管理:方便快捷的管理项目依赖资源(jar包),避免版本冲突问题 我们有的项目需要大量的jar包,采用手动导包的方式非常繁琐,并且版本升级也…...

.Net 异步委托
委托的 BeginInvoke 方法和 EndInvoke 方法可以实现异步执行委托方法。这允许委托的方法在后台线程中执行,而不会阻塞当前线程。小编在之前的webform开发中遇到下载进度条卡死的问题就是用它解决的。 案例: namespace ConsoleApplication1 {class Progr…...

web前端面试题---->HTML、CSS
一.居中方法 block元素如何居中 margin:0 auto;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);flex布局: 对父元素操作 : justify-content:center; al…...

移动端Web笔记day03
移动 Web 第三题 01-移动 Web 基础 谷歌模拟器 模拟移动设备,方便查看页面效果,移动端的效果是当手机屏幕发生了变化,页面和页面中的元素也要跟着等比例变化。 屏幕分辨率 分类: 硬件分辨路 -> 物理分辨率:硬件…...

c++的学习之路:3、入门(2)
一、引用 1、引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。 怎么说呢,简单点理解就是你的小名,家里人叫你小名&#…...

面试经典150题【91-100】
文章目录 面试经典150题【91-100】70.爬楼梯198.打家劫舍139.单词拆分322.零钱兑换300.递增最长子序列77.组合46.全排列39.组合总和(※)22.括号生成79.单词搜索 面试经典150题【91-100】 五道一维dp题五道回溯题。 70.爬楼梯 从递归到动态规划 public …...

在 nginx 中使用 JavaScript
前些日子尝试了在 nginx 中写 JavaScript 的效果。考虑到 JavaScript 作为编程语言不是强需求,在nginx生态上还是 lua 独大,并且还有 openresty 这样一直强力输血,大部分应用场景都能找到参考的解决方案。 插件生态来说,github 上…...

【pytorch】安装合集
使用conda或者pip安装的指令 https://pytorch.org/get-started/previous-versions/ 测试pytorch_gpu是否可用的代码 # 测试pytorch是否安装成功 import torch print(torch.__version__) print(torch.cuda.is_available())...

【教程】PLSQL查看表属性乱码解决方法
一、前言 PL/SQL是Oracle数据库的编程语言,用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性,看看各个字段的注释,可是打开一看,居然是乱码的,如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…...

新书速览|Django 5企业级Web应用开发实战:视频教学版
掌握Django框架开发技能,实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战:视频教学版》精选当前简单、实用和流行的Django实例代码,帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…...