# Python 条件语句

> 原文： [https://javabeginnerstutorial.com/python-tutorial/python3-conditional-statements-2/](https://javabeginnerstutorial.com/python-tutorial/python3-conditional-statements-2/)

## 条件决策

在介绍了有关 Python 3 中变量的基本类型的大量介绍性文章之后，现在该继续介绍条件运算符了，这些条件运算符可帮助我们在运行时基于不同条件创建应用流。

到目前为止，我们只有一个流程：启动应用，（可能）需要用户输入并显示一个结果。 通过条件更改。 根据输入或运行时创建的其他参数（您知道，有时不需要输入），我们可以输出不同的结果。

我们来看一个简单的“游戏” **FizzBu​​zz** 示例。

游戏的描述非常简单：如果一个数字可以被 3 整除，那么我们将显示“`Fizz`”；当一个数字可以被 5 整除时，我们将显示“`Buzz`”；当一个数字被 3 和 5 整除时，我们将显示“`FizzBu​​zz`”。 ; 否则，我们显示数字。

让我们将以下代码保存到名为`fizzbuzz.py`的文件中：

```py
n = int(input("Enter a number: "))
if n%15 == 0:
   print("FizzBuzz")
elif n%3 == 0:
   print("Fizz")
elif n%5 == 0:
   print("Buzz")
else:
   print(n)
```

如您所见，此应用现在受到了一定的限制，因为它在启动时仅执行一次，但是在下一篇文章中，我将介绍循环，然后我们将变得势不可挡，并且可以编写可以运行并运行的应用……希望您能理解这个想法。

如果我运行该应用，一些示例输出将如下所示：

```py
MB:examples GHajba$ python3 fizzbuzz.py
Enter a number: 5
Buzz
MB:examples GHajba$ python3 fizzbuzz.py
Enter a number: 6
Fizz
MB:examples GHajba$ python3 fizzbuzz.py
Enter a number: 2
2
MB:examples GHajba$ python3 fizzbuzz.py
Enter a number: 45
FizzBuzz
```

## 关于条件

条件句根据某些条件改变应用流程。 在大多数情况下，这是基于某些变量的值，有时是基于输入。 这一切都取决于您的应用的设计方式。

一些开发人员说，在应用流中没有分支的情况下编写应用很困难。 好吧，我们已经看到了可能，但是这以一种不好的方式降低了用户体验。 最好基于会改变编程状态的条件创建分支。

上面显示的“FizzBu​​zz”示例是一个不错的脚本，它显示了通过分支我们可以在编码时做很多不同。

但是，以上示例涵盖了 Python 中`if-then-else`构造的相同程序流。 `if`语句需要一个表达式，其值必须为`True`或`False`。 如果表达式的计算结果为`True`，则执行此语句后的代码块。 如果该语句的求值结果为`False`，则跳过此块。

`elif`语句再次要求一个求值结果为`True`或`False`的语句，并且仅在前一个语句被求值为`False`时才被求值。 否则，甚至不会求值该块。

如果先前的`if`块和所有先前的`elif`块的求值为`False`，则`else`块执行。 这里不需要任何语句进行求值。 如果所有以前的表达式求值为`False`，则`else`块是默认情况。

条件块的基本构造如下：

*   一个`if`块
*   零到任何`elif`块
*   零或一个`else`块

这意味着`if`块必须始终存在。 但是，此`if`块不必后面带有任何`elif`或`else`语句。 但是，如果没有`if`块，则不能单独拥有`elif`或`else`块。

```py
if conditional_expression_1:
   statement_block_1
elif conditional_expression_2:
   statement_block_2
else:
   statement_block_3
```

而且，如果您有多个`if`语句，则将同时求值它们。 这意味着对于“FizzBu​​zz”示例，您不能使用简单的`if`块。 这是因为在这种情况下，每个`if`语句都会被求值，并且会导致您无法预期的结果。

```py
n = int(input("Enter a number: "))
if n%15 == 0:
   print("FizzBuzz")
if n%3 == 0:
   print("Fizz")
if n%5 == 0:
   print("Buzz")
else:
   print(n)

MB:examples GHajba$ python fizzbuzz_wrong.py
Enter a number: 15
FizzBuzz
Fizz
Buzz
MB:examples GHajba$ python fizzbuzz_wrong.py
Enter a number: 3
Fizz
3
```

上面的代码示例演示了仅当前一个`if`块的值为`False`时，才对每个`if`块求值，并且执行最后的`else`。

## 生活不仅是对还是错

不幸的是有人说相反，因为布尔条件不仅是对还是错。 使用 Python 时，在每种情况下 0 的求值结果均为`False`，其他所有数字均求值为`True`。

集合也是如此（当然也包括字符串）。 如果集合为空，则它在条件语句中求值为`False`，在任何其他情况下为`True`。

没有一个总是求值为`False`。

这就是为什么有人说很难用 Python 编写条件语句的原因。 但这始终取决于开发人员的口味。 “Python 禅宗”指出

显式胜于隐式。

但是，在这种情况下，隐式有时甚至更好。 这意味着您可以避免类似以下的构造：

```py
if len(l) == 0:
   # do something

if a == 0 or a is None:
   # do something else
```

并用这些替换它们：

```py
if not l:
   # do something

if not a:
   # do something else
```

