欢迎光临散文网 会员登陆 & 注册

简明Python教程·运算符与表达式&控制流

2023-02-11 08:00 作者:琉璃汐阳  | 我要投稿

上一篇专栏

运算符与表达式

你所编写的大多数语句(逻辑行)都包含了表达式(Expressions)。一个表达式的简单例子 便是 2+3 。表达式可以拆分成运算符(Operators)与操作数(Operands)。

运算符(Operators)是进行某些操作,并且可以用诸如 + 等符号或特殊关键词加以表达的 功能。运算符需要一些数据来进行操作,这些数据就被称作操作数(Operands)。在上面的例子中 2 3 就是操作数。


运算符

接下来我们将简要了解各类运算符及它们的用法。 

要记得你可以随时在解释器中对给出的案例里的表达式进行求值。例如要想测试表达式 2+3 ,则可以使用交互式 Python 解释器提示符:

下面是可用运算符的速览:

  • + (加)

    • 两个对象相加。

    • 3+5 则输出 8 'a' + 'b' 则输出 'ab'

  • - (减)

    • 从一个数中减去另一个数,如果第一个操作数不存在,则假定为零。

    • -5.2 将输出一个负数, 50 - 24 输出 26 。 

  • * (乘)

    • 给出两个数的乘积,或返回字符串重复指定次数后的结果。

    • 2 * 3 输出 6 'la' * 3 输出 'lalala'

  • ** (乘方)

    • 返回 x 的 y 次方。

    • 3 ** 4 输出 81 (即 3 * 3 * 3 * 3 )。

  • / (除)

    • x 除以 y 

    • 13 / 3 输出 4.333333333333333

  • // (整除)

    • x 除以 y 并对结果向下取整至最接近的整数。

    • 13 // 3 输出 4

    • -13 // 3 输出 -5

  • % (取模)

    • 返回除法运算后的余数。

    • 13 % 3 输出 1 -25.5 % 2.25 输出 1.5

  • << (左移)

    • 将数字的位向左移动指定的位数。(每个数字在内存中以二进制数表示,即 0 和1)

    • 2 << 2 输出 8 2 用二进制数表示为 10

    • 向左移 2 位会得到 1000 这一结果,表示十进制中的 8 。 

  • >> (右移)

    • 将数字的位向右移动指定的位数。

    • 11 >> 1 输出 5

    • 11 在二进制中表示为 1011 ,右移一位后输出 101 这一结果,表示十进制中的 5

  • & (按位与)

    • 对数字进行按位与操作。1

    • 5 & 3 输出 1

  • | (按位或) 对数字进行按位或操作。2

    • 5 | 3 输出 7

  • ^ (按位异或)

    • 对数字进行按位异或操作。3

    • 5 ^ 3 输出 6

  • ~ (按位取反)4

    • x 的按位取反结果为 -(x+1)。

    • ~5 输出 -6 。有关本例的更多细节可以参 

      阅:http://stackoverflow.com/a/11810203

  • < (小于)

    • 返回 x 是否小于 y。所有的比较运算符返回的结果均为 True False 。请注意这 些名称之中的大写字母。

    • 5 < 3 输出 False 3 < 6 输出 True

    • 比较可以任意组成组成链接: 3 < 5 < 7 返回 True

  • > (大于)

    • 返回 x 是否大于 y。

    • 5 > 3 返回 True 。如果两个操作数均为数字,它们首先将会被转换至一种共同的 类型。否则,它将总是返回 False

  • <= (小于等于)

    • 返回 x 是否小于或等于 y。

    • x = 3; y = 6; x<=y 返回 True

  • >= (大于等于)

    • 返回 x 是否大于或等于 y。

    • x = 4; y = 3; x>=3 返回 True

  • == (等于)

    • 比较两个对象是否相等。

    • x = 2; y = 2; x == y 返回 True

    • x = 'str'; y = 'stR'; x == y 返回 False

    • x = 'str'; y = 'str'; x == y 返回 True

  • != (不等于)

    • 比较两个对象是否不相等。

    • x = 2; y = 3; x != y 返回 True

  • not (布尔“非”)5

    • 如果 xTure ,则返回 False 。如果 x False ,则返回 True

    • x = Ture; not x 返回 False

  • and (布尔“与”) 6

    • 如果 xFalse ,则 x and y 返回 False ,否则返回 y 的计算值。

    • xFalse 时, x = False; y = True; x and y 将返回 False 。在这一情境中, Python 将不会计算 y,因为它已经了解 and 表达式的左侧是 False ,这意味着整个 表达式都将是 False 而不会是别的值。这种情况被称作短路计算(Short-circuit Evaluation)。

  • or (布尔“或”)7

    • 如果 xTrue ,则返回 True ,否则它将返回 y 的计算值。

    • x = Ture; y = False; x or y 将返回 Ture 。在这里短路计算同样适用。


数值运算与赋值的快捷方式 

一种比较常见的操作是对一个变量进行一项数学运算并将运算得出的结果返回给这个变量, 因此对于这类运算通常有如下的快捷表达方式:

同样也可写作:

要注意到 变量 = 变量 运算 表达式 会演变成 变量 运算 = 表达式


求值顺序 8

如果你有一个诸如 2 + 3 * 4 的表达式,是优先完成加法还是优先完成乘法呢?我们的高中 数学知识会告诉我们应该先完成乘法。这意味着乘法运算符的优先级要高于加法运算符。

下面将给出 Python 中从最低优先级(最少绑定)到最高优先级(最多绑定)的优先级表。这 意味着,在给定的表达式中,Python 将优先计算表中位列于后的较高优先级的运算符与表达 式。

为了保持完整,下表是从 Python 参考手册 中引用而来。你最好使用圆括号操作符来对运算 符与操作数进行分组,以更加明确地指定优先级。这也能使得程序更加可读。你可以阅读改 变运算顺序来了解更多的细节。

  • lambda Lambda 表达式

  • if - else :条件表达式 

  • or :布尔“或” 

  • and :布尔“与” 

  • not x :布尔“非” 

  • in, not in, is, is not, <, <=, >, >=, !=, == :比较,包括成员资格测试 (Membership Tests)和身份测试(Identity Tests)。

  • | :按位或 

  • ^ :按位异或

  • & :按位与

  • <<, >> :移动

  • +, - :加与减

  • *, /, //, % :乘、除、整除、取余

  • +x, -x, ~x :正、负、按位取反

  • ** :求幂

  • x[index], x[index:index], x(arguments...), x.attribute :下标、切片、调用、属性引用

  • (expressions...), [expressions...], {key: value...}, {expressions...} :显示绑定或数 组、显示列表、显示字典、显示设置 

我们还没有遇到的运算符将在后面的章节中加以解释。 

在上表中位列同一行的运算符具有相同优先级。例如 + - 就具有相同的优先级。


改变运算顺序 

为了使表达式更加易读,我们可以使用括号。举个例子, 2 + (3 * 4) 自是要比 2 + 3 * 4 要更加容易理解,因为后者还要求你要了解运算符的优先级。和其它的一切一样,使用括号 同样也要适度(而不要过度),同时亦应不要像 (2 + (3 * 4)) 这般冗余。

使用括号还有一个额外的优点——它能帮助我们改变运算的顺序。同样举个例子,如果你希 望在表达式中计算乘法之前应先计算加法,那么你可以将表达式写作 (2 + 3) * 4


结合性 9

运算符通常由左至右结合。这意味着具有相同优先级的运算符将从左至右的方式依次进行求 值。如 2 + 3 + 4 将会以 (2 + 3) +4 的形式加以计算。


表达式

案例(将其保存为 expression.py ): 

输出:

它是如何工作的 

矩形的长度(Length)与宽度(Breadth)存储在以各自名称命名的变量中。我们使用它们并 借助表达式来计算矩形的面积(Area)与周长(Perimeter)。我们将表达式 length * breadth 的结果存储在变量 area 中并将其通过使用 print 函数打印出来。在第二种情况 中,我们直接在 print 函数中使用了表达式 2 * (length + breadth) 的值。

同时,你需要注意到 Python是如何漂亮地打印出 输出结果的。尽管我们没有特别在 Area is 和变量 area 之间指定空格,Python 会帮我们加上所以我们就能得到一个整洁的输出结 果,同时程序也因为这样的处理方式而变得更加易读(因为我们不需要在用以输出的字符串 中考虑空格问题)。这便是一个 Python 是如何让程序员的生活变得更加便捷美好的范例。


总结

我们已经了解了如何使用运算符、操作数与表达式——这些是我们构建任何程序的基本块。 接下来,我们将看到如何在程序中善加利用这些语句。

  1. . 按位与是针对二进制数的操作,指将两个二进制数的每一位都进行比较,如果两个相 应的二进位都为 1 则此位为 1,否则为 0。在本例中, 5 的二进制表达为 101 3 的 二进制表达为 11 (为补全位数进行按位操作写作 011 ),则按位与操作后的结果为 001 ,对应的十进制数为 1 。 ↩

  2. . 按位或是针对二进制数的操作,指将两个二进制数的每一位都进行比较,如果两个相 应的二进位有一个为 1 则此位为 1,否则为 0。在本例中, 101 011 进行按位或操 作后的结果为 111 ,对应十进制数为 7 。 ↩

  3. . 按位异或是针对二进制数的操作,指将两个二进制数的每一位都进行比较,如果两个 相应的二进位不同则此位为 1,相同为 0。在本例中, 101 011 进行按位异或操作 的结果为 110 ,对应十进制数为 6 。 ↩

  4. . 按位取反也称作“按位取非”或“求非”或“取反”,沈洁元译本译作“按位翻转”,是针对二进 制数的操作,指将两个二进制数的每一二进位都进行取反操作, 0 换成 1 1 换成 0 。受篇幅与学识所限,本例具体原理不在此处赘述。读者只需按照给出的公式记忆即 可。 ↩

  5. . 原文作 Boolean NOT。 ↩ 

  6. . 原文作 Boolean AND。 ↩

  7. . 原文作 Boolean OR。 ↩

  8. . 原文作 Evaluation Order。 ↩

  9. . 原文作 Associativity,沈洁元译本译作“结合规律”。 ↩ 

控制流 

截止到现在,在我们所看过的程序中,总是有一系列语句从上到下精确排列,并交由 Python 忠实地执行。如果你想改变这一工作流程,应该怎么做?就像这样的情况:你需要程序作出 一些决定,并依据不同的情况去完成不同的事情,例如依据每天时间的不同打印出 '早上好' 'Good Morning' 或 '晚上好' 'Good Evening'

正如你可能已经猜测到的那番,这是通过控制流语句来实现的。在 Python 中有三种控制流语 句—— if for while 。 


if 语句

if 语句用以检查条件:如果 条件为真(True),我们将运行一块语句(称作 if-blockif 块),否则 我们将运行另一块语句(称作 else-blockelse 块)。其中 else 从句是可选 的。

案例(保存为 if.py ):

输出: 

它是如何工作的 

在这个程序中,我们根据用户猜测的数字来检查这一数字是否是我们所设置的。我们将变量 number 设为任何我们所希望的整数,例如 23 。然后,我们通过 input() 函数来获取用户 的猜测数。所谓函数是一种可重复使用的程序。我们将在下一章详细讨论它。

我们为内置的 input 函数提供一串打印到屏幕上的字符串并等待用户的输入。一旦我们输入 了某些内容并按下键盘上的 enter 键, input() 函数将以字符串的形式返回我们所输入的 内容。然后我们通过 int 将这个字符串转换成一个整数并将其储存在变量 guess 中。实际 上, int 是一个类(Class),但你现在你所需要知道的就是你可以使用它将一串字符串转 换成一个整数(假设这个字符串的文本中含有一个有效的整数)。

接下来,我们将用户提供的猜测数与我们所选择的数字进行对比。如果它们相等,我们就打 印一条成功信息。在这里要注意到我们使用缩进级别来告诉 Python 哪些语句分别属于哪个 块。这便是为什么在 Python 中缩进如此重要。我希望你能够坚持“缩进一致”的原则,你能做 到吧?

另外需要注意的是 if 语句在结尾处包含一个冒号——我们借此向 Python 指定接下来会有 一块语句在后头。

然后,我们检查猜测数是否小于我们选择的数字,如果是,我们将告诉用户他们必须猜一个 更高一些的数字。在这里我们使用的是 elif 语句,它们实际上将两个相连的 if else-if else 语句合并成一句 if-elif-else 语句。这能够使程序更加简便,并且可以减少所需要的 缩进量。

elif else 同样都必须有一个冒号在其逻辑行的末尾,后面跟着与它们相应的语句块 (当然,别忘了恰当的缩进)。

你可以在 if 块的 一个 if 语句中设置另一个 if 语句,并可以如此进行下去——这被称作 嵌套的 if 语句。

要记住 elif else 部分都是可选的。一个最小规模且有效的 if 语句是这样的:

Python 完整执行了 if 语句及与其相关的 elif else 子句后,它将会移动至包含 if 语句的代码块的下一句语句中。在本例中,也就是主代码块(程序开始执行的地方), 其下一句语句就是 print('Done') 语句。在完成这些工作后,Python 会发现已行至程序末尾 并宣告工作的完成。

尽管这是一个非常简单的程序,我也一直在其中指出你应该注意的事情。所有的这些都可算 是简单易懂(对于那些具有 C/C++ 背景的人来说是相当简单易懂)。不过在开始时它们还是 可能会不断吸引你的注意,不断地去在意它们。但经过一些更丰富的操作后你就会习惯它们 及其中的逻辑,它们对于你来说将会成为“自然而然”的事情。

针对 C/C++ 程序员的提示 

Python 中不存在 switch 语句。你可以通过使用 if..elif..else 语句来实现同样的事 情(在某些情况下,使用一部 字典 能够更快速地完成)。


while 语句 

while 语句能够让你在条件为真的前提下重复执行某块语句。 while 语句是 循环 (Looping) 语句的一种。 while 语句同样可以拥有 else 子句作为可选选项。

案例(保存为 while.py ):

输出:

它是如何工作的 

在这一程序中,我们依旧通过猜数游戏来演示,不过新程序的优点在于能够允许用户持续猜 测直至他猜中为止——而无需像我们在上一节中所做的那样,每次猜测都要重新运行程序。 这种变化恰到好处地演示了 while 语句的作用。

首先我们将 input if 语句移到 while 循环之中,并在 while 循环开始前将变量 running 设置为 True 。程序开始时,我们首先检查变量 running 是否为 True ,之后再执 行相应的 while 块。在这一代码块被执行之后,将会重新对条件进行检查,在本例中也就是 running 变量。如果它依旧为 True ,我们将再次执行 while 块,否则我们将继续执行可选 的 else 块,然后进入到下一个语句中。

else 代码块在 while 循环的条件变为 False 时开始执行——这个开始的时机甚至可能是 在第一次检查条件的时候。如果 while 循环中存在一个 else 代码块,它将总是被执行, 除非你通过 break 语句来中断这一循环。

True False 被称作布尔(Boolean)型,你可以将它们分别等价地视为 1 0

针对 C/C++ 程序员的提示 

你可以在 while 循环中使用 else 从句。


for 循环 

for...in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(Iterates),意即 它会遍历序列中的每一个项目。我们将在后面的序列(Sequences)章节中了解有关它的更 多内容。现在你所需要的就是所谓队列就是一系列项目的有序集合。 

案例(保存为 for.py ):

输出:

它是如何工作的 

在这一程序中,我们打印了一序列的数字。我们通过内置的 range 函数生成这一数字序列。

 在这里我们所要做的事情是提供两个数字,而 range 将会返回一序列的数字,从第一个数字 开始,至第二个数字结束。举个例子, range(1,5) 将输出序列 [1, 2, 3, 4] 。在默认情况 下, range 将会以 1 逐步递增。如果我们向 range 提供第三个数字,则这个数字将成为逐 步递增的加数。同样举个例子来说明, range(1,5,2) 将会输出 [1, 3] 。要记住这一序列扩 展直到第二个数字,也就是说,它不会包括第二个数字在内。

另外需要注意的是, range() 每次只会生成一个数字,如果你希望获得完整的数字列表,要 在使用 range() 时调用 list() 。例如下面这样: list(range(5)) ,它将会返回 [0, 1, 2, 3, 4] 。有关列表的详细解释将会在 《数据结构》一章 呈现。

然后 for 循环就会在这一范围内展开递归—— for i in range(1,5) 等价于 for i in [1, 2, 3, 4] ,这个操作将依次将队列里的每个数字(或是对象)分配给 i ,一次一个,然后以 每个 i 的值执行语句块。在本例中,我们这一语句块所做的就是打印出这些值。 

同样要记住, else 部分是可选的。当循环中包含他时,它总会在 for 循环结束后开始执 行,除非程序遇到了 break 语句。

另一个需要注意的地方是 for...in 能在任何队列中工作。在这里,我们有的是通过内置的 range 函数生成的一串数字列表,但总体来说我们可以包含任何类型对象的队列!我们将会 在后面的章节详细解释这一观念。

 针对 C/C++/Java/C# 程序员的提示 

Python 中的 for 循环和 C/C++ 中的 for 循环可以说是完全不同。C# 程序员会注意 到 Python 中的 for 循环与 C# 中的 foreach 循环相似。Java 程序员则会注意到它同 样与 Java 1.5 中的 for (int i : IntArray) 无甚区别。 

C/C++ 中,如果你希望编写 for (int i = 0; i < 5; i++) ,那么在 Python 你只需要 写下 for i in range(0,5) 。正如你所看到的,Python 中的 for 循环将更加简单,更具表现力且更不容易出错。


break 语句

  break 语句用以中断(Break)循环语句,也就是中止循环语句的执行,即使循环条件没有 变更为 False ,或队列中的项目尚未完全迭代依旧如此。

 有一点需要尤其注意,如果你的 中断 了一个 for while 循环,任何相应循环中的 else 块都将不会被执行。

 案例(保存为 break.py ):

输出:

它是如何工作的 

在本程序中,我们重复地接受用户的输入内容并打印出每一次输入内容的长度。我们通过检 查用户输入的是否是 quit 这一特殊条件来判断是否应该终止程序。我们通过中断循环并转 进至程序末尾来结束这一程序。

输入字符串的长度可以通过内置的 len 函数来找到。

记住, break 语句同样可以适用于 for 循环。 

Swaroop 的诗意 Python 

我所使用的输入内容是一首我所写的小诗: 


continue 语句

continue 语句用以告诉 Python 跳过当前循环块中的剩余语句,并继续该循环的下一次迭代。

案例(保存为 continue.py ):

输出:

它是如何工作的 

在本程序中,我们接受来自用户的输入内容,但是只有在输入的字符串其长至少 3 字符我们 才会对其进行处理。为此,我们使用内置的 len 函数和来获取字符串的长度,如果其长度小 于 3,我们便通过使用 continue 语句跳过代码块中的其余语句。否则,循环中的剩余语句将 被执行,并在此处进行我们所希望的任何类型的处理。

要注意 continue 语句同样能用于 for 循环。


总结

我们已经了解了三种控制流语句—— if while for ——及其相关的 break continue 语句是如何工作的。这些语句是 Python 中一些最常用的部分,因此,习惯去使用 它们是必要的。 

接下来,我们将了解如何创建并使用函数。

下一篇专栏


简明Python教程·运算符与表达式&控制流的评论 (共 条)

分享到微博请遵守国家法律