程序流 Python 程序中常用的基本数据类型,包括:
自然的顺序是从页面或程序的顶端开始,然后从左往右读每一行。当达到行尾后,又是下一行的开始(或者叫做左端),依此类推,沿着页面(这里是指程序)往下走。 Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句。例如,清单 1 展示了几个简单的语句。当把它们键入 Python 解释器中(或者将它们保存在一个文件中,并作为一个 Python 程序来执行)时,读取语句的顺序是从左到右。 当读到一个行结束符(比如换行符)时,Python 解释器就前进到下一行并继续,直到没有了代码行。 清单 1. 一个简单的 Python 程序
在本例中,语句以简单的顺序一个接一个。但是情况并不总是线性的。考虑一个个人的例子。您今天早上醒来,听了交通或天气报告(或者两者都听了)。根据交通报告,您可能选择了一条不同的上班路线;或者类似地,根据天气报告,您为周末计划了不同的活动。您的对策并不简单;根据您所获得的信息,生活的自然顺序迂回而曲折。 Python 像大多数编程语言一样,通过使用流控制语句,也可以以这种方式操作。在 Python 中,有 3 种基本的流控制语句:
这个列表相当简单,并且您可能从其他编程语言认识了这些流控制语句。但是您可能在想,语句块 是什么意思呢。在清单 1 中,您看到了几个简单的语句,包括一个变量初始化、一个方法调用( Python 也具有复合语句,即相关语句形成的语句组,其中包括简单和(可能)附加的复杂语句。例如,根据表达式的值(对个人来说,可能是对“今天的天气晴朗吗”之类问题的答案),一个复合语句可能执行不同的操作或者对一个操作重复多次。这一描述似乎有些类似于前一段的流控制描述。当然应该类似,因为流控制语句就是复合语句。 一个复合语句包括一个流控制指令,后跟一个冒号( 清单 2. 一个伪代码例子展示了简单语句和复杂语句
该语法看起来既熟悉又陌生,并且两种感觉来自相同的事情:缩进。在列大纲或步骤时,您可能会使用不同级别的缩进来分隔每一项,使得列出来的东西更加清晰可读。Python 遵循这一模型,使用缩进来分隔代码块与程序的其余部分。其他编程语言使用特殊的字符来区分代码块,比如基于 C 的语言中的花括号( 另一方面,Python 需要缩进以指示代码块。如果没有正确地缩进,Python 解释器会抛出异常。可以使用制表符来标记缩进,但是一般推荐使用空格。(为了一致性,我总是使用 4 个空格来缩进代码块。)理由很简单:空格字符只有一种解释方式。另一方面,制表符可以有不同的解释方式,根据所使用的平台或工具,可以解释为 2 个、4 个、6 个甚至 8 个空格。 增强程序可读性缩进要求可能是 Python 的一个基本指导原则 —— Python 程序应该易于读和理解 —— 的最佳例子。但是这就跟工具一样,顽固分子也可能会编写晦涩的 Python 代码。例如,螺丝起子是用来起螺丝的,但是有时您也可能用来打开油漆盖子。 两个其他特性有助于编写易读的 Python 程序,并且这两者都遵循前面所用的书的比喻。首先,书中的行不会延伸到页面外面,都有固定的长度。其次,书中的行不是以特殊符号(比如分号)结束。这两个特性都贯穿于编写 Python 程序的过程中。 如果某个程序行太长,可以在文件中的下一物理行继续这一行。没有硬性规定一个代码行应该多长。但是一般限制为 80 个字符,这容易适合大多数显示器的一个打印页面。有几种方式来扩展超过一行的代码语句:
在 Python 中,不需要使用特殊字符(或符号)来指示语句的结束。这与有些语言不同。例如,基于 C 的语言使用分号( 清单 3 中演示了这两种技术。 清单 3. 演示 Python 的可读性技术
注意清单 3 中扩展到多个行的程序语句是如何缩进以改善可读性的。在本例中,缩进不是强制性的,就跟一个复合语句一样。但是正如您所见,缩进改善了程序的外观,因而强烈推荐进行缩进。
|
1 2 3 4 | if(expression one): # Action to take if expression one evaluates True else: # Action to take if all expression one evaluates False |
如果您使用过其他编程语言,那么该语法看起来可能既熟悉又陌生。相似之处在于 if
语句的一般格式、名称、用于确定如何分支语句执行流的表达式的计算,以及用于处理当表达式计算为 False
时的情况的 else
子句。但是有两个方面是完全特定于 Python 的:带有冒号字符的 if
和 else
语句的终止,以及 if
和 else
块中语句的缩进。正如所提到的,这两个特征是 Python 中流控制语句所必需的。
在清单 5 中,一个简单的 if/else 条件测试一个给定的数字是奇数还是偶数,并打印出结果。
if
语句例子1 2 3 4 5 6 7 | >>> i = 8 >>> if(i % 2): ... print 'Odd Number' ... else: ... print 'Even Number' ... Even Number |
一个似乎有些混乱的地方是 if
语句后面每一行前面的三个点(...
)。当键入 if
语句和终止的冒号,并按键盘上的回车键时,Python 解释器就知道您输入了一个复合语句。因此,它就将提示符从三个大于符号(>>>
)改为三个点(...
)。因为 Python 需要缩进以错开当表达式计算为 True
或 False
时应该执行的语句块,所以两个 print
语句都缩进了 4 个空格。
if
语句(以及本文后面讨论的 elif
子句和 while
循环)中的表达式可以很复杂。它可以包括多个使用 Python 中支持的不同关系运算符的子表达式。而子表达式又可使用 and
、or
和 not
逻辑运算符组合起来。本系列的第一篇文章“探索 Python,第 1 部分:Python 的内置数值类型”,包含更多关于布尔表达式和 Python 中不同关系和逻辑运算符的信息。
至此,已经看到了 if
语句可以如何用于根据一个特定布尔表达式的值,来执行两个程序语句块中的其中一个。然而在有些情况下,可能需要更多的选择。幸运的是,Python 提供了 if
语句的一个简单扩展。提供的解决方案非常简单:给 else
子句添加一个额外的 if
语句。结果是一个 else if
语句,简写为 elif
,如清单 6 所示。
elif
语句1 2 3 4 5 6 7 8 9 | >>> i = -8 >>> if(i > 0): ... print 'Positive Integer' ... elif(i < 0): ... print 'Negative Integer' ... else: ... print 'Zero' ... Negative Integer |
本例只包含一个 elif
语句,而实际中可根据程序需要包含任意多个。尽管它不是最优的解决方案,但是多个 elif
语句可以用于模拟其他一些语言中的 switch case
语句。
while
循环Python 中的第二种流控制语句是 while
循环,它在一个表达式计算为 True
时执行一个程序语句块。while
循环与 if
语句一样,支持一个可选的 else
子句,其中包含一个当表达式计算为 False
时执行的程序语句块。但是对于 while
循环,这意味着在循环终止后,else
子句中的代码被执行一次(参见清单 7 中的伪代码)。
while
循环的伪代码1 2 3 4 | while (expression): # statements to execute while loop expression is True else: # statements to execute when loop expression is False |
理解了 if
语句之后,while
循环理解起来就相当简单了。但是一定要知道,循环一直要执行到表达式计算为 False
。这意味着循环体中执行的程序语句必须要改变表达式的值,否则循环将无法结束。如清单 8 所示。
while
循环的一个简单例子1 2 3 4 5 6 7 | >>> i = 0 ; x = 10 >>> while(x > 0): ... i =1 ; x -= 1 ... else: ... print i, x ... 10 0 |
该例演示了几件事情。首先,它在一行中组合了变量初始化和变量修改:在本例中是 i
和 x
变量。其次,分别使用缩写形式的运算符 =
和 -=
来递增 i
的值和递减 x
的值。在本例中,循环开始时 x
的值为 10。每通过一次循环,x
的值就递减 1。最后,x
的值为 0,此时循环退出,并执行 else
子句中的代码,打印出两个变量的值。
while
循环(与本文后面介绍的 for
循环一样)支持三种附加语句:
continue
break
pass
continue
和 break
语句分别用于在 while
循环中继续下一次循环或中断循环。这两个语句通常放在 if
语句体中,以便由一个特殊的条件触发 continue 或 break 操作。break
语句的一个特殊特性是,它完全中断循环,并跳转到循环下面的任一个 else
子句。
pass
语句什么都不做。它用作一个占位符,即在需要一个语句,但是程序逻辑不需要操作时使用。清单 9 中演示了这三种语句。
continue
、break
和 pass
语句1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> i = 1 >>> while(i < 1000 ): ... i *= 5 ... if(i % 25): ... continue ... if not (i % 125): ... break ... if not (i % 1000): ... pass ... else: ... print i ... >>> print i 125 |
这个虚构的例子一直循环到变量 i
大于或等于 1,000。在循环中,将 i
乘以 5,然后测试 i
是否被 25 整除。记住,您只在表达式为 True
时执行 if
语句体。该表达式在当变量 i
不能被 25 整除时计算为 True。(在 Python 表达式中,非零数被计算为布尔值 True。)
循环体中的下一个语句是第二个 if
语句,它测试变量 i
是否能被 125 整除,但是该表达式前面加了一个 not
运算符。因此,当变量 i
的值能被 125 整除时执行第二个 if
语句体。此时,break
语句导致程序执行中断 while
循环,跳转到 else
子句。
最后一个 if
语句永远不会执行,只是用于演示如何在程序中编写 pass
语句。在后续文章中,将会介绍 pass
语句更相关的一些情况。
通过跟踪程序的逻辑流可以看到,第一次通过循环后,变量 i
的值变为 5。第一个 if
语句计算为 True
,因为 5 不能被 25 整除。这就会第二次进入 while
循环,这次变量 i
变成了 25。现在第一个 if
语句计算为 False
,因为 25 能被 25 整除。第二个和第三个 if
语句也计算为 False
,意味着第三次进入循环。这次变量 i
变成了 125,并且第一个 if
语句计算为 False
。
但是第二个 if
语句计算为 True
,因为变量 i
能被 125 整除(并且 not
运算符将结果 0 转换成布尔值 True)。这导致执行 break
语句,中断循环。else
子句永远不被执行,所以直到显式使用 print
语句之前不会输出任何东西。
for
循环Python 中的 for
循环很特殊,与 Python 编程语言中内置的容器数据类型紧密相关。当您在现实生活中有一个容器对象(比如书包)时,您通常想要看它所包含的东西。在编写 Python 程序时也是这样的。当需要对某件事情做一定的次数时(就像针对容器中的每一项一样),可使用 for
循环。清单 10 中的伪代码格式演示了 for
循环。
for
循环的伪代码1 2 3 4 | for item in container: # action to repeat for each item in the container else: # action to take once we have finished the loop. |
由于 Python 容器类型的丰富特性,for
循环非常强大。本质上,for
循环涉及到一个迭代器(iterator),用于在集合中逐项移动。本系列的下一篇文章将更加详细地介绍 for
循环,以及如何正确地将它与不同容器类型一起使用。
本文介绍了三种 Python 程序语句:if
语句、while
循环和 for
循环。这三种语句通过选择执行哪些语句,或者通过多次执行一组语句,让您可以改变程序流。在后续文章中将大量用到这些语句。复合语句的特性引入了 Python 程序中的适当缩进特性,这使得 Python 程序易于读和理解。
商务合作,请加微信:Fun-lying
|
来自: L罗乐 > 《Python编程知识》