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

337 lines
13 KiB
Markdown
Raw Normal View History

2024-10-20 12:24:46 +08:00
# 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 ”,然后重新运行代码。
### 包扎
条件语句在编程中非常有用。您将经常使用它们来根据用户的选择做出决策。你也可以使用基于数据库、网站和任何你的程序输入来源的响应的条件语句。
创建一个真正好的条件语句可能需要一些技巧,但是如果你在代码中投入足够的思想和精力,你就能做到!