Python:流程控制
Tips:本文中代码均使用
3.8.x
版本的Python。部分文字和图片源自网络,侵删。
关于流程控制
Python 同样提供了现代编程语言都支持的两种基本流程控制结构,分支结构和循环结构:
- 分支结构用于实现根据条件来选择性地执行某段代码;
- 循环结构用于实现根据循环条件重复执行某段代码;
Python使用if
语句提供分支支持,提供了while
、for-in
循环,也提供了break
和continue
控制程序的循环结构。
在学习流程控制前,需要了解布尔、比较操作符等知识。
布尔值
虽然整型、浮点型和字符串数据类型有无数种可能的值,但“布尔”数据类型只有两种值:True
和False
。Boolean(布尔)的首字母大写, 因为这个数据类型是根据数学家George Boole命名的。在作为Python代码输入时,布尔值True
和False
不像字符串,两边没有引号,它们总是以大写字母T或F开头, 后面的字母小写。
例如:
>>> 2==2
True
>>> a=true
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'true' is not defined
>>> a=True
>>> a
True
比较操作符
比较操作符比较两个值,求值为一个布尔值。
以下是操作符及其含义,这些操作符根据给它们提供的值,求值为True
或False
。
操作符 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
Tips:整型或浮点型的值永远不会与字符串相等。
<
、>
、<=
和>=
操作符仅用于整型和浮点型值。
例如:
>>> 33 == 33
True
>>> 33 != 33
False
>>> 33 != 34
True
>>> 33 < 34
True
>>> 33 > 34
False
>>> 33 > 32
True
布尔操作符
3 个布尔操作符(and
、or
和not
)用于比较布尔值。
二元布尔操作符
and
和or
操作符总是接受两个布尔值(或表达式),所以它们被认为是二元操作符。如果两个布尔值都为True
,and
操作符就将表达式求值为True
,否则求值
为False
。
操作符and
的真值表
表达式 | 求值为 |
---|---|
True and True | True |
True and False | False |
False and True | False |
False and False | False |
or
操作符的真值表
表达式 | 求值为 |
---|---|
True or True | True |
True or False | True |
False or True | True |
False or False | False |
not操作符
not
操作符只作用于一个布尔值(或表达式)。not
操作符求值为相反的布尔值。
not
操作符的真值表
表达式 | 求值为 |
---|---|
not True | False |
not False | True |
混合布尔和比较操作符
既然比较操作符求值为布尔值,就可以和布尔操作符一起,在表达式中使用。
例如:
>>> (2 < 3) and (22 > 1)
True
>>> (2 > 3) and (22 > 1)
False
>>> (1 == 2) or (3 == 3)
True
Tips:和算术操作符一样,布尔操作符也有操作顺序。在所有算术和比较操作符求值后,Python先求值
not
操作符,然后是and
操作符,然后是or
操作符。
控制流的元素
控制流语句的开始部分通常是条件,接下来是一个代码块,称为子句。
条件
你前面看到的布尔表达式可以看成是条件,它和表达式是一回事。条件只是在控制流语句的上下文中更具体的名称。条件总是求值为一个布尔值,True
或False
。控制流语句根据条件是 True 还是 False,来决定做什么。 几乎所有的控制流语句都使用条件。
代码块
一些代码行可以作为一组, 放在代码块 中。 可以根据代码行的缩进,知道代码块的开始和结束。代码块有 3 条规则:
- 缩进增加时, 代码块开始;
- 代码块可以包含其他代码块;
- 缩进减少为零,或减少为外面包围代码块的缩进,代码块就结束了;
if语句
选择(条件)语句可细分为3种形式,分别是if
语句、if-else
语句和if-elif-else
语句。
if语句
if 条件表达式:
代码块
if-else语句
if 表达式:
代码块 1
else:
代码块 2
if-elif-else语句
if 表达式 1:
代码块 1
elif 表达式 2:
代码块 2
elif 表达式 3:
代码块 3
...
else:
代码块 n
练习
英制单位英寸与公制单位厘米互换
value = float(input('请输入长度: '))
unit = input('请输入单位: ')
if unit == 'in' or unit == '英寸':
print('%f英寸 = %f厘米' % (value, value * 2.54))
elif unit == 'cm' or unit == '厘米':
print('%f厘米 = %f英寸' % (value, value / 2.54))
else:
print('请输入有效的单位')
百分制成绩转换为等级制成绩。
要求:如果输入的成绩在90分以上(含90分)输出A;80分-90分(不含90分)输出B;70分-80分(不含80分)输出C;60分-70分(不含70分)输出D;60分以下输出E。
score = float(input('请输入成绩: '))
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
elif score >= 60:
grade = 'D'
else:
grade = 'E'
print('对应的等级是:', grade)
while语句
利用while
语句,可以让一个代码块一遍又一遍的执行。只要while
语句的条件为True
,while
子句中的代码就会执行。在代码中,while
语句总是包含下面几部分:
- 关键字;
- 条件(求值为
True
或False
的表达式); - 冒号;
- 从新行开始,缩进的代码块(称为
while
子句)。
语法格式
语法格式如下:
while 条件表达式:
代码块
在while
循环中,条件总是在每次迭代开始时检查(也就是每次循环执行时)。如果条件为True
, 子句就会执行,然后,再次检查条件。当条件第一次为False
时,while
子句就跳过。
例如:
spam = 0
while spam < 5:
print('hello world')
spam += 1
练习
猜数字游戏
import random
answer = random.randint(1, 100)
counter = 0
while True:
counter += 1
number = int(input('请输入: '))
if number < answer:
print('大一点')
elif number > answer:
print('小一点')
else:
print('恭喜你猜对了!')
break
print('你总共猜了%d次' % counter)
if counter > 7:
print('你的智商余额明显不足')
for语句
在条件为True
时,while
循环就会继续循环(这是它的名称的由来)。但如果你想让一个代码块执行固定次数,该怎么办?可以通过for
循环语句和range()
函数来实现。
常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。
语法格式
语法格式如下:
for 迭代变量 in 字符串|列表|元组|字典|集合:
代码块
在使用for
循环时,最基本的应用就是进行数值循环。比如说,想要实现从1到100的累加,可以执行如下代码:
print("计算 1+2+...+100 的结果为:")
# 保存累加结果的变量
result = 0
# 逐个获取从 1 到 100 这些值,并做累加操作
for i in range(101):
result += i
print(result)
运行结果如下:
计算 1+2+...+100 的结果为:
5050
Tips:
range(101)
可以用来产生0到100范围的整数,需要注意的是取不到101。
练习
1~100之间的偶数求和
sum = 0
for x in range(2, 101, 2):
sum += x
print(sum) # Returns '2550'
输入一个正整数判断它是不是素数
from math import sqrt
num = int(input('请输入一个正整数: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
if num % x == 0:
is_prime = False
break
if is_prime and num != 1:
print('%d是素数' % num)
else:
print('%d不是素数' % num)
break语句
有一个捷径,让执行提前跳出while
循环子句。如果执行遇到break
语句,就会马上退出while
循环子句。在代码中,break
语句仅包含break
关键字。
break
用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break
,系统就将完全结束该循环,开始执行循环之后的代码。
例如:
for i in range(0, 10) :
print("i的值是: ", i)
if i == 2 :
# 执行该语句时将结束循环
break
运行的结果为:
i的值是: 0
i的值是: 1
i的值是: 2
continue语句
和break
语句相比,continue
语句的作用则没有那么强大,它只能终止本次循环而继续执行下一次循环。
例如:
for i in range(0, 3 ) :
print("i的值是: ", i)
if i == 1 :
# 忽略本次循环的剩下语句
continue
print("continue后的输出语句")
运行结果如下:
i的值是: 0
continue后的输出语句
i的值是: 1
i的值是: 2
continue后的输出语句