学习目标

掌握布尔表达式
掌握条件表达式
掌握while循环
掌握for循环
掌握循环中的break,continue和else语句

程序控制结构

Python程序中的语句默认是按照书写顺序一次被执行的,这时我们说这样的语句是顺序结构的。
在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一条语句就自动执行下一条语句,语句之间的执行是不作任何判断的,无条件的。
有时候我们需要根据特定的情况,有选择地执行某些语句,这时我们就需要一种选择结构的语句。
有时候我们还可以在给定条件下重复执行某些语句,这时我们称这些语句是循环结构的。
有了顺序、选择和循环这三种基本的结构,我们就能够构建任意复杂的程序了。

布尔表达式

选择结构和循环结构都会使用布尔表达式作为选择的条件和循环的条件。
布尔表达式是由关系运算符和逻辑运算符按一定语法规则组成的式子。
关系运算符有:<、<=、==、>、>=、!=。
逻辑运算符有:and、or、not。
布尔表达式的值只有两个,True和False。
在Python中False、None、0、””、()、[]、{}作为布尔表达式的时候,会被解释器看作假(False)。其他的一切都被解释为真,包括特殊值True。
一个布尔变量可以代表True或False值中的一个。bool函数可以用来(和list、str以及tuple一样)转换其他值。

  1. print(type(True))
  2. print(bool('Practice makes perfect.'))
  3. print(bool(''))
  4. print(bool(4))
  5. '''
  6. <class 'bool'>
  7. True
  8. False
  9. True
  10. '''

Python不同于其他语言,布尔表达式中不能使用赋值运算符“=”,否则会抛出异常。

选择结构

选择结构通过判断某些特定条件是否满足来决定下一步执行哪些语句。
Python有多重选择语句类型:

  • 单向if语句
  • 双向if-else语句
  • 嵌套if语句
  • 多向if-elif-else语句
  • 条件表达式
    1. if 条件表达式:
    2. 满足条件时要执行的语句块

    注意:同一个语句块的所有语句缩进相同。

第五章 流程控制 - 图1
if语句的语句块只有当表达式的值为真,即非零时,才会执行;否则的话,程序就会直接跳过这个语句块,去执行紧跟在这个语句块之后的语句。
这里的语句块,既可以包含多条语句,也可以只有一条语句。当语句块由多条语句组成时,要有统一的缩进形式,相对于if向右至少缩进一个Tab键,否则就会出现逻辑错误,即语法检查没错,但是结果却非预期。

  1. math = 65
  2. print('开始进入if语句并判断表达式的值是否为True')
  3. if math >= 85:
  4. print('数学成绩优秀')
  5. print('if语句运行结束')
  6. '''
  7. 开始进入if语句并判断表达式的值是否为True
  8. if语句运行结束
  9. '''

if-else语句是一种双选结构,根据表达式是真还是假来决定执行哪些语句,它选择的不是做与不做的问题,而是在两种备选操作中选择哪一个操作的问题。

  1. if 布尔表达式:
  2. 语句块1
  3. else:
  4. 语句块2

第五章 流程控制 - 图2

  1. day = "正月初一"
  2. if day == "年三十":
  3. pritn('今天是除夕')
  4. else:
  5. print('过年了')
  6. print('可以拿压岁钱了')
  7. '''
  8. 过年了
  9. 可以拿压岁钱了
  10. '''

将一个if语句放在另一个if语句中就形成了一个嵌套if语句。
如果需要在多组操作中选择一组执行,就会用到多选结构,就二十if-elif-else语句。
虽然if-elif-else语句的备选操作较多,但是有且只有一组操作被执行。

  1. if 表达式1:
  2. 语句1
  3. elif 表达式2:
  4. 语句2
  5. ......
  6. else:
  7. 语句块n

第五章 流程控制 - 图3

  1. # 编写程序利用多分支选择结构将成绩从百分制变换到等级制。
  2. score = float(input('请输入一个分数:'))
  3. if score >= 90.0:
  4. grade = 'A'
  5. elif score >= 80.0:
  6. grade = 'B'
  7. elif score >= 70.0:
  8. grade = 'C'
  9. elif score >= 60.0:
  10. grade = 'D'
  11. else:
  12. grade = 'F'
  13. print(("祝贺你已经完成成绩分级!你的成绩等级是:") + grade)
  14. '''
  15. 请输入一个分数:33
  16. 祝贺你已经完成成绩分级!你的成绩等级是:F
  17. '''

给一个变量赋值,但又受一些条件的限制时,可以考虑用条件表达式。

  1. 表达式1 if 布尔表达式 else 表达式2

如果布尔表达式为真,那么这个条件表达式的结果就是表达式1;否则, 这个结果就是表达式2。

  1. max = number1 if number1 > number2 else number2

循环结构

Python循环控制结构:

  • while循环
  • for循环

while循环一般用于循环次数难以提前确定的情况,也可以用于循环次数确定的情况。
for循环一般用于循环次数可以提前确定的情况,尤其是用于枚举序列或迭代对象中的元素。

while循环

while语句用于在某条件下循环执行某段程序,以处理需要重复处理的任务。

  1. while 循环继续条件:
  2. 循环体

循环体可以是一个单一的语句或一组具有统一缩进的语句。
第五章 流程控制 - 图4

注意:要确保循环继续条件最终变成False以便结束循环。编写循环程序时,常见的程序设计错误是循环继续条件总是为True,循环变成死循环。

  1. i = 1
  2. print("1~100之间能被5整除,但不能同时被3整除的所有数是:")
  3. while i <= 100:
  4. if i % 5 == 0 and i % 3 != 0:
  5. print(i, end = ' ')
  6. i += 1
  7. '''
  8. 1~100之间能被5整除,但不能同时被3整除的所有数是:
  9. 5 10 20 25 35 40 50 55 65 70 80 85 95 100
  10. '''

要想编写一个能够正确工作的while循环,需要考虑以下三步:

  1. 确认需要循环的循环体语句,即确定重复执行的语句序列。
  2. 把循环体语句放在循环体内。
  3. 编写循环继续条件,并添加合适的语句以控制循环能在有限步内结束,即能使循环继续条件的值变为False。

    for循环

    for循环是一种遍历型的循环,因为它会一次对某个序列中全体元素进行遍历,遍历完所有元素之后遍终止循环。
    1. for <循环变量> in <可迭代对象或迭代器>
    2. 循环体
    这里的关键词in是for循环的组成部分,而非运算符in。
    “可遍历序列”里保存了多个元素,且这些元素按照一个接一个的方式存储。
    “可遍历序列”被遍历处理,每次循环时,都会将“控制变量”设置为“可遍历序列”的当前元素,然后执行循环体。当“可遍历序列”中的元素被遍历一遍后,即没有元素可供遍历时,退出循环。
    第五章 流程控制 - 图5

    “遍历序列”可以是列表、元组、字典、集合、文件,甚至可以是自定义类或者函数。

  1. test_tuple = [("a", 1), ("b", 2), ("c", 3), ("d", 4)]
  2. print("准备遍历的元组列表:", test_tuple)
  3. print("遍历列表中的每一个元组:", end = '')
  4. for i, j in test_tuple:
  5. print(i, j, end = ',')
  6. '''
  7. 准备遍历的元组列表: [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
  8. 遍历列表中的每一个元组:a 1,b 2,c 3,d 4,
  9. '''
  1. person = {'姓名':'李明', '年龄':'26', '籍贯':'北京'}
  2. # item()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。
  3. for key, value in person.items():
  4. print('key=', key, ', value=', value)
  5. # 只有一个控制变量时,返回的是每一对key,value对应的元组
  6. for x in person.items():
  7. print(x)
  8. # 不使用items(),只能取得每一对元素的key值
  9. for x in person:
  10. print(x)
  11. '''
  12. key= 姓名 , value= 李明
  13. key= 年龄 , value= 26
  14. key= 籍贯 , value= 北京
  15. ('姓名', '李明')
  16. ('年龄', '26')
  17. ('籍贯', '北京')
  18. 姓名
  19. 年龄
  20. 籍贯
  21. '''
  1. weekdays = {'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'}
  2. # for循环在遍历set时,元素的顺序和list的顺序很可能是不同的
  3. for d in weekdays:
  4. print(d, end = ' ')
  5. '''
  6. THU SAT TUE FRI SUN MON WED
  7. '''

for循环在遍历set时,元素的顺序和list的顺序很可能是不同的

  1. fd = open('c:\\Python\\1.txt', encoding = 'utf-8')
  2. for line in fd:
  3. print(line, end = '')
  4. fd.close()

else子句常见语法

  1. for <循环变量> in <可迭代对象或迭代器>:
  2. 循环体
  3. else:
  4. 代码块
  1. while 条件表达式:
  2. 循环体
  3. else:
  4. 代码块
  1. count = 0
  2. while count < 5:
  3. print(count, "is less than 5")
  4. count += 1
  5. else:
  6. print(count, "is not less than 5")
  7. '''
  8. 0 is less than 5
  9. 1 is less than 5
  10. 2 is less than 5
  11. 3 is less than 5
  12. 4 is less than 5
  13. 5 is not less than 5
  14. '''
  1. # 鸡兔同笼问题:假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只
  2. for ji in range(1, 30):
  3. if 2 * ji + (30 - ji) * 4 == 90:
  4. print('鸡:', ji, '兔:', 30 - ji)
  5. '''
  6. 鸡: 15 兔: 15
  7. '''

循环结构的优化

在编写循环语句时,应该尽量减少循环内部不必要的计算,将与循环变量无关的代码尽可能放到循环体的外面。

  1. digits = (1, 2, 3, 4)
  2. result = []
  3. for i in range(1000):
  4. for i in digits:
  5. for j in digits:
  6. for k in digits:
  7. # i, j, k各执行1000 * 4 **3次
  8. result.append(i * 100 + j * 10 + k)
  1. digits = (1, 2, 3, 4)
  2. result = []
  3. for i in range(1000):
  4. for i in digits:
  5. # i执行1000 * 4次
  6. i = i * 100
  7. for j in digits:
  8. # j执行1000 * 4 **2次
  9. j = j * 10
  10. for k in digits:
  11. # k执行1000 * 4 ** 3次
  12. result.append(i + j + k)

for循环与range()函数的结合使用

range()函数用来生成整数数字数列,其语法格式如下: :::info range(start, stop[, step])
参数说明:

  • start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5)
  • end:计数到end结束,但不包括end。例如:range(0, 5)是[0, 1, 2, 3, 4]没有5,。
  • step:步长,默认为1。例如range(0, 5)等价于range(0, 5, 1)。 :::

    range(5)的返回值类型是range类型,如果想得到一个列表,使用list(range(5))得到的就是一个列表[0, 1, 2, 3, 4]。如果想得到一个元组,使用tuple(range(5))得到的就是一个元组(0, 1, 2, 3, 4)。

  1. '''
  2. 斐波那契数列:1、1、2、3、5、8、13、21、34、……,可通过递归的方法定义:F(1) = 1, F(2) = 1, F(n) = F(n - 1) + F(n - 2)(n >= 3, n∈N*)。
  3. '''
  4. a, b = 1, 1
  5. n = int(input('请输入斐波那契数列的项数(>2的整数):'))
  6. print('前%d项斐波那契数列为:'%(n), end = '')
  7. print(a, b, end = ' ')
  8. for k in range(3, n + 1):
  9. c = a + b
  10. print(c, end = ' ')
  11. a = b
  12. b = c
  13. '''
  14. 请输入斐波那契数列的项数(>2的整数):10
  15. 前10项斐波那契数列为:1 1 2 3 5 8 13 21 34 55
  16. '''

break和continue语句

break和continue都是循环控制关键字,为循环结构提供额外的控制。
break和continue可以与for和while循环搭配使用。
break和continue只能在循环中使用,不能单独使用。
在嵌套循环中,break和continue只对最近的一层循环起作用。
break语句用来终止循环语句,即循环条件没有False或序列还没被完全遍历完,也会停止执行循环语句。如果使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。
continue语句终止当前迭代而进行循环的下一次迭代。
循环语句也可以带有else子句,else子句在序列遍历结束(for语句)或循环条件为假(while语句)时执行,但循环被break终止时不执行。

  1. '''
  2. 求i除以2的余数,如果余数为0结束当次循环,继续执行后续循环;如果余数不为0则打印i,并判断如果i >= 7就结束整个循环,执行循环后语句。
  3. '''
  4. for i in range(10):
  5. if i % 2 == 0:
  6. continue
  7. print(i, end = ',')
  8. if i >= 7:
  9. # 由于break会提前跳出循环体,所以else子句不会得到执行
  10. break
  11. else:
  12. print('循环结束')
  13. '''
  14. 1,3,5,7,
  15. '''

总结

条件语句if可以引入单个分支的条件,也可以结合elif或else等语句实现多分支的条件。
Python支持while循环和for循环。
应注意Python对语句的嵌入式要求,程序块内的多行代码应采用相同的嵌入方式保证各行的语句是对齐的。