查看全课大纲(第 12 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 51.空气质量数据怎么“洗”干净,还能画成图?
汇率兑换5.0:给你的程序穿上“结构化”的西装
约 18 分钟
小象实战讲义 · Python 入门:8 个小项目边玩边学
欢迎回来!上一节我们学会了把“换算”这个动作打包成一个函数,让代码变得整洁。这节课,我们要做一件更酷的事:给你的整个程序“穿上西装”,让它从“一堆代码”变成一个结构清晰、专业范儿十足的“作品”。
学完这一节,你的汇率兑换程序将拥有一个清晰的“骨架”,并且会用一个超简洁的写法来定义简单的函数。这就像给你的代码做了个“大扫除”和“精装修”,让它看起来既专业又舒服。
💡 核心导读
- 程序结构化:学会用一个“主函数”来统领全局,让你的代码层次分明,一目了然。
if __name__ == '__main__'::了解专业程序员启动程序的“标准起手式”。- Lambda函数:掌握一种“一句话”就能定义简单函数的超酷写法,让代码更简洁。
- 安全提醒:学会用更安全的方式处理用户输入,避免程序中的“小陷阱”。
第一步:从“平铺直叙”到“层次分明”
还记得我们4.0版本的代码吗?它有一个convert_currency函数,但函数外面还有一堆代码(输入、判断、调用函数、输出)。现在,我们要把这些“外面的代码”也装进一个“盒子”里。
这个“盒子”我们通常叫它主函数,名字就叫main。它就像是整个程序的“总指挥”。
# 汇率兑换程序 v5.0 - 结构化版本
# 汇率
USD_VS_RMB = 6.77
def convert_currency(in_money, exchange_rate):
"""
汇率兑换函数
"""
out_money = in_money * exchange_rate
return out_money
def main():
"""
主函数:程序的“总指挥”
"""
# 带单位的货币输入
currency_str_value = '100CNY' # 原程序这里用 input() 让用户输入,例如 '100CNY'、'50USD'
unit = currency_str_value[-3:] # 获取货币单位
if unit == 'CNY':
exchange_rate = 1 / USD_VS_RMB # 人民币转美元
elif unit == 'USD':
exchange_rate = USD_VS_RMB # 美元转人民币
else:
exchange_rate = -1
if exchange_rate != -1:
# 获取货币数值部分(去掉末尾3个单位字符)
# ⚠️ 注意:原课程使用了 eval(),这里我们使用更安全的 float()
in_money = float(currency_str_value[:-3]) # '100CNY'[:-3] 得到 '100',再转浮点数
# 调用函数进行兑换计算
out_money = convert_currency(in_money, exchange_rate)
print('转换后的金额:', out_money)
else:
print('不支持该种货币!')
# 调用主函数,启动程序
main()转换后的金额: 14.771048744460858看,我们把除了汇率常量和函数定义之外的所有代码,都“缩进”到了def main():的下面。现在,整个程序的结构变成了:
- 定义常量。
- 定义
convert_currency函数。 - 定义
main函数。 - 调用
main函数。
本节新增了什么? 我们新增了一个main()函数,把程序的主干逻辑都装了进去。这就像把散乱的衣服都挂进了衣柜,房间立刻整洁了。
第二步:专业程序员的“标准起手式”
上面的代码最后一行是main(),直接调用主函数。这没问题,但还不够“专业范儿”。在真实的项目里,你经常会看到下面这种写法:
if __name__ == '__main__':
main()这行代码的意思是:如果这个文件是被直接运行的(而不是被其他文件导入的),那么就执行main()函数。
你可以把它理解为一个“智能开关”。它保证了我们的代码既可以作为一个独立的程序运行,也可以在未来被其他程序当作一个模块来使用,而不会产生意外的副作用。这是Python社区一个非常重要的惯例。
本讲义只用
main()直接调用(不用__main__守卫),这样你复制代码到任何地方都能立刻跑通,看到结果。真实项目里两种写法都对。
为什么程序看起来更清晰了? 在PyCharm这样的IDE里,你可以点击函数定义行旁边的-号,把整个函数“折叠”起来。折叠后,函数体被收成一行省略号,你的代码文件看起来就像下面这样,只剩一个个清晰的“模块”:
USD_VS_RMB = 6.77
def convert_currency(in_money, exchange_rate): … # 点 + 可展开
def main(): … # 点 + 可展开
main()是不是超级清晰?一眼就能看出这个程序由“一个常量 + 两个函数 + 一次调用”组成。这就是结构化的好处:先看骨架,想了解细节再展开对应函数。
第三步:Lambda函数——“一句话”定义函数
我们的convert_currency函数非常简单,就做了一件事:in_money * exchange_rate。对于这种极其简单的函数,Python提供了一个超级简洁的写法——Lambda表达式(也叫匿名函数)。
Lambda的语法是:函数名 = lambda 参数: 表达式 这个表达式的结果会自动作为函数的返回值。
让我们用Lambda来重写兑换函数:
# 汇率兑换程序 v5.0 - 使用Lambda函数
# 汇率
USD_VS_RMB = 6.77
def main():
"""
主函数
"""
# 带单位的货币输入
# 原程序用 input(),这里用固定值代替以便直接运行
currency_str_value = '100CNY' # 你可以改成'50USD'试试
unit = currency_str_value[-3:]
if unit == 'CNY':
exchange_rate = 1 / USD_VS_RMB
elif unit == 'USD':
exchange_rate = USD_VS_RMB
else:
exchange_rate = -1
if exchange_rate != -1:
in_money = float(currency_str_value[:-3])
# 🔥 使用Lambda定义函数(一句话搞定!)
# 函数名:convert_currency2
# lambda 参数x: 表达式 x * exchange_rate
convert_currency2 = lambda x: x * exchange_rate
# 调用Lambda函数
out_money = convert_currency2(in_money)
print('转换后的金额:', out_money)
else:
print('不支持该种货币!')
# 启动程序
main()运行上面的代码,你会看到:
转换后的金额: 14.771048744460858本节新增了什么? 我们新增了Lambda函数的用法,用一行代码lambda x: x * exchange_rate就替代了原来需要多行定义的convert_currency函数。它特别适合定义那些逻辑简单到只有一行表达式的函数。
⚠️ 重要提示:安全处理输入 你可能注意到了,我们把原课程中的 eval(currency_str_value[:-3]) 改成了 float(currency_str_value[:-3])。
eval()非常强大但也危险,它会执行字符串中的任何Python表达式。如果用户输入了恶意代码,可能带来安全问题。在处理用户输入时,应避免使用eval()。float()则安全得多,它只尝试将字符串转换成浮点数,转换失败会报错,不会执行任意代码。在我们的场景下,用float()更合适。
程序是如何“跑”起来的?
让我们画个简单的流程图,看看加了main()函数后,程序是怎么执行的:
- 运行程序,Python先看到常量赋值和函数定义(
def ...),但不执行函数里面的代码,只是把它们登记好。 - 接着看到最后一行的
main()调用,于是跳转到main函数。 - 进入
main()函数内部,开始一行行执行:获取输入、判断单位、计算汇率…… - 执行到
convert_currency2(in_money)时,调用我们定义的Lambda函数。 - Lambda函数计算
in_money * exchange_rate并返回结果。 - 结果回到
main()函数,被打印出来。 main()函数执行完毕,整个程序结束。
这个过程就像公司开会:写在最后面的 main() 一声令下“开始吧”,项目经理(main 函数)就按照议程(函数体内的代码)推进,需要技术支援时(convert_currency2),就呼叫工程师(Lambda函数)来解决。
📝 动手练一练
- 结构理解:把上面“第三步”里包含 Lambda 的最终 v5.0 代码完整地输入 PyCharm 并运行。尝试折叠
main函数,感受代码结构变得多么清晰。进阶(选做):再把最后一行main()换成下面两行,体会一下“标准起手式”——运行结果完全一样:if __name__ == '__main__': main() - Lambda挑战:我们的Lambda函数
convert_currency2 = lambda x: x * exchange_rate使用了函数外定义的exchange_rate变量。你能写一个Lambda函数,让它接收两个参数(金额和汇率),并返回换算结果吗?这样它就更独立了。
👉 点击查看第2题参考答案
思路:让Lambda函数自己接收汇率参数,而不是依赖外部的exchange_rate。这样它就是一个“纯函数”,逻辑更清晰。
# 定义一个接收两个参数的Lambda函数
convert_currency_pure = lambda money, rate: money * rate
# 假设金额是100,汇率是0.1477(人民币兑美元)
money = 100
rate = 0.1477
result = convert_currency_pure(money, rate)
print(f'{money}人民币可兑换{result:.2f}美元') # :.2f 表示保留两位小数运行结果:
100人民币可兑换14.77美元本章小结
恭喜你!你不仅完成了汇率兑换项目的终极版本,还学到了两个让代码变得更专业的核心概念。
📋 行动清单
- 运行并理解最终的v5.0代码,观察
main()函数和Lambda是如何工作的。 - 在你的代码编辑器里,尝试折叠/展开函数,体验结构化代码的清晰感。
- 记住这个安全原则:处理用户输入的字符串时,优先使用
int()、float()等安全转换函数,尽量避免使用eval()。
从1.0到5.0,我们通过“汇率兑换”这个有趣的项目,像搭积木一样,不知不觉学会了变量、字符串、判断、循环、函数等核心概念。你的程序从一个简单的计算器,成长为了一个结构清晰、功能完整的小工具。这就是“螺旋式项目递进”的魅力——在玩中学,每一步都看得到成果!
我们的下一个项目将完全换一个画风:用Python来画画! 你将学会如何指挥一只“小海龟”在屏幕上爬行,绘制出奇妙的图形。准备好进入编程的视觉艺术世界了吗?我们下节课见!
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第2章代码包:汇率兑换(含全部版本 5 个 .py)ZIP · 3KB