[Explained] 如何在 Python 中实现 Switch-Case

想在Python中实现类似switch-case的结构吗?本文将探讨几种不同的方法,帮助你模拟switch-case的行为。

如果你有C或JavaScript的编程经验,那么你一定熟悉switch-case语句。 那么,为什么我们需要这种结构呢?

试想一下,你有一系列不同的操作(或者代码块)。你需要根据一个变量或表达式的值,来决定执行哪一个操作。

举几个例子:

  • 根据学生的成绩来评定等级
  • 根据用户的选择来执行不同的字符串处理
  • 根据用户输入对两个数字进行算术运算

因此,switch-case结构提供了一种便捷的方式来实现这种逻辑。 当你需要根据一个变量或表达式的值来执行多种可能的操作时,它就显得非常有用。

虽然Python本身没有内置的switch-case结构,但是我们可以通过多种方式来达到类似的效果。 在接下来的内容中,我们将深入探讨这些方法。

在Python中模拟Switch-Case的行为

让我们通过一个实例来了解如何在Python中模拟switch-case的行为。

我们将编写一个简单的程序,实现以下功能:

  • 从一个单词列表中随机抽取一个单词(Python字符串)。
  • 为用户提供上下文,并提示用户选择要对该单词执行的字符串操作。
  • 考虑大小写转换操作(小写、大写、首字母大写等),以及默认行为。 使用Python内置的字符串方法来实现。
  • 提示用户输入选项。由于输入默认为字符串,所以需要将其转换为整数类型。

Python字符串是不可变的。因此字符串方法不会修改原始字符串,而是返回一个新的字符串副本。 以下是我们将会用到的一些Python字符串方法:

字符串方法 描述
lower() 返回一个将所有字符都转换为小写形式的字符串副本
upper() 返回一个将所有字符都转换为大写形式的字符串副本
title() 返回一个将每个单词的首字母转换为大写形式的字符串副本
swapcase() 返回一个将大写字符转换为小写,并将小写字符转换为大写的字符串副本

以下代码段随机从word_list中抽取一个单词,并获取用户的输入:


import random

# 单词列表
word_list = ["Python", "programming", "Hello", "world", "context", "Switch"]

# 随机选择一个单词
word = random.choice(word_list)

# 向用户提供上下文和可用选项
print("欢迎!你有一个随机选择的单词。")
print("选择一个选项来处理这个单词:")
print("1. 小写")
print("2. 大写")
print("3. 首字母大写")
print("4. 大小写互换")
print("5. 默认行为")

# 获取用户选项
option = int(input("输入你的选项:"))

以下示例展示了如何根据用户选择修改字符串“Python”:

当你运行程序时,你应该会看到如下提示:


欢迎!你有一个随机选择的单词。

选择一个选项来处理这个单词:
1. 小写
2. 大写
3. 首字母大写
4. 大小写互换
5. 默认行为

输入你的选项:

接下来,我们将继续探讨不同的实现方法。

使用If-Elif-Else 阶梯

在这种方法中,我们使用一系列的if-elif-else语句来检查用户的选择。然后根据用户的输入执行相应的代码块。


# if-elif-else

if option == 1:
    result = word.lower()
elif option == 2:
    result = word.upper()
elif option == 3:
    result = word.title()
elif option == 4:
    result = word.swapcase()
else:
    result = word

print(f"你随机选择的单词是 {word},结果是 {result}")

这里:

  • 我们使用if-elif语句将用户的输入与每个选项进行比较。
  • 当找到匹配时,我们执行相应的代码块。
  • 如果没有if-elif条件匹配,我们将执行else块,实现默认行为。

现在你可以运行脚本,输入你的选择,并验证输出:


欢迎!你有一个随机选择的单词。

选择一个选项来处理这个单词:
1. 小写
2. 大写
3. 首字母大写
4. 大小写互换
5. 默认行为

输入你的选项: 2

你随机选择的单词是 Switch,结果是 SWITCH。

if-elif-else阶梯很容易实现。 但是当选项过多时,维护起来就会比较困难。在这个例子中,我们有五个分支(包括默认行为)。但在实际应用中,我们可能会有更多的选项。这种冗长的if-elif-else结构是一种应该避免的代码坏味道。

因此,让我们继续探讨一种更易于维护的实现方式。

使用字典映射和一流函数

你可以利用Python的字典和函数来模拟switch-case的行为。

📑 Python的函数是一等公民

在Python中,函数是一等公民。这意味着你可以做的事情远不止定义和调用它们:

  • 定义函数后,你可以将其赋值给另一个变量,可以将函数用作列表的元素或字典中的值等等。
  • 你还可以传递函数:函数可以作为参数传递给其他函数,并且函数可以返回函数。

在这个方法中,我们将使用一个字典将用户的选择映射到相应的函数或操作。这是一种更有效的方式来处理多项选择,因为它避免了使用长长的if-elif语句链。

首先,我们为各种字符串操作定义以下函数:


# 为每个选项定义函数
def lower_case(word):
    return word.lower()

def upper_case(word):
    return word.upper()

def title_case(word):
    return word.title()

def swap_case(word):
    return word.swapcase()

接下来,我们执行以下操作:

  • 创建一个名为`options`的字典,其中键是用户的选择,值是要执行的函数或操作。
  • 使用字典的`get()`方法,根据用户的选择来获取对应的操作。如果在字典中找不到该选项,我们会提供一个由lambda函数指定的默认操作。
  • 然后对随机单词执行所选择的操作。

# 将函数存储在字典中
options = {
    1: lower_case,
    2: upper_case,
    3: title_case,
    4: swap_case,
}

# 使用字典来选择并调用相应的函数
result = options.get(option, lambda x: x)(word)

print(f"你随机选择的单词是 {word},结果是 {result}")

以下是一个示例输出:


欢迎!你有一个随机选择的单词。

选择一个选项来处理这个单词:
1. 小写
2. 大写
3. 首字母大写
4. 大小写互换
5. 默认行为

输入你的选项: 4

你随机选择的单词是 Hello,结果是 hELLO。

使用大小写匹配

📝 注意:需要Python 3.10或更高版本才能使用`match-case`语句。

从Python 3.10开始,你可以使用`match`语句来实现类似switch-case的结构。`match`语句以其简洁的语法,提供了一种更直观的方式来处理多种情况。下划线(`_`)被用作默认情况。

以下是我们如何使用大小写匹配来重写我们的示例:

  • 我们使用`match`语句将用户的输入与各种情况进行比较。
  • 每一种情况都指定一个选择以及该选择匹配时要执行的代码。
  • 下划线(`_`)用作默认情况,当其他情况都不匹配时,则执行该情况的代码。

match option:
    case 1:
        result =  word.lower()
    case 2:
        result = word.upper()
    case 3:
        result = word.title()
    case 4:
        result = word.swapcase()
    case _:
        result = word  # 默认行为,返回原始字符串

print(f"你随机选择的单词是 {word},结果是 {result}。")

现在你可以运行脚本并验证输出:


欢迎!你有一个随机选择的单词。

选择一个选项来处理这个单词:
1. 小写
2. 大写
3. 首字母大写
4. 大小写互换
5. 默认行为

输入你的选项: 2
你随机选择的单词是 world,结果是 WORLD。

⚙ 尽管`match`语句提供了一种实现switch-case结构的便捷方法,但它的主要目的是为了提供更强大的结构模式匹配功能,而不仅仅是模拟switch-case的行为。

总结

让我们总结一下在Python中实现switch-case功能的不同方法:

  • if-elif-else 阶梯很容易实现,但维护起来很麻烦。因此,请尽量少使用它们——只有当你需要检查的选项不多时才考虑使用。
  • 你可以利用Python的字典和函数来模拟switch-case的行为。使用不同的选择作为字典的键,相应的函数作为字典的值。
  • Python 3.10中引入的`match-case`语句,有助于使用简洁直观的语法来实现switch-case结构。不过,`match-case`语句更适用于进行结构模式匹配的复杂场景。

你可以在GitHub上找到本教程的代码示例。如果你正在准备编码面试,请查看这篇热门Python面试问题汇总。