《树莓派Python编程指南》——3.3 控制程序流程

3.3 控制程序流程

while循环是一种最简单的循环。只要结果是布尔类型的任何语句都可以做它的判断条件,它将会持续循环到条件为假。如果条件始终为真,它将一直循环下去。例如:

但愿你还记得第2章的循环体。在条件后面要加上冒号,接下来的一行要有缩进,所有缩进部分都属于循环体。要在Python解释器中运行这段代码,输入print语句之后要按回车键(Enter)。用退格键(backspace)删掉自动产生的tab(缩进),然后再按回车键。这是告诉Python循环体结束了,你需要执行这段代码。
这段代码会陷入死循环,按Ctrl+C组合键可以终止它。
无论判断条件选择的多么复杂都可以,只要它的返回值是真或假就可以了。但为了最终能够跳出循环,通常需要一个或多个变量以方便在循环内部改变判断条件。比如说,下面这个猜数字游戏中的主循环。

注意,如果输入非数字的字符,这个程序将报错。后面我们会介绍如何简单地修复这个问题,但让我们先来看一下另一种循环。
3.3.1 用循环遍历数据
for循环可以用来遍历数据,它在每次循环中对一个数据进行处理。通常我们在rang(x, y)的帮助下,遍历从x到y的每一个数据。例如,你可以得出一个12倍表:

rang()还有一个参数,可以设定两个连续数字之间的间隔。例如我们把range(1,13)改成range(2,14,2),它将会只计算从2到14的所有偶数。我们还可以使用其他线性数据类型(包括字符串)和集合来控制for循环。下列例子都是合法的:

最后一行是一个很好的例子,它展示了使用错误的数据类型会有什么结果。集合和其他类型有点不一样,因为它没有顺序,只是一堆数据的集合。下面两个例子的执行结果是一样的。

字典有点特别,因为它保存的不是元素,而是键值对。for循环中可以使用它,但必须做些特殊处理:

使用集合,你就不能控制循环中访问数据的顺序。实际上,如果你期望用for循环顺序访问数据,则需要使用线性数据结构,如列表或元组,而不是使用像集合或字典这样的无序数据结构。
3.3.2 深入理解循环嵌套
编程时经常需要同时遍历多种数据,比如下面这个用来找出1到30之间所有素数的程序。

请注意缩进级别,第一个循环体的缩进为一,第二个循环体的缩进为二。这一点非常重要,只有这样,Python才能理解哪个代码属于哪个循环体,以及每个循环体在何处结束。
使用嵌套时要注意,它可能会使程序变慢。上面的例子运行得很快,但如果你试图计算3000以内的素数(只需要在第一行的30后面加两个零),程序运行就会花非常长的时间。不只是因为外层循环要多循环上千次,每次走进内层循环也需要多执行很多次。你会发现整个程序运行起来很慢(如果你在做这个实验,记得按Ctrl+C组合键可以停止它)。幸运的是,我们还可以改进它。试一下这个程序:

首先,使用range(1, 3000, 2)跳过所有的偶数。我们直接省去一半时间。其次,你可能注意到了,在if里面我们多加了一个break。这会让我们节约更多时间。我们是在计算素数,因此不用关心每个数的所有约数。一旦发现这个数字是非素数,就可以直接使用break跳出循环,继续执行下面一行(if is_prime:)。这两点优化可以使程序运行得更快。
3.3.3 使用if语句控制程序分支
不仅可以使用循环来不断执行某段代码,还可以使用分支来控制Python程序流,使其根据不同条件,执行不同的代码。分支由if语句实现。我们已经见过很多次if语句,现在来复习一下。if语句,像while循环一样,只需要一个布尔类型的条件。它后面还可以有附加语句如elif(else-if)和else语句。例如:

一个if语句最多只执行一段代码,只要Python发现条件为真,就执行该段代码并结束整个if语句。因此如果在上面的程序中输入10,它将只返回该数字可以被2整除,而不会试下该数字能否被5整除(如果你期望它试一下,就需要写一个新的if语句而不是用elif)。如果没有一个条件为真,则执行else后面的代码段。在其他例子中可以看到,if语句可以不带elif或else。如果没有else语句,同时判断条件也不成立,Python就会跳过if语句,不执行其中的任何代码。
3.3.4 捕获异常
如果你喜欢尝试,在前面的例子中试图输入过非数字的字符,就会发现程序会报错。这是因为Python不能把任意字符转换成数字,它不知道该怎么做了。此时,Python就会报出错误。目前为止,我们只是放任它这么做,然后,就会导致程序崩溃。
然而,如果你知道某段代码可能会报出异常,可以告诉Python,这样程序就知道遇到问题时该如何处理。可以参考下面代码:

你可以告诉Python要处理的错误类型,因为Python在异常时会输出错误类型。如:

可以看到,这是个ValueError(值错误)。因此前一个例子可以改成:

练习2
试着使用try语句来捕获由于用户输入错误导致的异常,修复本章开始的猜数字游戏。

时间: 2024-10-23 06:59:14

《树莓派Python编程指南》——3.3 控制程序流程的相关文章

《树莓派Python编程指南》——第3章 Python基础3.1 变量、值和类型

本节书摘来自华章计算机<树莓派Python编程指南>一书中的第3章,第3.1节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问"华章计算机"公众号查看. 第3章 Python基础 在前面章节中,我们直接深入Python程序中,希望能够给你一个概念--什么是Python.但你还不清楚它具体是如何工作的.本章中,我们将回答这些问题,并详细介绍如何在Python中创建自己的程序.在后继的章节中,我们将分别介绍Python的不同特性,帮助你为树

《树莓派Python编程指南》—— 导读

前 言 计算机已经不再只是用来工作的方盒子.任何拥有一个可编程处理中心的东西都可以称作计算机.游戏终端.智能手机.全球卫星定位系统(GPS)单元.平板电脑以及其他许多令人难以置信的设备都说明了这一点.它们都是计算机,并且它们已经接管了这个世界.我们用它们来工作.通信,以及娱乐.事实上,很难找到有哪个领域还从未使用过计算机. 销售人员喜欢用智能来描述嵌入式计算机设备(智能手机.智能电视.智能手表等),事实上它们却并不智能.处理单元只是块执行指令的硅片.智能手机的"智能"并非来自计算机芯片

《树莓派Python编程指南》——第2章 Python简介2.1 使用Turtles绘画

第2章 Python简介 本章通过一些代码示例来逐步介绍Python.你不必了解这些代码的所有细节,本章只是带你领略下编程的感觉.你将会学到如何在屏幕上绘画,甚至如何编写简单的游戏.同时,你将会学到一些编程的基本概念.如果无法完全理解本章中的程序,不用担心,我们会在后面章节中做详细介绍. 2.1 使用Turtles绘画 是时候开始编程了!我们强烈建议你将代码一行行输入IDLE3,这样可以帮助你理解每行都做了什么事情.言归正传,打开IDLE3,点击File→New Window,然后输入: 然后点

《树莓派Python编程指南》—— 1.3 树莓派快速指南

1.3 树莓派快速指南 本书主要面向编程方向,而不是介绍如何使用树莓派.因此我们不会过多地介绍树莓派.但你会从中了解到树莓派是如何工作的. 有不少操作系统可以运行在树莓派上,本书的命令都是基于Raspbian的(一个树莓派默认的操作系统),也是初学者最好的选择.如果有Linux的使用经验,可以选择Arch或者Fedora.选择了其他系统,就需要将本书的apt-get命令转换为相应系统的命令以完成软件包管理. 在树莓派上安装Raspbian的最简便方法是使用NOOBS,可以从www.raspber

《树莓派Python编程指南》——2.3 小结

2.3 小结 我们的Python快速导览到此为止.希望这些程序能够帮助你理解它.不用担心无法百分之百地理解全部内容,我们会在第3章比较详细地介绍Python的其他部分.无论如何,还是希望你能理解下列几个方面: Python程序由一系列命令组成并从上到下执行. 可以通过循环和if语句控制程序的执行顺序. 不必事必躬亲,通过导入模块,使用模块中的方法可以完成许多工作. 函数可以帮助重用代码,也可以使程序变得易于理解和维护. 变量可以存储信息以便后面使用. 在Python中画一朵花或者写个游戏非常容易

《树莓派Python编程指南》——第1章 起航(启动和运行)1.1 组装好你的树莓派

第1章 起航(启动和运行) 欢迎阅读本书.本书从三维图像.游戏编程到控制电子学,再到推文,会让你学到如何解放这个小计算机的全部能量.你将会看到掩藏在表象之下的内部世界,并学会如何创建程序以发挥这台小计算机的全部特性. 1.1 组装好你的树莓派 为跟进本书,你需要一些设备: 树莓派 USB键盘 USB鼠标 SD卡 显示器 电源 还有一些有用的可选设备: 有源USB集线器(强烈推荐) 摄像头模块 USB网络摄像头 USB 无线网络(WiFi)适配器 本书中的所有内容都可以在A版树莓派上完成.从编程角

《树莓派Python编程指南》——1.5 小结

1.5 小结 读完本章,你应该理解以下内容: 你需要一些额外的硬件以更好地利用树莓派. 供电不足是最常见的问题. 遇到问题时,最好从dmesg和syslog开始查找原因. Raspbian使用LXDE桌面环境. 终端是和底层操作系统最有效的沟通方式. raspi-config可以用来配置树莓派. apt-get可以用来安装新软件. Python可以通过shell交互或者文本程序运行.

《树莓派Python编程指南》——3.7 使用模块获得附加特性

3.7 使用模块获得附加特性 到目前为止,你已经见过import很多次了,但我们并没有解释它们究竟做些了什么.事实上,非常简单,import只是将Python代码从另外一个文件中转移到当前程序中.如果你创建一个名为module_example.py的文件,并写入下面这行: "https://yqfile.alicdn.com/bb0434e3017edf295f99b6c75aa533f85a84ee8a.png " > 将其保存在你的home目录(对于默认用户就是/home/p

《树莓派Python编程指南》——3.2 在结构体中存储值

3.2 在结构体中存储值 除了简单数据类型,Python还允许我们将数据用不同方式组合起来创建结构体.最简单的结构体是sequences(线性结构).它将信息一个接一个地存储起来.它分为有两类:lists(列表)和tuples(元组).多数情况下,它们是相似的. 来看接下来的例子: 我们用方括号将数字括起来构成列表,用圆括号将数字括起来构成元组.到现在为止,它们两个工作起来都是一致的.在结构体名后面跟方括号,方括号中填下标就可以访问单个元素.注意下标从0开始,因此list_1[0]和tuple_