freeCodeCamp 每日编程挑战解析:用 Python 条件判断实现 Thermostat Adjuster(Challenge 36) freeCodeCamp 每日编程挑战解析用 Python 条件判断实现 Thermostat AdjusterChallenge 36【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇指南围绕 freeCodeCamp 仓库中daily-coding-challenges-python模块的 Challenge 36「Thermostat Adjuster」展开完整解析这道条件判断编程题的题目约束、种子代码、六组单元测试断言与官方参考解法并深入结合仓库源码讲解这道题在 freeCodeCamp 课程体系、自动化校验、数据库种子脚本与前后端展示链路中的实际位置与运行方式。读完本文你将掌握一套可复制的「读懂挑战 Markdown → 理解测试桩 → 编写并验证 Python 解法」的完整方法论并能复用到同模块其余 300 多道 Python 每日挑战中。挑战文件的位置与课程上下文Challenge 36 的原始文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-python/68b06e589bf2273243814771.md文件头部元数据如下--- id: 68b06e589bf2273243814771 title: Challenge 36: Thermostat Adjuster challengeType: 29 dashedName: challenge-36 ---id是这条挑战在课程数据库中的全局唯一标识后续种子脚本、API 与前端完成记录都以它为键challengeType: 29表明这是一道「每日编码挑战」daily coding challenge类型的题目dashedName: challenge-36用于 URL 与内部路由引用。该文件位于daily-coding-challenges-python模块下与 JavaScript 侧的daily-coding-challenges-javascript模块一一对应。从 curriculum/structure/blocks/daily-coding-challenges-python.json 可以看到本模块共登记了 365 道截至该结构文件所记录的范围Python 每日挑战其中 Challenge 36 排在 Challenge 35「Word Frequency」之后、Challenge 37「Sentence Capitalizer」之前。模块配置helpCategory: Python、usesMultifileEditor: true、blockLayout: legacy-challenge-list并且isUpcomingChange: true说明该模块在仓库中属于通过「dev-playground」超级模块进行开发与测试的预发布内容。题目要求三态室温调节指令Challenge 36 的核心任务非常简单且边界清晰给定房间当前温度与目标温度两个数值返回一个描述如何调节室温的字符串规则只有三条当前温度低于目标温度 → 返回heat需要加热当前温度高于目标温度 → 返回cool需要制冷当前温度等于目标温度 → 返回hold保持现状。函数签名在种子代码中给出def adjust_thermostat(temp, target): return temp种子代码中return temp只是占位实现用于让挑战者聚焦在补全分支逻辑上而不是从头搭建函数骨架。边界情形解读从题目描述与后续测试断言可以归纳出几个值得注意的边界点等值判定必须精确72 72、0.0 0.0都应落入hold分支这意味着浮点数相等判断在本题中是可依赖的温度值来自测试用例中的固定字面量不存在累积误差支持负数与小数测试中包含(-20.5, -10.1)这样的负数温度对以及(100, 99.9)这样的非整数温度差说明参数类型是浮点数而非仅限整数返回值大小写固定三个返回值均为全小写字符串heat/cool/hold必须逐字符精确匹配。六组测试断言完整覆盖三条分支本题在 Markdown 的--hints--段中内嵌了六组自动化测试每组都是标准的 freeCodeCamp 测试桩格式——用runPython在浏览器端执行 Python 代码再通过unittest.TestCase().assertEqual做断言输入(temp, target)期望返回覆盖的分支(68, 72)heattemp target(75, 72)cooltemp target(72, 72)holdtemp target(-20.5, -10.1)heat负数场景 分支(100, 99.9)cool小数场景 分支(0.0, 0.0)hold浮点零等值场景六组用例完整覆盖了三条分支并特意挑选了负值、小数值与浮点零等边界输入用来验证实现不会因类型或数值大小而误判。例如第一组测试桩的完整写法如下({test: () { runPython( from unittest import TestCase TestCase().assertEqual(adjust_thermostat(68, 72), heat)) }})官方参考解法if / elif / else 三路分支--solutions--段给出的官方解法是最直接的三路分支实现def adjust_thermostat(temp, target): if temp target: return heat elif temp target: return cool else: return hold这段解法的要点分支顺序无关紧要但逻辑完备、、else三者组合覆盖了实数上的全部可能else分支天然承接了temp target的情形无需引入abs或取整题目只要求返回指令字符串不要求计算温差因此实现保持最小化直接返回字符串字面量没有多余中间变量可读性最佳。与 Challenge 72「Thermostat Adjuster 2」的对照同模块稍后的 Challenge 72curriculum/challenges/english/blocks/daily-coding-challenges-python/68cae5b538ff798bbd4da00a.md是本题的进阶版它要求先完成摄氏转华氏的单位换算F (C * 1.8) 32再按温差输出Heat: X degrees Fahrenheit/Cool: X degrees Fahrenheit/Hold的格式化字符串且X要四舍五入到 1 位小数。进阶版参考解法如下def adjust_thermostat(current_f, target_c): target_f (target_c * 1.8) 32 diff round(abs(target_f - current_f), 1) if current_f target_f: return fHeat: {diff} degrees Fahrenheit elif current_f target_f: return fCool: {diff} degrees Fahrenheit else: return Hold两题对照可以清晰看到同一套三路分支骨架如何演化Challenge 36 只输出指令词Challenge 72 则叠加了单位换算、abs温差计算、round(..., 1)格式化与 f-string 拼接是理解「先分支后格式化」思维进阶的绝佳示例。源码级佐证这道挑战如何被校验、入库与展示Thermostat Adjuster 不仅仅是一份 Markdown 文档它在 freeCodeCamp 的课程流水线中有一整套可追踪的实现链路。测试如何被执行runPython 与 unittest所有--hints--测试桩通过runPython注入执行。浏览器端对应的运行环境由 tools/client-plugins/browser-scripts 提供前端挑战页面的校验逻辑位于 client/src/templates/Challenges。测试桩把unittest的断言字符串交给runPython在沙箱中先加载用户对adjust_thermostat的定义再逐条执行assertEqual。也就是说只要你在编辑器中定义的函数名、参数个数与返回字符串完全符合题目要求六组断言会一次性全部通过。双语言一致性约束每日挑战同时存在 JavaScript 与 Python 两个模块。种子脚本 tools/daily-challenges/helpers.ts 中的combineChallenges会强制校验同一序号的 JS 与 Python 挑战的标题、描述完全一致且测试数量必须相等curriculum/src/test/daily-challenges.test.js 也在 Vitest 中逐条断言两边挑战的id、title、description与测试数量一致。因此 Challenge 36 的 Python 侧与 JavaScript 侧的adjustThermostat挑战共享同一份题目描述与同等的测试强度只是语言实现不同。入库与展示从 Markdown 到 DailyCodingChallenges 集合课程内容通过 curriculum/src/get-challenges.ts 等工具从 Markdown 解析为结构化挑战对象tools/daily-challenges/seed-daily-challenges.ts 从正在运行的客户端 GraphQL 端点http://localhost:8000/___graphql拉取dev-playground超级模块下的每日挑战并写入 MongoDB 的DailyCodingChallenges集合_id直接取挑战的id字段前端展示与提交记录依赖 client/src/utils/daily-coding-challenge-validator.ts 中定义的DailyCodingChallengeFromDb结构与 Joi 校验模式——每条挑战必须同时包含javascript与python两套tests含text与testString和challengeFiles缺一不可API 侧 api/src/daily-coding-challenge/README.md 明确说明每日挑战的信息获取端点与提交逻辑的职责划分。也就是说你在 Challenge 36 页面上写下的adjust_thermostat实现会经过「挑战页编辑器 → runPython 沙箱校验 → 通过后写入完成记录」这一完整链路其数据源头正是本文开头的这份 Markdown 文件。实战演练手写解法并逐条验证下面给出一个与官方解法等价的实现并演示如何在本地验证。解法一三路 if/elif/else推荐def adjust_thermostat(temp, target): if temp target: return heat elif temp target: return cool else: return hold解法二字典查表 比较函数def adjust_thermostat(temp, target): return {temp target: heat, temp target: cool}.get(True, hold)该写法利用布尔键查表temp target时两个键均为False落入默认值hold逻辑等价但可读性略差适合作为思维拓展。解法三条件表达式单行def adjust_thermostat(temp, target): return heat if temp target else (cool if temp target else hold)单行嵌套三元表达式在本题场景下可读性尚可但更复杂的场景不推荐。本地逐条验证将任意解法保存为thermostat.py后可用与测试桩完全一致的断言逐条验证from unittest import TestCase def adjust_thermostat(temp, target): if temp target: return heat elif temp target: return cool else: return hold tc TestCase() tc.assertEqual(adjust_thermostat(68, 72), heat) tc.assertEqual(adjust_thermostat(75, 72), cool) tc.assertEqual(adjust_thermostat(72, 72), hold) tc.assertEqual(adjust_thermostat(-20.5, -10.1), heat) tc.assertEqual(adjust_thermostat(100, 99.9), cool) tc.assertEqual(adjust_thermostat(0.0, 0.0), hold) print(All 6 assertions passed!)全部断言通过即代表该实现与官方参考解法在行为上完全一致可以放心提交。常见误区与排查建议返回值大小写错误把hold写成Hold会直接失败——本题要求全小写这与 Challenge 72 要求首字母大写Hold恰好相反做题时务必对照题目描述逐字核对返回温差数字而非指令词Challenge 36 不要求计算温差多余的abs、round不会导致失败但也不是必须的误用/若将等值情形提前吞掉如先判temp target返回heat(72, 72)就会错误返回heat而非hold等值分支必须独立承接参数顺序写反函数签名为adjust_thermostat(temp, target)若混淆了当前温度与目标温度的先后六组断言将全部反转失败。延伸思考从一道题到一套方法论Challenge 36 的价值在于它是一个教科书级的「三态条件分支」训练题目约束只有三条、测试覆盖完整、参考解法极简。掌握它的读题与验证流程后你可以用完全相同的方法去攻克同模块的其余题目——比如 Challenge 35「Word Frequency」的词频统计curriculum/challenges/english/blocks/daily-coding-challenges-python/68b06e589bf227324381476f.md、Challenge 72 的温度单位换算进阶版乃至全套 365 道每日 Python 挑战。它们共享同一套 Markdown 结构、同样的unittest测试桩格式以及同一条「源码 → 校验 → 入库 → 前端展示」的技术链路理解其中一道就等于理解了整条每日挑战体系的运行机制。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考