170.md 5.1 KB
Newer Older
W
wizardforcel 已提交
1
# Python 条件语句
W
init  
wizardforcel 已提交
2 3 4

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

W
wizardforcel 已提交
5
## 条件决策
W
init  
wizardforcel 已提交
6

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

W
wizardforcel 已提交
9
到目前为止,我们只有一个流程:启动应用,(可能)需要用户输入并显示一个结果。 通过条件更改。 根据输入或运行时创建的其他参数(您知道,有时不需要输入),我们可以输出不同的结果。
W
init  
wizardforcel 已提交
10 11 12

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

W
wizardforcel 已提交
13
游戏的描述非常简单:如果一个数字可以被 3 整除,那么我们将显示“`Fizz`”;当一个数字可以被 5 整除时,我们将显示“`Buzz`”;当一个数字被 3 和 5 整除时,我们将显示“`FizzBu​​zz`”。 ; 否则,我们显示数字。
W
init  
wizardforcel 已提交
14

W
wizardforcel 已提交
15
让我们将以下代码保存到名为`fizzbuzz.py`的文件中:
W
init  
wizardforcel 已提交
16

W
wizardforcel 已提交
17
```py
W
init  
wizardforcel 已提交
18 19 20 21 22 23 24 25 26 27 28
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)
```

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

W
wizardforcel 已提交
31
如果我运行该应用,一些示例输出将如下所示:
W
init  
wizardforcel 已提交
32

W
wizardforcel 已提交
33
```py
W
init  
wizardforcel 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
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
```

## 关于条件

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

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

W
wizardforcel 已提交
54
上面显示的“FizzBu​​zz”示例是一个不错的脚本,它显示了通过分支我们可以在编码时做很多不同。
W
init  
wizardforcel 已提交
55

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

W
wizardforcel 已提交
58
`elif`语句再次要求一个求值结果为`True``False`的语句,并且仅在前一个语句被求值为`False`时才被求值。 否则,甚至不会求值该块。
W
init  
wizardforcel 已提交
59

W
wizardforcel 已提交
60
如果先前的`if`块和所有先前的`elif`块的求值为`False`,则`else`块执行。 这里不需要任何语句进行求值。 如果所有以前的表达式求值为`False`,则`else`块是默认情况。
W
init  
wizardforcel 已提交
61 62 63

条件块的基本构造如下:

W
wizardforcel 已提交
64 65 66
*   一个`if`
*   零到任何`elif`
*   零或一个`else`
W
init  
wizardforcel 已提交
67

W
wizardforcel 已提交
68
这意味着`if`块必须始终存在。 但是,此`if`块不必后面带有任何`elif``else`语句。 但是,如果没有`if`块,则不能单独拥有`elif``else`块。
W
init  
wizardforcel 已提交
69

W
wizardforcel 已提交
70
```py
W
init  
wizardforcel 已提交
71 72 73 74 75 76 77 78
if conditional_expression_1:
   statement_block_1
elif conditional_expression_2:
   statement_block_2
else:
   statement_block_3
```

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

W
wizardforcel 已提交
81
```py
W
init  
wizardforcel 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
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
```

W
wizardforcel 已提交
103
上面的代码示例演示了仅当前一个`if`块的值为`False`时,才对每个`if`块求值,并且执行最后的`else`
W
init  
wizardforcel 已提交
104 105 106

## 生活不仅是对还是错

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

W
wizardforcel 已提交
109
集合也是如此(当然也包括字符串)。 如果集合为空,则它在条件语句中求值为`False`,在任何其他情况下为`True`
W
init  
wizardforcel 已提交
110

W
wizardforcel 已提交
111
没有一个总是求值为`False`
W
init  
wizardforcel 已提交
112

W
wizardforcel 已提交
113
这就是为什么有人说很难用 Python 编写条件语句的原因。 但这始终取决于开发人员的口味。 “Python 禅宗”指出
W
init  
wizardforcel 已提交
114 115 116 117 118

显式胜于隐式。

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

W
wizardforcel 已提交
119
```py
W
init  
wizardforcel 已提交
120 121 122 123 124 125 126 127 128
if len(l) == 0:
   # do something

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

并用这些替换它们:

W
wizardforcel 已提交
129
```py
W
init  
wizardforcel 已提交
130 131 132 133 134 135 136
if not l:
   # do something

if not a:
   # do something else
```