复杂程序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"] ]]

ZZAX 微信公众

文档一更新,立刻告诉你