如何使用 Python 三元运算符

本指南将深入探讨如何在Python编程中使用三元条件运算符。你将掌握其语法结构,并通过实例分析来理解其工作机制。

我们将首先回顾`if-else`条件语句的基础知识,然后学习如何运用三元运算符编写等效的表达式。

随后,我们将通过实际例子进行演示,并探索如何使用Python的元组和字典来模拟三元运算符的效果。最后,我们将讨论在哪些场景下三元运算符是更优的选择。

让我们开始吧!

Python中的`if-else`语句回顾

你可以通过启动Python交互式环境(REPL)或在techblik.com的在线Python编辑器中进行实践。

在Python中,`if-else`语句的基本结构如下:

if 条件:
    # 执行此代码块
else:
    # 执行另一代码块

在上述代码片段中,“条件”代表需要检验的逻辑表达式。如果该条件的结果为`True`,那么执行`if`代码块中的语句;反之,如果条件结果为`False`,则执行`else`代码块中的语句。

以下是一个例子,根据能量值是否小于或等于零来设置`game_over`变量的布尔值:

  • 如果`energy` <= 0,则`game_over`被赋值为`True`。
  • 否则,`game_over`被赋值为`False`。

以下代码展示了如何使用`if-else`条件语句来实现这一逻辑:

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# 输出:True

在本例中,由于`energy`的值为-1,小于0,因此`game_over`的值被设置为`True`。

Python三元运算符:语法与实例

Python提供了一个三元运算符,其功能类似于C和C++等语言中的三元条件运算符。其通用语法如下所示:

表达式1 if 条件 else 表达式2

让我们详细解析一下上述语法:

  • 条件:待评估的逻辑表达式。
  • 表达式1:当条件为`True`时执行的表达式。
  • 表达式2:当条件为`False`时执行的表达式。

现在,我们将分析之前`if-else`版本的代码,确定相应的表达式1、表达式2和条件。

综上所述,我们可以使用Python的三元运算符得到以下结果:

game_over = True if energy <= 0 else False
print(game_over)
# 输出: True

让我们再看一个例子。假设你经营一家书店,并根据顾客在过去一年内的光顾次数提供不同的折扣。

用`numVisits`表示访问次数。

  • 如果`numVisits` > 7,则折扣百分比`discount_perc`为20。
  • 否则,`discount_perc`为5。

我们使用三元运算符来为`discount_perc`变量赋值:

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 输出:20 (因为 numVisits = 10,大于 7)

接下来,我们将学习如何使用Python的元组和字典来模拟三元运算符的行为。

使用Python元组模拟三元运算符

与Python中的其他可迭代对象类似,元组的索引从零开始。因此,对于一个包含两个元素的元组,`tuple_name[0]`表示第一个元素,而`tuple_name[1]`表示第二个元素。

Python的基本数据类型包括整数、浮点数、字符串和布尔值。Python支持类型转换,允许你将一种数据类型转换成另一种等效的数据类型。

启动Python的REPL环境,并运行以下示例。你会发现,将整数转换为布尔值时,会出现以下情况:

  • `bool(0)` 的结果是`False`。
  • `bool(<任何非零整数>)` 的结果是`True`。
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

类似地,将布尔值转换为整数时,我们有:

>>> int(True)
1
>>> int(False)
0

结合类型转换和索引,我们可以实现以下效果:

  • 元组中索引为0的元素:条件为`False`时应该使用的值。
  • 元组中索引为1的元素:条件为`True`时应该使用的值。

利用以上概念,我们可以得到以下结果:

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

在这里,由于`numVisits`为10,所以条件`numVisits > 7`的结果为`True`。由于`int(True)`的值为1,`discount_perc`的值为20,即索引为1的元素。

使用Python字典模拟三元运算符

你可以将`True`和`False`设置为字典的键。然后,将`表达式1`和`表达式2`分别设置为键`True`和`False`对应的值。

some_dict = {True: 表达式1,
             False: 表达式2
            }

接下来,当你使用`some_dict[条件]`时,如果条件为`True`,则计算与`True`键对应的`表达式1`;反之,如果条件为`False`,则计算`表达式2`。

让我们(再次)使用Python字典来实现`discount_perc`的例子:

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

这里,`numVisits`为10,大于7。因此,条件`numVisits > 7`的结果为`True`。所以`discount_dict[numVisits > 7]`会被计算为`discount_dict[True]`,其对应的值为20。

是否应该总是使用Python三元运算符?

到目前为止,我们已经学习了如何使用三元运算符。但是,我们是否应该在所有情况下都使用它呢?实际上,三元运算符并非在所有情况下都是最佳选择。本节将探讨何时应该优先使用三元运算符,以及何时应该考虑使用`if-else`语句。

比`if-else`代码块更简洁

正如前面所提到的,在Python中,三元运算符的表达式比`if-else`语句更简洁。因此,你可以使用它来检查条件并动态地评估表达式。

在下面的例子中,`nums`是一个包含10个随机生成整数的列表。对于其中的每个数字,我们检查它是奇数还是偶数,并将结果嵌入到f-字符串中:

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} 是 {'偶数' if num%2==0 else '奇数'}")
# 示例输出

0 是 偶数
56 是 偶数
6 是 偶数
53 是 奇数
62 是 偶数
7 是 奇数
8 是 偶数
77 是 奇数
41 是 奇数
94 是 偶数

三元运算符需要`else`子句

当使用`if-else`条件语句时,`else`子句是可选的。例如,如果能量值降至小于或等于零,可以将`game_over`变量设置为`True`。

然而,如果能量值大于零,那么`game_over`变量将不会被初始化。此时,如果你试图访问`game_over`变量,就会引发错误。

energy = 5
if energy <= 0:
    game_over = True

print(f"游戏结束了吗? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"游戏结束了吗? {game_over}")
NameError: name 'game_over' is not defined

解决这个问题的一种方法是将`game_over`初始化为`False`,然后当能量值小于或等于零时将其更新为`True`。

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"游戏结束了吗? {game_over}")

但是,当使用等效的Python三元运算符时,`else`子句是必不可少的。三元运算符要求在条件为`False`时也要计算一个表达式。

game_over = True if energy <= 0 else False

如果你尝试删除`else`部分,比如将上面的代码更改为`game_over = True if energy <= 0`,你会遇到语法错误,如下所示:

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

要检查多个条件,请使用`if-else`语句

考虑这样一个例子:一套编码面试题中的每道题都有一个相关的难度分。根据这个分数,我们将题目划分为三个难度级别:简单、中等和困难。假设难度分数的划分如下:

分数 难度级别
小于10 简单
10到20之间 中等
大于20 困难

给定一个难度分数,你可以使用Python的三元运算符来获取其难度级别,如下所示:

score = 12

difficulty_level = "简单" if score < 10 else "困难" if score > 20 else "中等"

print(difficulty_level)
# 输出:中等

上述代码块中的三元运算符表达式采用了以下形式:

表达式1 if 条件1 else 表达式2 if 条件2 else 表达式3

虽然简洁,但它在理解和解析上稍微有些困难。下图展示了这种情况下的控制流:

以下代码片段展示了使用`if-else`语句的等效实现。可以看出,控制流更加清晰易懂,代码也更具可读性。

if score < 10:
    difficulty_level="简单"
elif score > 20:
    difficulty_level="困难"
else:
    difficulty_level="中等"

print(difficulty_level)

因此,当存在多个条件时,应使用`if-else`代码块而不是三元运算符。这确保了代码的可读性和易理解性。

此外,当你需要执行多条语句时(取决于条件是真还是假),你应该考虑使用`if-else`语句。

结论

以下是对本教程所学内容的回顾:

  • 在Python中,三元运算符的语法如下:`表达式1 if 条件 else 表达式2`。
  • 你可以使用Python的元组和字典来模拟三元运算符的行为。
  • 虽然三元运算符可以作为`if-else`代码块的更简洁替代方案,但你应该确保代码具有可读性。为了提高代码的可读性,当需要链接多个条件时,可以使用`if-else`语句代替三元运算符。

接下来,可以学习关于Python中等于和不等于运算符的教程。