![Python高效开发实战:Django、Tornado、Flask、Twisted(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/40795109/b_40795109.jpg)
1.3 流程控制
流程控制语句用来对程序流程的选择、循环和返回等进行控制。Python中主要的流程控制语句包括if(判断)、for(循环)、break(跳出)、continue(继续)等。
1.3.1 程序块与作用域
在大多数高级语言中,程序块与作用域有不同的概念。
• 程序块是一种程序结构形式,使程序变得清晰,便于阅读和修改。如C、C++中允许程序员按照自己的习惯在不同的行之间采取任意对齐方式。
• 作用域是按变量或函数的可见性定义的程序子集。如果某个符号的名称在给定执行点是可见的,则称该符号在作用域内。如在C、C++中用大括号“{ }”表示作用域。
Python将两个概念进行了结合,用一种表达方式(即缩进)同时表达程序块和作用域的概念,即相同缩进范围内的代码在一个程序块和作用域中,且同一程序块和作用域中不能有不同的缩进。Python中用冒号“:”作为程序块标记关键字。比如,Python中可以有这样的代码:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/056-1.jpg?sign=1738896923-M0UenAleUKm6fy2I2M0yapVUnS7UQb38-0-0fdd07b341169370872a8b57eb82fbcb)
上述代码在if块中分两行打印了两个单词,该块中的两条语句有相同的缩进。
下面的代码因为在if块中出现了两个不同缩进的语句行,所以不符合Python的语法规则(执行时Python解释器会报错):
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/056-2.jpg?sign=1738896923-LIuBACYdBjOwu7f4hAdMheMoW8nXG1v7-0-d36d51c233ebcb1416f031521625d2db)
注意:每个用冒号“:”标记的程序块内的代码必须有相同的缩进。
在C、C++、Java等语言中允许定义空作用域,即在作用域中不写任何代码,达到使作用域什么也不做的目的。由于在Python中使用缩进自动表示作用域,因此作用域中必须要写入一行以上的代码。在Python中使用语句pass来定义作用域,但不执行任何动作。
【示例1-19】如下程序定义了if语句块,但不做任何操作:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/057-1.jpg?sign=1738896923-ImGpRWywaK4pqTBusUbvGXy9im9v3fCP-0-9747e919d32152537e281be183961a25)
技巧:pass语句用于“需要写代码,但实际什么也不做”的场合。
1.3.2 判断语句
条件判断是依据指定的变量或表达式的结果,决定后续运行的程序,最常用的是if-else指令,可以根据指定条件是否成立来决定后续的程序。也可以组合多个if-else指令进行较复杂的条件判断。
Python中的if语句有如下3种语法形式。
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/057-2.jpg?sign=1738896923-MRts6LDIt7bT52ykcy4soGIO38D1vYnE-0-2229136d87bfb6be54023727fd60bf42)
或者
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/057-3.jpg?sign=1738896923-4B71yJFocci96vroYtg7VTXGx3lD5cJN-0-3d424f8562b049a653609fd835a01062)
或者
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/057-4.jpg?sign=1738896923-rWZQwllgEUwFdUauR0vrHcX8me1esHMP-0-107c9811de53e46deee96946d81ca0be)
【示例1-20】如下程序可演示if语句的使用方法:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/058-1.jpg?sign=1738896923-0D1N5TtaRRNQu4E1t64AnWDmTBAaFLMv-0-a9095e1dd445519d64b48ed94009acff)
这是一段根据控制台输入数字的参数判断数值大小的程序,对其解析如下。
• 定义了变量param的初始值为空(None),该变量用于在之后保存输入参数。
• 第1个if语句判断控制台是否有参数输入,如果有,则将第1个参数转换为int类型并放入param变量中。
• sys.argv是一个系统tuple变量,Python解释器在运行Python程序时将命令行参数传入sys.argv中。sys.argv中的第1个值(索引为0)是Python程序名,从第2个(索引为1)开始的其他元素为字符串类型的控制台输入参数。
• 表达式int(sys.argv[1]) 将第1个输入参数从字符串类型转换为整型。
• 第2个if语句是一个多条件判断语句:首先判断param变量是否被设置,如果没有被设置,则通过两条print语句输出警告;通过两个elif语句判断另外两个条件并进行输出;通过else执行默认语句。
技巧:每个if、elif、else块中都可以放入多条语句。
将如上代码保存为if.py文件,在控制台中调用该程序的执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/058-2.jpg?sign=1738896923-ou9OEXOczCWF0uso924QzQGtPwinHFxw-0-46d6a02c2e27af8cb91b75238c2607e6)
1.3.3 循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中需要重复执行某些语句,而能否继续重复则取决于循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序叫作循环体。循环语句由循环体及循环的终止条件两部分组成。Python中的循环语句有两种形式:while语句和for语句。
1. while语句
while语句的语法为:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/059-1.jpg?sign=1738896923-LL6b6WsOifDVAW9qYgiYamtuCpiPsxNr-0-92da5531b251326a6beeaf5a410f214b)
其语意为:判断expression表达式,如果该表达式为真,则执行repeat_block并再次判断expression,直到expression返回假为止。
【示例1-21】while语句代码演示如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/059-2.jpg?sign=1738896923-SyMML8YgBvVCP7q2tCUNSWkc5sGFBbDH-0-2fae33877ba683664e102580f3fa30f9)
如上代码逐个输出myList列表中的内容,直到列表长度为0,即不满足条件len(myList) > 0。将其保存为文件while.py,执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/059-3.jpg?sign=1738896923-qZDK2QGV1E5DuDxbUPOuGuKPQhJpwVtv-0-157af40ab318660f6e8b7ae19fcafc7e)
注意:循环语句要防止死循环,如果while语句中的expression一直为真,则程序永远无法退出repeat_block的执行。
2. for语句
Python中的for语句类似于C#、Java中的foreach语句,语法为:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/060-2.jpg?sign=1738896923-pCtfPIvThIFOFiOwbHBDHjYCl82x0QXl-0-b445809ec971189fdb239b46456f72d7)
其中for和in是关键字,语意为:针对iterable中的每个元素都执行repeat_block,在repeat_block中可以用element变量名来访问当前的元素。iterable可以是任意Sequence类型、集合或迭代器等。
【示例1-22】for语句代码演示如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/060-3.jpg?sign=1738896923-I0WIxngHS82s2CB2qzqmD5aVckDdqsF0-0-3800a2eae80e852eeca54f2dad2e8a39)
如上代码逐个输出myList列表中的内容。将其保存为文件for.py,执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/060-4.jpg?sign=1738896923-UPVfFkF0zECB4KWQc1cl6WeEHPOHnX1B-0-a166f7701f0398e8a5aec89c0f2494b9)
3. break及continue语句
开发逻辑较复杂的程序时,在while或for循环语句的循环体中,有时需要提前结束循环,或者在本轮循环体尚未结束时提前开始下一轮循环,这就需要用到break及continue语句。
【示例1-23】break及continue语句代码演示如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/060-5.jpg?sign=1738896923-Z3wpsjy2hxotEwxzHOQrLUBvQRSIvdxg-0-4bfd2e4a3a40e2ffb7828d482bff23c7)
上述代码一直提示让用户输入字符串“quit”,如果用户输入不正确则让用户再次输入,直到输入正确为止;并且每输错3次就提示用户“Please input quit!”。解析如下。
• 变量count用于对循环体计数,程序主体由while循环体构成。
• raw_input()函数获得客户端输入,raw_input的参数是提示用户输入的字符串。
• 用if语句判断输入是否正确,如果正确则用break语句退出循环。
• 用if语句判断本次输入是否是3的整数倍,如果不是则用continue语句继续循环。
将代码保存为break.py,程序运行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/061-2.jpg?sign=1738896923-MC9g2WCEjBixGmMb23iK3v2G5EwIdWrS-0-e82a754c9f16636470dd94b2add19d52)
技巧:raw_input()函数用于获取控制台输入。
1.3.4 语句嵌套
和其他高级语言一样,Python允许if、while、for等语句的嵌套使用。
【示例1-24】如下是用Python实现排序算法的代码:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/061-3.jpg?sign=1738896923-pdiZDXj3qapSmBdH7stMhqU19tadpi4y-0-4af327acd034f563d65902850b181254)
在代码中实现了两层循环,在if语句的执行体中用到了交换运算符:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/062-2.jpg?sign=1738896923-vGIZKo6pZhGdItO3WXcQ7Oe7MZtnBgwF-0-cf6912d6e002389f833aab367f59d3ce)
交换运算符可直接交换两个变量的内容,而无须用到中间变量。把代码保存为loop.py,执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/062-3.jpg?sign=1738896923-BhdYQh7ycpAkHHn5NKYxCbPlbpcGXpPe-0-8775681fdc83820e93d8327e2471ca84)
技巧:用交换运算符可以直接交换变量的值。