第 3 章 数据处理编程 本章概要 根据代码的功能,可以将代码划分成不同函数和库形式的代码块,即对代码 进行模块化管理。本章围绕批量数据类型,主要介绍如何利用程序设计方法,将 数据与计算统一在一起,讲解同样的问题和数据,可以采用不同的程序结构和算 法实现;同时学习模块化编程中必须掌握的方法和技巧。 学习目标 通过本章的学习,要求达到以下目标: (1)掌握并会运用分支结构解决问题。 (2)掌握并会运用循环结构解决问题。 (3)掌握函数的定义和调用。 (4)掌握文件的读写操作。 (5)掌握数据预处理和数据标准化操作。 ..3.1 程序的基本结构 1.控制流 3.1 算法的控制结构章节介绍了算法的三种基本结构:顺序结构、选择结构和循 环结构。在程序中,根据表达式求值的结构或判断条件,程序可以决定跳过某些 指令、重复某些指令或者从几条指令中选择一条执行。算法的程序实现,实际上 是事务处理的流程在计算机中的表现形式,很少有程序从第一条指令开始,简单 地顺序执行每一条指令直至最后。“控制流语句”决定程序的处理路径。 图3-1是判断是否可以进入图书馆的流程图。根据判断框的条件和箭头指示 的路径,能够了解从开始到结束的所有步骤。判断框中的条件相当于程序中的 “控制流语句”,它将决定下一步要走的路径。条件框中,条件的判断结果用“是” 和“否”表示。在Python程序中实现“控制流语句”,需要先学习布尔值、比较运算 符和逻辑运算符。 54数据智能———Python数据分析与可视化 图3-1一张流程图,告诉你是否可以进入图书馆 1.布尔值 布尔数据类型只有两种值:True和False。在Python中,必须以大写字母T和F开 头,后面的字母是小写。布尔值可以用在表达式中,也可以保存在变量中,使用时注意不需 要加引号。此外,True或False不能作为变量名。图3-2显示了布尔值的一些正确和错误 的使用方法。 图3- 2 布尔值的用法示例 2. 比较运算符 比较运算符又称为关系运算符,用来比较两个值,其结果是一个布尔值。用比较运算符 可以构成简单的布尔表达式。表3-1列出了Python中的比较运算符。 表3- 1 比较运算符 比较运算符说明比较运算符说明 == 相等> 大于 != 不相等<= 小于或等于 < 小于>= 大于或等于 第3章 数据处理编程 55 通过对比较运算符两边的数值进行比较,可以得到一个布尔类型的值。 ==和!=比较运算符用于任何数据类型的比较,判断运算符两边的数值是否相等。需 要注意的是,整型或浮点型的值与字符串类型是不相等的。例如,在Python中42和'42'是 不同的,所以关系运算42==4' 2'的结果是False。图3-3是==和!=的运算示例。 图3-3 ==和!=示例 在==和!=两边可以是其他表达式或变量,图3-4显示了数值和算术表达式的比较、 变量和字符串的比较。 >、<、>=和<=运算符通常用于整型和浮点型数值的比较,也可以比较字符串、其他 表达式或变量。图3-5为比较运算符的使用示例。 图3-4 表达式或变量参与关系运算 图3-5 >、<、>=和<=运算符示例 3.逻辑运算符 Python中有三个逻辑运算符:and、or和not。对布尔值进行比较,构成复合布尔表达 式,形式如下。 布尔值/布尔表达式逻辑运算符布尔值/布尔表达式 56数据智能———Python数据分析与可视化 在逻辑运算符两边可以直接是布尔值,也可以是简单的布尔表达式。 (1)and运算符:二元运算符。and运算符左右两边的布尔值/布尔表达式的值均为 True时,整个复合布尔表达式的值为True;and两边的布尔值/布尔表达式有一方为False, 则复合表达式的结果就为False。其运算规则如表3-2所示。 表3-2and运算规则 例如,图3-6的代码表示当strWeekday不是"Monday"、并且时间大于或等于8时,返 回值为True。 图3-6and使用示例 布尔值/布尔表达式1布尔值/布尔表达式2and结果 True True True True False False False True False False False False 可以用多个and构造更加复杂的复合布尔表达式。图3-7显示了满足进入图书馆的条 件,即当strWekday不是"Monday",并且时间大于或等于8且小于或等于17时,返回值为 True,表示可以进入图书馆。 图3- 7 多个and构成复杂的复合布尔表达式示例 (2)or运算符:二元运算符。or运算符左右两边的布尔值/布尔表达式的值均为False 时,整个复合布尔表达式的值为False;or两边的布尔值/布尔表达式有一方为True,则复合 表达式的结果就为True。其运算规则如表3-3所示。 表3- 3 or运算规则 布尔值/布尔表达式 1 布尔值/布尔表达式 2 or结果 True True True True False True False True True False False False 例如,图3-8的代码表示当strWekday="Monday"、intTime=7时,各条件运算下的 返回值。同样,可以使用多个or运算符构造更加复杂的复合布尔表达式。 第3章数据处理编程57(3)not运算符:一元运算符。仅作用于一个布尔值/布尔表达式。其含义为取反,规 则如表3-4所示。 表3-4not运算规则 布尔值/布尔表达式not结果 True False False True 图3-9为not运算的示例,同样,可以由多个not运算符构造复杂的复合布尔表达式。 图3-8or运算符示例图3-9not运算符示例 4.多种运算符混合 在很多情况下,一个表达式中可能包含不同类型的运算符。Python规定了不同类型运 算符的优先顺序,表3-5描述了优先顺序从高到低的排序。 表3- 5 算术、关系和逻辑运算符的优先顺序 运算符类型符号 ** 算术运算符*,/ +,— 关系运算符<,<=,>,>=,==,!= not 逻辑运算符and or 例31:根据表36中变量a,c的值,填写复合布尔表达式的计算结果。 表3- 6 变量a,b,c的取值及复合布尔表达式 --b, a b c a>12orc>bandc>= 2 not(a>2andb>aorc>1) 10 -6 2 -9 3 -7 分析:要计算复合布尔表达式的结果,在明确各运算符的优先顺序之后,可以借助图示 分解法。 以第一行参数值为例,a=10,b=-6,c=2,其执行顺序和分步执行结果如图3-10 所示。 58 数据智能———Python数据分析与可视化 图3-10 两个复合布尔表达式的执行过程 根据两个图中对运算执行顺序的分解,可以得到由第一行参数决定的两个复合布尔表 达式的计算结果,分别为True和False。同理,根据第二行参数计算得到的两个表达式结果 为False和True。因此,变量a,b,c的取值及复合布尔表达式结果如表3-7所示。 表3-7 变量a,b,c的取值及复合布尔表达式结果 a b c a>12orc>bandc>=2 not(a>2andb>aorc>1) 10 -6 2 True False -9 3 -7 False True 3.1.2 程序运算选择 在程序实现中,最常见的控制流语句结构是选择结构,包括单分支选择、双分支选择和 多分支选择。 1.if语句———单分支选择结构 if语句是最简单的选择结构,其执行流程图如图3-11所示。根据if语句的执行流程, 如果代表条件的布尔表达式值为True,则执行代码块的程序,否则跳过代码块。 图3-11 if语句流程图 在Python中,if语句的语法形式为: if 布尔表达式: 代码块 第3章 数据处理编程 59 注意:Python是第一批强制缩进的编程语言之一。Python通过缩进表示哪几条语句 是一个语句分组中的一部分。缩进组被称为“语句块”或“代码块”。在其他语言中,缩进是 一种良好的编写方式,然而在Python中,缩进是强制性的,如果错误使用缩进或漏用缩进, 都会造成程序语义上的错误。代码块语法有以下五个简单的规则需要遵守。 图3-12 例3-2流程图 (1)代码块前一行的语句总是以冒号(:)字符结束。 (2)从代码块第一行开始,下面的所有代码行必须缩进。 (3)代码块可以包含其他代码块。 (4)缩进增加时,新的代码块开始。 (5)缩进减少为零,或与上一层的代码块对齐,则代码块 结束。例 3-2:编写程序,实现功能如下。 (1)接收输入的年龄。 (2)当年龄大于或等于18 时,输出“Congratulations! Youcanapplyforadrivers' license.”。 分析:年龄是否满足18岁是判断条件,当大于或等于18 岁时,执行输出的操作,处理流程图如图3-12所示。 根据流程图,Python程序实现如下。 intAge = int(input("Enter your age:")) if intAge >= 18: print("Congratulations! You can apply for a driver's license.") 该程序的执行结果如图3-13所示:当输入的年龄为18岁时,输出字符串。 图3-13 条件为真时,输出字符串 当输入年龄为16岁时,不会输出字符串,如图3-14所示。 图3-14 条件为假时,不输出字符串 2.if-else语句———双分支选择结构 在Python中,if-else语句的语法形式为: if 布尔表达式: 代码块1 else: 代码块2 与if语句相比,if-else语句结构有两条路径(True和False),每条路径上都可以执行代 码块,其执行流程图如图3-15所示。根据if-else语句的执行流程,如果代表条件的布尔表 达式值为True,则执行代码块1的程序,否则执行代码块2的程序。 60 数据智能———Python数据分析与可视化 例3-3:编写程序,实现功能如下。 (1)接收输入的整数。 (2)判断该整数能够被2整除,则输出“偶数”;否则,输出“奇数”。 分析:输入的整数是否能被2整除是判断条件,处理流程图如图3-16所示。 图3-15 if-else语句流程图 图3-16 例3-3流程图 根据流程图,Python程序实现如下。 intNum = int(input("请输入一个整数:")) if intNum % 2 == 0: print(intNum,"是一个偶数") else: print(intNum,"是一个奇数") 该程序的执行结果如图3-17所示:分别输入37和6802时,执行不同的代码块,输出不 同的信息。 图3-17 分别输入奇数和偶 数时的执行结果 根据条件判断的结果,每个分支上可以执行一个代 码块。例 3-4:编写程序,根据输入的转换标志,实现摄氏度 与华氏度的转换。 (1)输入温度转换标志位,该标志只能为“0”或“1”: “0”表示将摄氏度转换为华氏度;“1”表示将华氏度转换为 摄氏度。如果输入的标志位不是“0”或“1”,则提示错误信 息,处理结束。 (2)输入温度值。 (3)如果输入的温度转换标志位为“0”,则将(2)输入的温度值转换为华氏度;否则,将 (2)输入的温度值转换为摄氏度。 注:摄氏温度(C)和华氏温度(F)之间的换算方法为:F=9/5C+32,或C=5/9(F-32)。 分析:该功能包括两个判断条件。首先,判断输入的温度转换标志位是否为“0”或“1”, 这个判断可以通过if语句实现;其次,判断输入的温度转换标志位是否为“0”,若是“0”,则 执行摄氏度转华氏度的处理;否则,执行华氏度转摄氏度的处理。 第3章 数据处理编程 61 根据分析,Python程序实现如下。 strFlg = input("请输入转换标志位: ") if strFlg != "0" and strFlg != "1": print("输入的标志位不正确!") else: intTemp = int(input("请输入温度: ")) if strFlg == "0": fltF = round(9 / 5 * intTemp + 32,2) print("摄氏度",intTemp,"转换为华氏度为: ",fltF) else: fltC = round(5 / 9 * (intTemp - 32),2) print("华氏度",intTemp,"转换为摄氏度为: ",fltC) 该程序的执行结果如下:当输入“0”或“1”以外的标志位时,提示输入错误,如图3-18 所示。 图3-18 输入“0”或“1”以外的标志位时提示输入错误 当输入标志位为“0”,再输入温度,进行摄氏度转换为华氏度的处理,最后输出转换后的 华氏度。执行示例如图3-19所示。 图3-19 输入标志位为“0”,执行摄氏度到华氏度转换的代码块 当输入标志位为“1”,再输入温度,进行华氏度转换为摄氏度的处理,最后输出转换后的 摄氏度。执行示例如图3-20所示。 图3-20 输入标志位为“1”,执行华氏度到摄氏度转换的代码块 3.if-elif语句———多分支选择结构 在Python中,if-elif语句的语法形式为: if 布尔表达式1: 代码块1 elif 布尔表达式2: 代码块2 elif 布尔表达式3: 代码块3 62 数据智能———Python数据分析与可视化 … elif 布尔表达式n: 代码块n else: 代码块n+1 if-else满足了有两条路径时的处理需求,但有时候程序需要处理有更多可能性的情况, 每一种可能的情况,都有相对应的代码块需要执行,elif即满足这种情况。if-elif语句结构 有多条路径,每一种可能性由elif后面的条件语句来判断,当满足该条件时,这条路径上的 代码块就能够被执行。其执行流程图如图3-21所示,根据if-elif语句的执行流程,如果条 件1满足,则执行代码块1;否则,如果条件2满足,则执行代码块2;……;否则,如果条件n 满足,则执行代码块n。条件1~n都不满足时,执行代码块n+1。 图3-21 if-elif语句流程图 例3-5:编写程序,输入成年人的性别、身高和体重,计算BMI值,根据表3-8的BMI指 标输出纤体程度。 (1)输入性别,性别只能为“男”或“女”。如果输入的性别不是“男”或“女”,则提示错误 信息,处理结束。 (2)输入身高和体重。 (3)计算BMI值,计算公式为:BMI= 体重(kg) 身高(m2) (4)根据表3-8输出相应的纤体程度。 分析:该功能包括两个判断条件。首先,判断输入的性别是否为“男”或“女”,这个判断 可以通过if语句实现;其次,根据计算的BMI值输出相对应的纤体程度,由于BMI标准有 多个程度,因此使用if-elif语句实现多分支判断。根据分析,Python程序实现如下。 第3章 数据处理编程 63 表3-8 BMI纤体标准 性别程度BMI指标 女 过轻<19 适中[19,24) 过重[24,29) 肥胖[29,34) 非常肥胖≥34 男 过轻<20 适中[20,25) 过重[25,30) 肥胖[30,35) 非常肥胖≥35 strGender = input("请输入性别:") if strGender != "男" and strGender != "女": print("输入的性别有误!") else: fltWeight = float(input("请输入体重(单位为kg):")) fltHeight = float(input("请输入身高(单位为m):")) fltBMI = round(fltWeight / pow(fltHeight,2),2) print("纤体程度:",fltBMI) if strGender == "女": if fltBMI < 19: print("你有点弱不禁风哦!") elif fltBMI >= 19 and fltBMI < 24: print("多一两胖,少一两瘦,正正好!") elif fltBMI >= 24 and fltBMI < 29: print("对身材放松要求了吧!") elif fltBMI >= 29 and fltBMI < 34: print("最近吃得太任性了! 快打住!") elif fltBMI >= 34: print("以后一周只能吃一顿饭了!") else: if fltBMI < 20: print("你有点弱不禁风哦!") elif fltBMI >= 20 and fltBMI < 25: print("多一两胖,少一两瘦,正正好!") elif fltBMI >= 25 and fltBMI < 30: print("对身材放松要求了吧!") elif fltBMI >= 30 and fltBMI < 35: print("最近吃得太任性了! 快打住!") elif fltBMI >= 35: print("以后一周只能吃一顿饭了!") 64数据智能———Python数据分析与可视化 该程序的执行结果如下:当输入“男”或“女”以外的标志位时,提示输入错误,如图3-22 所示。输 入不同的性别、身高和体重,程序执行的结果示例如图3-23 所示。 图3-22 输入“男”或“女”以外的图3-23 根据性别、身高、体重不同代码 性别时提示输入错误块的执行结果示例 3.3 程序运算控制 1. 本节介绍Python的循环控制结构。当需要代码块重复执行多次时,就要用到循环控 制结构。Python中使用while和for语句实现代码块的循环执行,同时可以用break和 continue控制语句跳出循环。 1.while循环语句 利用while语句,可以让一个代码块重复执行,其流程图如图3-24 所示,while语句表 示当条件为True时,代码块就能够执行。 图3-24 while语句流程图 第3章 数据处理编程 65 在Python中,while语句的语法形式为: while 布尔表达式: 代码块 因为布尔表达式在进入循环之前会被计算,所以一个while语句可以执行多次循环,也 可能执行零次循环。 例3-6:编写程序,实现“重要的事情说3遍!”。 分析:可以直接输出三次“重要的事情说3遍!”实现该程序的功能,Python代码如下。 print("重要的事情说3 遍!") print("重要的事情说3 遍!") print("重要的事情说3 遍!") 这段程序的执行结果如图3-25所示。 在上面的代码中,三行代码完全相同,可以使用while循环,将一条print语句重复执行 三次。Python代码实现如下。 intCnt = 1 while intCnt <= 3: print("重要的事情说3 遍!") intCnt = intCnt+1 这段程序的执行结果如图3-26所示,与原结果一样。在上述代码中,使用了intCnt变 量来控制循环的次数:该变量初始值为1,在进入while循环的时候,满足intCnt<=3的条 件;此后每一轮循环,都会将该变量累加1,每次进入循环,都会判断其值是否小于或等于3; 直到执行三轮循环之后,intCnt累加到4,不再满足循环条件,循环结束。 图3-25 直接输出三次的执行结果 图3-26 用while循环实现同一语句输出三次 使用while程序可以节省很多代码。例如,实现“重要的事情说100遍”的功能,用循环 来实现将更加简单、灵活。 例3-7:编写程序,用while循环语言实现数字1~100的累加求和。 分析:参考例3-6,可以采用循环实现。设定一个变量控制循环的次数,变量初始值是 1,循环执行的条件是该变量值小于或等于100。Python代码如下。 intCnt = 1 intTotal = 0 while intCnt <= 100: intTotal = intTotal + intCnt intCnt = intCnt + 1 print("1~100 累加结果是:",intTotal) 在这段代码中,巧妙地利用intCnt变量实现了1~100的递增,使用变量intTotal进行累 66 数据智能———Python数据分析与可视化 图3-27 用while循环实现 1~100的累加 加,最后输出累加结果如图3-27所示。 2.for循环语句 根据while循环语句的执行逻辑,当条件为True时, while循环就会执行,因此while循环可以看作是不固定次数 的循环。如果预先知道代码执行的固定次数,可以使用更加 方便的for循环结构。 Python中for语句的语法形式为: for var in 序列: 取下一项 代码块 其中,var是变量,它被依次赋予序列中的值,并且代码块针对每个值会执行一遍。for 语句执行流程如图3-28所示。 图3-28 for语句流程图 for语句中的序列可以有多种形式。 1)列表形式 例如,用for循环实现输出1、2、3、4、5这五个数字,可以用列表的形式实现,代码如下。 for i in [1,2,3,4,5]: print(i) 在这段代码中,变量i将分别被赋予列表[1,2,3,4,5]中的值,并将其输出,因此print (i)会执行5次。执行结果如图3-29所示。 2)字符串形式 可以用for循环实现输出一个字符串的各个字符,代码如下。 for strL in "Hello": print(strL) 在这段代码中,变量strL将分别被赋予字符串"Hello"的各个字符的值,并将其输出, 因此print(i)会执行5次。执行结果如图3-30所示。 第3章 数据处理编程 67 图3-29 变量被赋予列表各项的值, for语句执行结果 图3-30 变量被赋予字符串各个字符的值, for语句执行结果 3)range()函数形式 Python的range()函数可以用来创建一个整数序列,range()函数可以和for语句一起 使用,实现固定次数的循环,其语法形式如下。 for var in range([initial_value,]final_value[,step]): 代码块 ● initial_value是序列的起始值,这个参数是可选的,如果省略,则默认值为0。 ● final_value是序列的终止值,但是不包括final_value。 ● step是步长,表示每次循环后循环变量增加的值,这个参数也是可选的,如果省略, 则默认值为1。 上述输出1、2、3、4、5的程序,用range()和for循环实现同样的功能,代码如下。 for i in range(5): print(i+1) 这段代码的执行结果与图3-29相同,都是输出了1、2、3、4、5这5个数字。这段代码中 range()函数的参数只有5,是因为省略了initial和step,相当于range(0,5,1)的形式。因 为initial_value省略,所以初始值为0,因此每次输出的值应该是序列的当前值+1。如果初 始值从1开始,可以这样实现: for i in range(1,6): print(i) 在例3-7中,用while循环语言实现数字1~100的累加求和,现在使用for循环和 range()函数来实现同样的功能。 例3-8:编写程序,用for循环语句和range()函数实现数字1~100的累加求和。 分析:数字1~100的累加,即需要循环100次变量的累加求和,因此循环次数是固定 的,可以使用for循环实现,代码如下。 intTotal = 0 for i in range(1,101): intTotal = intTotal + i print("数字1 到100 的累加和是: ",intTotal) 在这段代码中,range(1,101)表示从1~100执行100次循环,变量i的值也分别是1~ 100,每次循环都对变量i进行累加,最后的执行结果如图3-31所示。 range()函数的step参数可以规定每次循环后循环变量增加的值,默认情况下,循环变 68 数据智能———Python数据分析与可视化 图3-31 用for循环实现1~100的累加 量每次增加1。通过设定不同的step,可以实现更 加灵活的循环功能。 例3-9:编写程序,用for循环语句和range() 函数输出1~20中的偶数。 分析:首先需要计算出循环的范围,查找范围是1~20,由于range()函数不包含终止 值,所以range()函数的参数是1和21。判断偶数可以设定每次循环的步长为2,从而跳过 奇数,实现每隔一个数字(奇数)输出一个偶数。代码如下。 print("1 到20 的偶数如下: ") for i in range(1,21,2): print(i+1) 在这段代码中,range(1,21,2)表示从1~20以步长为2执行10次循环,由于输出的是 偶数,所以每次需要输出变量i+1,执行结果如图3-32所示。 有时候还可以使用负数作为步长,让循环计数逐渐减少,而不是增加。 例3-10:编写程序,用for循环语句和range()函数,逆序排列输出20到1中的奇数。 分析:循环次数和例3-9一样,从20到1的奇数有10个,且按倒序输出,因此可以设置 序列的起始值为20,终止值为0,步长为-2,代码如下。 print("20 到1 的奇数按倒序排列如下: ") for i in range(20,0,-2): print(i-1) 在这段代码中,range(20,0,2)表示从20到1以步长为-2执行10次循环,即每次变 量i递减2,由于输出的是奇数,所以每次需要输出变量i-1,执行结果如图3-33所示。 图3-32 用for循环输出1~20中的偶数 图3-33 用for循环输出20~1的奇数 3.break语句 循环会消耗很多CPU 资源,从程序的执行效率来讲,要谨慎使用循环。如果在某次循 环中,根据指定条件需要及时跳出或者结束循环,而不是等到完成所有循环,可以使用循环 终止语句。break语句用在while和for循环中,用于中止循环,即循环条件没有达到False 条件或者序列还没被完全递归完,也会停止执行循环语句,两者的流程图如图3-34所示。 例3-11:编写程序,实现下列功能。 (1)输入任意要查找的字符。 (2)判定"Summerishere."字符串中是否含有上述(1)输入的字符。 分析:通常的方法是遍历字符串,判断每一位字符是否等于要查找的字符。但有些情 第3章 数据处理编程 69 图3-34 while循环和for循环中有break的流程图 况下,无须执行完所有循环,就可以满足题目的要求。例如,输入的字符是"e",在第五次循 环的时候,就可以判断出包含字符"e",而无须循环到最后,因此可以在for循环中加入一个 终止条件,即一旦当前字符等于"e",则可以判断出该字符串包含"e",终止循环。代码实现 如下。 strText = "Summer is here." strFind = input("请输入要查找的字符: ") blnFind = False for strC in strText: if strC == strFind: blnFind = True break if blnFind == True: print("找到了要查找的字符: ",strFind) else: print("找不到要查找的字符: ",strFind) 图3-35 查找到和未查找 到的执行结果 在这段代码的for循环中,如果当前字符和待查找的字符 一致,则利用break语句中止循环,执行for循环之后的语 句。"Summerishere."字符串长度为15,全部循环次数为15, 以查找字符是"e"为例,使用break语句能够节省10次循环的 时间。上述代码的执行结果如图3-35所示。 在大规模数据处理中,提高程序的执行效率非常重要,我 们要对每一个可能影响程序执行时间的代码进行优化,才能 够应对大数据时代的数据处理需求。 4.continue语句 和break语句类似,continue语句在循环内部用于停止本轮循环。但continue语句是 跳转至循环开始处,重新对循环条件进行判断或对循环序列求下一个值。 70 数据智能———Python数据分析与可视化 例3-12:编写程序,用for循环、range()函数和continue语句输出1~20中的偶数。 分析:在例3-9中,使用step=2实现了输出1~20中的偶数功能。如果不借助步长, 而使用continue语句是否也能实现相同的功能? 代码实现如下。 for i in range(1,21): if i%2 != 0: continue print(i) 代码的每次循环中都会判断当前值是否能被2 整除,若不能被2 整除,则执行 continue,即不执行print(i)语句,结束本轮循环,直接跳转至循环开始处,取序列中的下一 个值,进入下一次循环。程序流程图如图3-36所示。 图3-36 通过continue语句终止本轮循环 3.1.4 习题与实践 1.填空题 (1)布尔数据类型只有两种值: 和。 (2)比较运算符又称为关系运算符,用来比较两个值,其结果是一个。 (3)Python中有三个逻辑运算符: 、和。 (4)对于一个循环结构来说,终止整个循环的语句是,中止本轮循环的语句 是。 2.选择题 (1)下列不属于比较运算符的是( )。 A.== B.!= C.>= D.= (2)下列布尔表达式的值为True的是( )。 A.55=="55"and55==55.0 B.30>=90or55=="55" C.20>4*4and"a">"A"or0==0 D."ABC">"abc" (3)关于选择结构以下说法错误的是( )。 第3章 数据处理编程 71 A.if可以实现单分支选择结构 B.if-else可以实现双分支选择结构 C.if-elif可以实现多分支选择结构 D.if-else和if-elif不可以嵌套使用 (4)关于循环结构以下说法正确的是( )。 A.while循环语句至少会执行一次循环 B.for语句必须和range()函数一起使用 C.range()的step参数可以是负数 D.range()的初始值参数一定要小于终止值参数 3.判断题 (1)当循环次数未知时,可以使用for循环结构。( ) (2)当循环结构已知时,不能使用while循环结构。( ) (3)在以下代码片段中,"Hello"显示10次。( ) for i in range(1,10): print("Hello") (4)在for循环结构中,循环变量在每次循环的开始处被自动赋予序列中的后续值。 ( ) (5)while结构可能会执行0次循环。( ) (6)在以下代码片段中,"Hello"显示10次。( ) i = 1 while i <= 10: print("Hello") i = i + 1 .. 3.2 模块化程序设计 在Python中,将用于实现某个功能的语句组合成一个模块,称为函数。本节将介绍函 数的定义和使用方法。 3.2.1 函数 创建函数的目的是重复使用,提高程序开发效率。可以把函数看成是一个具有某种功 能的“工具”,可以反复使用。 1.创建函数 创建函数也称为定义函数。在Python中函数由关键字def来定义。函数定义的一般 形式为: def 函数名(参数列表): 函数体 return 72 数据智能———Python数据分析与可视化 其中,参数是可选的,用于指定向函数中传递的参数。如果有多个参数,参数之间用逗 号分隔。如果无参数设置,则表明当前函数没有参数,调用时也无须指定参数。 根据需要,函数可以有返回值,用return返回。当函数无返回值时,可以省略return 语句。例 3-13:创建一个名为Hello的函数,其作用为输出“欢迎进入Python世界”的字符 内容。创 建该函数的程序段如下。 def Hello(): print("欢迎进入Python 世界") 在程序中调用Hello()函数,将显示“欢迎进入Python世界”的字符内容。 例3-14:创建一个名为sum()的函数,其作用是计算n以内的整数之和(包含n)。下 面为定义的函数程序段。 def sum(n): s=0 for i in range(1,n+1): s=s+i return s 2.调用函数 在Python中,在需要函数的地方,直接使用函数名来调用函数。如果定义的函数包含 参数,则调用函数时也必须提供参数。 例3-15:调用sum(n)函数计算1~50的整数之和。 def sum(n): #定义sum 函数 s=0 for i in range(1,n+1): s=s+i return s print(sum(50)) #调用sum 函数,参数为50 3.形参与实参 在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系,这就是有 参数的提取形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体 的操作处理。 函数参数在定义函数时放在函数名称后面的一对小括号中,在使用函数时,经常会用到 形式参数(形参)和实际参数(实参),两者都称为参数。 形式参数和实际参数在作用上的区别如下。 (1)形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”,也称形参。 (2)实际参数:在调用一个函数时,函数名后面括号中的参数为“实际参数”。也就是 将函数的调用方传递给函数的参数称为实际参数,也称实参。 根据实参的类型不同,可以分为传值和传地址两大类———将实参的值传递给形参和将 实参的引用传递给形参两种情况。其中,当实参为不可变对象时,进行的是值传递;当形参