复杂程序Complex Programs
语句嵌套
基础规则
if, for, while 可以随意嵌套
样例
1 2 3 4 5 6 7 for ... : if ... : ... while ... : if ... : ...
留意
换行缩进
循环嵌套
需求
小明 每天 吃3顿饭, 吃完了就睡觉
三天过去了, 小明干了什么
< < < < < < < < < < < <吃饭吃饭吃饭睡觉吃饭吃饭吃饭睡觉吃饭吃饭吃饭睡觉
代码
1.
1 2 3 4 5 6 7 8 9 10 11 12 print("吃饭")print("吃饭")print("吃饭")print("睡觉")print("吃饭")print("吃饭")print("吃饭")print("睡觉")print("吃饭")print("吃饭")print("吃饭")print("睡觉")
2.
消除重复1
1+2 3 4 5 6-7-8-9-10-11-12-13-for i in range(3): print("吃饭") print("吃饭") print("吃饭") print("睡觉")print("吃饭")print("吃饭")print("吃饭")print("睡觉")print("吃饭")print("吃饭")print("吃饭")print("睡觉")
3.
消除重复2
1 2+3 4-5-6 for i in range(3): for j in range(3): print("吃饭") print("吃饭") print("吃饭") print("睡觉")
内外循环
内循环
外循环
执行顺序
内循环 | 秒针 |
外循环 | 分针 |
秒针走一圈,分针走一格
11 for ... : 21 for ... : 31 22 12 11 21, 31, 31, ... 31, 22 21, 31, 31, ... 31, 22 ... 21, 31, 31, ... 31, 22 12
消代码大法
写出原始代码,逐层消除重复
案例
需求
输出
< < <* * * * * *
步骤
1.
写出不循环的代码
尽量使用最小单元
1 2 3 4 5 6 7 8 9 10 11 print("* ", end="")print("* ", end="")print("* ", end="")print() print("* ", end="")print("* ", end="")print() print("* ", end="")print()
2.
一次消除
1 2 3 4 5 6 7 8 9 10 11 for i in range(3): print("* ", end="")print() for i in range(2): print("* ", end="")print() for i in range(1): print("* ", end="")print()
3.
二次消除
1 2 3 4 for j in range(3): for i in range(3 - j): print("* ", end="") print()
4.
整理
1 2 3 4 5 size = 3for i in range(size): for j in range(size - j): print("* ", end="") print()
挑战
输出
< < <* * *
提示:
1 print(" ", end="")
填模板大法
准备好双层 for 循环 模板
分析最小单元代码,及其频率,
放到对应位置里去
案例
需求
输出
< < < <1 x 1 = 1, 1 x 2 = 2, ... 1 x 9 = 92 x 2 = 4, 2 x 3 = 6, ... 2 x 9 = 9...8 x 8 = 64, 8 x 9 = 729 x 9 = 81
步骤
1.
准备好双层 for 循环模板
1 2 3 4 5 for i in range(_A_): _B_ for j in range(_C_): _D_ _E_
2.
找出最小单元
1 2 3 4 5 6 7 print(left, end="")print(" x ", end="")print(right, end="")print(" = ", end="")print(result, end="")print(", ", end="")print()
3.
找出相对频率
1 2 3 4 5 6 7 print(left, end="") 较高print(" x ", end="") 较高print(right, end="") 较高print(" = ", end="") 较高print(result, end="") 较高print(", ", end="") 较高print() 较低
4.
根据相对频率,放到内外循环中
较高的放内循环,较低的放外循环
1 2 3 4 5 6 7 8 9 for i in range(_A_): for j in range(_C_): print(left, end="") print(" x ", end="") print(right, end="") print(" = ", end="") print(result, end="") print(", ", end="") print()
5.
分析内外循环次数
外循环 9 次
内循环 次数 跟外循环次数有数学关系
1 2 3 4 5 6 7 8 9 for i in range(9): for j in range(9 - i): print(left, end="") print(" x ", end="") print(right, end="") print(" = ", end="") print(result, end="") print(", ", end="") print()
6.
找出最小单元 跟 循环 i j 的数学关系
1 2 3 4 5 6 7 8 9 10 11 12 for i in range(9): for j in range(9 - i): left = i + 1 right = left + j result = left * right print(left, end="") print(" x ", end="") print(right, end="") print(" = ", end="") print(result, end="") print(", ", end="") print()
7.
细节调整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 size = 9for i in range(size): for j in range(size - i): left = i + 1 right = left + j result = left * right print(left, end="") print(" x ", end="") print(right, end="") print(" = ", end="") print(result, end="") if right != size) print(",", end="") print()
挑战
输出
< < <* * *
剥洋葱大法
将一整个大问题,逐层分解为小问题
大事化小、小事化了
案例
需求
输出 100 以内所有的质数
步骤
1.
原始问题
1 # 输出 100 以内所有的质数
2.
使用 for 降级
1+2 for i in range(2, 101): # 给定一个数 i, 如果是质数, 就把它输出出来
3.
使用 if 降级
1 2+3 4 5+6+for i in range(2, 101): test = False # 检测一个数 i, 是否是质数 if test: print(i)
4.
伪代码分析
质数是只能被 1 和 自己整除
也就是说, 从 2 到 它自己, 没有任何数能把它整除
1 2*3 4 5 6 7 8 9*10 for i in range(2, 101): is_prime = True # 对 i 进行检查 # (从 2 到 i, 不包含 i) : # 应该没有任何能整除 i 的 # 一旦发现, 就不是质数了 if is_prime: print(i)
5.
使用 for 降级
1 2 3 4+5 6 7 8 9 for i in range(2, 101): is_prime = true for factor in range(2, i): # 应该没有任何能整除 i 的 # 一旦发现, 就不是质数了 if is_prime: print(i)
6.
伪代码分析
1 2 3 4 5*6*7 8 9 for i in range(2, 101): is_prime = true for factor in range(2, i): # 如果 (factor 能整除 i): # i 就不是质数 if is_prime: print(i)
7.
使用 if 降级
1 2 3 4 5*6*7 8 9 for i in range(2, 101): is_prime = true for factor in range(2, i): if i % factor == 0: is_prime = false if is_prime: print(i)
挑战
输出
< < <* * *
循环嵌套 x 循环控制
规则
break 和 continue 只对 离它最近的 循环语句生效,
不会影响到 外层循环
for ... : for ... : if ... : if ... : break # 1 # 2 # 3 # 4
break 执行后,会跳到哪个注释区域的代码
A
1
B
2
C
3
D
4
案例
1 2 3 4 5 6 7+8 9 10 for i in range(2, 101): is_prime = True for factor in range(2, i): if i % factor == 0: is_prime = False break if is_prime: print(i)
排序Sorting
什么是
入门级经典问题
给定一个列表, 里面有一堆乱序的数, 执行一段程序后, 居然就从小到大排列好了
有哪些
很多
选择排序
插入排序
冒泡排序
选择排序

插入排序

冒泡排序

二维列表
包裹着 一维列表 的 列表,就是 二维列表
样例
字面量
1 2 3 4 5 6 7 matrix = [[2, 5, 1, 4], [1, 3, 7, 0], [8, 5, 2, 9]] matrix = [ [2, 5, 1, 4], [1, 3, 7, 0], [8, 5, 2, 9]]
二维列表访问
1 2 3 4 5 6 7 8 matrix = [ [2, 5, 1, 4], [1, 3, 7, 0], [8, 5, 2, 9]]matrix[1][2] = 3print(matrix)print(matrix[1][2])
二维列表遍历
1 2 3 4 5 6 7 8 9 matrix = [ [2, 5, 1, 4], [1, 3, 7, 0], [8, 5, 2, 9]] for row in matrix: for item in row: print(item)
二维列表遍历 带索引
1 2 3 4 5 6 7 8 9 10 11 matrix = [ [2, 5, 1, 4], [1, 3, 7, 0], [8, 5, 2, 9]] for i in range(len(matrix)): row = matrix[i] for j in range(len(row)): item = row[j] print(item)
制造二维列表
制造一个全是 1 的 4 x 4 的 二维列表
1 2 3 4 5 6 matrix = []for i in range(4): row = [] for j in range(4): row.append(1) matrix.append(row)
二维列表变一维列表
1 2 3 4 5 6 7 8 9 10 matrix = [ [2, 5, 1, 4], [1, 3, 7, 0], [8, 5, 2, 9]] linear = []for row in matrix: for item in row: linear.append(item)
多维列表
以此类推
比如 三维列表
1 2 3 4 5 6 7 8 9 10 cube = [ [ ["000", "001"], ["010", "011"] ], [ ["100", "101"], ["110", "111"] ]]