查看全课大纲(第 12 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 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():的下面。现在,整个程序的结构变成了:

  1. 定义常量。
  2. 定义convert_currency函数。
  3. 定义main函数。
  4. 调用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()函数后,程序是怎么执行的:

  1. 运行程序,Python先看到常量赋值和函数定义(def ...),但不执行函数里面的代码,只是把它们登记好。
  2. 接着看到最后一行的 main() 调用,于是跳转到 main 函数。
  3. 进入main()函数内部,开始一行行执行:获取输入、判断单位、计算汇率……
  4. 执行到 convert_currency2(in_money) 时,调用我们定义的Lambda函数。
  5. Lambda函数计算 in_money * exchange_rate 并返回结果。
  6. 结果回到main()函数,被打印出来。
  7. main()函数执行完毕,整个程序结束。

这个过程就像公司开会:写在最后面的 main() 一声令下“开始吧”,项目经理(main 函数)就按照议程(函数体内的代码)推进,需要技术支援时(convert_currency2),就呼叫工程师(Lambda函数)来解决。

📝 动手练一练

  1. 结构理解:把上面“第三步”里包含 Lambda 的最终 v5.0 代码完整地输入 PyCharm 并运行。尝试折叠 main 函数,感受代码结构变得多么清晰。进阶(选做):再把最后一行 main() 换成下面两行,体会一下“标准起手式”——运行结果完全一样:
    if __name__ == '__main__':
        main()
  2. 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
    下载
看图文没弄懂?展开看本节视频讲解(约 18 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)