geekdoc-python-zh/docs/pythonlibrary/python-101-conditional-stat...

337 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Python 101:条件语句
> 原文:<https://www.blog.pythonlibrary.org/2020/04/29/python-101-conditional-statements/>
开发人员不得不一直做决策。你如何处理这个问题?你用 X 技术还是 Y 技术?您可以使用哪种编程语言来解决这个问题?您的代码有时也需要做出决定。
以下是代码每天都要检查的一些常见问题:
* 你被授权做那件事吗?
* 这是有效的电子邮件地址吗
* 该值在该字段中有效吗?
这类事情通过使用*条件语句*来控制。这个题目通常叫做*控制流*。在 Python 中,你可以使用`if`、`elif`和`else`语句来控制程序的流程。您还可以使用异常处理来实现一种简单的控制流,尽管通常不建议这样做。
有些编程语言也有`switch`或`case`语句可以用于控制流。Python 没有这些。
在本章中,您将了解以下内容:
* 比较运算符
* 创建简单的条件
* 分支条件语句
* 嵌套条件句
* 逻辑运算符
* 特殊操作员
让我们从学习比较运算符开始吧!
| [![](img/9437a5e03f2225dbc315c4e7e5b908b3.png)](https://leanpub.com/py101/) | 你想了解更多关于 Python 的知识吗?
### Python 101 -第二版
**[在 Leanpub](https://leanpub.com/py101) 上立即购买** |
### 比较运算符
在开始使用条件语句之前,了解一下比较运算符是很有用的。比较运算符允许您询问某物是否等于另一物,或者它们是否大于或小于某个值,等等。
下表显示了 Python 的比较运算符:
| 操作员 | 意义 |
| --- | --- |
| > | 大于——这是`True`是左操作数大于右操作数 |
| < | 小于-这是`True`左操作数小于右操作数 |
| == | 等于-只有当两个操作数相等时,这才是`True` |
| = | 不等于-如果操作数不相等,这是`True` |
| >= | 大于或等于-当左操作数大于或等于右操作数时,这是`True` |
| <= | 小于或等于-当左操作数小于或等于右操作数时,这是`True` |
现在您已经知道 Python 中有哪些比较运算符,您可以开始使用它们了!
以下是一些例子:
```py
>>> a = 2
>>> b = 3
>>> a == b
False
>>> a > b
False
>>> a < b
True
>>> a >= b
False
>>> a <= b
True
>>> a != b
True
```
继续,在 Python REPL 中自己使用比较运算符。尝试一下是有好处的,这样你就能完全理解发生了什么。
现在让我们学习如何创建一个条件语句。
### 创建简单的条件
创建条件语句允许您的代码分支到两个或更多不同的路径。我们以认证为例。如果您在新电脑上使用您的网络邮件帐户,您需要登录才能查看您的电子邮件。主页的代码要么会在你进入时加载你的邮箱,要么会提示你登录。
你可以很有把握地打赌,代码正在使用一个条件语句来检查和查看你是否已经验证/授权查看该电子邮件。如果是,它会加载你的电子邮件。如果不是,它会加载登录屏幕。
让我们创建一个假想的身份验证示例:
```py
>>> authenticated = True
>>> if authenticated:
... print('You are logged in')
...
You are logged in
```
在本例中,您创建了一个名为`authenticated`的变量,并将其设置为`True`。然后使用 Python 的`if`关键字创建一个条件语句。Python 中的条件语句采用以下形式:
```py
if <expression>:
# do something here
```
要创建一个条件,您可以以单词`if`开始,后面跟着一个表达式,然后以冒号结束。当该表达式的计算结果为`True`时,执行条件下的代码。
如果`authenticated`被设置为`False`,那么什么都不会被打印出来。
#### 在 Python 中缩进很重要
Python 关心缩进。代码块是一系列统一缩进的代码行。Python 通过缩进来确定代码块的开始和结束位置。
其他语言使用括号或分号来标记代码块的开始或结束。
Python 要求统一缩进代码。如果没有正确地做到这一点,您的代码可能很难诊断问题。
另外一个警告。不要混用制表符和空格。如果你这样做IDLE 会抱怨你的代码可能有难以诊断的问题。Python 风格指南(PEP8)建议使用 4 个空格来缩进代码块。只要代码一致,您可以缩进任意数量的空格。但是,通常建议使用 4 个空格。
如果您处理了这两种情况,这段代码会更好。让我们看看接下来该怎么做!
### 分支条件语句
根据问题的答案,您通常需要做不同的事情。因此,对于这种假设的情况,您希望让用户知道他们何时还没有进行身份验证,以便他们能够登录。
要实现这一点,您可以使用关键字`else`:
```py
>>> authenticated = False
>>> if authenticated:
... print('You are logged in')
... else:
... print('Please login')
...
Please login
```
这段代码所做的是,如果你是`authenticated`,它会打印“你已登录”,如果不是,它会打印“请登录”。在一个真正的程序中,你不仅仅会有一个`print()`语句。您可能有代码将用户重定向到登录页面,或者如果他们通过了身份验证,它将运行代码来加载他们的收件箱。
让我们看一个新的场景。在下面的代码片段中,您将创建一个条件语句,该语句将检查您的年龄,并允许您根据该因素购买不同的商品:
```py
>>> age = 10
>>> if age < 18:
... print('You can buy candy')
... elif age < 21:
... print('You can purchase tobacco and candy, but not alcohol')
... elif age >= 21:
... print('You can buy anything!')
...
You can buy candy
```
在这个例子中,您使用了`if`和`elif`。关键词,`elif`是“else if”的简称。因此您在这里所做的是对照不同的硬编码值检查年龄。如果年龄小于 18 岁,那么买家只能买糖果。
如果他们大于 18 岁但小于 21 岁,他们可以购买烟草。当然,你不应该这样做,因为烟草对你不好,但它在大多数地方都有年龄限制。接下来你要检查买家的年龄是否大于或等于 21 岁。然后他们可以买任何他们想要的东西。
如果你想的话,你可以把最后一个`elif`改成一个简单的`else`子句,但是 Python 鼓励开发者在他们的代码中显式表达,在这种情况下使用`elif`会更容易理解。
您可以根据需要使用任意多的`elif`语句,尽管通常建议当您看到一个长的`if/elif`语句时,该代码可能需要重新编写。
### 嵌套条件句
您可以将一个`if`语句放在另一个`if`语句中。这就是所谓的嵌套。
让我们看一个愚蠢的例子:
```py
>>> age = 21
>>> car = 'Ford'
>>> if age >= 21:
... if car in ['Honda', 'Toyota']:
... print('You buy foreign cars')
... elif car in ['Ford', 'Chevrolet']:
... print('You buy American')
... else:
... print('You are too young!')
...
You buy American
```
这段代码有多条路径,因为它依赖于两个变量:`age`和`car`。如果年龄大于某个值,那么它将落入该代码块,并将执行嵌套的`if`语句,该语句检查`car`类型。如果`age`小于一个任意值,那么它将简单地打印出一条消息。
理论上,你可以任意多次嵌套条件语句。但是,嵌套做得越多,后期调试就越复杂。在大多数情况下,您应该将嵌套保持在一两层深度。
幸运的是,逻辑运算符可以帮助缓解这个问题!
### 逻辑运算符
逻辑运算符允许您使用特殊的关键字将多个表达式链接在一起。
以下是 Python 支持的三种逻辑运算符:
* `and`——如果两个操作数都为真,则只有`True`
* `or` - `True`如果任一操作数为真
* `not` - `True`如果操作数为假
让我们在上一节的示例中尝试使用逻辑运算符`and`来简化条件语句:
```py
>>> age = 21
>>> car = 'Ford'
>>> if age >= 21 and car in ['Honda', 'Toyota']:
... print('You buy foreign cars')
... elif age >= 21 and car in ['Ford', 'Chevrolet']:
... print('You buy American')
... else:
... print('You are too young!')
...
You buy American
```
当您使用`and`时,两个表达式的计算结果都必须是`True`才能执行下面的代码。所以第一个条件检查年龄是否大于或等于 21并且该车是否在日系车列表中。因为不是这两种情况所以您下降到`elif`并检查这些条件。这次两个条件都是`True`,所以它打印出你的用车偏好。
让我们看看如果将`and`改为`or`会发生什么:
```py
>>> age = 21
>>> car = 'Ford'
>>> if age >= 21 or car in ['Honda', 'Toyota']:
... print('You buy foreign cars')
... elif age >= 21 or car in ['Ford', 'Chevrolet']:
... print('You buy American')
... else:
... print('You are too young!')
...
You buy foreign cars
```
等一下!你说你的车是“福特”,但这个代码是说你买外国车!这是怎么回事?
当你使用一个逻辑`or`时,这意味着如果任何一个语句为`True`,代码块中的代码将会执行。
让我们把它分解一下。`if age >= 21 or car in ['Honda', 'Toyota']`中有两个表达式。第一个是`age >= 21`。那就评估为`True`。Python 一看到`or`并且第一条语句是`True`,它就将整个事件评估为`True`。要么你的年龄大于等于 21 **要么**你的车是福特。无论哪种方式,它都是真的,代码被执行。
使用`not`有点不同。它根本不适合这个例子,所以你得写点别的。
这里有一种使用`not`的方法:
```py
>>> my_list = [1, 2, 3, 4]
>>> 5 not in my_list
True
```
在这种情况下,您要检查一个整数是否在一个`list`中。
让我们用另一个认证例子来演示如何使用`not`:
```py
>>> ids = [1234, 5678]
>>> my_id = 1001
>>> if my_id not in ids:
... print('You are not authorized!')
...
You are not authorized!
```
这里有一组已知的 id。这些 id 可以是数字,就像这里一样,也可以是电子邮件地址或其他东西。无论如何,您需要检查给定的 id`my_id`是否在您的已知 id 列表中。如果不是,那么您可以让用户知道他们无权继续。
您也可以在条件语句中组合逻辑运算符。这里有一个例子:
```py
>>> hair = 'brown'
>>> age = 21
>>> if age >= 21 and (hair == 'brown' or hair == 'blue'):
... print(f'You are {age} years old with {hair} hair')
... else:
... print(f'You are too young at {age} years old')
...
You are 21 years old with brown hair
```
这一次,如果年龄大于或等于 21 岁,头发颜色是棕色或蓝色,您将运行`if`语句前半部分的代码。为了便于阅读,您在第二个和第三个表达式两边放了括号。
## 特殊操作员
您可以在条件表达式中使用一些特殊的运算符。事实上,在上一节中您已经使用了其中的一个。
你记得你刚刚用的是哪一个吗?
* `is` - `True`当操作数相同时(即具有相同的 id)
* `is not` - `True`当操作数不相同时
* `in` - `True`当值在序列中时
* `not in` - `True`当值不在序列中时
您使用最后一个选项`not in`来确定一个 id 是否不在授权访问列表中。
前两个用于测试**身份**。您想知道一个项目是否引用相同的对象(或 id)。最后两个用于检查成员资格,这意味着您想知道一个项目是否在一个序列中。
让我们看看身份是如何工作的:
```py
>>> x = 'hi'
>>> y = 'hi'
>>> x is y
True
>>> id(x)
140328219549744
>>> id(y)
140328219549744
```
当您将同一个字符串赋给两个不同的变量时,它们的身份是相同的,因为 Python 将`x`和`y`指向内存中相同的 ID 或位置。
让我们看看在创建列表时是否会发生同样的事情:
```py
>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> x is y
False
>>> id(x)
140328193994832
>>> id(y)
140328193887760
>>> x == y
True
```
Python 列表的工作方式略有不同。每个列表都有自己的 id所以当您在这里测试身份时它会返回`False`。请注意,当您在最后测试相等性时,这两个列表确实彼此相等。
你可以使用`in`和`not in`来测试一个东西是否在一个序列中。Python 中的序列指的是列表、字符串、元组等。
有一种方法可以让你利用这些知识:
```py
>>> valid_chars = 'yn'
>>> char = 'x'
>>> if char in valid_chars:
... print(f'{char} is a valid character')
... else:
... print(f'{char} is not in {valid_chars}')
...
x is not in yn
```
这里你检查一下`char`是否在`valid_chars`的字符串中。如果不是,它将打印出有效的字母。
尝试将`char`改为一个有效的字符比如小写的“y”或小写的“n ”,然后重新运行代码。
### 包扎
条件语句在编程中非常有用。您将经常使用它们来根据用户的选择做出决策。你也可以使用基于数据库、网站和任何你的程序输入来源的响应的条件语句。
创建一个真正好的条件语句可能需要一些技巧,但是如果你在代码中投入足够的思想和精力,你就能做到!