python流程控制

前言:

经过简单的了解python基本语法和使用后,发现其都是一些顺序执行语句,也就是依次执行,没有任何的分支,循环,也不会返回到以前的执行语句-流程控制。在实际使用中,当然不可避免使用到流程控制语句,但其都要由逻辑表达式进行控制,因此先行介绍一下布尔逻辑。

1. 布尔逻辑

什么是布尔逻辑?

简单来讲,布尔逻辑就是操作真值。相比大多数编程语言一样,Python也使用布尔逻辑来做决策判断,使用True和False表示。一般经常使用的有4个布尔逻辑运算符,not、and、or、==。在Python语言的使用中,几乎所有判断决策都可以使用这四个逻辑运算符表示。首先我们计算布尔逻辑可能产生的值,假设a,b两个变量,那么对于它们来讲就有四个非真即假的组合,如下表:F表示FALSE,T表示TRUE

a

b

a==b

a!=b

a and b

a or b

not b

F

F

T

F

F

F

T

F

T

F

T

F

T

T

T

F

F

T

F

T

F

T

T

T

F

T

T

F

通过代码直观感受下布尔逻辑计算的结果:

==(逻辑相等), 当 a 和 b 包含的真 值相同,即都为 True 或都为 False 时,表达 式 a==b 的结果才为 True

!= (逻辑不等)

and(逻辑与), 仅当a和b都为 True 时,布尔表达式的 结果才为 True,而在其他情况下都为 False

or(逻辑或), 仅当a和b至少有一个为 True 时,布尔表达式 a or b 才为 True

not(逻辑非),不真即为假,不假即为真

有计算的地方,就会涉及到计算的优先级,对于布尔运算的优先级,规则如下

优先级由高到低:

a==ba != bnot aa and ba or b

举个例子: not True and False or True,执行结果如下图True。可以看到其执行顺序为not True,在计算(not Ture) and False,最后是or,那么我们来简化下,这个求值结果是不是就是计算 False and False or True 。这也算是优化的一小步!当然,我们根据上面的表在考虑一下:and的优先级高于or,故而计算False and False 等价于 False。那么最后的表达式也就是计算 False or True。

我们随机在上一个表达式中添加括号,以图查看括号对布尔表达式计算的影响。同时,当布尔逻辑表达式用于循环语句或者if条件语句时,也会经常遇到包含括号的表达式。如下图:

所以,当需要使用比较复杂的布尔逻辑表达式的时候,需要特别注意括号的使用!

  • 了解了布尔逻辑的规则,Python同其它语言一样,使用了一定的方法,提高了布尔表达式的计算速度,这个方法被称为:短路求值。
  • 有兴趣的话可以自行深入了解下实现原理

运算规则

运算结果

a or b

如果 a 为 False,结果为 b,否则结果为 a

a and b

如果 a 为 False,结果为 a,否则结果为 b

这个逻辑表达式是Python使用者经常用到的,直观来讲,以 True or Any 为例,不论这个Any为什么值,其表达式结果都是True。同理,False and Any 的结果为False。但切记,逻辑好用的同时也会对代码产生可读性不好的体验感,可以用下面提到的if条件语句来实现运算规则体验一下!

1.1 条件控制语句-if

if-条件控制语句,它的作用是使得代码程序在执行的时候按照一定的条件进行决策改变。对于文本处理、脚本开发、网站开发、数据科学等各个方向的研究实现,几乎都会使用到if语句。

1.2 if/else 语句

假设有个简单的小需求:开机需要用户输入用户名和密码,如果正确则让其登录,如果不正确告知密码不正确。

if __name__ == "__main__":

    while True:
        scan_user = input("please input your name: ")
        scan_pass = input("please input your passwd: ")
        if scan_pass == "if/else":
            print("Logging on now!")
        else:
            print("your passwd is incorrect!!")
        print("我不在if/else语句中!")


执行结果:

可以看到,如果变量scan_pass指向的字符串为"if/else",就会显示登录成功,如果不是,变量为任何值都会提示密码错误。

由此,我们来画一个if/else的基本语句结构:

在Python的使用中,通常会将 : 用作 if 语句头、循环头和函数头的结束标记。并且,其中的代码块可以包含任意数量的Python语句和其它if语句。在Python编程中,同样需要缩进代码块,不过与其它语言为了美观相比,Python必须使用缩进来表示一段代码块的所属。如上面那段示例的最后一行代码,并不在else语句中。

1.3 if/elif 语句

if/elif 语句是if/else语句的扩充,很多逻辑的实现不会仅仅只包含两个条件,它可能包含多个条件。比如某商场设定的一些优惠条件:满200打八折,满400打六折,满800超出400的部分打五折等等。

这样的代码实现如下:

if __name__ == "__main__":
    
    while True:
        consumer = int(input("请输入您的消费金额:"))
        money = 0
        if 200 <= consumer < 400:
            money = consumer * 0.8
            print("您的消费金额是:" + str(money))
        elif 400 <= consumer < 800:
            money = consumer * 0.6
            print("您的消费金额是:" + str(money))
        elif consumer >= 800:
            money = 400 * 0.6 + (consumer - 400) * 0.5
            print("您的消费金额是:" + str(money))

当输入消费金额之后,程序进入if/elif 语句,按照指定顺序依次进行判断,首先对消费金额进行大于200并小于400的判断,然后计算出此次消费金额,跳出语句,以此类推。需要注意的是: elif 是 else if 的缩写,编写时可以随意使用,但是每个代码块的缩进必须相同。

if/else 语句还有一个比较简单的写法,是一种有人喜欢有人不喜欢的写法。

通常如下:主要看response那一行代码,这行代码就等价于下面的if/else代码块。

if __name__ == "__main__":

    color = input("请问您最喜欢什么颜色?")
    response = "blue" if color == "red" else "black"
    print(response)
if __name__ == "__main__":

    color = input("请问您最喜欢什么颜色?")
    if color == "red":
        like = "blue"
    else:
        like = "black"


条件表达式通常比等价的 if/else 语句简短,但并非总是与 if/else 语句一样灵活和易于理解。一般而言,仅当条件表达式可让代码更简单时才会使用。

2 循环控制语句

上面的条件控制主要决策执行哪一段代码块,在编写代码时也会涉及到重复的执行某一段代码,这时就会用到循环控制语句。在每种语言的使用中,通常会用到的就是for循环和while循环两种循环控制语句。此处加个小说明:无论老师讲课还是日常使用中,经常会用到变量i,因为它是index的缩写。当开始使用循环语句的时候, 通常将 j 和 k 用作其他循环变量名。

2.1 循环控制之for

假设我们需要在屏幕上依次打印数字0~9,此时我们可以使用循环语句实现,如下:for循环的第1行被称为for循环头。for 循环总是以关键字for打头,接下来是循环变量(这里为 i),然后是关键字 in。关键字 in 后面通常(但并非总是)是 range(n) 和结束符号 : 。for 循环重复执行循环体(循环头后面的语句块)n 次。

if __name__ == "__main__":

    for i in range(10):
        print(i)

每次执行循环时,循环变量都被设置为下一个值。默认情况下,初始值为 0,并逐步递增到 n-1(而不是 n)。

如果要修改循环的初始值,可在 range 中添加初始值:

if __name__ == "__main__":

    for i in range(1,10):
        print(i)
    #或者给变量i+1   
 for i in range(10):
   print(i + 1) 

如果需要按照相反的顺序打印,则可以按照以下两个方法:

if __name__ == "__main__":

    for i in range(10, 0, -1):
        print(i)
        
    for i in range(10):
    print(10 - i) 

for循环当然不止运用于循环打印,在实际编程中,根据不同的需要,其可以适用于任何类型的迭代中。例如,使用for循环读取文本的行数据或者向文本中写入数据等等。

2.2 循环控制之while

对于while循环,在本人的使用中,对比for,感受到for循环更容易使用,但其却没有while循环的灵活性。同样,我们循环打印一些数字:

if __name__ == "__main__":

    i = 0
    while i < 10:
        print(i)
        i = i + 1


该代码与for循环的执行结果是一样的,但是直观来看,while循环的代码块要稍微复杂一些。while 循环本身以关键字 while 打头,这 一行被称为 while 循环头,而它后面缩进的代码被称为 while 循环体。以这个例子我们画一个while循环的执行流程图,

如下:

可以总结一下, while 循环的控制流程:

1.Python 检查循环条件为 True 还是 False(就是之前所阐述的布尔表达式),

  • 如 果为 True,就执行循环体;
  • 如果为 False,就跳过循环体(即跳出循环)并执行后面的语句。

2. 在条件为 True 并执行循环体后,Python 再次检查条件。只要循环条件为 True,Python 就不断执行循环体,直到跳出。

示例程序的第 1 行为 i = 0,在循环语境下,i=0被称为初始化语句。与 for 循环那样自动初始化循环变量不同,由编程者负责给 while 循环使用的变量指定初始值。而循环体的最后一行为 i = i + 1,随着循环的进行,i 的值不断递增,确保循环终将终止。在 while 循环中,这一行被称为递增语句,在本例中作用是让循环变量进行递增。

这样看来,for循环不需要编程者去定义初始化语句和递增语句,但是在开发中,使用者通常会发现这些语句一旦不注意则会导致bug出现,这也是为什么说while循环要比for循环更加灵活。

while循环在使用测试时,通常还有一个特性便是无线循环执行,实现只需要一行代码while true,只要使用,那么其循环体便会持续执行下去。在实际生产中,最好使用for循环来代替这种用法!后续也会阐述一些跳出循环的语句来避免。

3 for vs while

使用三个简单的小例子来看下for循环和while循环是如何解决相同的问题,同时体会一下二者的不同,这可以让我们更好的应用在实际的编程中去。

3.1 对输入的数字求和

本案例输入一些数字,然后求出这些数字的总和。

for循环实现:

if __name__ == "__main__":

    num = int(input("需要计算多少个数字:"))
    sum = 0
    for i in range(num):
        n = input("输入第" + str(i + 1) + "个数字:")
        sum = sum + int(n)
    print("输入的数字总和为:" + str(sum))


while循环实现:

    num = int(input("需要计算多少个数字:"))
    sum = 0
    i = 1
    while i <= num:
        n = input("输入第" + str(i + 1) + "个数字:")
        sum = sum + int(n)
        i = i + 1
    print("输入的数字总和为:" + str(sum))


二者实现的结果如下:

案例中的程序都是将输入的数字固定在整数,如果用户输入的是浮点数,调用 int(s) 时将会报错。当然,要支持用户输入浮点数很容易, 只需将int(s)改为float(s)即可。

3.2 未知个数字的求和

这个案例需要注意,上面的案例无论使用for循环或者while循环都可以实现需求,但是这个案例可以体验一下for循环无法处理,但是while循环适用的情况。需求:假设输入一系列数字,同样计算总和,但是并不知道会输入多少个数字,并且在输入结束时,我们以done为标识。

if __name__ == "__main__":

    num = input("输入完成标识(or "done"):")
    sum = 0
    while num != "done":
        i = int(num)
        sum = sum + i
        num = input("输入完成标识(or "done"):")
    print("输入的数字总和为:" + str(sum))

结果示例1:

 

结果示例2:

试想一下,我们不知道会输入多少个数字,而是直到输入标识字符才会计算求和。这个代码块预先并不知道循环体执行多少次。

注意代码中的一些地方:

  • 1. 在循环体内,语句的排列顺序至关重要。如果循环条件为 True,就说明 num 不是 "done",所以假定它是一个整数。 因此,我们可以将它转换为整数,将其与总和相加。
  • 2. 必须在两个地方调用 input:循环前面及循环体内,因为循环条件判断输入是数字还是 "done"。
  • 3. 不再需要计数器变量 i。在上一个计算总和的示例中,i 用于记录输入了多少个数字。在日常使用中,程序包含的变量越少,越容易理解、调试和扩展。

3.3 阶乘计算

最后在体验一把二者都可以使用的情况:计算数字的阶乘,即1*2*3*4*...*n

if __name__ == "__main__":

    num = int(input("输入一个大于0的整数: "))
    k = 1;
    for i in range(2,num+1):
        k = k * i
    print(str(num) + "的阶乘值:" + str(k))

    num = int(input("输入一个大于0的整数: "))
    k = 1;
    i = 2;
    while i<=num:
        k = k * i;
        i = i + 1
    print(str(num) + "的阶乘值:" + str(k))

 

由于python对整数的最大取值没有限制,所以可以使用python来计算很大的阶乘值。

到此这篇关于python流程控制的文章就介绍到这了,更多相关python流程控制内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!