Python 编程语言正在不断发展,每次更新都会添加新特性和功能。Python 3.10 于 2021 年中期发布,并附带结构模式匹配(也称为语句)
match case
。这是 Python 3.10 最重要的新功能;新功能允许您通过在满足条件(或情况)时执行某些代码部分来更轻松地控制程序流程。
在本文中,我们将告诉您有关 Python 中的 match case 语句的所有知识,这将使您能够对程序的执行方式进行细粒度的控制。
关于 Python 版本
在开始之前,我们首先了解一下 Python 版本和基本的 Python 知识。
如果您正在运行旧版本的 Python,我们建议您升级到 Python 3.10,以便充分利用本文。这样您就可以使用此处的代码片段,并能够修改它们以适合您自己的项目。
请查看
Python 官方下载页面
以获取最新版本。如果您想要了解有关
match case
语句的更多详细信息,有三个新的 Python 增强提案 (PEP)。PEP
636
,它是模式匹配的教程。如果您想深入了解,
PEP 634
涵盖了规范,
PEP 635
描述了此新功能的动机和原理。
对于那些刚接触 Python 的人,我们有两篇文章解释了我们将在本文中使用的一些重要术语。点击 此处查看第 1 部分 ,点击 此处查看第 2 部分 。我们还有互动课程来帮助加速您的学习。Python 基础知识 是一个很好的起点, Python 中的内置算法 将教您快速编写优化应用程序的工具。
好的,现在让我们深入研究 Python
match case
语句。
Python 中的 match case
的基本实现与
match case
非常相似
语句
。如果您需要复习一下,我们有一篇关于
if
if
Python 中的多个条件的
.
对于那些有 Java 或 C 等其他语言背景的人来说,它
match case
可能看起来像一个
switch
语句。 Switch 语句在功能上类似于
if-else
语句,但它们在定义案例时需要的代码较少。
Python 中的语句功能
match case
更
强大,可以进行更复杂的模式匹配
。让我们先看一个基本示例来演示语法:
>>> command = 'Hello, World!'
>>> match command:
... case 'Hello, World!':
... print('Hello to you too!')
... case 'Goodbye, World!':
... print('See you later')
... case other:
... print('No match found')
Hello to you too!
在这里,我们定义一个变量
comm和
,并使用 match 关键字将
match
其添加到每个关键字后定义的案例中
case
。附带说明一下,
match
and
case
最好被描述为
“软”关键字
,这意味着它们只能用作 match case 语句中的关键字。您可以在程序的其他部分继续使用“match”或“case”作为变量名。 相当于
case other
语句
else
中的
if-elif-else
,可以更简单地写成
case _
.
我们在这里使用该
print()
函数只是将文本打印到屏幕上。但是,如果大小写匹配,任何其他命令或函数调用都可以在这里执行。我们将在下面看到一些更详细的示例。如果您想了解有关该
print()
函数的更多信息,请查看
这篇文章
.
为什么要使用 match case 语句?
上面的示例可以很容易地用
if-elif-else
语句来实现。在本节中,我们将看到另外两个示例,说明如何使用
match case
可以简化流控制语句,使其更易读且更不容易出错。
假设我们要编写一个脚本来处理大量文件。我们可以编写以下函数:
>>> def file_handler_v1(command):
... match command.split():
... case ['show']:
... print('List all files and directories: ')
... # code to list files
... case ['remove', *files]:
... print('Removing files: {}'.format(files))
... # code to remove files
... case _:
... print('Command not recognized')
输入再次是一个字符串,使用 在空格处进行拆分
command.split()
。这将返回一个字符串列表。(顺便说一句,如果您想知道列表和数组之间的区别,我们将在
本文
。)当命令的值为“show”时,将匹配第一种情况,该
split()
方法返回列表
['show']
。然后执行列出特定目录中所有文件的代码。这里我们只有注释中指出的要执行的代码;实际上,您可以使用
os
模块来实现所需的功能。
第二种情况更有趣。以下是一个例子:
>>> file_handler_v1('remove file1.txt file2.jpg file3.pdf')
Removing files: ['file1.txt', 'file2.jpg', 'file3.pdf']
分割后匹配
'remove'
参数的第一部分
*args
);
files
变量被定义为包含所有要删除的文件的列表。如果您尝试使用
if-elif-else
语句实现这一点,您将使用更多代码来实现相同的结果。它也不像使用语句那样可读
match case
。
下一个复杂程度涉及使用或运算符 (
|
) 并将
if
语句放在案例定义中。看一下以下函数,特别注意第二种和第三种情况:
>>> def file_handler_v2(command):
... match command.split():
... case ['show']:
... print('List all files and directories: ')
... # code to list files
... case ['remove' | 'delete', *files] if '--ask' in files:
... del_files = [f for f in files if len(f.split('.'))>1]
... print('Please confirm: Removing files: {}'.format(del_files))
... # code to accept user input, then remove files
... case ['remove' | 'delete', *files]:
... print('Removing files: {}'.format(files))
... # code to remove files
... case _:
... print('Command not recognized')
第二种和第三种情况现在匹配输入命令中的“remove”或“delete”。此外,第二种情况有一个 if 语句,只有当
--ask
输入中有可选标志时才匹配。在此之下,您可以实现代码来接受用户输入,然后在确认命令后删除文件。请注意,我们必须使用列表推导来选择要删除的所有文件,这是一种编写 for 循环的紧凑方式。查看本文以了解
有关 Python 中 for 循环的更多信息。
当输入命令中没有可选标志时,将匹配上例中的第三种情况。让我们看看该函数的两个实际示例:
>>> file_handler_v2('remove --ask file1.txt file2.jpg file3.pdf')
Please confirm: Removing files: ['file1.txt', 'file2.jpg', 'file3.pdf']
>>> file_handler_v2('delete file1.txt file2.jpg file3.pdf')
Removing files: ['file1.txt', 'file2.jpg', 'file3.pdf']
Python 中的 match case 的最终思考
在本文中,我们介绍了 Python 中的结构模式匹配和
match case
语句。我们展示了它在所需代码量和可读性方面如何优于
if-elif-else
语句。这个新功能还有更多我们在这里没有涉及的功能 - 您可以提供一个对象作为输入(而不是我们使用的字符串),并对对象的属性进行模式匹配。非常酷的东西。
需要注意的是:对于更复杂的语句(如上面最后一个例子),
case 的顺序会改变程序的行为
。你可能在编写语句时熟悉这一点
if-elif-else
。为了演示这个问题,请以上面最后一个例子为例,交换第二个和第三个 case 的位置。你会发现标志
--ask
永远不会匹配。因此,一定要仔细考虑如何构造 case 语句。你甚至可以将其他一些流控制语句合并到你的代码中。查看这篇文章,其中展示了
如何使用 break、continue 和 pass 来控制 Python 中的循环
.
严格来说,
match case
它并没有为 Python 添加新功能。但是,它确实大大简化了复杂的控制语句。您可以随意将在这里学到的知识应用到自己的项目中。尝试用语句重写一些
if-elif-else
语句,
match case
以确认它的实用性。祝您编码愉快!
发表评论 取消回复