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

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

本节书摘来自华章出版社《Python数据科学实践指南》一书中的第2章,第2.4节,纪路 著,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 流程控制

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

2.4.1 条件判断

带有条件判断的程序又称为“分支程序”,这样的程序由如三个部分构成。
一个条件判断,对一个表达式求值,结果是True或False。
一个代码块,如果条件判断为True,则执行这部分代码。
一个可选的代码块,如果条件判断为False,则执行这部分的代码。
这样的代码可以执行某些规则的比较,比如下面这段程序:

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::
"""
相关文章
|
12天前
|
机器学习/深度学习 数据可视化 数据处理
从基础到进阶:探索Python在数据科学中的应用
【10月更文挑战第18天】从基础到进阶:探索Python在数据科学中的应用
31 1
|
21天前
|
机器学习/深度学习 数据采集 数据可视化
Python 数据分析:从零开始构建你的数据科学项目
【10月更文挑战第9天】Python 数据分析:从零开始构建你的数据科学项目
45 2
|
3月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
本文介绍了Python中的循环语句,包括while和for循环的使用,range()函数的运用,以及continue、break和pass关键字的说明,同时提出了关于while循环是否能与成员运算符结合使用的思考。
48 1
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
探索Python的奥秘:数据科学中的利器
本文将深入探讨Python编程语言在数据科学领域的强大应用。通过简洁易懂的语言,我们将解析Python的核心概念、流行库以及在实际项目中的应用,帮助您理解为何Python成为数据科学家的首选工具。
55 0
|
3月前
|
测试技术 索引 Python
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
本文提供了Python接口自动化测试中的编程练习,包括计算器、猜数字、猜拳和九九乘法表等经典问题,涵盖了数据类型、运算、循环、条件控制等基础知识的综合应用。
43 1
|
6天前
|
机器学习/深度学习 数据可视化 数据处理
Python在数据科学中的应用###
本文探讨了Python语言在数据科学领域的广泛应用及其重要性。通过分析Python的简洁语法、强大的库支持和跨平台特性,阐述了为何Python成为数据科学家的首选工具。文章还介绍了Python在数据处理、分析和可视化方面的具体应用实例,展示了其在提升工作效率和推动科学研究方面的巨大潜力。最后,讨论了未来Python在数据科学领域的发展趋势和挑战。 ###
|
9天前
|
机器学习/深度学习 分布式计算 数据可视化
Python在数据科学中的应用与挑战
本文探讨了Python编程语言在数据科学领域的广泛应用及其面临的主要挑战。Python因其简洁的语法、强大的库支持和活跃的社区,已成为数据科学家的首选工具。然而,随着数据量的激增和复杂性的增加,Python也面临着性能瓶颈、内存管理等问题。本文将通过具体案例分析,展示Python在数据处理、分析和可视化方面的优势,同时讨论如何克服其在大规模数据处理中的局限性,为读者提供实用的解决方案和优化建议。
|
7天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
13 1
|
15天前
|
人工智能 IDE 测试技术
使用通义灵码提升Python开发效率:从熟悉代码到实现需求的全流程体验
作为一名Python开发者,我最近开始使用通义灵码作为开发辅助工具。它显著提高了我的工作效率,特别是在理解和修改复杂代码逻辑方面。通过AI编码助手,我能够在短时间内快速上手新项目,实现新需求,并进行代码优化,整体效率提升了60%以上。通义灵码不仅加快了代码生成速度,还增强了代码的健壮性和稳定性。
|
27天前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【10月更文挑战第4天】在Web开发中,数据库操作至关重要,但直接编写SQL语句既繁琐又易错。对象关系映射(ORM)技术应运而生,让开发者以面向对象的方式操作数据库,显著提升了开发效率和代码可维护性。本文探讨Python ORM的优势及其实现细节,并通过Django ORM的示例展示其应用。ORM提供高级抽象层,简化数据库操作,提高代码可读性,并支持多种数据库后端,防止SQL注入。Django内置强大的ORM系统,通过定义模型、生成数据库表、插入和查询数据等步骤,展示了如何利用ORM简化复杂的数据库操作。
57 6