
freeCodeCamp Python 每日编程挑战 62手写 Hex 转 Decimal 进制转换与验证全解【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南围绕 freeCodeCamp 开源课程仓库中 Python 每日编程挑战Daily Coding Challenges第 62 题「Hex to Decimal」展开完整讲解十六进制到十进制转换的数制原理、int(hex, 16)一行解法、手写逐位累加算法、越权输入校验以及该挑战在「Dev Playground」超级块中的 Markdown 结构与自动测试hints运行机制。读完本文你将掌握用 Python 实现任意长度十六进制字符串转十进制整数的多种可靠写法并理解 freeCodeCamp 如何用内嵌runPython测试驱动这类练习题的评分。挑战题面输入与约束挑战原文位于 curriculum/challenges/english/blocks/daily-coding-challenges-python/68c497f3aaefc9fd9f1b0e26.md要求实现函数def hex_to_decimal(hex): # 返回十进制整数值题目描述给定一个表示十六进制数基数 16的字符串返回其十进制基数 10的整数值。输入约束非常重要字符串仅包含字符0–9和A–F不需要处理小写字母、0x前缀、空格或非法字符字符串可能很长如A3F这种三位及以上解题时需要考虑位权累加。数制基础为什么 0–9 之后是 A–F十六进制是计算机领域最常见的缩写型数制1 位十六进制数字恰好对应 4 位二进制bit因此内存地址、颜色值、哈希摘要都习惯用十六进制书写。题目给出了 16 个数字的约定0-9表示值0到9A-F表示值10到15。题内附带的转换表完整列出各阶段换算关系HexadecimalDecimal0011......99A10......F151016......9F159A0160......FF255100256观察规律10代表16即 1×16 09F 9×16 15 159FF 15×16 15 255100 1×16² 256。这正是逢十六进一的位权展开。官方解法一行int(hex, 16)题目的--solutions--部分给出了官方参考答案整个函数只有一行def hex_to_decimal(hex): return int(hex, 16)Python 内置的int(x, base)支持第二个参数指定进制base的取值范围是 0 和 2–36。传入16时Python 会按十六进制解析字符串并返回十进制整数int(A, 16)→10int(15, 16)→21int(2E, 16)→46int(FF, 16)→255int(A3F, 16)→2623注意事项Python 的int()默认是大小写不敏感的int(a3f, 16)同样返回2623且字符串中的空白如首尾空格会被忽略。本挑战的输入约束保证只出现大写A–F因此直接使用内置函数即可。逐位手写实现理解位权累加原理官方一行解固然简洁但若要真正理解进制转换的数学原理这在面试与算法题中经常被要求应当掌握手写逐位累加的写法def hex_to_decimal(hex): decimal 0 for char in hex: if 0 char 9: digit ord(char) - ord(0) else: # A 到 F digit ord(char) - ord(A) 10 decimal decimal * 16 digit return decimal核心思路是霍纳法则Horners method从左到右扫描每一位把当前结果乘以 16 再加上该位的数值等价于按位权展开d1×16ⁿ⁻¹ d2×16ⁿ⁻² ... dn×16⁰。例如处理A3F初始decimal 0读A→ 10decimal 0*16 10 10读3→ 3decimal 10*16 3 163读F→ 15decimal 163*16 15 2623。另一种常见写法是先构建字符到数值的映射表再累加def hex_to_decimal(hex): hex_map {str(i): i for i in range(10)} hex_map.update({chr(ord(A) i): 10 i for i in range(6)}) decimal 0 for char in hex: decimal decimal * 16 hex_map[char] return decimal映射表写法把字母与数值的对应关系显式化代码可读性更好也方便后续扩展例如加入小写字母支持。防御式写法结合输入校验虽然题目保证输入合法但在真实项目中建议加上校验避免int()抛ValueError或静默接受意外格式。可以结合本仓库另一道相关挑战「Challenge 166: Hex Validator」curriculum/challenges/english/blocks/daily-coding-challenges-python/696655d24b614176d4c9b789.md的校验思路写出健壮的版本def hex_to_decimal(hex): if not hex: return 0 for char in hex: if not ((0 char 9) or (A char F)): raise ValueError(fInvalid hexadecimal character: {char}) decimal 0 for char in hex: if 0 char 9: digit ord(char) - ord(0) else: digit ord(char) - ord(A) 10 decimal decimal * 16 digit return decimal挑战的自动测试hints 如何驱动评分该挑战的--hints--段落定义了 5 条测试全部通过 Python 标准库unittest的TestCase执行由 JavaScript 端通过runPython注入运行断言期望结果hex_to_decimal(A)10hex_to_decimal(15)21hex_to_decimal(2E)46hex_to_decimal(FF)255hex_to_decimal(A3F)2623在 Markdown 源码中每条 hint 以代码块形式嵌入({test: () { runPython( from unittest import TestCase TestCase().assertEqual(hex_to_decimal(A), 10)) }})运行机制从源码结构看浏览器端通过 Web Worker 在沙箱中执行 Python 代码Python 交互print、input、reset 等消息由 python-worker-handler.ts 统一处理其中的PythonWorkerEvent类型枚举了print、input、contentLoaded、reset、stopped、is-alive等事件execute-challenge-saga.jsclient/src/templates/Challenges/redux/execute-challenge-saga.js负责在提交时逐条执行 hints最终汇总成通过/失败结果。这与普通 JS 挑战直接用assert.equal(...)不同Python 挑战必须经由runPython把测试脚本送到 Python 运行时中执行。挑战在课程体系中的位置本挑战属于daily-coding-challenges-python块编号为 Challenge 62位于dev-playground超级块下超级块结构定义见 curriculum/structure/superblocks/dev-playground.json它聚合了daily-coding-challenges-javascript与daily-coding-challenges-python两个块块的元数据定义见 curriculum/structure/blocks/daily-coding-challenges-python.json其中helpCategory: Python、usesMultifileEditor: true、isUpcomingChange: true属即将上线内容本地需开启SHOW_UPCOMING_CHANGES才能看到同一 id68c497f3aaefc9fd9f1b0e26在 JS 块中也有对应版本68c497f3aaefc9fd9f1b0e26.mdJS其解法为parseInt(hex, 16)两个版本通过测试套件保证描述、标题与测试数量严格一致。课程测试 daily-challenges.test.js 专门验证两件事其一JS 与 Python 两个块的挑战数量必须相等其二逐一比对每对挑战的 id、标题、描述与测试数量必须完全匹配英文 locale 下这保证了跨语言版本的一致性维护。本地运行与验证方式如果要在本地复现并验证这些 Python 每日挑战该块被标记为isUpcomingChange: true需要先设置环境变量SHOW_UPCOMING_CHANGEStruecurriculum/src/test/daily-challenges.test.js开头正是用vi.stubEnv(SHOW_UPCOMING_CHANGES, true)来模拟该配置运行课程测试套件执行上述一致性校验见 curriculum/package.json 中 vitest 相关脚本挑战数据可通过 tools/daily-challenges/README.md 描述的 seed 流程写入本地数据库复制sample.env为.env、安装依赖、以展示 upcoming changes 的方式运行主客户端然后在tools/daily-challenges目录执行pnpm seed-daily-challenges即可把「Dev Playground」超级块的挑战种子到freecodecamp数据库的DailyCodingChallenges集合中。小结Challenge 62「Hex to Decimal」表面上是一个一行内置函数即可解决的入门题但它承载了三层价值一是十六进制位权展开的数制基础二是int(str, base)与手写霍纳累加两种解法的对比训练三是从 hints 到 Web Worker 的自动化测试链路展示了 freeCodeCamp 课程系统中 Python 挑战的完整运行机制。掌握本题也为后续Decimal to Binary、Hex Validator、RGB to Hex等相邻挑战见 daily-coding-challenges-python.json 的 challengeOrder 列表打下扎实基础。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考