2.4 选择与循环
在Python中,选择与循环都是比较重要的控制流语句。选择结构可以根据给定的条件是否满足来决定程序的执行路线,这种执行结构在求解实际问题时被大量使用。根据程序执行路线的不同,选择结构又可以分为单分支、双分支和多分支3种类型。要实现选择结构,就要解决条件表示问题和结构实现问题。而循环结构也是类似的,需要有循环的条件和循环所执行的程序即循环体两个方面。
2.4.1 if语句
最常见的控制流语句是if语句。if语句的子句将在语句的条件为True时执行;如果条件为False,子句将跳过。
1.if单分支结构
在Python中if语句可以实现单分支结构,其一般的格式为:
if 表达式(条件): 语句块(子句)
其执行过程如图2-1所示。
图2-1 单分支if语句执行结构
例如:判断一个人的名字是否为“xiaoming”。
>>>if name == "xiaoming": >>> print ("he is xiaoming")
2.if双分支结构
在Python中if子句后面有时候也可以跟着else语句。只有if语句的条件为False时,才会执行else子句。
if语句同样可以实现双分支结构,其一般格式为:
if 表达式(条件): 语句块1(if子句) else: 语句块2(else子句)
其执行过程如图2-2所示。
图2-2 双分支if语句执行结构
回到上面的例子,在名字不是“xiaoming”时,else关键字后面的缩进代码就会执行。
>>>if name =="xiaoming": >>> print ("he is xiaoming") >>>else: >>> print("he is not xiaoming")
3.if多分支结构
虽然只有if或else子句会被执行,但当希望有更多可能的子句中有一个被执行时,elif语句就派上用场了。elif语句是“否则如果”,总是跟在if或另一条elif语句后面。它提供了另一个条件,仅在前面的条件为False时才检查该条件。
if语句也可以实现多分支结构,它的一般格式为:
if表达式1(条件1): 语句块1 elif表达式2(条件2): 语句块2 ...... elif表达式m(条件m): 语句块m [else: 语句块n]
其执行过程如图2-3所示。
图2-3 多分支if语句执行结构
回到上面的例子。当判断name是否为“xiaoming”之后,结果为False,还想要继续判断其他的条件,此时就可以使用elif语句。
>>>if name =="xiaoming": >>> print ("he is xiaoming") >>>elif age > 18 >>> print("he is an adult")
当“name=="xiaoming"”为False时,会跳过if的子句转而判断elif的条件,当“age>18”为True时,会输出he is an adult。当然,如果还有其他的条件,还可以在后面继续增加elif语句,但是,一旦有一个条件满足,就会自动跳过余下的代码。下面,我们分析一个完整的实例。
【例2-1】学生成绩等级判定。
输入学生的成绩,90分以上为优秀,80~90为良好,60~80为及格,60以下为不及格。程序代码如下:
score = float(input("请输入学生成绩:")) # input为Python内置函数 # if多分支结构,判断输入学生成绩属于哪一等级 if score > 90: print("优秀") elif score > 80: print("良好") elif score >= 60: print("及格") else: print("不及格")
程序的一次运行结果如图2-4所示。
另外一次的运行结果如图2-5所示。
图2-4 学生成绩等级判定一次显示结果(1)
图2-5 学生成绩等级判定另一次显示结果(2)
2.4.2 while循环
while循环结构是通过判断循环条件是否成立来决定是否要继续进行循环的一种循环结构。它先判断循环的条件是否为True,若为True则继续进行循环,若为False,则退出循环。
1.while语句基本格式
在Python中,while语句的一般格式为:
while 表达式(循环条件): 语句块
在Python中while循环的执行过程如图2-6所示。
图2-6 while循环结构
while语句会先计算表达式的值,判定是否为真,结果为True,则重复执行循环体中的代码,直到结果为False,退出循环。
注意:在Python中,循环体中的代码必须用缩进对齐的方式组成语句块。
【例2-2】利用while循环求1~100的累加和。
i = 1 sum_all = 0 while i <=100: # 当i<=100时,条件为True,执行循环体的语句块 sum_all += i # 对i进行累加 i += 1 # i每次循环都要+1,这也是循环退出的条件 print(sum_all) # 输出累加的结果
运行结果为:5050
注意:在使用while语句时,一般情况下要在循环体内定义循环退出的条件,否则会出现死循环。
【例2-3】死循环实例演示。
num1= 10 num2 = 20 while num1 < num2: print("死循环")
运行结果如图2-7所示。
图2-7 死循环显示结果
可以看出程序会持续输出“死循环”。
2.while语句中的else语句
在Python中,可以在while语句之后使用else语句。在while语句的循环体正常结束退出循环后会执行else语句的子句。但是当循环用break语句退出时,else的子句不会被执行。
【例2-4】while...else语句实例演示。
i =1 while i < 6: print(i, "< 6") i+=1 # 循环计数作为循环判定条件 else: print(i, "不小于 6")
程序的运行结果如图2-8所示。
当程序改为如下代码时:
i =1 while i < 6: print(i, "< 6") i+=1 # 循环计数作为循环判定条件 if i == 5: # 当i=5时,循环结束 break else: print(i, "不小于 6")
程序的运行结果如图2-9所示。
图2-8 while...else显示结果(1)
图2-9 while...else显示结果(2)
可以看出,当i=5时程序跳出循环,并不会执行else下面的子句。
2.4.3 for循环
当我们想在程序中实现计数循环时,一般会采用for循环。在Python中,for循环是一个通用的序列迭代器,可以遍历任何有序的序列对象的元素。
1.for循环的格式
for语句的一般格式为:
for 目标变量 in 序列对象: 语句块
for语句定义了目标变量和需要遍历的序列对象,接着的是缩进对齐的语句块作为for循环的循环体。其具体执行过程如图2-10所示。
图2-10 for循环执行结构
for循环首先将序列中的元素依次赋给目标变量,每赋值一次都要执行一次循环体中的代码。当序列的每一个元素都被遍历过后,循环结束。
2.range在for循环中的应用
for循环经常和range联用。range是Python 3.x内部定义的一个迭代器对象,可以帮助for语句定义迭代对象的范围。其基本格式为:
range(start,stop[,step])
range的返回值从start开始,到stop结束,以step为步长,step为可选参数,默认为1。
【例2-5】for循环与range的联用。
for i in range(1,10): print(i,end=' ') # end=表示输出结果不换行
输出结果如图2-11所示。
参数改为间隔输出,代码如下:
for i in range(1,10,2): print(i,end=' ')
输出结果如图2-12所示。
图2-11 for循环一次显示结果
图2-12 for循环间隔输出显示结果
【例2-6】利用for循环求1~100中所有可以被4整除的数的和。
sum_4 =0 for i in range(1,100): # for循环,范围1~100 if i % 4==0: # 判定能否被4整除 sum_4 +=i print("1~100内能被4整除的数和为:", sum_4)
程序输出结果如图2-13所示。
图2-13 整除显示结果
2.4.4 break和continue
break语句和continue语句均是循环控制语句,可以改变循环的执行路径。
1.break语句
break语句多用于for、while循环的循环体中,作用是提前结束循环,即跳出循环体。当多层循环嵌套时,break只是跳出最近的一层循环。
【例2-7】使用break语句结束循环。
i =1 while i < 6: print("output number is ",i) i = i +1 # 循环计数作为循环判定条件 if i == 3: # i=3时结束循环 break print("输出结束")
运行结果如图2-14所示。
图2-14 break结束循环显示结果
【例2-8】判断所输入的任意一个正整数是否为素数。
素数是指除了1和该数本身以外不能被其他任何数整除的正整数。如果要判断一个正整数n是否为素数,只要判断其是否可以被2~之间的任何一个正整数整除即可,如果都不能则其为素数。
import math n = int(input("请输入一个正整数:")) k = int(math.sqrt(n)) # 求出输入整数的平方根后取整 for i in range(2,k+2): if n % i ==0: # 判断是否能被整除 break if i == k+1: print(n, "是素数") else: print(n, "不是素数")
程序的一次运行结果如图2-15所示。
程序的另一次运行结果如图2-16所示。
图2-15 素数判断不是素数运行结果
图2-16 素数判断是素数运行结果
2.continue语句
continue语句类似于break语句,必须在for和while循环中使用,但是,与break语句不同的是,continue语句仅仅是跳出本次循环,返回到循环条件判断处,并且根据判断条件来确定是否继续执行循环。
【例2-9】使用continue语句跳出循环。
i =0 while i < 6: i = i +1 if i == 3: # 当i=3时,跳出本次循环 continue print("output number is ",i) print("输出结束")
运行结果如图2-17所示。
图2-17 continue跳出循环显示结果
从图2-17中的输出结果可以看出,i=3时continue跳出了循环。
【例2-10】计算0~100之间不能被3整除的数的平方和。
sum_all = 0 for i in range(0,101): if i%3 ==0: continue # 条件成立时,跳出本次循环 else: sum_all = sum_all + i** 2 print("平方和为:", sum_all)
程序运行结果如图2-18所示。
图2-18 平方和显示结果