13 KiB
Python 101:条件语句
原文:https://www.blog.pythonlibrary.org/2020/04/29/python-101-conditional-statements/
开发人员不得不一直做决策。你如何处理这个问题?你用 X 技术还是 Y 技术?您可以使用哪种编程语言来解决这个问题?您的代码有时也需要做出决定。
以下是代码每天都要检查的一些常见问题:
- 你被授权做那件事吗?
- 这是有效的电子邮件地址吗
- 该值在该字段中有效吗?
这类事情通过使用条件语句来控制。这个题目通常叫做控制流。在 Python 中,你可以使用if、elif和else语句来控制程序的流程。您还可以使用异常处理来实现一种简单的控制流,尽管通常不建议这样做。
有些编程语言也有switch或case语句,可以用于控制流。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
在这个例子中,您使用了if和elif。关键词,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
这段代码有多条路径,因为它依赖于两个变量:age和car。如果年龄大于某个值,那么它将落入该代码块,并将执行嵌套的if语句,该语句检查car类型。如果age小于一个任意值,那么它将简单地打印出一条消息。
理论上,你可以任意多次嵌套条件语句。但是,嵌套做得越多,后期调试就越复杂。在大多数情况下,您应该将嵌套保持在一两层深度。
幸运的是,逻辑运算符可以帮助缓解这个问题!
逻辑运算符
逻辑运算符允许您使用特殊的关键字将多个表达式链接在一起。
以下是 Python 支持的三种逻辑运算符:
and——如果两个操作数都为真,则只有Trueor-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 可以是数字,就像这里一样,也可以是电子邮件地址或其他东西。无论如何,您需要检查给定的 id,my_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 将x和y指向内存中相同的 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。请注意,当您在最后测试相等性时,这两个列表确实彼此相等。
你可以使用in和not 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 ”,然后重新运行代码。
包扎
条件语句在编程中非常有用。您将经常使用它们来根据用户的选择做出决策。你也可以使用基于数据库、网站和任何你的程序输入来源的响应的条件语句。
创建一个真正好的条件语句可能需要一些技巧,但是如果你在代码中投入足够的思想和精力,你就能做到!
