第 4 章 循 环 结 构 程 序 设 计 2 本 章 主 讲 赵 家 刚
4.3.3 while 语 句 用 于 无 限 循 环 4.3.3 当 while 语 句 的 表 达 式 永 远 不 会 为 布 尔 假 时, 循 环 将 永 远 不 会 结 束, 形 成 无 限 循 环, 也 称 死 循 环 使 用 while 语 句 构 成 无 限 循 环 的 格 式 通 常 为 : while True: 循 环 体 可 以 在 循 环 体 内 使 用 break 语 句 强 制 结 束 死 循 环 1-2
例 4-5 使 用 无 限 循 环 的 方 法 编 程 实 现 例 4-2 开 始 表 达 式 恒 为 真 True 输 入 一 个 字 符 不 是 字 符 # 吗? 结 束 True 输 出 该 字 符 False 程 序 : a = input(' 请 输 入 字 符, 如 果 输 入 # 号 则 结 束 输 入 操 作 : ') while True: print(' 您 输 入 的 字 符 是 :', a) a = input(' 请 输 入 字 符, 如 果 输 入 # 号 则 结 束 输 入 操 作 : ') if a == '#': break 图 4-7 无 限 循 环 的 框 图 1-3
例 4-6 求 以 下 表 达 式 的 值, 其 中 n 值 从 键 盘 输 入 参 考 值 : 当 n = 11 时,s s = 1.833333 s = 1+ 1 1 1 + + + 1+ 2 1+ 2 + 3 1+ 2 + 3 + + n 1-4
分 析 (1) 以 上 问 题 属 于 数 学 中 的 级 数 求 和 问 题, 是 使 用 循 环 结 构 解 决 的 一 类 常 见 问 题 (2) 级 数 求 和 问 题 编 程 的 重 点 在 于 通 过 观 察 表 达 式 的 规 律, 分 析 每 次 循 环 都 要 完 成 的 事 件 通 常 将 这 些 事 件 进 行 局 部 分 解, 称 为 通 式 该 题 的 通 式 有 以 下 几 个 : (1) 分 母 的 通 式 : mu = mu + i (2) 变 量 i 的 通 式 : i = i + 1 (3) 当 前 项 的 通 式 : t = 1.0 / mu (4) 求 和 的 通 式 : s = s + t 1-5
程 序 : i=1 mu = 0 s = 0.0 n = input(' 请 输 入 n 值 : ') # 或 用 书 上 的 代 码 while i <= n: # 判 断 是 否 计 算 到 表 达 式 的 最 后 一 项 mu = mu + i # 求 分 母 的 通 式 i += 1 # i 自 增 的 通 式 t = 1.0 / mu # 求 当 前 项 的 通 式 s = s + t # 求 和 的 通 式 print 's = ', s # 循 环 结 束 后, 打 印 总 和 提 问 : (1) 变 量 i mu mu s 的 初 值 只 能 是 1 0 0.0 0.0 吗? (2) 循 环 体 内 语 句 的 先 后 顺 序 可 以 随 意 调 换 吗? 1-6
例 4-7 4-7 通 过 以 下 表 达 式 求 π 的 近 似 值, 当 某 项 小 于 0.00000001( ( 即 1e-8) ) 时 停 止 循 环 π 1 1 2 1 2 3 1 2 3 4 1 2 n = 1+ + + + + + 2 3 3 5 3 5 7 3 5 7 9 3 5 (2n + 1) 1-7
分 析 : 该 题 使 用 循 环 结 构 来 解 决, 只 有 当 某 一 项 小 于 1e-8 时 才 停 止 迭 代, 因 此 循 环 次 数 是 不 确 定 的 观 察 表 达 式 中 相 邻 两 项 的 规 律 是 1 前 一 项 的 分 子 乘 以 1 个 整 数 值 i 可 得 后 一 项 的 分 子, 而 这 个 整 数 值 i 随 着 循 环 次 数 由 1 递 增 到 n;2 前 一 项 的 分 母 乘 以 2*i+1 i+1 可 得 后 一 项 的 分 母 该 题 的 通 式 有 以 下 几 个 : (1) 分 子 的 通 式 :zi = zi * i (2) 分 母 的 通 式 :mu = mu * (2 * i + 1) (3) 变 量 i 的 通 式 :i i = i + 1 (4) 当 前 项 的 通 式 :t = zi*1.0/mu (5) 求 和 通 式 :s=s+t 1-8
开 始 初 始 化 zi mu i t s False 判 断 t >= 1e -8? Tru e 将 t 累 加 到 s 求 分 子 zi 分 母 mu 求 当 前 项 t i 自 增 1 输 出 π 的 近 似 值 结 束 图 4-9 求 π 近 似 值 的 框 图 程 序 : #Exp4_7.py i = 1 zi = 1.0 mu = 1.0 t = 1.0 s = 0.0 while t >= 1e-8: s = s + t zi = zi * i mu = mu * ( 2 * i + 1) t = zi * 1.0 / mu i += 1 print 'PAI = ', (2 * s) 1-9
例 4-8 求 1 ~ 100 之 间 能 被 7 整 除, 但 不 能 同 时 被 5 整 除 的 所 有 整 数 分 析 (1) 本 题 需 要 对 1 ~ 100 范 围 内 的 所 有 数 一 一 进 行 判 断 (2) 本 题 的 循 环 次 数 确 定 是 100 次 (3) 在 每 次 循 环 过 程 中 需 要 用 if 语 句 进 行 条 件 判 断 因 此 本 题 是 循 环 嵌 套 选 择 的 结 构 1-10 10 开 始 为 i 赋 初 值 1 判 断 i <= 100? 结 束 True 判 断 i 是 否 能 被 7 整 除 但 不 能 被 5 整 除? True 输 出 i i 自 增 1 False False 图 4-10 整 除 问 题 的 框 图
程 序 : i = 1 # i # i 既 是 循 环 变 量, 同 时 又 是 被 判 断 的 数 print('1~100 之 间 能 被 7 整 除, 但 不 能 同 时 被 5 整 除 的 所 有 数 是 :') 判 断 循 环 是 否 结 束 while i <= 100: # 判 断 循 环 是 否 结 束 if i % 7 == 0 and i % 5!= 0: # 判 断 本 次 的 print i, '\t ' # 打 印 满 足 条 件 的 i i += 1 # 每 次 循 环 i 应 自 增 判 断 本 次 的 i 是 否 满 足 条 件 提 问 : 请 问 语 句 i i += 1 可 以 和 语 句 print i, '\t ' 对 齐 吗? 1-11 11
例 4-9 输 出 水 仙 花 数 所 谓 水 仙 花 数 是 指 1 个 3 位 的 十 进 制 数, 其 各 位 数 字 的 立 方 和 等 于 该 数 本 身 例 如 :153 是 水 仙 花 数, 因 为 153 = 1 3 + 5 3 + 3 3 分 析 (1) 本 题 需 要 对 100 ~ 999 范 围 内 的 所 有 数 一 一 进 行 判 断 (2) 本 题 的 变 量 i 既 是 循 环 变 量, 同 时 也 是 被 判 断 的 数 (3) 每 次 循 环 过 程 中 需 要 用 if 语 句 进 行 条 件 判 断 因 此 本 题 也 是 循 环 嵌 套 选 择 的 结 构 1-12 12
提 问 : 变 量 i 是 一 个 三 位 整 数, 例 如 i = 123 (1) 请 写 出 分 离 i 的 百 位 数 的 表 达 式 (2) 请 写 出 分 离 i 的 十 位 数 的 表 达 式 (3) 请 写 出 分 离 i 的 个 位 数 的 表 达 式 程 序 : i = 100 print(' 所 有 的 水 仙 花 数 是 :') while i <= 999: # 判 断 循 环 是 否 结 束 bai = int(i / 100) # 分 离 i 的 百 位 数 shi = int((i % 100) / 10) # 分 离 i 的 十 位 数 ge = int(i % 10) # 分 离 i 的 个 位 数 if bai ** 3 + shi ** 3 + ge ** 3 == i: # 判 断 条 件 print i # 打 印 水 仙 花 数 i += 1 # 变 量 i 自 增 1-13 13
4.4 for 语 句 Python 提 供 的 另 一 个 循 环 机 制 是 for 语 句, 它 提 供 了 Python 中 最 强 大 的 循 环 结 构 Python 中 的 for 语 句 与 传 统 的 for 语 句 不 太 一 样, 它 接 受 可 迭 代 对 象 ( 例 如 序 列 或 迭 代 器 ) 作 为 其 参 数, 每 次 迭 代 其 中 的 一 个 元 素 for 取 值 in 序 列 : 循 环 体 还 有 值 未 取 吗? 是 循 环 体 否 1-14 14
4.3.1 for 语 句 用 于 序 列 类 型 列 表 元 组 字 符 串 都 是 序 列 序 列 类 型 有 着 相 同 的 访 问 模 式 : 它 的 每 一 个 元 素 可 以 通 过 指 定 一 个 偏 移 量 的 方 式 得 到 ; 而 多 个 元 素 可 以 通 过 切 片 操 作 的 方 式 得 到 序 列 操 作 可 以 通 过 很 多 内 建 函 数 来 实 现, 比 如 求 序 列 长 度 len( ); 求 最 大 值 max( ) ; 最 小 值 min( ) ; 求 和 sum( ); 排 序 sorted( ) 等, 以 上 这 些 内 建 函 数 的 实 现 都 离 不 开 循 环 结 构 1-15 15
例 4-10 创 建 1 个 由 分 数 构 成 的 列 表, 求 出 所 有 分 数 的 平 均 分 方 法 一 : 使 用 Python 的 内 建 函 数 sum( ) 求 和, 然 后 再 求 平 均 分 >>> score = [70, 90, 78, 85, 97, 94, 65, 80] >>> score [70, 90, 78, 85, 97, 94, 65, 80] >>> aver = sum(score) / 8.0 >>> aver 82.375 1-16 16
方 法 二 : 使 用 for 语 句, 通 过 序 列 索 引 进 行 迭 代 分 析 (1) 以 上 列 表 score 有 8 个 元 素, 这 些 元 素 的 序 列 索 引 范 围 是 0 0 ~ 7 (2) 本 题 用 到 成 员 测 试 运 算 符 in in, 如 果 成 员 在 序 列 中, 测 试 结 果 为 True True,, 否 则 为 False False (3) 本 题 用 到 计 算 序 列 长 度 的 内 建 函 数 len( ) (4) 本 题 用 到 内 建 函 数 range( ), range( ) 函 数 的 完 整 语 法 要 求 提 供 2 个 或 3 个 整 型 参 数 : range(start, end, step) 1-17 17
程 序 : score = [70, 90, 78, 85, 97, 94, 65, 80] print ' 所 有 的 分 数 值 是 :' print score # 打 印 列 表 sum = 0 # 以 下 for 语 句 的 i 是 迭 代 项, 内 建 函 数 len(score) 的 执 行 结 果 是 8 # 内 建 函 数 range(8) 返 回 一 个 列 表 [0, 1, 2, 3, 4, 5 6,7] # 运 算 符 in 是 判 断 迭 代 项 i 是 否 还 在 列 表 [0, 1,2 3, 4, 5, 6 7] 中 for i in range(len(score)): sum += score[i] # 循 环 体 对 列 表 元 素 求 和 aver = sum / 8.0 print '\naver = ', aver # 循 环 之 后, 求 平 均 值 1-18 18
方 法 三 : 使 用 for 语 句, 通 过 序 列 项 运 算 程 序 : score = [70, 90, 78, 85, 97, 94, 65, 80] print ' 所 有 的 分 数 值 是 :' print score # 打 印 列 表 sum = 0 # 以 下 for 语 句 使 用 运 算 符 in 判 断 迭 代 项 i 是 否 在 列 表 score 中 for i in score: sum += i # 循 环 体 对 列 表 元 素 求 和 aver = sum / 8.0 print '\naver = ', aver # 循 环 之 后, 求 平 均 值 1-19 19
利 用 for 语 句 实 现 双 层 循 环 嵌 套 循 环 的 嵌 套 是 指 在 一 个 循 环 中 又 包 含 另 外 一 个 完 整 的 循 环, 即 循 环 体 中 又 包 含 循 环 语 句 while 循 环 和 for 循 环 可 以 相 互 嵌 套 循 环 嵌 套 的 执 行 过 程 是 : 一 次 外 循 环 对 应 着 完 整 的 一 轮 内 循 环 1-20
例 4-10 4-10 使 用 for 循 环 的 嵌 套 结 构 打 印 9-9 乘 法 表 分 析 9-9 乘 法 表 由 9 行 组 成, 每 行 的 列 数 有 规 律 地 递 增 通 过 观 察 可 以 看 出, 表 达 式 X * Y = Z 中 的 X 是 内 循 环 变 量 j 的 取 值,Y 是 外 循 环 变 量 i 的 取 值,Z 是 X 乘 以 Y 的 结 果 1-21
程 序 : for i in range(1, 10, 1): # 控 制 行 for j in range(1, i+1, 1): # 控 制 列 print i, '*', ', j, '=', i*j, '\t print '\n' # 每 行 末 尾 的 换 行 1-22
课 堂 练 习 使 用 for 循 环 的 嵌 套 结 构 编 程, 打 印 以 下 图 形 (1) 矩 形 (2) 直 角 三 角 形 (3) 正 三 角 形 1-23
4.4 break 语 句 Python 提 供 了 一 条 提 前 结 束 循 环 的 语 句 break 语 句 当 在 循 环 过 程 中, 某 个 条 件 被 触 发 ( 一 般 通 过 if 语 句 检 查 ), 需 要 立 即 停 止 循 环 时 使 用 break 语 句 可 以 用 在 while 和 for 循 环 中 1-24
例 4-12 求 200 以 内 能 被 17 整 除 的 最 大 正 整 数 分 析 这 个 查 找 过 程 将 以 递 减 的 方 式 遍 历 200 至 1 之 间 的 整 数, 当 找 到 第 1 个 能 被 17 整 除 的 数 时, 循 环 过 程 立 即 停 止, 后 续 还 没 有 遍 历 的 数 将 无 需 再 进 行 判 断, 因 此 可 以 使 用 break 语 句 将 循 环 提 前 终 止 程 序 : for i in range(200, 1, -1): if i % 17 == 0: break print('200 以 内 能 被 17 整 除 的 最 大 数 是 :', i) 1-25
4.6 continute 语 句 continue 语 句 的 作 用 是 终 止 当 前 循 环, 并 忽 略 continue 之 后 的 语 句, 然 后 回 到 循 环 的 顶 端, 继 续 执 行 下 一 次 循 环 1-26
例 4-17 求 200 以 内 能 被 17 整 除 的 所 有 正 整 数, 并 统 计 满 足 条 件 的 数 的 个 数 #Exp4_17_2.py s=0 print '200 以 内 能 被 17 整 除 的 所 有 数 是 :' for i in range(1, 201, 1): if i%17!= 0: continue print i, s+=1 print '\n 数 的 个 数 是 :', s 1-27
第 8 次 上 机 作 业 : 1. 利 用 以 下 公 式 求 π 的 近 似 值, 直 到 最 后 一 项 的 绝 对 值 小 于 等 于 10-6 为 止 π 1 1 1 1 + + 4 3 5 7 2. 使 用 循 环 的 嵌 套 结 构 编 程 输 出 以 下 图 形 1-28