简明 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版本正式发布,新增车牌识别,点击…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
