aoi学院

Aisaka's Blog, School of Aoi, Aisaka University

Python-第5篇《重复的艺术:循环语句》

📖 开篇语

还记得上次处理报销单的情景吗?

打开第1张发票 → 录入金额 → 核对日期 → 检查签字 → 保存
打开第2张发票 → 录入金额 → 核对日期 → 检查签字 → 保存
打开第3张发票 → 录入金额 → 核对日期 → 检查签字 → 保存

打开第58张发票 → 录入金额 → 核对日期 → 检查签字 → 保存

这种重复性工作,占据了大量的时间。Python的循环语句,就是专治各种“重复动作”的神器。

让我们学会用Python的“循环魔法”,把58次重复变成一串代码!


🎯 今日学习目标

  • 掌握 for 循环(批量处理神器)
  • 学会 while 循环(智能判断重复)
  • 用Python批量处理发票(告别机械劳动)
  • 自动生成月度报表

🔄 for循环:批量处理的发电机

从发票处理理解for循环
假设你有10张发票要处理,手工流程是:

1
2
3
4
5
处理发票1
处理发票2
处理发票3
...
处理发票10

用Python的 for 循环:

1
2
3
4
5
发票列表 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for 发票号 in 发票列表:
print(f"正在处理第{发票号}张发票...")
print("✅ 完成")

3行代码搞定10次重复操作!

for循环的基本语法

1
2
3
for 变量 in 可迭代对象:
# 循环体(要重复执行的代码)
代码块

举个实际的财务例子🌰:

1
2
3
4
5
6
7
# 批量计算员工工资
员工名单 = ["张三", "李四", "王五", "赵六"]

for 员工 in 员工名单:
print(f"正在计算{员工}的工资...")
# 这里可以加入复杂的工资计算逻辑
print(f"{员工}的工资计算完成!\n")

批量处理发票的实战案例

案例1:批量检查发票日期
1
2
3
4
5
6
7
8
9
10
11
# 批量检查发票是否过期
发票日期列表 = ["2024-01-15", "2024-02-20", "2023-12-25", "2024-03-01", "2023-11-30"]
当前年份 = 2024

print("=== 发票有效期检查 ===")
for 发票日期 in 发票日期列表:
发票年份 = int(发票日期[:4])
if 发票年份 == 当前年份:
print(f"✅ 发票{发票日期}:有效")
else:
print(f"❌ 发票{发票日期}:过期发票")
案例2:批量计算发票金额
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 批量计算各类发票总金额
发票数据 = [
{"类型": "办公用品", "金额": 580},
{"类型": "差旅费", "金额": 2300},
{"类型": "招待费", "金额": 1500},
{"类型": "办公用品", "金额": 320},
{"类型": "差旅费", "金额": 1800}
]

print("=== 发票分类统计 ===")
办公用品总额 = 0
差旅费总额 = 0
招待费总额 = 0

for 发票 in 发票数据:
类型 = 发票["类型"]
金额 = 发票["金额"]

if 类型 == "办公用品":
办公用品总额 += 金额
elif 类型 == "差旅费":
差旅费总额 += 金额
elif 类型 == "招待费":
招待费总额 += 金额

print(f"办公用品总额:{办公用品总额}元")
print(f"差旅费总额:{差旅费总额}元")
print(f"招待费总额:{招待费总额}元")
print(f"总计:{办公用品总额 + 差旅费总额 + 招待费总额}元")

♾️ while循环:智能重复处理器

while循环 vs for循环

  • for循环:知道要重复多少次(处理10张发票)
  • while循环:满足条件就一直重复(直到找到错误数据)

while循环的基本语法

1
2
3
while 条件:
# 循环体
代码块

财务场景理解🌰:

1
2
3
4
5
6
7
8
9
10
11
12
# 对账:直到两者相等为止
公司账目 = 100000
银行账目 = 99800

while 公司账目 != 银行账目:
print(f"差额:{公司账目 - 银行账目}")
print("正在查找差异原因...")
# 模拟找到并调整
银行账目 += 200
print(f"调整后银行账目:{银行账目}")

print("✅ 对账完成,账目一致!")

实用while循环案例

案例1:查找异常数据
1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找第一张问题发票
发票列表 = [1200, 800, 5000, 3500, 9000, 1500, 2200]
待检查索引 = 0

print("=== 查找超标准发票 ===")
while 待检查索引 < len(发票列表):
当前金额 = 发票列表[待检查索引]
if 当前金额 > 5000:
print(f"❌ 发现异常:第{待检查索引 + 1}张发票金额{当前金额}元,超过5000元标准")
break
else:
print(f"✅ 第{待检查索引 + 1}张发票{当前金额}元正常")
待检查索引 += 1
案例2:预算控制提醒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 预算使用监控
预算总额 = 50000
已用预算 = 0
本月消费记录 = [8000, 12000, 15000, 10000, 5000, 3000, 7000]

print("=== 预算使用监控 ===")
for 本次消费 in 本月消费记录:
if 已用预算 + 本次消费 > 预算总额:
print(f"⚠️ 警告:本次消费{本次消费}元将导致预算超支")
print(f"当前已用:{已用预算}元,剩余:{预算总额 - 已用预算}元")
是否继续 = input("是否继续消费?(是/否):")
if 是否继续 == "否":
print("✅ 已取消消费,预算控制良好")
break

已用预算 += 本次消费
print(f"消费{本次消费}元,累计使用:{已用预算}元")

print(f"\n最终预算使用情况:{已用预算}/{预算总额}")
print(f"预算使用率:{已用预算/预算总额*100:.1f}%")

📊 实战项目:自动生成月度报表

版本1.0:基础报表生成器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 基础月度报表生成器
print("=== 月度财务报表生成器 ===")

# 模拟月度数据
月份 = "2024年1月"
收入明细 = [25000, 18000, 32000, 22000, 28000, 35000, 19000, 26000, 30000, 24000, 21000, 27000]
支出明细 = [18000, 15000, 28000, 19000, 22000, 26000, 16000, 21000, 24000, 20000, 17000, 22000]

# 计算总收入
总收入 = 0
for 收入 in 收入明细:
总收入 += 收入

# 计算总支出
总支出 = 0
for 支出 in 支出明细:
总支出 += 支出

# 计算利润
利润 = 总收入 - 总支出

# 生成报表
print(f"\n📊 {月份} 财务报表")
print("=" * 40)
print(f"总收入:{总收入:,}元")
print(f"总支出:{总支出:,}元")
print(f"净利润:{利润:,}元")
print(f"利润率:{利润/总收入*100:.1f}%")

# 简单分析
if 利润 > 0:
print("✅ 本月盈利,经营状况良好")
if 利润/总收入*100 > 20:
print("🎉 利润率超过20%,表现优秀!")
elif 利润/总收入*100 > 10:
print("👍 利润率在10%-20%,表现良好")
else:
print("⚠️ 利润率低于10%,需要控制成本")
else:
print("❌ 本月亏损,需要分析原因")
版本2.0:详细分析报表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 增强版月度分析报表
print("=== 详细月度财务分析 ===")

# 更详细的数据
月度数据 = {
"月份": "2024年1月",
"各部门收入": {
"销售部": [8000, 9500, 7800, 10200, 8900],
"市场部": [6500, 7200, 5800, 6900, 6100],
"技术部": [12000, 13500, 11800, 14200, 12900],
"运营部": [4500, 5200, 3800, 4900, 4300]
},
"各类支出": {
"人员成本": 45000,
"办公费用": 8500,
"差旅费": 12000,
"市场推广": 15000,
"其他费用": 6500
}
}

# 计算各部门收入
print(f"\n📈 {月度数据['月份']} 各部门收入分析:")
部门收入统计 = {}
for 部门, 收入列表 in 月度数据["各部门收入"].items():
部门总收入 = 0
for 收入 in 收入列表:
部门总收入 += 收入
部门收入统计[部门] = 部门总收入
平均收入 = 部门总收入 / len(收入列表)
print(f"{部门}:总收入{部门总收入:,}元,平均{平均收入:.0f}元/天")

# 找出收入最高和最低的部门
最高收入部门 = max(部门收入统计, key=部门收入统计.get)
最低收入部门 = min(部门收入统计, key=部门收入统计.get)

print(f"\n🏆 收入最高:{最高收入部门}{部门收入统计[最高收入部门]:,}元)")
print(f"📉 收入最低:{最低收入部门}{部门收入统计[最低收入部门]:,}元)")

# 计算总支出
print(f"\n📊 支出分析:")
总支出 = 0
for 支出类型, 金额 in 月度数据["各类支出"].items():
总支出 += 金额
print(f"{支出类型}{金额:,}元")

# 计算总收入
总收入 = sum(部门收入统计.values())

# 生成综合报表
print(f"\n📋 综合财务报表:")
print("=" * 50)
print(f"总收入:{总收入:,}元")
print(f"总支出:{总支出:,}元")
print(f"净利润:{总收入 - 总支出:,}元")
print(f"利润率:{(总收入 - 总支出)/总收入*100:.1f}%")

# 趋势分析(与前月对比)
上月利润 = 15000
本月利润 = 总收入 - 总支出
利润增长率 = (本月利润 - 上月利润) / 上月利润 * 100

print(f"\n📈 趋势分析:")
print(f"上月利润:{上月利润:,}元")
print(f"本月利润:{本月利润:,}元")
print(f"增长率:{利润增长率:.1f}%")

if 利润增长率 > 0:
print("✅ 利润呈上升趋势")
if 利润增长率 > 20:
print("🎉 增长强劲,表现优秀!")
else:
print("⚠️ 利润下降,需要分析原因")
版本3.0:智能预测报表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# 智能财务预测报表
print("=== 智能财务预测分析系统 ===")

# 历史数据(过去6个月)
历史收入 = [220000, 235000, 210000, 245000, 260000, 280000]
历史支出 = [180000, 185000, 175000, 190000, 195000, 200000]

# 1. 计算历史趋势
print("\n📈 历史数据分析:")

# 计算收入增长率
收入增长率列表 = []
for i in range(1, len(历史收入)):
增长率 = (历史收入[i] - 历史收入[i-1]) / 历史收入[i-1] * 100
收入增长率列表.append(增长率)

平均收入增长率 = sum(收入增长率列表) / len(收入增长率列表)

# 计算支出增长率
支出增长率列表 = []
for i in range(1, len(历史支出)):
增长率 = (历史支出[i] - 历史支出[i-1]) / 历史支出[i-1] * 100
支出增长率列表.append(增长率)

平均支出增长率 = sum(支出增长率列表) / len(支出增长率列表)

print(f"平均收入增长率:{平均收入增长率:.1f}%")
print(f"平均支出增长率:{平均支出增长率:.1f}%")

# 2. 预测下月数据
print(f"\n🔮 下月预测:")

# 简单线性预测
预测收入 = 历史收入[-1] * (1 + 平均收入增长率/100)
预测支出 = 历史支出[-1] * (1 + 平均支出增长率/100)
预测利润 = 预测收入 - 预测支出

print(f"预测收入:{预测收入:.0f}元")
print(f"预测支出:{预测支出:.0f}元")
print(f"预测利润:{预测利润:.0f}元")

# 3. 多期预测(未来6个月)
print(f"\n📊 未来6个月趋势预测:")

预测收入列表 = []
预测支出列表 = []
预测利润列表 = []

当前收入 = 历史收入[-1]
当前支出 = 历史支出[-1]

for 月份 in range(1, 7):
当前收入 = 当前收入 * (1 + 平均收入增长率/100)
当前支出 = 当前支出 * (1 + 平均支出增长率/100)
当前利润 = 当前收入 - 当前支出

预测收入列表.append(当前收入)
预测支出列表.append(当前支出)
预测利润列表.append(当前利润)

print(f"第{月份}个月:收入{当前收入:.0f}元,支出{当前支出:.0f}元,利润{当前利润:.0f}元")

# 4. 风险预警
print(f"\n⚠️ 风险预警分析:")

# 计算历史波动
收入方差 = 0
平均收入 = sum(历史收入) / len(历史收入)
for 收入 in 历史收入:
收入方差 += (收入 - 平均收入) ** 2
收入标准差 = (收入方差 / len(历史收入)) ** 0.5
收入变异系数 = 收入标准差 / 平均收入 * 100

print(f"收入稳定性:{收入变异系数:.1f}%(<10%稳定,10%-20%一般,>20%不稳定)")

if 收入变异系数 > 20:
print("⚠️ 收入波动较大,建议增加现金储备")
elif 收入变异系数 > 10:
print("💡 收入有一定波动,建议适当控制成本")
else:
print("✅ 收入相对稳定,可适度扩大投资")

# 5. 经营建议
print(f"\n💡 智能经营建议:")

if 平均收入增长率 > 平均支出增长率:
print("✅ 收入增长快于支出,经营状况良好")
if 平均收入增长率 > 15:
print("🎉 增长强劲,可考虑扩大规模")
else:
print("📈 稳步增长,保持当前策略")
else:
print("⚠️ 支出增长快于收入,需要控制成本")
print("建议:1.优化成本结构 2.提高运营效率 3.开发新收入来源")

# 6. 现金流预测
print(f"\n💰 现金流预测:")

# 假设应收账款和应付账款比例
应收账款比例 = 0.15
应付账款比例 = 0.20

print(f"应收账款比例:{应收账款比例*100}%")
print(f"应付账款比例:{应付账款比例*100}%")

for i in range(3): # 预测未来3个月
预测现金流入 = 预测收入列表[i] * (1 - 应收账款比例)
预测现金流出 = 预测支出列表[i] * (1 - 应付账款比例)
净现金流 = 预测现金流入 - 预测现金流出

print(f"第{i+1}个月净现金流:{净现金流:.0f}元")

if 净现金流 < 0:
print(f"⚠️ 第{i+1}个月可能出现现金流紧张")

🏃‍♀️ 进阶小挑战

挑战1:批量发票真伪验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 批量发票真伪验证系统
print("=== 批量发票真伪验证系统 ===")

import random

# 模拟待验证发票列表
待验证发票 = []
for i in range(20):
发票号 = f"FP{2024}{i+1:04d}"
金额 = round(random.uniform(100, 10000), 2)
待验证发票.append({"发票号": 发票号, "金额": 金额})

print(f"待验证发票数量:{len(待验证发票)}张")

# 模拟验证结果(80%概率为真)
验证结果 = []
for 发票 in 待验证发票:
是否真实 = random.choice([True, True, True, True, False]) # 80%为真
验证结果.append({
"发票号": 发票["发票号"],
"金额": 发票["金额"],
"验证结果": "真实" if 是否真实 else "可疑"
})

# 统计验证结果
真实发票 = []
可疑发票 = []

for 结果 in 验证结果:
if 结果["验证结果"] == "真实":
真实发票.append(结果)
else:
可疑发票.append(结果)

# 输出验证报告
print(f"\n📊 验证结果统计:")
print(f"真实发票:{len(真实发票)}张")
print(f"可疑发票:{len(可疑发票)}张")
print(f"验证通过率:{len(真实发票)/len(验证结果)*100:.1f}%")

if 可疑发票:
print(f"\n⚠️ 可疑发票清单:")
for 发票 in 可疑发票:
print(f"发票号:{发票['发票号']},金额:{发票['金额']}元")

print(f"\n💡 处理建议:")
print("1. 联系开票方确认发票信息")
print("2. 要求提供发票开具证明")
print("3. 必要时向税务机关举报")
else:
print("✅ 所有发票验证通过,无异常")
挑战2:智能对账系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# 智能对账系统
print("=== 智能对账系统 ===")

# 模拟银行对账单
银行对账单 = []
公司账目 = []

# 生成模拟数据
import random
random.seed(42) # 保证结果可重复

起始余额 = 100000
当前余额 = 起始余额

# 生成30天的交易记录
for 日期 in range(1, 31):
# 随机生成收入或支出
if random.random() > 0.3: # 70%概率有交易
金额 = round(random.uniform(1000, 20000), 2)
类型 = random.choice(["收入", "支出"])

if 类型 == "收入":
当前余额 += 金额
银行对账单.append({
"日期": f"2024-01-{日期:02d}",
"收入": 金额,
"支出": 0,
"余额": 当前余额
})
else:
当前余额 -= 金额
银行对账单.append({
"日期": f"2024-01-{日期:02d}",
"收入": 0,
"支出": 金额,
"余额": 当前余额
})

# 生成公司账目(故意制造几个差异)
公司当前余额 = 起始余额
for 交易 in 银行对账单:
# 随机制造差异
if random.random() > 0.9: # 10%概率有差异
差异金额 = round(random.uniform(100, 500), 2)
if random.random() > 0.5:
公司当前余额 += (交易["收入"] - 交易["支出"] + 差异金额)
else:
公司当前余额 += (交易["收入"] - 交易["支出"] - 差异金额)
else:
公司当前余额 += (交易["收入"] - 交易["支出"])

公司账目.append({
"日期": 交易["日期"],
"收入": 交易["收入"],
"支出": 交易["支出"],
"余额": 公司当前余额
})

print(f"银行对账单记录数:{len(银行对账单)}")
print(f"公司账目记录数:{len(公司账目)}")

# 开始对账
print(f"\n🔍 开始对账...")

差异记录 = []
对账通过 = 0

for i in range(min(len(银行对账单), len(公司账目))):
银行交易 = 银行对账单[i]
公司交易 = 公司账目[i]

if 银行交易["日期"] == 公司交易["日期"]:
金额差异 = abs(银行交易["余额"] - 公司交易["余额"])

if 金额差异 < 0.01: # 忽略小于0.01的差异
对账通过 += 1
print(f"✅ {银行交易['日期']}:对账通过")
else:
差异记录.append({
"日期": 银行交易["日期"],
"银行余额": 银行交易["余额"],
"公司余额": 公司交易["余额"],
"差异": 金额差异
})
print(f"❌ {银行交易['日期']}:差异{金额差异:.2f}元")

# 输出对账结果
print(f"\n📊 对账结果:")
print(f"总记录数:{len(银行对账单)}")
print(f"对账通过:{对账通过}")
print(f"差异记录:{len(差异记录)}")
print(f"对账准确率:{对账通过/len(银行对账单)*100:.1f}%")

if 差异记录:
print(f"\n⚠️ 差异明细:")
for 差异 in 差异记录:
print(f"{差异['日期']}:银行{差异['银行余额']:.2f}元,公司{差异['公司余额']:.2f}元,差异{差异['差异']:.2f}元")

# 自动调整建议
总差异 = sum(差异["差异"] for 差异 in 差异记录)
print(f"\n💡 自动调整建议:")
if 总差异 > 0:
print(f"公司账目应调增:{总差异:.2f}元")
else:
print(f"公司账目应调减:{abs(总差异):.2f}元")

print(f"\n🔧 调整分录:")
print("借:银行存款 {:.2f}元".format(abs(总差异)))
print("贷:财务差异 {:.2f}元".format(abs(总差异)))
else:
print("✅ 对账完成,无差异!")

💭 今日思考

通过今天的学习,我们发现:

  • 循环语句是处理重复性工作的利器
  • for 循环适合已知次数的批量处理
  • while 循环适合条件控制的智能重复
  • 用Python生成报表比手工操作快得多,而且更准

📝 课后小结

  • ✅ 掌握了 for 循环的用法
  • ✅ 学会了 while 循环的应用
  • ✅ 理解了两种循环的区别和选择
  • ✅ 制作了三个版本的月度报表生成器

🎯 下节预告

下节我们将学习代码的乐高:函数,把今天写的这些循环代码封装成“积木”,需要时直接调用,再也不用重复写相同的代码了!


💡 小贴士

  • 循环语句要注意避免“死循环”(条件永远为真)
  • 选择合适的循环类型:知道次数用for,条件控制用while
  • 复杂的循环逻辑可以先画流程图,再写代码

🤖 Powered by Kimi K2 0905 💻 内容经葵葵🌻审核与修改