关于流程控制

Python 同样提供了现代编程语言都支持的两种基本流程控制结构,分支结构和循环结构:

  • 分支结构用于实现根据条件来选择性地执行某段代码;
  • 循环结构用于实现根据循环条件重复执行某段代码;

Python使用if语句提供分支支持,提供了whilefor-in循环,也提供了breakcontinue控制程序的循环结构。

在学习流程控制前,需要了解布尔、比较操作符等知识。

布尔值

虽然整型、浮点型和字符串数据类型有无数种可能的值,但“布尔”数据类型只有两种值:TrueFalse。Boolean(布尔)的首字母大写, 因为这个数据类型是根据数学家George Boole命名的。在作为Python代码输入时,布尔值TrueFalse不像字符串,两边没有引号,它们总是以大写字母TF开头, 后面的字母小写。

例如:

1
2
3
4
5
6
7
8
9
>>> 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

比较操作符

比较操作符比较两个值,求值为一个布尔值。

以下是操作符及其含义,这些操作符根据给它们提供的值,求值为TrueFalse

操作符 含义
== 等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于

Tips:整型或浮点型的值永远不会与字符串相等。<><=>=操作符仅用于整型和浮点型值。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 33 == 33
True
>>> 33 != 33
False
>>> 33 != 34
True
>>> 33 < 34
True
>>> 33 > 34
False
>>> 33 > 32
True

布尔操作符

3 个布尔操作符(andornot)用于比较布尔值。

二元布尔操作符

andor操作符总是接受两个布尔值(或表达式),所以它们被认为是元操作符。如果两个布尔值都为Trueand操作符就将表达式求值为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

混合布尔和比较操作符

既然比较操作符求值为布尔值,就可以和布尔操作符一起,在表达式中使用。

例如:

1
2
3
4
5
6
>>> (2 < 3) and (22 > 1)
True
>>> (2 > 3) and (22 > 1)
False
>>> (1 == 2) or (3 == 3)
True

Tips:和算术操作符一样,布尔操作符也有操作顺序。在所有算术和比较操作符求值后,Python先求值not操作符,然后是and操作符,然后是or操作符。

控制流的元素

控制流语句的开始部分通常是条件,接下来是一个代码块,称为子句

条件

你前面看到的布尔表达式可以看成是条件,它和表达式是一回事。条件只是在控制流语句的上下文中更具体的名称。条件总是求值为一个布尔值,TrueFalse。控制流语句根据条件是 True 还是 False,来决定做什么。 几乎所有的控制流语句都使用条件。

代码块

一些代码行可以作为一组, 放在代码块 中。 可以根据代码行的缩进,知道代码块的开始和结束。代码块有 3 条规则:

  • 缩进增加时, 代码块开始;
  • 代码块可以包含其他代码块;
  • 缩进减少为零,或减少为外面包围代码块的缩进,代码块就结束了;

if语句

选择(条件)语句可细分为3种形式,分别是if语句、if-else语句和if-elif-else语句。

if语句

1
2
if 条件表达式:
代码块

image

if-else语句

1
2
3
4
if 表达式:
代码块 1
else
代码块 2

image

if-elif-else语句

1
2
3
4
5
6
7
8
9
if 表达式 1
代码块 1
elif 表达式 2
代码块 2
elif 表达式 3
代码块 3
...
else
代码块 n

image

练习

英制单位英寸与公制单位厘米互换

1
2
3
4
5
6
7
8
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。

1
2
3
4
5
6
7
8
9
10
11
12
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语句的条件为Truewhile子句中的代码就会执行。在代码中,while语句总是包含下面几部分:

  • 关键字;
  • 条件(求值为TrueFalse的表达式);
  • 冒号;
  • 从新行开始,缩进的代码块(称为while子句)。

语法格式

语法格式如下:

1
2
while 条件表达式:
代码块

image

while循环中,条件总是在每次迭代开始时检查(也就是每次循环执行时)。如果条件为True, 子句就会执行,然后,再次检查条件。当条件第一次为False时,while子句就跳过。

例如:

1
2
3
4
spam = 0
while spam < 5:
print('hello world')
spam += 1

练习

猜数字游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()函数来实现。

常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。

语法格式

语法格式如下:

1
2
for 迭代变量 in 字符串|列表|元组|字典|集合:
代码块

在使用for循环时,最基本的应用就是进行数值循环。比如说,想要实现从1到100的累加,可以执行如下代码:

1
2
3
4
5
6
7
print("计算 1+2+...+100 的结果为:")
# 保存累加结果的变量
result = 0
# 逐个获取从 1 到 100 这些值,并做累加操作
for i in range(101):
result += i
print(result)

运行结果如下:

1
2
计算 1+2+...+100 的结果为:
5050

Tips:range(101)可以用来产生0到100范围的整数,需要注意的是取不到101。

练习

1~100之间的偶数求和

1
2
3
4
sum = 0
for x in range(2, 101, 2):
sum += x
print(sum) # Returns '2550'

输入一个正整数判断它是不是素数

1
2
3
4
5
6
7
8
9
10
11
12
13
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,系统就将完全结束该循环,开始执行循环之后的代码。

例如:

1
2
3
4
5
for i in range(0, 10) :
print("i的值是: ", i)
if i == 2 :
# 执行该语句时将结束循环
break

运行的结果为:

1
2
3
i的值是:  0
i的值是: 1
i的值是: 2

continue语句

break语句相比,continue语句的作用则没有那么强大,它只能终止本次循环而继续执行下一次循环。

例如:

1
2
3
4
5
6
for i in range(0, 3 ) :
print("i的值是: ", i)
if i == 1 :
# 忽略本次循环的剩下语句
continue
print("continue后的输出语句")

运行结果如下:

1
2
3
4
5
i的值是:  0
continue后的输出语句
i的值是: 1
i的值是: 2
continue后的输出语句