查看全课大纲(第 10 / 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.空气质量数据怎么“洗”干净,还能画成图?

汇率兑换程序能一直运行,直到我喊停吗?

约 24 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

在上一节,我们让汇率兑换程序学会了“看人下菜碟”——能自动识别你输入的是人民币还是美元,然后进行正确的换算。但每次算完一次,程序就“下班”了,想再算一次就得重新运行,有点麻烦。

今天,我们就来解决这个“麻烦”!我们要给程序加上一个循环功能,让它变成一个不知疲倦的“计算器”。只要你愿意,它可以一直为你服务,直到你主动说“Q”(退出)。想象一下,你的程序现在像一个24小时营业的便利店,随时待命,是不是很酷?

💡 核心导读

  • 循环是什么? 让一段代码可以重复执行多次的“魔法”。
  • while 循环:Python 中实现循环的“开关”,条件是它的“遥控器”。
  • 避免“死循环”:一个不小心,程序就会变成停不下来的“复读机”,我们要学会如何正确控制它。
  • 程序友好度升级:给循环加点“装饰”,让交互界面更清晰、更友好。

从流程图到代码:理解“循环”这件事

还记得我们之前写的程序吗?它像一条单行道,从输入到输出,走完就结束。但我们想要的是环形跑道,跑完一圈,还能回到起点,继续下一圈。

这种“环形跑道”在编程里就叫循环。为了理清思路,程序员们喜欢用一种叫流程图的工具来画图。下面就是我们3.0版本程序的“设计图”:

开始
  ↓
输入带单位的金额(例如:100CNY)
  ↓
判断用户输入的是否为“Q”?
  ├─ 如果是“Q” → 输出“程序已退出!” → 结束
  ↓
  └─ 如果不是“Q” → 执行我们2.0版本的所有换算逻辑
        ↓
        (这里是判断CNY/USD、计算、输出的所有步骤)
        ↓
        └─ 回到“判断用户输入的是否为‘Q’?”这一步

看到了吗?关键在于那个“回到”的箭头。只要用户输入的不是“Q”,程序就会一遍又一遍地执行中间的换算逻辑。这,就是循环的精髓。

本节新增:认识 while 循环

本节我们只加一件事:用 while 循环让程序能一直运行。

在 Python 里,我们用一个叫做 while 的关键字来创建循环。你可以把它理解成“当……的时候,就重复做某事”。

它的语法长这样:

while 条件:
    # 如果条件满足(为 True),就执行这个缩进块里的所有语句
    # 执行完后,会再次回到上面检查"条件"
    # 如果条件不满足(为 False),就跳出循环,执行后面的代码

条件是什么? 它和我们上一节学的 if 语句里的条件一模一样,就是一个判断,结果是 True(真)或 False(假)。

  • True:代表条件成立,循环继续。
  • False:代表条件不成立,循环停止。

好了,理论说完,我们动手把它塞进我们的汇率兑换程序里!

动手实现:给程序装上“循环引擎”

我们的策略是:在2.0版本的程序外面,套上一个 while 循环。循环的条件就是:当用户输入的不是退出指令“Q”时,就继续换算。

第一步:搭建循环框架

我们先从最核心的循环判断开始。我们会提示用户输入,并且判断这个输入是否等于“Q”。

# 汇率(这个没变)
USD_VS_RMB = 6.77

# 1. 首先,询问用户输入,并提示退出方式
currency_str_value = 'Q'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


# 2. 新增的 while 循环:只要输入不是'Q',就执行循环体
while currency_str_value != 'Q':
    # 注意这个冒号和缩进!循环体里的所有代码都要缩进
    # 这里先留空,我们马上把2.0的代码搬进来
    print("循环体里的代码待填充...")

    # 3. 一次循环结束后,需要再次询问用户,否则会陷入死循环
    currency_str_value = 'Q'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


# 4. 循环结束后(即用户输入了'Q'),执行这里的代码
print('程序已退出!')
程序已退出!

代码解读:

  • != 是“不等于”的意思。currency_str_value != 'Q' 就是判断输入是否不等于“Q”。
  • 如果输入是“100CNY”,它不等于“Q”,条件为 True,程序进入循环体。
  • 循环体最后一行至关重要:它再次让用户输入。这样,下一次循环判断时,currency_str_value 就是用户的新输入了。
  • 如果用户输入“Q”,条件 'Q' != 'Q' 结果为 False,循环结束,直接执行最后的 print('程序已退出!')。

第二步:填入核心换算逻辑

现在,我们把2.0版本里那个强大的“判断+计算”引擎,整个搬到 while 循环的缩进块里。

# 汇率
USD_VS_RMB = 6.77

# 带单位的货币输入
currency_str_value = 'Q'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


while currency_str_value != 'Q':
    # ---------------- 以下是2.0版本的核心逻辑 ----------------
    # 获取货币单位
    unit = currency_str_value[-3:]

    if unit == 'CNY':
        # 输入的是人民币
        rmb_str_value = currency_str_value[:-3]
        # 将字符串转换为数字(⚠️注意:这里用float更安全,原课用eval有风险)
        rmb_value = float(rmb_str_value)
        # 汇率计算
        usd_value = rmb_value / USD_VS_RMB
        # 输出结果
        print('美元(USD)金额是:', usd_value)

    elif unit == 'USD':
        # 输入的是美元
        usd_str_value = currency_str_value[:-3]
        # 将字符串转换为数字
        usd_value = float(usd_str_value)
        # 汇率计算
        rmb_value = usd_value * USD_VS_RMB
        # 输出结果
        print('人民币(CNY)金额是:', rmb_value)

    else:
        # 其他情况
        print('目前版本尚不支持该种货币!')
    # ---------------- 以上是2.0版本的核心逻辑 ----------------

    print('************************************************')
    # 一次循环结束后,再次询问用户,为下一次循环做准备
    currency_str_value = 'Q'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


print('程序已退出!')
程序已退出!

大功告成! 这就是我们汇率兑换程序的3.0版本。现在,你可以连续兑换无数次,直到输入“Q”才会退出。

趣味调试:给循环装个“计数器”

有时候,我们想知道循环到底执行了多少次。可以加一个计数器变量 i。

# 汇率
USD_VS_RMB = 6.77

currency_str_value = 'Q'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)

i = 0  # 初始化计数器

while currency_str_value != 'Q':
    i = i + 1  # 每次循环,计数器加1
    print('这是第', i, '次计算')  # 打印当前是第几次循环(调试用,发布时可注释掉)

    # ... (这里省略中间完整的换算逻辑,和上面代码块一样) ...

    print('************************************************')
    currency_str_value = 'Q'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


print('程序已退出!')

注意看 i = i + 1 这行:

  • 在数学上,i = i + 1 永远不成立。
  • 但在编程里,= 是赋值号,意思是“把右边的计算结果,存到左边的变量里”。
  • 所以这行的意思是:取出 i 当前的值,加上1,再把结果存回 i。这样 i 的值就增加了1。

这个技巧在你以后自己调试复杂程序时非常有用。当然,给用户看的最终版本,可以把 print('这是第', i, '次计算') 这行用 # 注释掉,界面就更清爽了。

警惕!循环的陷阱:死循环

在我们最初的尝试中,如果不小心忘记了在循环体最后让用户重新输入,就会发生可怕的事情:

# ❌ 错误示范(会导致死循环)
while currency_str_value != 'Q':
    # ... 执行换算逻辑 ...
    # 执行完后,currency_str_value 还是最初输入的那个值,比如“100CNY”
    # 然后跳回while判断:“100CNY” != ‘Q’ 吗? 是True!
    # 于是又开始执行换算逻辑, currency_str_value 还是“100CNY”...
    # 如此反复,永无止境,程序“卡死”了。

这就是死循环——程序停不下来,像一台失控的机器。避免死循环的关键是:确保循环体内的操作,有可能使循环条件在未来变为 False。对我们来说,就是在每次循环结束前,给用户一个改变输入(从而可能输入‘Q’)的机会。

📝 动手练一练

  1. 体验无限兑换:将本节完整的3.0版本代码(包含计数器 i 的版本)运行起来。尝试连续兑换3次不同的金额,然后输入“Q”退出。观察计数器和输出分隔线 ****** 是如何让过程更清晰的。

  2. 改造存钱计算器(假设):假设我们有一个计算每周存钱总额的简单程序(total = 每周金额 * 周数)。如果想让这个程序能反复计算不同周数下的总额,直到用户输入“结束”,你会怎么用 while 循环改造它?请写出循环部分的核心框架。

    • 提示:思考循环条件是什么?循环体内需要做什么?循环结束后提示什么?
👉 点击查看第2题参考答案

思路:

  1. 循环条件:当用户输入的不是“结束”时,继续计算。
  2. 循环体内:询问用户“每周存多少钱”和“存多少周”,然后计算并输出总额。
  3. 循环结束后:输出“存钱计算结束”。

核心代码框架:

# 初始化用户输入(或者直接用第一次输入)
user_command = '结束'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


while user_command != '结束':
    # 1. 获取每周存钱金额(这里简化,假设user_command就是金额)
    #    实际可能需要更复杂的输入处理
    money_per_week = float(user_command)

    # 2. 获取周数
    weeks = 10  # 原程序用 input() 让用户输入数字,这里用固定值代替(参与乘法运算,故不加引号),你可以改成自己的值试


    # 3. 计算并输出
    total = money_per_week * weeks
    print(f'每周存{money_per_week}元,共存{weeks}周,总额为:{total}元')

    print('---')
    # 4. 为下一次循环做准备,再次询问
    user_command = '结束'  # 固定为退出标志值(循环体内若恒为此值,循环只跑一轮就结束;原程序这里是 input() 让用户决定何时退出)


print('存钱计算结束!')
存钱计算结束!

本章小结

恭喜!你的汇率兑换程序获得了“永动机”属性(当然是受控的)!现在它已经是一个相当实用的小工具了。

我们本节只引入了一个新概念——while 循环,但它的力量是巨大的。它让程序从“一次性”变成了“可持续交互”。你还学会了:

  • 用 while 条件: 来构建循环。
  • 用 != 判断“不等于”。
  • 如何避免致命的“死循环”(关键是在循环体内改变循环条件)。
  • 用计数器变量来辅助调试。

📋 行动清单

  • 运行完整的3.0程序,享受连续兑换的畅快感。
  • 尝试故意去掉循环体最后一句 input,感受一下“死循环”的恐怖,然后记得按IDE的停止按钮。
  • 想一想,你手机里有哪些App的功能,感觉像是用“循环”逻辑实现的?(比如,音乐播放器的“单曲循环”)

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第2章代码包:汇率兑换(含全部版本 5 个 .py)
    ZIP · 3KB
    下载
看图文没弄懂?展开看本节视频讲解(约 24 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)