机器学习:基于OpenCV和Python的智能图像处理
上QQ阅读APP看书,第一时间看更新

2.4 选择与循环

在Python中,选择与循环都是比较重要的控制流语句。选择结构可以根据给定的条件是否满足来决定程序的执行路线,这种执行结构在求解实际问题时被大量使用。根据程序执行路线的不同,选择结构又可以分为单分支、双分支和多分支三种类型。要实现选择结构,就要解决条件表示问题和结构实现问题。而循环结构也是类似,需要有循环的条件和循环所执行的程序(即循环体)。

2.4.1 if语句

最常见的控制流语句是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表达式3(条件3):
        语句块3
    ……
    elif表达式m(条件m):
        语句块m
    [else:
        语句块n]

其执行过程如图2-3所示。

图2-3 多分支if语句执行过程

回到上面的例子。当判断名字是否为“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("请输入学生成绩:"))#inputPython内置函数
    # if多支结构,判断输入学生成绩属于哪一级
    ifscore>90:
        print("优秀")
    elif score > 80:
        print("良好")
    elifscore>60:
        print("及格")
    else:
        print("不及格")

程序的一次运行结果如图2-4所示。

图2-4 学生成绩等级判定结果1

另外一次的运行结果如图2-5所示。

图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,如果为True,则重复执行循环体中的代码,直到结果为False,退出循环。


注意 在Python中,循环体的代码块必须用缩进对齐的方式组成语句块。


【例2-2】 利用while循环求1~99的数字和。

    i = 1
    sum_all = 0
    while i <=100:                #i<=100时,条件为True,执行循环体的语句块
        sum_all += i              #i进行累加
        i += 1                    # i每次循环都要+1,这也是循环退出的条件
    print(sum_all)                #输出累加的结果
    运行结果为:4950


注意 在使用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所示。

图2-8 while…else运行结果1

当程序改为如下代码时:

    i=1
    whilei<6:
        print(i, "< 6")
        i+=1#循环计数作为循环判定条件
        ifi==5:#i=5时,循环结束
            break
    else:
        print(i, "不小于 6")

程序的运行结果如图2-9所示。

图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开始,以step为步长,到stop结束,step为可选参数,默认为1。

【例2-5】 for循环与range的联用。

    for i in range(1,10):
        print(i, end=' ')      # end=表示输出结果不换行

输出结果如图2-11所示。

图2-11 for循环运行结果1

参数改为间隔输出:

    for i in range(1,10,2):
        print(i, end=' ')

输出结果如图2-12所示。

图2-12 for循环运行结果2

【例2-6】 利用for循环求1~100中所有可以被4整除的数的和。

    sum_4 =0
    foriinrange(1,101):#for循环,范围为1~100
        ifi%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是否为素数,只要判断其是否可以被之间的任何一个正整数整除即可,如果不能整除则为素数。

    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-15 素数判断运行结果1

程序的另一次运行结果如图2-16所示。

图2-16 素数判断运行结果2

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中的输出结果可以看出,continue跳出了i=3时的循环。

【例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 平方和显示结果