任何一种语言都有程序结构,Python也一样。常见的程序结构有顺序结构、分支结构和循环结构。Python编程中对程序流程的控制主要是通过条件判断、循环控制语句及continue、break完成的。本章将重点学习Python中控制语句的使用方法和技巧。
在现实生活中,我们看到的流程是多种多样的,如汽车在道路上行驶,要顺序地沿道路前进,碰到交叉路口时,驾驶员就需要判断是转弯还是直行,在环路上是继续前进还是从一个出口出去等。在编程的世界里遇到这些状况时,可以通过流程控制语句来控制程序的执行流程。
语句是构造程序的基本单位,程序运行的过程就是执行程序语句的过程。程序语句执行的次序称为流程控制(控制流程)。
流程控制的结构有顺序结构、选择结构和循环结构3种。例如,生产线上零件的流动过程,应该顺序地从一个工序流向下一个工序,这就是顺序结构。但当检测不合格时,就需要从这道工序中退出,或者继续在这道工序中再加工直到检测通过为止,这就是选择结构和循环结构。
对数据结构的处理流程称为基本处理流程。在Python中,基本处理流程包含3种结构,即顺序结构、选择结构和循环结构。顺序结构是Python脚本程序中基本的结构,它按照语句出现的先后顺序依次执行,如图4-1所示。
图4-1 顺序结构
选择结构按照给定的逻辑条件来决定执行顺序,有单向选择、双向选择和多向选择之分,但程序在执行过程中只执行其中一条分支。单向选择和双向选择结构如图4-2所示。
图4-2 单向选择和双向选择结构
循环结构即根据代码的逻辑条件来判断是否重复执行某一段程序,若逻辑条件为True,则进入循环重复执行,否则结束循环。循环结构可分为条件循环和计数循环,如图4-3所示。
图4-3 循环结构
一般在Python语言中,程序总体是按照顺序结构执行的,而在顺序结构中可以包含选择结构和循环结构。
顺序结构的程序是指程序中的所有语句都是按照书写顺序逐一执行的,只是顺序结构程序的功能有限。
下面是一个包含顺序结构的程序示例。
【例4.1】计算圆的面积(源代码\ch04\4.1.py)。
radius = float(input("请输入半径: ")) #输入半径 print("") area = 3.1416* radius* radius print(area) #输出圆的面积
保存并运行程序,输出结果如下:
请输入半径: 12 452.3904
该程序是一个顺序结构的程序,首先定义radius和area两个变量,在屏幕上输出“请输入半径:”的提示语句,再通过键盘输入获取数据复制给变量radius,然后为变量area赋值,最后输出area的值。程序的执行过程是按照书写语句一步一步地顺序执行的,直至程序结束。
注意: 因为input()函数输入的是字符串格式,所以在键盘输入的浮点数并不是真正的浮点数,而是字符串形式。因为radius是字符串形式,不可以相乘,所以在执行语句area=3.1416* radius* radius时会报错。这里使用float()函数强制将输入的半径转换为浮点数。
如果不使用float()函数,在进行乘法运算时就会报错。例如:
>>> a=input("请输入半径: ") 请输入半径: 5 >>> b=a*a Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't multiply sequence by non-int of type 'str'
从结果可以看出,直接对输入的值进行乘法运算是会报错的。
本节介绍选择结构及常用语句。
选择结构也称为分支结构,用于处理程序中出现两条或更多执行路径可供选择的情况。选择结构可以用分支语句来实现。分支语句主要为if语句。
【例4.2】求取输入的两个整数的差值(源代码\ch04\4.2.py)。
a= int(input("请输入第1个数: ")) b=int(input("请输入第2个数: ")) print("") if a<=b: print("它们的差值:",b-a) elif a>b: print ("它们的差值:",a-b)
保存并运行程序,输出结果如下:
请输入第1个数: 100 请输入第2个数: 200 它们的差值: 100
该程序是一个选择结构的程序,在执行过程中会按照键盘输入值的大小顺序选择不同的语句执行。若a<=b,则执行print("它们的差值:",b-a);若a>b,则执行print ("它们的差值:",a-b)。
条件判断语句就是对语句中不同条件的值进行判断,进而根据不同的条件执行不同的语句。if语句是使用非常普遍的条件判断语句,每一种编程语言都有一种或多种形式的if语句,在编程中它经常被用到。
if语句的格式如下:
if 表达式1: 语句1 elif表达式2: 语句2 ... else: 语句n
若表达式1为真,则Python运行语句1,反之则向下运行。如果没有条件为真,就运行else内的语句。elif与else语句都是可以省略的。可以在语句内使用pass语句,表示不运行任何动作。
注意以下问题:
(1)每个条件后面要使用冒号(:),表示接下来是满足条件后要执行的语句块。
(2)使用缩进划分语句块,相同缩进数的语句在一起组成一个语句块。
(3)在Python中没有switch...case语句。
以下为if语句中常用的操作运算符:
(1)<:小于。
(2)<=:小于或等于。
(3)>:大于。
(4)>=:大于或等于。
(5)==:等于,比较对象是否相等。
(6)!=:不等于。
【例4.3】使用if判断语句(源代码\ch04\4.3.py)。
sc= int(input("请输入考试分数: ")) print("") if sc <60: print("成绩不及格") elif 60 <= sc <=70: print("成绩及格") elif 70 < sc <=80: print("成绩良好") elif 80 < sc<=100: print("成绩优秀 ") elif 100 < sc: print("输入的考试分数有误") input("按Enter键退出")
保存并运行程序,输出结果如下:
请输入考试分数: 85 成绩优秀 按Enter键退出
从结果可以看出,输入的考试分数为85,再执行print("成绩优秀")语句。
在if嵌套语句中,可以把if...elif...else结构放在另一个if...elif...else结构中,语法格式如下:
if 表达式1: 语句 if 表达式2: 语句 elif 表达式3: 语句 else 语句 elif 表达式4: 语句 else: 语句
【例4.4】判断输入的数字是否既能整除2又能整除3(源代码\ch04\4.4.py)。
num=int(input("输入一个数字:")) if num%2==0: if num%3==0: print ("你输入的数字可以整除 2 和 3") else: print ("你输入的数字可以整除 2,但不能整除3") else: if num%3==0: print ("你输入的数字可以整除3,但不能整除 2") else: print ("你输入的数字不能整除 2 和 3")
保存并运行程序,输出结果如下:
输入一个数字:12 你输入的数字可以整除 2 和 3
从结果可以看出,输入的数字为12,再执行print ("你输入的数字可以整除3,但不能整除2")语句。
在Python编程中,经常会遇到多重条件比较的情况。在多重条件比较时,需要用到and或or运算符。其中,and运算符用于多个条件同时满足的情况,or运算符用于只需满足一个条件的情况。
【例4.5】多重条件判断(源代码\ch04\4.5.py)。
a= int(input("请输入三角形的第一条边: ")) b= int(input("请输入三角形的第二条边: ")) c= int(input("请输入三角形的第三条边: ")) print("") if a ==b and a ==c: print("等边三角形") elif a==b or a==c or b==c: print("等腰三角形") elif a==b or a==c or b==c: print("等腰三角形") elif a*a+b*b==c*c or a*a+c*c==b*b or c*c+b*b==a*a : print("直角三角形") else: print("一般三角形")
保存并运行程序,输出结果如下:
请输入三角形的第一条边: 9 请输入三角形的第二条边: 9 请输入三角形的第三条边: 15 等腰三角形
循环语句主要是在满足条件的情况下反复执行某一个操作。循环控制语句主要包括while语句和for语句。
while语句是循环语句,也是条件判断语句。
while语句的语法格式如下:
while 判断条件: 语句
注意: 这里同样需要注意冒号和缩进。
【例4.6】使用while循环语句计算1~20的总和(源代码\ch04\4.6.py)。
a = 20 sum = 0 b = 1 while b <= a: sum = sum + b b += 1 print("1 到 %d 之和为: %d" % (a,sum))
保存并运行程序,输出结果如下:
1 到 20 之和为: 210
注意: 如果在这里遗漏代码行b+=1,程序就会进入无限循环。因为变量b的初始值为1,并且不会发生变化,所以b<=a始终为True,导致while循环不会停止。
要避免无限循环的问题,就必须对每个while循环进行测试,确保其会按预期的那样结束。如果希望程序在用户输入特定值时结束,那么可运行程序并输入这样的值;如果在这种情况下程序没有结束,那么请检查程序处理这个值的方式,确认程序至少有一个这样的地方能让循环条件变为False,或者让break语句得以执行。
如果条件表达式一直为True,while循环就会进入无限循环。无限循环的应用也比较广泛,如在服务器上处理客户端的实时请求时无限循环就非常有用。
【例4.7】while无限循环的应用(源代码\ch04\4.7.py)。
aa = "商品" while aa=="商品" : # 表达式永远为 True name =str (input("请输入需要采购商品的名称:")) print ("你输入的商品名称是: ", name) print ("商品采购完毕!")
保存并运行程序,输出结果如下:
请输入需要采购商品的名称:洗衣机 你输入的商品名称是: 洗衣机 请输入需要采购商品的名称:电视机 你输入的商品名称是: 电视机 请输入需要采购商品的名称:电脑 你输入的商品名称是: 电脑 请输入需要采购商品的名称:
如果用户想退出无限循环,可以按Ctrl+C组合键。
当while循环体中只有一条语句时,可以将该语句与while写在同一行中。例如:
aa = "商品" while aa=="商品" :print ("这里只有一条执行语句") print ("商品采购完毕!")
while语句可以和else配合使用,表示当while语句的条件表达式为False时,执行else的语句块。
【例4.8】while语句和else配合使用(源代码\ch04\4.8.py)。
a=1 while a <20: print (a, "小于20") a=a+1 else: print (a, "大于或等于20")
保存并运行程序,输出结果如下:
1 小于20 2 小于20 3 小于20 4 小于20 5 小于20 6 小于20 7 小于20 8 小于20 9 小于20 10 小于20 11 小于20 12 小于20 13 小于20 14 小于20 15 小于20 16 小于20 17 小于20 18 小于20 19 小于20 20 大于或等于20
for语句包括条件控制和循环两部分。
for语句的语法格式如下:
for <variable> in <sequence>: 语句 else: 语句
其中,<variable>是一个变量名称,<sequence>是一个列表。else语句运行的时机是for语句都没有运行,或者最后一个循环已经运行时。else语句是可以省略的。
下面的示例打印变量n所有的值:
for n in [100,200,300,400,500]: print (n)
输出结果如下:
100 200 300 400 500
若想跳出循环,则可以使用break语句,该语句用于跳出当前循环体。
【例4.9】for语句和break语句的配合使用(源代码\ch04\4.9.py)。
fruits = ["苹果", "葡萄","橘子","香蕉","西瓜","芒果"] for ff in fruits: if ff == "西瓜": print("水果中包含西瓜!") break print(ff) else: print("没有发现需要的水果!") print("水果搜索完毕!")
保存并运行程序,输出结果如下:
苹果 葡萄 橘子 香蕉 水果中包含西瓜! 水果搜索完毕!
从结果可以看出,当搜索到西瓜时,会跳出当前循环,对应的循环else块将不执行。
使用continue语句时,Python将跳过当前循环体中的剩余语句,继续进行下一轮循环。
【例4.10】for语句和continue语句的配合使用(源代码\ch04\4.10.py)。
aa = 0 while aa <100: aa=aa+10 if aa==80: #变量为80时跳过输出 continue print (aa, " 小于或等于100")
保存并运行程序,输出结果如下:
10 小于或等于100 20 小于或等于100 30 小于或等于100 40 小于或等于100 50 小于或等于100 60 小于或等于100 70 小于或等于100 90 小于或等于100 100 小于或等于100
从结果可以看出,当变量为80时,将跳出当前循环,进入下一个循环。
当for循环被执行完毕或while循环条件为False时,else语句才会被执行。需要特别注意的是,如果循环被break语句终止,那么else语句不会被执行。
【例4.11】for、break和else语句的配合使用(源代码\ch04\4.11.py)。
a= "盈盈一水间,脉脉不得语。" for b in a: #包含break语句 if b== '不': # 文字为“不”时跳过输出 print ('当前文字是:', b) break else: print ('没有发现对应的文字')
保存并运行程序,输出结果如下:
没有发现对应的文字 没有发现对应的文字 没有发现对应的文字 没有发现对应的文字 没有发现对应的文字 没有发现对应的文字 没有发现对应的文字 没有发现对应的文字 当前文字是:不
从结果可以看出,当搜索到文字“不”时,将通过break语句跳出循环。
pass是空语句,主要是为了保持程序结构的完整性。pass不做任何事情,一般用作占位语句。
【例4.12】for和pass语句配合使用的实例(源代码\ch04\4.12.py)。
for a in '江南可采莲,莲叶何田田,鱼戏莲叶间。': if a == '鱼': pass print ('执行pass语句') print ('当前文字:', a) print ("搜索完毕!")
保存并运行程序,输出结果如下:
当前文字: 江 当前文字: 南 当前文字: 可 当前文字: 采 当前文字: 莲 当前文字: , 当前文字: 莲 当前文字: 叶 当前文字: 何 当前文字: 田 当前文字: 田 当前文字: , 执行pass语句 当前文字: 鱼 当前文字: 戏 当前文字: 莲 当前文字: 叶 当前文字: 间 当前文字: 。 搜索完毕!
从结果可以看出,当搜索到文字“鱼”时,先执行print ('执行pass语句'),再执行print ('当前文字:', a)。