《Python数据科学实践指南》——2.4 流程控制

2.4 流程控制

到目前为止,我们所编写的程序都是线性的程序,程序中的语句按照顺序依次被执行,这样的程序能实现的功能非常有限,而且还需要编写大量的代码,损失了编写程序执行任务的大部分优势。事实上,可以使用条件判断及循环这两种常用的方式更有效率地编写程序。

2.4.1 条件判断

带有条件判断的程序又称为“分支程序”,这样的程序由如三个部分构成。

这样的代码可以执行某些规则的比较,比如下面这段程序:

if sex == "man”:
   print("he")
else:
   print("her")

我们在性别分别为男或女时打印出不同的代词,当然也可以做数学运算,比如使用取模的方式x % 2 == 0来判断奇偶。还记得吗?“==”代表的是比较,求值之后的结果是布尔型的True或False,而“=”代表的是赋值,不要搞混这两个概念。

Python中另外一个重要的概念就是缩进。Python不像其他语言使用“;”或“{”、“}”来分割代码块,Python只使用一个缩进来区分语法块,比如上面代码中的第二行及第四行。虽然很多人对这种方式颇有微词,但是缩进处理的方法有一个好处,代码在视觉上和逻辑上的结构是完全一致的。比如下面这一段C代码:

if (friend_id != -1) {
if (m->friendlist[friend_id].status >= FRIEND_CONFIRMED)
   return FAERR_ALREADYSENT;
}

这段代码是完全正确的,但是读者能够很轻易地区分出这段代码中的两个if是在同一个逻辑层级还是在不同的逻辑层级上。在Python中正确的缩进应该是像下面这样的:

if (friend_id != -1) {
   if (m->friendlist[friend_id].status >= FRIEND_CONFIRMED)
      return FAERR_ALREADYSENT;
}

这样阅读代码的时候逻辑确实更加清晰了。除了简单的if...else...语句之外,还有一个关键字“elif”,这个关键字是“else if”的缩写,我们可以写一个更加复杂的条件判断语句:

if x % 2 == 0:
   if x % 3 == 0:
      print "2和3的最小公倍数"
elif x % 3 == 0:
   print "可以被3整除却不可以被2整除的数"
else:
   print 0

在上面的程序中,elif语句的后面还可以写一个条件判断语句。需要注意的一点是,若elif语句之前的某个if或elif语句不成立, 就不会继续执行下去了,所以条件判断的顺序很重要。

虽然条件判断语句增强了我们编写程序的能力,但还有一个大问题需要解决,那就是如何让电脑任劳任怨地做我们为其安排的工作,这将会涉及2.2.2节将要介绍的流程控制方法。

2.4.2 循环

Python中的循环分为两种,让我们先从读者可能比较熟悉的while循环说起。与条件判断语句类似,while循环也是由条件判断语句和代码块构成的,示例代码如下:

x = 5
iters = 10
ans = 0
while iters > 0:
    ans = ans + x
    iters -= 1
print ans

上面的代码是计算5 * 10这个语句的复杂写法,先不要纠结这些细节,让我们来看看while循环需要哪些东西。这段程序的本质是将10个5加起来,所以需要循环10次,这一点可以从iters这个变量中确认,而变量ans则用于存储相加的总和。iters > 0是条件判断语句,当这个语句的结果为False时,这个循环就会终止。而程序块中一定要有一个语句用于减少iters的值,即iters -= 1这个语句,以保证循环最终会停止。我们可以在纸上手工计算这个程序,每一次迭代之后ans的值应该是:5,10,15,20,25,30,35,40,45,50。

如果忘记了增加iters -= 1会怎么样呢?结果就是这个程序永远都不会终止,直到整数溢出错误发生,所以请一定要多加注意。

Python的第二个循环方式是for循环,与其他编程语言一样,for循环是一种比while更简便的表达方式。虽然用while循环可以实现所有的循环,但是如果类似iters -= 1这样的语句忘记写了,或者写错了,就会发生死循环。而for循环在很多时候都能避免此类的情况发生,因为for循环实现的出发点就是循环次数是已知的。下面来看一个计算乘法的for循环版本:

x = 5
ans = 0
for iters in range(10):
    ans = ans + x
print ans

这个程序中range()函数可以生成一个数列,遵循左闭右开的规则从0至9,让我们使用for循环打印出来查看一下:

>>> for iters in range(10):
...     print iters
...
0
1
2
3
4
5
6
7
8
9
>>>

在for循环中,in后面一定是一个序列,然后在每一次循环中序列中的值都会依次赋值给iters,直到序列的最后一个值循环终止时为止。与序列的分片一样,range可以传入start、end、step三个参数,比如:

>>> for iters in range(5, 50, 5):
...     print iters
...
5
10
15
20
25
30
35
40
45
>>>

上面的程序会生成一个从5起始,到50终止,步长为5的序列。如果要生成的序列过长,可以使用xrange()函数代替range()函数,xrange()函数是range()函数的生成器版本,可以在序列很长的时候节约内存。

与其他语言一样,Python的两种循环都支持continue和break语句,比如:

>>> x = 1
>>> ans = 0
>>> for iters in range(100):
...     ans = ans + x
...     if ans % 3 == 0:
...         continue
...     if ans >= 10:
...         break
...     print(ans)
...
1
2
4
5
7
8
>>>

在上面的程序中,第一个if中的continue会在ans能在被3整除的时候跳过当前这个循环,所以可以发现在输出结果中3、6和9不见了。而第二个if语句在使用break语句时如果ans大于10就会跳过整个循环程序块,即使循环次数没有达到100次也会跳出。

2.4.3 缩进、空白和注释

Python中不需要用“;”和“{}”来对代码块进行分割,而是使用缩进来进行分割。有些初学者在使用文本编辑器时往往没有注意空格缩进与tab的区别,导致程序执行出错,这是需要注意的。而且一旦决定分隔符的空格数就要一直使用相同的空格数作为缩进,通常来说,Python官方建议使用4个空格作为分隔符。不幸的是,Sublime Text 3的默认分割符是tab,读者可以尝试在Performance>Settings-User打开的文件中插入两行,以确保换行之后自动插入4个空格的缩进:

{
"tab_size": 4,
"translate_tabs_to_spaces": true
}

在Python中,空白行是没有任何意义的,用来保证美观即可。通常来说,逻辑上无关的程序块之间需要用两个空行进行分割。注释同样没有意义,通常以“#”开头。多行注释可以用来进行大段的描述,使用三引号进行表达,下面就列出几种常见的Python注释。

单行注释:

# Make sure the instance knows which cache to remove itself from.

多行注释:

"""A blocking HTTP client.

This interface is provided for convenience and testing; most applications
that are running an IOLoop will want to use `AsyncHTTPClient` instead.
Typical usage looks like this::
时间: 2024-11-05 06:12:39

《Python数据科学实践指南》——2.4 流程控制的相关文章

《Python数据科学实践指南》一2.4 流程控制

2.4 流程控制 到目前为止,我们所编写的程序都是线性的程序,程序中的语句按照顺序依次被执行,这样的程序能实现的功能非常有限,而且还需要编写大量的代码,损失了编写程序执行任务的大部分优势.事实上,可以使用条件判断及循环这两种常用的方式更有效率地编写程序. 2.4.1 条件判断 带有条件判断的程序又称为"分支程序",这样的程序由如三个部分构成. 一个条件判断,对一个表达式求值,结果是True或False. 一个代码块,如果条件判断为True,则执行这部分代码. 一个可选的代码块,如果条件

《Python数据科学实践指南》——导读

前 言 为什么要写这本书 我接触大数据技术的时间算是比较早的,四五年前当大数据这个词火遍互联网的时候,我就已经在实验室里学习编程及算法的知识.那个时候我一心想要做学术,每天阅读大量的英文文献,主要兴趣更多的是在机器人和人工智能上.研究生毕业时我本来想实现早先的愿望,继续攻读博士学位,不过思来想去觉得不应该错过大数据这个机会,所以毅然决定投入大数据行业中. 在工作之初,市面上已经存在一些介绍大数据相关技术的权威著作,其中很多还是很底层的或特定领域的专著.但即使是我这种自诩为"学院派"的人

《Python数据科学实践指南》一导读

前言 为什么要写这本书 我接触大数据技术的时间算是比较早的,四五年前当大数据这个词火遍互联网的时候,我就已经在实验室里学习编程及算法的知识.那个时候我一心想要做学术,每天阅读大量的英文文献,主要兴趣更多的是在机器人和人工智能上.研究生毕业时我本来想实现早先的愿望,继续攻读博士学位,不过思来想去觉得不应该错过大数据这个机会,所以毅然决定投入大数据行业中. 在工作之初,市面上已经存在一些介绍大数据相关技术的权威著作,其中很多还是很底层的或特定领域的专著.但即使是我这种自诩为"学院派"的人看

《Python数据科学实践指南》——0.1节何谓数据科学

0.1 何谓数据科学 在家用计算机普及之前,数学.逻辑学.哲学及自然科学研究的目的都是为了追求完美的理论证明,或者是提供某种确定性的规则,用以解释某种自然现象,或者为某些技术提供理论依据.那个时候人类产生数据的能力和收集数据的能力还很有限,或许公司的经营账目和计算导弹发射弹道的演算纸就属于数据最集中的地方了.在那个年代,这些数据分析和处理的工作大都是由人工完成的,最多也只会借助某些由机械或电子构成的计算装置罢了.在互联网兴起之后,人类将现实世界中的很多信息以数据的形式存储到网络空间中,比如生活中

《Python数据科学实践指南》——第0章 发现、出发 0.1 何谓数据科学

第0章 发现.出发 最近一年里,知乎社区有不少朋友邀请我回答关于数据挖掘的问题,其中提问最多的是关于"如何改行做数据挖掘".我想他们之所以邀请我回答这类问题,不是因为我做数据挖掘做得好,而是好奇我是如何改行做数据挖掘的?说来也巧,我本科是学电子的,研究生是学控制的,而我的职业理想是成为一个"先知",但我并不知道如何才能实现这一职业理想.自公元632年人类最后一位先知默罕默德去世之后,将近1400年没人做先知了,既没有人可以指导我,也没有可以效仿的对象.2011年到2

《Python数据科学实践指南》——0.3 为什么是Python

0.3 为什么是Python 通过书名,各位读者就应该知道这是一本讲解Python编程的书了.数据科学只是个引子,我希望能通过相关的例子和练习激发出读者的兴趣,帮助读者除掉编程这条拦路虎.在很多非计算机相关专业的人的概念里,编程是要归为玄学分类的,通过一堆意义不明的符号就能驱动计算机完成各种各样的任务,是不是有点像魔法师口中所念的咒语.但事实上,计算机只能做两件事情,执行计算并记录结果,只不过它的这两项能力远远超过人类大脑的能力(读者可能看过一些文章,其中有些研究声称尝试估算过人类大脑的计算能力

《Python数据科学实践指南》一第0章 发现、出发

第0章 发现.出发 最近一年里,知乎社区有不少朋友邀请我回答关于数据挖掘的问题,其中提问最多的是关于"如何改行做数据挖掘".我想他们之所以邀请我回答这类问题,不是因为我做数据挖掘做得好,而是好奇我是如何改行做数据挖掘的?说来也巧,我本科是学电子的,研究生是学控制的,而我的职业理想是成为一个"先知",但我并不知道如何才能实现这一职业理想.自公元632年人类最后一位先知默罕默德去世之后,将近1400年没人做先知了,既没有人可以指导我,也没有可以效仿的对象.2011年到2

《Python数据科学实践指南》一0.3 为什么是Python

0.3 为什么是Python 通过书名,各位读者就应该知道这是一本讲解Python编程的书了.数据科学只是个引子,我希望能通过相关的例子和练习激发出读者的兴趣,帮助读者除掉编程这条拦路虎.在很多非计算机相关专业的人的概念里,编程是要归为玄学分类的,通过一堆意义不明的符号就能驱动计算机完成各种各样的任务,是不是有点像魔法师口中所念的咒语.但事实上,计算机只能做两件事情,执行计算并记录结果,只不过它的这两项能力远远超过人类大脑的能力(读者可能看过一些文章,其中有些研究声称尝试估算过人类大脑的计算能力

《Python数据科学实践指南》一 第2章 Python基础知识

第2章 Python基础知识 为了开启我们的数据科学之旅,本章会进行一些基础的编程训练.第1章中已经搭建好了Python的运行环境,读者应该已经能够在Python shell中执行简单的打印和四则运算了.接下来我们要完整地学习一遍构成一个Python程序的基本要素. 2.1 应当掌握的基础知识 本节会介绍一些学习Python前应当掌握的基础知识,这一部分内容在所有的编程语言学习中基本上都是类似的,Python当然也遵守这些通用的规则,熟悉这些内容的读者可以跳过这一节. 2.1.1 基础数据类型