python 分支程序

377 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

python 分支程序

到目前为止,我们一直在研究的计算类型被称为直线程序。它们按照语句出现的顺序执行一个接一个的语句,并在语句用完时停止。我们可以用直线程序描述的计算类型并不是很有趣。事实上,他们非常无聊。

分支程序更有趣。最简单的分支语句是条件语句。如图 2-5 中的框所示,条件语句包含三个部分:

• 测试,即计算结果为 True 或 False 的表达式。

如果测试的计算结果为 True ,则执行的代码块。

一个可选的代码块,如果测试的计算结果为 False,则执行该代码块

执行条件语句后,将在语句后面的代码处恢复执行。

image.png

在 Python 中,条件语句具有以下形式 if 布尔表达式:

image.png

在描述Python语句的形式时,我们使用斜体来标识程序中该点可能发生的代码类型。例如,布尔表达式指示任何计算结果为 True 或 False 的表达式都可以跟在保留字 if 之后,代码块指示任何 Python 语句序列都可以跟在 else: 之后。

请考虑以下程序,如果变量 x 的值为偶数,则打印“偶数”,否则打印“奇数”:

image.png

当 x 除以 2 的余数为 o 时,表达式 x2 == o 的计算结果为 True,否则为 False。请记住,== 用于比较,因为 = 是为赋值保留的。

缩进在 Python 中具有语义意义。例如,如果上述代码中的最后一个语句缩进,则将是与 else 关联的代码块的一部分,而不是条件语句后面的代码块。

Python以这种方式使用缩进是不寻常的。大多数其他编程语言使用括号符号来描绘代码块,例如,C将块括在集合大括号()中。Python方法的一个优点是,它确保程序的视觉结构是其语义结构的准确表示。因为缩进在语义上很重要,所以线条的概念也很重要。太长而无法轻松阅读的一行代码可以通过在屏幕上以反斜杠 (V) 结束屏幕上的每一行(最后一行除外)来拆分为多行。例如,

image.png

长线也可以使用Python的隐含线延续来换行。这是通过括号完成的,即括号,方括号和大括号。例如

image.png

被解释为两行(因此产生“意外缩进”语法错误,而

image.png

由于括号,被解释为一行。许多Python程序员更喜欢使用隐含的行延续而不是使用反斜杠。最常见的是,程序员在逗号或运算符处换长行。

返回到条件语句,当条件的 true 块或 false 块包含另一个条件时,条件语句称为嵌套。下面的代码在顶级 if 语句的两个分支中包含嵌套条件。

image.png

image.png

在条件测试中使用复合布尔表达式通常很方便,例如,

image.png

手指练习:编写一个程序,检查三个变量 - x,y和z-,并打印其中最大的奇数。如果它们都不是奇数,则应打印三个值中的最小值。

您可以通过多种方式攻击此练习。有八个单独的案例需要考虑:它们都是奇数(一个案例),正好两个是奇数(三个案例),恰好一个是奇数(三个案例),或者它们都不是奇数(一个案例)。因此,一个简单的解决方案将涉及八个if语句的序列,每个语句都有一个打印语句:

image.png

这可以完成工作,但相当麻烦。它不仅是16行代码,而且变量反复测试奇怪。以下代码既更优雅,也更高效:

image.png

该代码基于通用编程范例。它首先为变量分配一个临时值(答案),在适当的时候更新它,然后打印变量的最终值。请注意,它测试每个变量是否正好是奇数一次,并且只包含一个 print 语句。这段代码几乎是我们可以做的,因为任何正确的程序都必须检查每个变量的奇数,并比较奇数变量的值以找到其中最大的变量。

Python支持条件表达式以及条件语句。条件表达式的格式为

image.png

如果条件的计算结果为 True,则整个表达式的值为 expri;否则就是 expr2。例如,

image.png

将 x 设置为 y 和 z 的最大值。条件表达式可以出现在普通表达式可以出现的任何位置,包括在条件表达式中。例如,

image.png

打印 x、y 和 z 的最大值。

条件允许我们编写比直线程序更有趣的程序,但是分支程序的类仍然非常有限。考虑一类程序的强大功能的一种方法是它们需要多长时间才能运行。假定每行代码需要一个单位的时间来执行。如果直线程序有n行代码,它需要n个单位的时间来运行。具有 n 行代码的分支程序呢?运行时间可能少于 n 个单位,但不能花费更多,因为每行代码最多执行一次。

最大运行时间受程序长度限制的程序称为以恒定时间运行。这并不意味着每次运行程序时,它都会执行相同数量的步骤。这意味着存在一个常量 k,因此程序保证运行不超过 k 个步骤。这意味着运行时间不会随着程序输入的大小而增长。

恒定时间程序在它们能做的事情上是有限的。考虑编写一个程序来计算选举中的选票。如果一个人能够编写一个程序,可以在一个独立于投票数的时间内做到这一点,那将是真正令人惊讶的。事实上,这是不可能的。研究问题的内在难度是计算复杂性的主题。我们将在本书中多次回到这个话题。

幸运的是,我们只需要一个编程语言结构,迭代,就可以编写任意复杂的程序。我们将在第 2.5 节中介绍这一点。