微课学人工智能Python编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 结构化程序设计

1.4.1 程序设计与算法

程序设计就是使用某种计算机语言,按照某种算法,编写程序的活动。一般说来,程序设计包括以下步骤:①问题定义;②算法设计;③算法表示(如流程图设计);④程序编制;⑤程序调试、测试及资料编制。

一个完整的程序应包括:

1)对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构。

2)对操作的描述。即操作步骤,也就是算法。

做任何事情都有一定的步骤,而算法就是解决某个问题或处理某件事的方法和步骤,在这里所讲的算法是专指用计算机解决某一问题的方法和步骤。算法应具有有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性等5个特征。

为了描述一个算法,可以采用许多不同的方法,常用的有:自然语言、流程图、N-S流程图、伪代码等,这里只简单介绍传统流程图,图形符号见表1-12。

表1-12 流程图图形符号

图1-13所示为计算A、B、C三个数中最大数的流程图表示方式。在流程图中,判断框左边的流程线表示判断条件为真时的流程,右边的流程线表示条件为假时的流程,有时就在其左、右流程线的上方分别标注“真”“假”或“True”“False”或“Y”“N”。另外,还规定,流程线是从下往上或从右向左时,必须带箭头,除此以外,都不画箭头,流程线的走向总是从上向下或从左向右。

图1-13 计算A、B、C三个数中最大数的流程图

1.4.2 结构化程序设计的基本要点

结构化程序设计是由迪克斯特拉(E.W.dijkstra)在1969年提出的,是以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,这样使完成每一个模块的工作变得简单而明确,为设计一些较大的软件打下良好的基础。

结构化程序设计的基本要点包括以下两点:

第一点:采用自顶向下、逐步细化的程序设计方法。

在需求分析、概要设计中,都采用了自顶向下、逐层细化的方法。

第二点:使用三种基本控制结构组成程序。

任何程序都可由顺序、选择、循环三种基本控制结构组成,即用顺序方式对过程分解,确定各部分的执行顺序;用选择方式对过程分解,确定某个部分的执行条件;用循环方式对过程分解,确定某个部分进行重复的开始和结束的条件;对处理过程仍然模糊的部分反复使用以上分解方法,最终可将所有细节确定下来。

1.顺序结构

顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的,如图1-14所示,语句的执行顺序为:A→B→C。

2.选择结构

选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。其基本形状有两种,如图1-15所示。图1-15a所示的结构的执行序列为,当条件为真时执行A,否则执行B;图1-15b所示的结构的执行序列为,当条件为真时执行A,否则什么也不做。

图1-14 顺序结构

图1-15 选择结构

3.循环结构

循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。在循环结构中最主要的是:什么情况下执行循环?哪些操作需要循环执行?循环结构的基本形式有两种:当型循环和直到型循环。循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。

1)当型循环如图1-16a所示。其执行序列为:当条件为真时,反复执行A,一旦条件为假,跳出循环,执行循环后面的语句。

2)直到型循环如图1-16b所示。执行序列为:首先执行A,再判断条件,条件为真时,一直循环执行A,一旦条件为假,结束循环,执行循环后面的语句。

图1-16中,A被称为循环体,条件被称为循环控制条件。要注意的是,在循环体中,必然对条件要判断的值进行修改,使得经过有限次循环后,循环一定能结束;当型循环中,循环体可能一次都不执行,而直到型循环则至少执行一次循环体。

图1-16 循环结构

以上三种基本结构的共同特点是:

1)只有单一的入口和单一的出口。

2)结构中的每个部分都有执行到的可能。

3)结构内不存在永不终止的死循环。

因此,结构化程序设计的基本思想是采用“自顶向下,逐步求精”的程序设计方法和“单入口单出口”的控制结构。

1.4.3 选择结构

1.单分支

单分支的语法表达式如下:

其中,如果条件表达式的值为真,则执行其后的语句块(可以是单个语句,当是单个语句时可直接放在条件表达式的冒号(:)后成一行,下同),否则不执行该语句块,其执行逻辑如图1-17所示。

2.二分支形式

采用if-else形式来表达的是二分支形式,其语法表达式如下:

其中,如果表达式的值为真,则执行语句块1,否则执行语句块2,其执行的逻辑过程如图1-18所示。

3.多分支形式

当有多个分支选择时,可采用if-elif-else语句,其语法表达式如图1-19所示。

图1-17 单分支的执行逻辑

图1-18 二分支的执行逻辑

图1-19 多分支的语法表达形式

图1-19中,依次判断条件表达式的值,当出现某个值为真时,则执行其对应的语句块,然后跳到整个if语句之后继续执行程序。如果所有的表达式均为假,则执行语句块n,然后继续执行后续程序。多分支的执行逻辑如图1-20所示。

图1-20 多分支的执行逻辑

例1-23】输入一个整数,与存储值进行比较后输出信息。

运算结果:

4.三目运算符

使用if else实现三目运算(条件运算)的格式如下:

其中,condition是判断条件,exp1和exp2是两个表达式。如果condition成立(结果为真),就执行exp1,并把exp1的结果作为整个表达式的结果;如果condition不成立(结果为假),就执行exp2,并把exp2的结果作为整个表达式的结果。

语句max=a if a>b else b的含义是:

如果a>b成立,就把a作为整个表达式的值,并赋给变量max;

如果a>b不成立,就把b作为整个表达式的值,并赋给变量max。

三目运算符支持嵌套,可以构成更加复杂的表达式。在嵌套时需要注意if和else的配对,例如:

应该理解为:

例1-24】三目运算。

运算结果:

从本例中可以看到,在写代码的过程中,如果遇到一行代码很长的情况,为了让代码显得整齐干净,就需要把一行代码分成多行来写,最简单的方法就是用反斜杠“\”链接多行代码。

5.if语句的嵌套

当if语句中的语句或语句块又是if语句时,则构成了if语句嵌套的情形,其语法表达如下:

或者为

在嵌套内的“if语句”可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意通过统一缩进来体现的if和else的配对。

例1-25】判断是否为酒后驾车。

如果规定,车辆驾驶员的血液酒精含量小于20mg/100mL不构成酒驾;酒精含量大于或等于20mg/100mL为酒驾;酒精含量大于或等于80mg/100mL为醉驾。

通过梳理思路,是否构成酒驾的界限值为20mg/100mL;而在已确定为酒驾的范围(大于20mg/100mL)中,是否构成醉驾的界限值为80mg/100mL,整个代码执行流程如图1-21所示。

图1-21 流程图

运算结果:

当然,本例单独使用if elif else也可以实现,这里只是为了让初学者熟悉if分支嵌套的用法而已。

1.4.4 循环结构

1.while循环语句

Python编程中,while语句用于循环执行,即在满足某条件下循环执行某段程序,以处理需要重复处理的相同任务。

while循环语句的语法表达式为:

其中,条件表达式是循环条件,一般是关系表达式或逻辑表达式,除此以外任何非零或非空(Null)的值均为True;语句块(包括单个语句)为循环体。

while语句使用中,无else子句时,其语义解释为:计算条件表达式的值,当值为真(非0或非空)时,执行循环体语句,一旦循环体语句执行完毕,条件表达式中的值将会被重新计算;如果还是为True,循环体将会再次执行,这样一直重复下去,直至条件表达式中的值为False(或为0或为空)为止。

while语句使用中,有else子句时,while语句部分含义同上,else中的语句块2则会在循环正常执行结束的情况下执行,即while不是通过break跳出而中断的(见图1-22)。

图1-22 while语句的执行逻辑

例1-26】对整数进行while循环操作。

运算结果:

2.for循环语句

for循环语句可以遍历任何序列中的项目,如一个列表或者一个字符串等,来控制循环体的执行,其语法格式如下:

for循环语句的执行逻辑如图1-23所示。

这里先介绍通常用于for循环中来控制循环次数的range()函数,其语法是:

该结果是返回一个[start,start+step,start+2×step,...]结构的整数序列。range()函数具有一些特性:

1)如果step参数缺省,默认1;如果start参数缺省,默认0。

2)如果step是正整数,则最后一个元素(start+i×step)小于stop。

3)如果step是负整数,则最后一个元素(start+i×step)大于stop。

4)step参数必须是非零整数,否则报VauleError异常。

需要注意的是,range()函数返回一个左闭右开([left,right))的序列数。

图1-23 for语句的执行逻辑

例1-27】使用range()函数。

运算结果:

3.循环嵌套

Python语言允许在一个循环体里面嵌入另一个循环。当两个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为外层循环或外循环,位于内层的循环结构常简称为内层循环或内循环。对于循环嵌套结构的代码,Python解释器执行的流程为:

1)当外层循环条件为True时,则执行外层循环结构中的循环体。

2)外层循环体中包含了普通程序和内层循环,当内层循环的循环条件为True时会执行此循环中的循环体,直到内层循环条件为False,跳出内层循环。

3)如果此时外层循环的条件仍为True,则返回第2步,继续执行外层循环体,直到外层循环的循环条件为False。

4)当内层循环的循环条件为False,且外层循环的循环条件也为False时,则整个嵌套循环才算执行完毕。

循环嵌套的执行流程图如图1-24所示,嵌套循环执行的总次数=外层循环执行次数×内层循环执行次数。

Python的循环嵌套基本型有两种。

1)for循环嵌套语法:

2)while循环嵌套语法:

图1-24 循环嵌套的执行流程图

除此之外,还可以在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环;反之,可以在for循环中嵌入while循环。

例1-28】循环嵌套应用。

运算结果:

可以看到,此程序中运用了嵌套循环结构,其中外层循环使用的是while语句,而内层循环使用的是for语句。程序执行的流程是:

1)开始i=0,循环条件i<3成立,进入while外层循环执行其外层循环体。

2)从j=0开始,由于j<3成立,因此进入for内层循环执行内层循环体,直到j=3不满足循环条件,跳出for循环体,继续执行while外层循环的循环体。

3)执行i=i+1语句,如果i<3依旧成立,则从第2步继续执行。直到i<3不成立,则此循环嵌套结构才执行完毕。

根据上面的分析,此程序中外层循环将循环3次(从i=0到i=2),而每次执行外层循环时,内层循环都从j=0循环执行到j=2。因此,该嵌套循环结构将执行3×3=9次。

例1-29】if语句和循环(while、for)结构之间的相互嵌套。

运算结果:

需要指明的是,上面程序演示的仅是两层嵌套结构,其实if、while、for之间完全支持多层(≥3)嵌套。例如:

也就是说,只要场景需要,判断结构和循环结构之间完全可以相互嵌套,甚至可以多层嵌套。

4.break语句

break语句用于在语句块执行过程中终止当前循环,并且跳出当前循环。break语句可以立即终止当前循环的执行,跳出当前所在的循环结构。无论是while循环还是for循环,只要执行break语句,就会直接结束当前正在执行的循环体。

break语句的语法非常简单,只需要在相应while或for语句中直接加入即可,一般会结合if语句进行搭配使用,表示在某种条件下跳出循环体。

例1-30】while循环中的break语句。

运算结果:

分析本例程序不难看出,当循环至num=3时,程序执行break语句,其会直接终止当前的循环,跳出循环体,并不执行else中的语句。

对于嵌套的循环结构来说,break语句只会终止所在循环体的执行,而不会作用于所有的循环体。

5.continue语句

continue语句用于执行过程中终止当前循环,跳出该次循环,执行下一次循环。和break语句相比,continue语句只会终止执行本次循环中剩下的代码,直接从下一次循环继续执行。

continue语句的用法和break语句一样,只要在while或for语句中的相应位置加入即可。

例1-31】break语句借用bool类型变量跳出更多循环体。

运算结果:

可以看到,当i从0循环至5时,会进入if判断语句执行print()语句和continue语句。其中,print()语句起到换行的作用,而continue语句会使Python解释器忽略执行代码行“print(i,end="")”,直接从下一次循环开始执行。

6.pass语句

pass是空语句,起到保持程序结构的完整性作用。

例1-32】pass语句简单应用。

运算结果:

从运行结果可以看出,程序执行到“i=3”时,输入成绩为86时,其指令为“pass”,但是并没有进行什么操作。