文章目录
- 第四章 程序的控制结构
- 4.1 程序的三种控制结构
- 4.1.1 程序流程图
- 4.1.2 程序控制结构基础
- 4.1.3 程序控制结构扩展
- 4.2 程序的多分支结构
- 4.2.1 单分支结构:if
- 4.2.2 二分支结构:if-else
- 4.2.3 多分支结构:if-elif-else
- 4.2.4 判断条件及组合
- 1、Python的关系操作符
- 2、保留字
- 4.3 程序的循环结构
- 4.3.1 遍历循环:for
- 4.3.2 无限循环:while
- 4.3.3 循环控制:break和continue
- 4.4 循环的异常处理
- 4.5 实例解析——猜数字游戏
- 习题4
- 一、选择题
- 二、编程题
第四章 程序的控制结构
4.1 程序的三种控制结构
4.1.1 程序流程图
程序流程图是一种表达程序控制结构的方式,主要用于关键部分的程序分析和过程描述,由一系列图形、流程线和文字说明等组成。
流程图包括7中基本元素:
各基本元素的含义如下:
- 起止框:表示程序逻辑的开始或结束
- 判断框:表示一个判断条件,并根据判断结果选择不同的执行路径
- 处理框:表示一组处理过程,对应于顺序执行的程序逻辑
- 输入/输出框:表示程序中的数据输入或结果输出
- 注释框:表示程序的注释
- 流向线:表示程序的控制流,以带箭头直线或曲线表达程序的执行路径
- 连接点:表示多个流程图的连接方式,常用于将多个较小流程图组织成较大流程图
4.1.2 程序控制结构基础
程序由3中基本结构组成:顺序结构、分支结构和循环结构。任何程序都由这3种基本结构组合而成。
顺序结构是程序按照先行顺序依次执行的一种运行方式。
分支结构是程序根据条件判断结果而选择不同向前执行路径的一种运行时方式。最基础的分支结构是二分支结构。二分支结构会组合形成多分支结构。
循环结构是程序根据条件判断结果向后执行的一种运行方式,根据循环体触发条件不同,包括条件循环和遍历循环结构。
4.1.3 程序控制结构扩展
在三种基本控制逻辑基础上,Python语言进行了必要且适当的扩展。
在分支结构原理的基础上,Python增加了异常处理,使用try-except保留字。
异常处理以程序异常为判断条件,根据一段代码执行的正确性进行程序逻辑选择。异常处理是分支结构的一种扩展。
在循环结构原理的基础上,Python提供两个循环控制符break和continue,对循环的执行过程进行控制。break控制符用来结束当前循环。continue控制符用来结束当前循环的当次循环过程。
4.2 程序的多分支结构
4.2.1 单分支结构:if
Python的单分支结构使用if保留字对条件进行判断,语法格式如下:
if <条件>: 语句块
其中,if、:和<语句块>前的缩进都是语法的一部分。<语句块>是if条件满足后执行的一个或多个语句系列,缩进表达<语句块>与if的包含关系。<条件>是一个产生True或False结果的语句,当结果 为True时,执行<语句块>,否则跳过<语句块>。<条件>是一个或多个条件,多个条件见采用and或or进行逻辑组合。and表示多个条件“与”的关系,or表示多个条件“或”的关系。
4.2.2 二分支结构:if-else
Python的二分之结构使用if-else保留字对条件进行判断,语法格式如下:
if <条件>: <语句块1> else: <语句块2>
<语句块1>在if中<条件>满足即为True时执行,<语句块2>在if中<条件>不满足即为False时执行。简单说,二分之结构根据条件的True或False结构产生两条路径。
二分之结构还有一种更简洁的表达式,适合<语句块1>和<语句块2>都只包含简单表达式的清空,语法格式如下:
<表达式1> if <条件> else <表达式2>
4.2.3 多分支结构:if-elif-else
Python的多分枝结构使用if-elif-else保留字对多个相关条件进行判断,并根据不同条件的结构按照顺序选择执行路径,语法格式如下:
if <条件1>: <语句块1> elif <条件2>: <语句块2> ... else: <语句块N>
多分枝结构通常用于判断同一个条件或一类条件的多个执行路径。要注意,Python会按照多分支结构的代码顺序依次评估判断条件,寻找并执行第一个结果为True条件对应的语句块,当前语句块执行后跳过整个if-elif-else结构。如果没有任何条件成立,else下面的语句块被执行。else子句是可选的。
利用多分支结构编写代码时要注意多个逻辑条件的先后关系。
4.2.4 判断条件及组合
1、Python的关系操作符
分支结构中的判断条件可以使用任何能够产生True或False的语句或函数。形成判断条件最常见的方式是采用关系操作符。
操作符 | 操作符含义 |
---|---|
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
== | 等于 |
!= | 不等于 |
2、保留字
Python语言使用保留字not、and和or对条件进行逻辑运算或组合。
保留字not表示单个条件的“否”关系,and表示多个条件之间的“与”关系,or表示多个条件之间的“或”关系。
4.3 程序的循环结构
Python语言的循环结构包括两种:遍历循环和无限循环。
遍历循环使用保留字for依次提取遍历结构各元素进行处理。
无限循环使用保留字while根据判断条件执行程序。
4.3.1 遍历循环:for
遍历循环可以理解为从遍历结构中逐一提取元素,放在循环变量中,对于每个所提取的元素执行一次语句块。for语句的循环执行次数是根据遍历结构中元素个数确定的。语法格式如下:
for <循环遍历> in <遍历结构>: <语句块>
遍历结果可以是字符串、文件、range()函数或组合数据类型等。
遍历循环还有一种扩展模式,语法格式如下:
for <循环变量> in <遍历结构>: <语句块1> else: <语句块2>
当for循环正常执行之后,程序会继续执行else语句中内容。else语句只在循环正常执行之后才执行并结束,因此,可以在<语句块2>中放置评价循环执行情况的语句。
4.3.2 无限循环:while
Python通过保留字while实现无限循环,语法格式如下:
while <条件>: <语句块>
当程序执行到while语句时,判断条件如果为True,执行循环体语句,语句结束后返回再次判断while语句的条件;当条件为False时,循环终止,执行与while同级别缩进的后续语句。
无限循环还有一种扩展模式,语法格式如下:
while <条件>: <语句块1> else: <语句块2>
在这种扩展模式中,当while循环正常执行之后,程序会继续执行else语句中内容。else语句只在循环正常执行后才执行,因此可以在语句块2中给放置判断循环执行情况的语句。
4.3.3 循环控制:break和continue
循环结构有i啷个辅助循环控制的保留字:break和continue。
break用来跳出最内层for或while循环,脱离该循环后,程序继续执行循环后续代码。
continue用来结束当前当次循环,即跳出循环体中下面尚未执行的语句,但不跳出当前循环。
continue语句和break语句的区别是:continue语句只结束本次循环,不终止整个循环的执行,而break具备结束整个当前循环的能力。
4.4 循环的异常处理
Python程序一般对输入有一定要求,但当实际输入不满足程序要求时,可能还会产生程序的运行错误。
Python语言使用保留着try和except进行异常处理,语法格式如下:
try: <语句块1> except: <语句块2>
语句块1是正常执行的程序内容,当执行这个语句块发生异常时,则执行except保留字后面的语句块2。
4.5 实例解析——猜数字游戏
import random
target = random.randint(1, 1000)
count = 0
while True:
try:
guess = eval(input("请输入一个猜测的整数(1-1000):"))
except:
print("输入有错!")
continue
count = count + 1
if guess > target:
print("猜大了!")
elif guess < target:
print("猜小了!")
else:
print("猜对了!")
break
print(f"总共猜了{count}次!")
习题4
一、选择题
-
以下语句在Python中非法的是:_______
A x=y=z=1 B x=(y=z+1) C x,y=y,x D x+=y
正确答案:B
-
以下选项运行结果为True的是:_______
A (‘3’,‘’) < (‘a’,‘b’) B 5+4j > 2-3j C ‘abc’ > ‘xyz’ D 3>2>2
正确答案:A
-
以下选项符合Python语法要求且能够正确执行的是:_______
A min = x if x < y = y B max = x > y ? x : y
C if (x > y) print s D while True : pass
正确答案:D
-
以下选项用来判断当前程序在分支结构中的是:_______
A 括号 B 冒号 C 缩进 D 花括号
正确答案:C
-
以下选项不能进行条件逻辑操作的是:_______
A and B or C not D xor
正确答案:D
-
对负数取平方根,即使用函数pow(-1,0,5),将产生:_______
A 虚数 B 程序崩溃 C 什么都不产生 D ValueError错误
正确答案:A
-
for或者while与else搭配使用时,能够执行else对应语句块的情况是:_______
A 总会执行 B 永不执行 C 仅循环正常结束时 D 仅循环非正常结束时,以break结束
正确答案:C
-
try-execpt结构中,能够执行except对应语句块的情形是:_______
A try中语句出现异常时 B 正常程序结束后
C try中语句有分支时 D try中语句有循环时
正确答案:A
-
关于break的作用,以下说法正确的是:_______
A 按照缩进跳出当前层语句块 B 按照缩进跳出除函数缩进外的所有语句块
C 跳出当前层for/while循环 D 跳出所有for/while循环
正确答案:C
-
关于异常处理机制,以下说法最合理的是:_______
A 应当大量使用以避免任何可能的错误
B 将所有代码放到一个try语句块中避免程序报错
C 用if判断代替所有的try-except结构
D 再输入判断及关键代码中使用,但不滥用
正确答案:D
二、编程题
-
输入一个年份,输出是否为闰年
# 方法一 year = int(input("请输入年份:")) if year % 4 == 0 and year % 100 != 0: print(f"{year}是闰年") elif year % 400 == 0: print(f"{year}是闰年") else: print(f"{year}不是闰年") # 方法二 def is_leap_year(year): if year % 4 == 0: if year % 100 == 0: if year % 400 == 0: return True else: return False else: return True else: return False year = int(input("请输入年份:")) if is_leap_year(year): print(year, "是闰年") else: print(year, "不是闰年")
-
最大公约数和最小公倍数计算
def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) def lcm(a, b): return a * b / gcd(a, b) a = int(input("请输入第一个数字:")) b = int(input("请输入第二个数字:")) print("最大公约数为:", gcd(a, b)) print("最小公倍数为:", int(lcm(a, b)))
-
统计不同字符个数
s = input("请输入一行字符:") # 输入一行字符 letter_count = 0 # 英文字母个数 digit_count = 0 # 数字个数 space_count = 0 # 空格个数 other_count = 0 # 其他字符个数 # 统计个数 for i in s: if i.isalpha(): letter_count += 1 elif i.isdigit(): digit_count += 1 elif i.isspace(): space_count += 1 else: other_count += 1 # 输出结果 print("英文字母个数为:", letter_count) print("数字个数为:", digit_count) print("空格个数为:", space_count) print("其他字符个数为:", other_count)
-
猜数游戏续
import random target = random.randint(1, 1000) count = 1 while True: guess = input("请输入一个猜测的整数(1-1000):") try: type(guess) != int(guess) except: print("输入的内容必须为整数!\n请重新输入!") break count = count + 1 if int(guess) > target: print("猜大了!") elif int(guess) < target: print("猜小了!") else: print("猜对了!") break print(f"总共猜了{count}次!")
-
羊车门问题
import random def monty_hall(repeat, change_choice): """ :param repeat: 抽样的总次数 :param change_choice: True表示参赛者改变选择,False表示坚持选择 :return: 获胜的概率 """ win = 0 for i in range(repeat): # 三扇门 doors = ["goat", "goat", "car"] # 参赛者随机选择一扇门 choice = random.choice(doors) # 主持人打开一扇有山羊的门 doors.remove("goat") goat_door = random.choice(doors) doors.remove(goat_door) # 如果参赛者选择改变 if change_choice: # 获胜的门只有一扇 win_door = doors[0] if win_door == "car": win += 1 # 如果参赛者坚持选择 else: if choice == "car": win += 1 # 计算获胜的概率 win_probability = win / repeat return win_probability # 测试 change_win = monty_hall(10000, True) no_change_win = monty_hall(10000, False) print("参赛者改变选择获胜的概率为:%.2f%%" % (change_win * 100)) print("参赛者坚持选择获胜的概率为:%.2f%%" % (no_change_win * 100))