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

13 KiB
Raw Blame History

Python 101:条件语句

原文:https://www.blog.pythonlibrary.org/2020/04/29/python-101-conditional-statements/

开发人员不得不一直做决策。你如何处理这个问题?你用 X 技术还是 Y 技术?您可以使用哪种编程语言来解决这个问题?您的代码有时也需要做出决定。

以下是代码每天都要检查的一些常见问题:

  • 你被授权做那件事吗?
  • 这是有效的电子邮件地址吗
  • 该值在该字段中有效吗?

这类事情通过使用条件语句来控制。这个题目通常叫做控制流。在 Python 中,你可以使用ifelifelse语句来控制程序的流程。您还可以使用异常处理来实现一种简单的控制流,尽管通常不建议这样做。

有些编程语言也有switchcase语句可以用于控制流。Python 没有这些。

在本章中,您将了解以下内容:

  • 比较运算符
  • 创建简单的条件
  • 分支条件语句
  • 嵌套条件句
  • 逻辑运算符
  • 特殊操作员

让我们从学习比较运算符开始吧!

| | 你想了解更多关于 Python 的知识吗?

Python 101 -第二版

在 Leanpub 上立即购买 |

比较运算符

在开始使用条件语句之前,了解一下比较运算符是很有用的。比较运算符允许您询问某物是否等于另一物,或者它们是否大于或小于某个值,等等。

下表显示了 Python 的比较运算符:

操作员 意义
> 大于——这是True是左操作数大于右操作数
< 小于-这是True左操作数小于右操作数
== 等于-只有当两个操作数相等时,这才是True
= 不等于-如果操作数不相等,这是True
>= 大于或等于-当左操作数大于或等于右操作数时,这是True
<= 小于或等于-当左操作数小于或等于右操作数时,这是True

现在您已经知道 Python 中有哪些比较运算符,您可以开始使用它们了!

以下是一些例子:

>>> a = 2
>>> b = 3
>>> a == b
False
>>> a > b
False
>>> a < b
True
>>> a >= b
False
>>> a <= b
True
>>> a != b
True

继续,在 Python REPL 中自己使用比较运算符。尝试一下是有好处的,这样你就能完全理解发生了什么。

现在让我们学习如何创建一个条件语句。

创建简单的条件

创建条件语句允许您的代码分支到两个或更多不同的路径。我们以认证为例。如果您在新电脑上使用您的网络邮件帐户,您需要登录才能查看您的电子邮件。主页的代码要么会在你进入时加载你的邮箱,要么会提示你登录。

你可以很有把握地打赌,代码正在使用一个条件语句来检查和查看你是否已经验证/授权查看该电子邮件。如果是,它会加载你的电子邮件。如果不是,它会加载登录屏幕。

让我们创建一个假想的身份验证示例:

>>> authenticated = True
>>> if authenticated:
...     print('You are logged in')
... 
You are logged in

在本例中,您创建了一个名为authenticated的变量,并将其设置为True。然后使用 Python 的if关键字创建一个条件语句。Python 中的条件语句采用以下形式:

if <expression>:
    # do something here

要创建一个条件,您可以以单词if开始,后面跟着一个表达式,然后以冒号结束。当该表达式的计算结果为True时,执行条件下的代码。

如果authenticated被设置为False,那么什么都不会被打印出来。

在 Python 中缩进很重要

Python 关心缩进。代码块是一系列统一缩进的代码行。Python 通过缩进来确定代码块的开始和结束位置。

其他语言使用括号或分号来标记代码块的开始或结束。

Python 要求统一缩进代码。如果没有正确地做到这一点,您的代码可能很难诊断问题。

另外一个警告。不要混用制表符和空格。如果你这样做IDLE 会抱怨你的代码可能有难以诊断的问题。Python 风格指南(PEP8)建议使用 4 个空格来缩进代码块。只要代码一致,您可以缩进任意数量的空格。但是,通常建议使用 4 个空格。

如果您处理了这两种情况,这段代码会更好。让我们看看接下来该怎么做!

分支条件语句

根据问题的答案,您通常需要做不同的事情。因此,对于这种假设的情况,您希望让用户知道他们何时还没有进行身份验证,以便他们能够登录。

要实现这一点,您可以使用关键字else:

>>> authenticated = False
>>> if authenticated:
...     print('You are logged in')
... else:
...     print('Please login')
... 
Please login

这段代码所做的是,如果你是authenticated,它会打印“你已登录”,如果不是,它会打印“请登录”。在一个真正的程序中,你不仅仅会有一个print()语句。您可能有代码将用户重定向到登录页面,或者如果他们通过了身份验证,它将运行代码来加载他们的收件箱。

让我们看一个新的场景。在下面的代码片段中,您将创建一个条件语句,该语句将检查您的年龄,并允许您根据该因素购买不同的商品:

>>> 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

在这个例子中,您使用了ifelif。关键词,elif是“else if”的简称。因此您在这里所做的是对照不同的硬编码值检查年龄。如果年龄小于 18 岁,那么买家只能买糖果。

如果他们大于 18 岁但小于 21 岁,他们可以购买烟草。当然,你不应该这样做,因为烟草对你不好,但它在大多数地方都有年龄限制。接下来你要检查买家的年龄是否大于或等于 21 岁。然后他们可以买任何他们想要的东西。

如果你想的话,你可以把最后一个elif改成一个简单的else子句,但是 Python 鼓励开发者在他们的代码中显式表达,在这种情况下使用elif会更容易理解。

您可以根据需要使用任意多的elif语句,尽管通常建议当您看到一个长的if/elif语句时,该代码可能需要重新编写。

嵌套条件句

您可以将一个if语句放在另一个if语句中。这就是所谓的嵌套。

让我们看一个愚蠢的例子:

>>> 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

这段代码有多条路径,因为它依赖于两个变量:agecar。如果年龄大于某个值,那么它将落入该代码块,并将执行嵌套的if语句,该语句检查car类型。如果age小于一个任意值,那么它将简单地打印出一条消息。

理论上,你可以任意多次嵌套条件语句。但是,嵌套做得越多,后期调试就越复杂。在大多数情况下,您应该将嵌套保持在一两层深度。

幸运的是,逻辑运算符可以帮助缓解这个问题!

逻辑运算符

逻辑运算符允许您使用特殊的关键字将多个表达式链接在一起。

以下是 Python 支持的三种逻辑运算符:

  • and——如果两个操作数都为真,则只有True
  • or - True如果任一操作数为真
  • not - True如果操作数为假

让我们在上一节的示例中尝试使用逻辑运算符and来简化条件语句:

>>> 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会发生什么:

>>> 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的方法:

>>> my_list = [1, 2, 3, 4]
>>> 5 not in my_list
True

在这种情况下,您要检查一个整数是否在一个list中。

让我们用另一个认证例子来演示如何使用not:

>>> ids = [1234, 5678]
>>> my_id = 1001
>>> if my_id not in ids:
...     print('You are not authorized!')
... 
You are not authorized!

这里有一组已知的 id。这些 id 可以是数字,就像这里一样,也可以是电子邮件地址或其他东西。无论如何,您需要检查给定的 idmy_id是否在您的已知 id 列表中。如果不是,那么您可以让用户知道他们无权继续。

您也可以在条件语句中组合逻辑运算符。这里有一个例子:

>>> 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)。最后两个用于检查成员资格,这意味着您想知道一个项目是否在一个序列中。

让我们看看身份是如何工作的:

>>> x = 'hi'
>>> y = 'hi'
>>> x is y
True
>>> id(x)
140328219549744
>>> id(y)
140328219549744

当您将同一个字符串赋给两个不同的变量时,它们的身份是相同的,因为 Python 将xy指向内存中相同的 ID 或位置。

让我们看看在创建列表时是否会发生同样的事情:

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> x is y
False
>>> id(x)
140328193994832
>>> id(y)
140328193887760
>>> x == y
True

Python 列表的工作方式略有不同。每个列表都有自己的 id所以当您在这里测试身份时它会返回False。请注意,当您在最后测试相等性时,这两个列表确实彼此相等。

你可以使用innot in来测试一个东西是否在一个序列中。Python 中的序列指的是列表、字符串、元组等。

有一种方法可以让你利用这些知识:

>>> 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 ”,然后重新运行代码。

包扎

条件语句在编程中非常有用。您将经常使用它们来根据用户的选择做出决策。你也可以使用基于数据库、网站和任何你的程序输入来源的响应的条件语句。

创建一个真正好的条件语句可能需要一些技巧,但是如果你在代码中投入足够的思想和精力,你就能做到!