Python流程控制详解:布尔逻辑、条件语句与循环结构
本文深入解析Python流程控制机制,涵盖布尔逻辑运算符及其优先级、短路求值原理。详细讲解if、elif、else条件语句的结构与三元表达式用法,并对比for与while循环的执行流程、初始化及终止条件,通过求和与阶乘等实例展示不同场景下的最佳实践。
前言:
在初步掌握python基础语法后,我们发现代码通常按顺序依次执行,缺乏分支、循环或返回机制,这被称为流程控制。实际开发中,流程控制不可或缺,其核心在于通过逻辑表达式进行决策,因此首先需要理解布尔逻辑。
1. 布尔逻辑
什么是布尔逻辑?
简而言之,布尔逻辑用于操作真值。与大多数编程语言类似,Python利用布尔逻辑进行决策判断,使用True和False作为真值表示。常用的布尔逻辑运算符包括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。

!= (逻辑不等)


涉及计算时必然涉及优先级问题。布尔运算的优先级规则如下:
优先级由高到低:
a==b、a != b、not a、a and b、a or b
举例说明:not True and False or True的执行结果如图为True。执行顺序依次为not True,接着计算(not True) and False,最后执行or运算。简化后,该求值结果等同于计算False and False or True。这算是优化的一小步!此外,根据前述表格可知:and的优先级高于or,因此计算False and False等价于False。最终的表达式即计算False or True。

因此,当使用复杂的布尔逻辑表达式时,务必注意括号的使用!
- 了解布尔逻辑规则后,
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.在循环体内,语句的排列顺序至关重要。如果循环条件为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流程控制内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









