[{"data":1,"prerenderedAt":15943},["ShallowReactive",2],{"post-python-macos-installation":3,"sidebar-posts":202,"post-related-source":9134},{"id":4,"title":5,"body":6,"category":186,"cover":187,"description":12,"extension":188,"meta":189,"navigation":190,"path":191,"pinned":192,"publishedAt":193,"seo":194,"slug":195,"stem":196,"summary":197,"tags":198,"updatedAt":193,"visible":190,"__hash__":201},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":8,"toc":176},"minimark",[9,13,17,20,23,30,38,41,58,61,64,99,102,110,113,116,131,134,148,151,163,166,169,172],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,31,32,33,37],{},"终端收到 ",[34,35,36],"code",{},"python3"," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,39,40],{"id":40},"核心概念",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[45,49,50],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[45,52,53,54,57],{},"检查 pip 时使用 ",[34,55,56],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,59,60],{"id":60},"跟着示例运行",[10,62,63],{},"在 macOS 终端执行：",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark","python3 --version\npython3 -m pip --version\n","bash","",[34,72,73,85],{"__ignoreMap":70},[74,75,78,81],"span",{"class":76,"line":77},"line",1,[74,79,36],{"class":80},"svObZ",[74,82,84],{"class":83},"sDLfK"," --version\n",[74,86,88,90,93,97],{"class":76,"line":87},2,[74,89,36],{"class":80},[74,91,92],{"class":83}," -m",[74,94,96],{"class":95},"sU2Wk"," pip",[74,98,84],{"class":83},[10,100,101],{},"预期结果：",[65,103,108],{"className":104,"code":106,"language":107,"meta":70},[105],"language-text","Python 3.14.x\npip 版本信息与安装路径\n","text",[34,109,106],{"__ignoreMap":70},[10,111,112],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,114,115],{"id":115},"按执行顺序拆开看",[117,118,119,125],"ol",{},[45,120,121,124],{},[34,122,123],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[45,126,127,130],{},[34,128,129],{},"python3 -m pip --version"," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,132,133],{"id":133},"初学者容易混淆的地方",[42,135,136,142],{},[45,137,138,139,141],{},"看到系统已有 ",[34,140,36],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[45,143,144,145,147],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,146,36],{},"，不修改系统自带工具。",[14,149,150],{"id":150},"练习",[117,152,153,160],{},[45,154,155,156,159],{},"执行 ",[34,157,158],{},"which python3","，记录当前解释器路径。",[45,161,162],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,164,165],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,167,168],{"id":168},"本篇边界",[10,170,171],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,174,175],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":70,"searchDepth":87,"depth":87,"links":177},[178,179,180,181,182,183,184,185],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},"Python",null,"md",{},true,"\u002Fposts\u002F20260817\u002F02-python-macos-installation",false,"2026-08-17",{"title":5,"description":12},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[186,199,200],"macOS","环境搭建","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",[203,1008,1348,1484,1603,1782,1970,2135,2319,2502,2695,2926,3110,3287,3444,3615,3780,3995,4224,4406,4570,4759,4947,5102,5262,5459,5656,5870,6037,6281,6462,6667,6862,7046,7247,7537,7729,7958,8153,8373,8613,8817],{"id":204,"title":205,"body":206,"category":186,"cover":187,"description":70,"extension":188,"meta":998,"navigation":190,"path":999,"pinned":192,"publishedAt":1000,"seo":1001,"slug":1002,"stem":1003,"summary":1004,"tags":1005,"updatedAt":1000,"visible":190,"__hash__":1007},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":207,"toc":974},[208,211,214,217,224,227,230,269,285,289,294,305,310,316,334,340,345,351,355,405,408,414,420,423,454,499,516,530,540,544,555,566,569,575,580,583,598,608,629,633,637,640,651,657,661,676,683,687,690,710,716,720,723,727,730,750,753,757,760,794,797,816,819,840,845,849,852,872,875,878,882,889,902,905,909,912,922,933,937,940,955,971],[14,209,210],{"id":210},"引言",[10,212,213],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,215,216],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,218,219,220,223],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,221,222],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,225,226],{"id":226},"扫盲",[10,228,229],{},"那么这里有几个概念：",[231,232,233,236],"blockquote",{},[10,234,235],{},"为什么需要安装python解释器？",[231,237,238,249,252,260,263],{},[10,239,240,241,244,245,248],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,242,243],{},"0","和",[34,246,247],{},"1","组成的机器指令。",[10,250,251],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,253,254,255,259],{},"这样，我们就能用",[256,257,258],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,261,262],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,264,265],{},[26,266],{"alt":267,"src":268},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[231,270,271,274],{},[10,272,273],{},"pip又是什么？",[231,275,276,279],{},[10,277,278],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,280,281],{},[26,282],{"alt":283,"src":284},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,286,288],{"id":287},"windows-安装","Windows 安装",[290,291,293],"h3",{"id":292},"_1-下载官方安装程序","1. 下载官方安装程序",[10,295,296,297,304],{},"打开 ",[298,299,303],"a",{"href":300,"rel":301},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[302],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[231,306,307],{},[10,308,309],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,311,312],{},[26,313],{"alt":314,"src":315},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[42,317,318,325,331],{},[45,319,320,321,324],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[256,322,323],{},"Windows installer (64-bit)","。",[45,326,327,328,324],{},"搭载 ARM 处理器的 Windows 设备选择 ",[256,329,330],{},"Windows installer (ARM64)",[45,332,333],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,335,336],{},[26,337],{"alt":338,"src":339},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[231,341,342],{},[10,343,344],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,346,347],{},[26,348],{"alt":349,"src":350},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[290,352,354],{"id":353},"_2-安装并加入-path","2. 安装并加入 PATH",[231,356,357,362,369,398],{},[231,358,359],{},[10,360,361],{},"PATH 环境变量",[10,363,364,365,368],{},"Windows 有一个特殊的变量叫 ",[256,366,367],{},"PATH","，它里面存了一串文件夹路径，比如：",[65,370,374],{"className":371,"code":372,"language":373,"meta":70,"style":70},"language-python shiki shiki-themes github-dark","D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n","python",[34,375,376,381,386,392],{"__ignoreMap":70},[74,377,378],{"class":76,"line":77},[74,379,380],{},"D:\\Python313\\\n",[74,382,383],{"class":76,"line":87},[74,384,385],{},"D:\\Python313\\Scripts\\\n",[74,387,389],{"class":76,"line":388},3,[74,390,391],{},"C:\\Windows\\System32\\\n",[74,393,395],{"class":76,"line":394},4,[74,396,397],{},"...\n",[10,399,400,401,404],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[256,402,403],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,406,407],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,409,410,411,413],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,412,373],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,415,416],{},[26,417],{"alt":418,"src":419},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,421,422],{},"对安装界面最底部的两个勾选项分别解释 :",[231,424,425,428,433],{},[10,426,427],{},"Add python.exe to PATH",[10,429,430],{},[256,431,432],{},"把 Python 添加到系统环境变量",[231,434,435,441,447],{},[10,436,437,438,440],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,439,373],{}," 就能运行",[10,442,443,444,446],{},"不勾选的话，命令行输入 ",[34,445,373],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,448,449,450,453],{},"必须",[256,451,452],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[231,455,456,459,464],{},[10,457,458],{},"Use admin privileges when installing py.exe",[10,460,461],{},[256,462,463],{},"使用管理员权限安装 py.exe（Python 启动器）",[231,465,466,476,490,493],{},[10,467,468,471,472,475],{},[34,469,470],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,473,474],{},"py"," 来启动 Python。",[10,477,478,479,481,482,485,486,489],{},"勾选后，",[34,480,470],{}," 会安装到",[256,483,484],{},"系统级目录","，电脑上",[256,487,488],{},"所有用户账户","都能用",[10,491,492],{},"不勾选，只有当前用户能用",[10,494,495,498],{},[256,496,497],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[231,500,501,504],{},[10,502,503],{},"操作建议",[231,505,506,513],{},[10,507,508,509,512],{},"两个都勾上之后，再点 ",[256,510,511],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,514,515],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[231,517,518,524],{},[10,519,520,521],{},"Python 安装的",[256,522,523],{},"可选功能页",[10,525,526],{},[26,527],{"alt":528,"src":529},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[231,531,532,535],{},[10,533,534],{},"高级选项页",[10,536,537],{},[26,538],{"alt":528,"src":539},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[290,541,543],{"id":542},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,545,546,547,550,551,554],{},"按 ",[34,548,549],{},"Win + R","，输入 ",[34,552,553],{},"cmd"," 并回车，然后执行：",[65,556,558],{"className":67,"code":557,"language":69,"meta":70,"style":70},"python --version\n",[34,559,560],{"__ignoreMap":70},[74,561,562,564],{"class":76,"line":77},[74,563,373],{"class":80},[74,565,84],{"class":83},[10,567,568],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[65,570,573],{"className":571,"code":572,"language":107,"meta":70},[105],"Python 3.x.x\n",[34,574,572],{"__ignoreMap":70},[10,576,577],{},[26,578],{"alt":528,"src":579},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,581,582],{},"继续检查 pip：",[65,584,586],{"className":67,"code":585,"language":69,"meta":70,"style":70},"python -m pip --version\n",[34,587,588],{"__ignoreMap":70},[74,589,590,592,594,596],{"class":76,"line":77},[74,591,373],{"class":80},[74,593,92],{"class":83},[74,595,96],{"class":95},[74,597,84],{"class":83},[10,599,600,601,603,604,607],{},"如果 ",[34,602,373],{}," 无法识别，但 ",[34,605,606],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[65,609,611],{"className":67,"code":610,"language":69,"meta":70,"style":70},"py --version\npy -m pip --version\n",[34,612,613,619],{"__ignoreMap":70},[74,614,615,617],{"class":76,"line":77},[74,616,474],{"class":80},[74,618,84],{"class":83},[74,620,621,623,625,627],{"class":76,"line":87},[74,622,474],{"class":80},[74,624,92],{"class":83},[74,626,96],{"class":95},[74,628,84],{"class":83},[14,630,632],{"id":631},"macos-安装","macOS 安装",[290,634,636],{"id":635},"_1-先检查现有环境","1. 先检查现有环境",[10,638,639],{},"打开“终端”应用，执行：",[65,641,643],{"className":67,"code":642,"language":69,"meta":70,"style":70},"python3 --version\n",[34,644,645],{"__ignoreMap":70},[74,646,647,649],{"class":76,"line":77},[74,648,36],{"class":80},[74,650,84],{"class":83},[10,652,653,654,656],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,655,129],{},"。两条命令都正常时，无需重复安装。",[290,658,660],{"id":659},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,662,296,663,668,669,324,672,675],{},[298,664,667],{"href":665,"rel":666},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[302],"Python macOS 下载页","，下载当前稳定版的 ",[256,670,671],{},"macOS 64-bit universal2 installer",[34,673,674],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,677,678,679,682],{},"下载完成后打开 ",[34,680,681],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[290,684,686],{"id":685},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,688,689],{},"安装完成后重新打开终端，执行：",[65,691,692],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,693,694,700],{"__ignoreMap":70},[74,695,696,698],{"class":76,"line":77},[74,697,36],{"class":80},[74,699,84],{"class":83},[74,701,702,704,706,708],{"class":76,"line":87},[74,703,36],{"class":80},[74,705,92],{"class":83},[74,707,96],{"class":95},[74,709,84],{"class":83},[10,711,712,713,715],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,714,36],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,717,719],{"id":718},"linux-安装","Linux 安装",[10,721,722],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[290,724,726],{"id":725},"_1-检查是否已经安装","1. 检查是否已经安装",[10,728,729],{},"打开终端，执行：",[65,731,732],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,733,734,740],{"__ignoreMap":70},[74,735,736,738],{"class":76,"line":77},[74,737,36],{"class":80},[74,739,84],{"class":83},[74,741,742,744,746,748],{"class":76,"line":87},[74,743,36],{"class":80},[74,745,92],{"class":83},[74,747,96],{"class":95},[74,749,84],{"class":83},[10,751,752],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[290,754,756],{"id":755},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,758,759],{},"Ubuntu 或 Debian：",[65,761,763],{"className":67,"code":762,"language":69,"meta":70,"style":70},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,764,765,776],{"__ignoreMap":70},[74,766,767,770,773],{"class":76,"line":77},[74,768,769],{"class":80},"sudo",[74,771,772],{"class":95}," apt",[74,774,775],{"class":95}," update\n",[74,777,778,780,782,785,788,791],{"class":76,"line":87},[74,779,769],{"class":80},[74,781,772],{"class":95},[74,783,784],{"class":95}," install",[74,786,787],{"class":95}," python3",[74,789,790],{"class":95}," python3-pip",[74,792,793],{"class":95}," python3-venv\n",[10,795,796],{},"Fedora：",[65,798,800],{"className":67,"code":799,"language":69,"meta":70,"style":70},"sudo dnf install python3 python3-pip\n",[34,801,802],{"__ignoreMap":70},[74,803,804,806,809,811,813],{"class":76,"line":77},[74,805,769],{"class":80},[74,807,808],{"class":95}," dnf",[74,810,784],{"class":95},[74,812,787],{"class":95},[74,814,815],{"class":95}," python3-pip\n",[10,817,818],{},"Arch Linux：",[65,820,822],{"className":67,"code":821,"language":69,"meta":70,"style":70},"sudo pacman -S python python-pip\n",[34,823,824],{"__ignoreMap":70},[74,825,826,828,831,834,837],{"class":76,"line":77},[74,827,769],{"class":80},[74,829,830],{"class":95}," pacman",[74,832,833],{"class":83}," -S",[74,835,836],{"class":95}," python",[74,838,839],{"class":95}," python-pip\n",[10,841,842,844],{},[34,843,769],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[290,846,848],{"id":847},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,850,851],{},"安装结束后执行：",[65,853,854],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,855,856,862],{"__ignoreMap":70},[74,857,858,860],{"class":76,"line":77},[74,859,36],{"class":80},[74,861,84],{"class":83},[74,863,864,866,868,870],{"class":76,"line":87},[74,865,36],{"class":80},[74,867,92],{"class":83},[74,869,96],{"class":95},[74,871,84],{"class":83},[10,873,874],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,876,877],{"id":877},"常见问题",[290,879,881],{"id":880},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,883,884,885,888],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,886,887],{},"python --version","。如果仍然失败，按下面的顺序检查：",[117,890,891,896,899],{},[45,892,155,893,895],{},[34,894,606],{},"，确认 Python Launcher 是否可用。",[45,897,898],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[45,900,901],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,903,904],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[290,906,908],{"id":907},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,910,911],{},"先尝试：",[65,913,914],{"className":67,"code":642,"language":69,"meta":70,"style":70},[34,915,916],{"__ignoreMap":70},[74,917,918,920],{"class":76,"line":77},[74,919,36],{"class":80},[74,921,84],{"class":83},[10,923,924,925,927,928,930,931,324],{},"在这两个系统中，只有 ",[34,926,36],{}," 命令而没有 ",[34,929,373],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,932,36],{},[290,934,936],{"id":935},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,938,939],{},"先使用模块方式检查：",[65,941,943],{"className":67,"code":942,"language":69,"meta":70,"style":70},"python3 -m pip --version\n",[34,944,945],{"__ignoreMap":70},[74,946,947,949,951,953],{"class":76,"line":77},[74,948,36],{"class":80},[74,950,92],{"class":83},[74,952,96],{"class":95},[74,954,84],{"class":83},[10,956,957,958,960,961,963,964,966,967,970],{},"Windows 用户将命令中的 ",[34,959,36],{}," 换成 ",[34,962,373],{}," 或 ",[34,965,474],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,968,969],{},"python3-pip","；不要直接使用其他系统的安装命令。",[173,972,973],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":70,"searchDepth":87,"depth":87,"links":975},[976,977,978,983,988,993],{"id":210,"depth":87,"text":210},{"id":226,"depth":87,"text":226},{"id":287,"depth":87,"text":288,"children":979},[980,981,982],{"id":292,"depth":388,"text":293},{"id":353,"depth":388,"text":354},{"id":542,"depth":388,"text":543},{"id":631,"depth":87,"text":632,"children":984},[985,986,987],{"id":635,"depth":388,"text":636},{"id":659,"depth":388,"text":660},{"id":685,"depth":388,"text":686},{"id":718,"depth":87,"text":719,"children":989},[990,991,992],{"id":725,"depth":388,"text":726},{"id":755,"depth":388,"text":756},{"id":847,"depth":388,"text":848},{"id":877,"depth":87,"text":877,"children":994},[995,996,997],{"id":880,"depth":388,"text":881},{"id":907,"depth":388,"text":908},{"id":935,"depth":388,"text":936},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":205,"description":70},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[186,200,1006],"爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1009,"title":1010,"body":1011,"category":186,"cover":1018,"description":70,"extension":188,"meta":1337,"navigation":190,"path":1338,"pinned":192,"publishedAt":1339,"seo":1340,"slug":1341,"stem":1342,"summary":1343,"tags":1344,"updatedAt":1339,"visible":190,"__hash__":1347},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1012,"toc":1322},[1013,1019,1022,1025,1029,1032,1057,1060,1066,1069,1072,1108,1118,1122,1129,1132,1157,1160,1172,1175,1179,1182,1185,1188,1191,1194,1197,1200,1224,1227,1230,1236,1239,1242,1245,1249,1255,1258,1284,1287,1291,1294,1297,1301,1304,1307,1310,1313,1316,1319],[10,1014,1015],{},[26,1016],{"alt":1017,"src":1018},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1020,1021],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1023,1024],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1026,1028],{"id":1027},"python-代码是什么样的","Python 代码是什么样的",[10,1030,1031],{},"下面是一段简单的 Python 代码：",[65,1033,1035],{"className":371,"code":1034,"language":373,"meta":70,"style":70},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1036,1037,1042,1047,1052],{"__ignoreMap":70},[74,1038,1039],{"class":76,"line":77},[74,1040,1041],{},"name = \"Python\"\n",[74,1043,1044],{"class":76,"line":87},[74,1045,1046],{},"year = 2026\n",[74,1048,1049],{"class":76,"line":388},[74,1050,1051],{"emptyLinePlaceholder":190},"\n",[74,1053,1054],{"class":76,"line":394},[74,1055,1056],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1058,1059],{},"运行结果：",[65,1061,1064],{"className":1062,"code":1063,"language":107,"meta":70},[105],"正在学习 Python，当前年份是 2026\n",[34,1065,1063],{"__ignoreMap":70},[10,1067,1068],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1070,1071],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[65,1073,1075],{"className":371,"code":1074,"language":373,"meta":70,"style":70},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1076,1077,1082,1086,1091,1096,1102],{"__ignoreMap":70},[74,1078,1079],{"class":76,"line":77},[74,1080,1081],{},"score = 85\n",[74,1083,1084],{"class":76,"line":87},[74,1085,1051],{"emptyLinePlaceholder":190},[74,1087,1088],{"class":76,"line":388},[74,1089,1090],{},"if score >= 60:\n",[74,1092,1093],{"class":76,"line":394},[74,1094,1095],{},"    print(\"成绩合格\")\n",[74,1097,1099],{"class":76,"line":1098},5,[74,1100,1101],{},"else:\n",[74,1103,1105],{"class":76,"line":1104},6,[74,1106,1107],{},"    print(\"需要继续学习\")\n",[10,1109,1110,1113,1114,1117],{},[34,1111,1112],{},"if"," 和 ",[34,1115,1116],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1119,1121],{"id":1120},"python-如何运行代码","Python 如何运行代码",[10,1123,1124,1125,1128],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1126,1127],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1130,1131],{},"交互式环境适合快速验证一个表达式：",[65,1133,1135],{"className":371,"code":1134,"language":373,"meta":70,"style":70},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1136,1137,1142,1147,1152],{"__ignoreMap":70},[74,1138,1139],{"class":76,"line":77},[74,1140,1141],{},">>> 10 + 20\n",[74,1143,1144],{"class":76,"line":87},[74,1145,1146],{},"30\n",[74,1148,1149],{"class":76,"line":388},[74,1150,1151],{},">>> \"Python\".lower()\n",[74,1153,1154],{"class":76,"line":394},[74,1155,1156],{},"'python'\n",[10,1158,1159],{},"需要保存和重复运行的程序，则可以写入文件：",[65,1161,1163],{"className":67,"code":1162,"language":69,"meta":70,"style":70},"python3 hello.py\n",[34,1164,1165],{"__ignoreMap":70},[74,1166,1167,1169],{"class":76,"line":77},[74,1168,36],{"class":80},[74,1170,1171],{"class":95}," hello.py\n",[10,1173,1174],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1176,1178],{"id":1177},"python-的特点","Python 的特点",[290,1180,1181],{"id":1181},"语法相对简洁",[10,1183,1184],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[290,1186,1187],{"id":1187},"支持多种编程方式",[10,1189,1190],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[290,1192,1193],{"id":1193},"标准库比较完整",[10,1195,1196],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1198,1199],{},"例如，获取当前时间：",[65,1201,1203],{"className":371,"code":1202,"language":373,"meta":70,"style":70},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1204,1205,1210,1214,1219],{"__ignoreMap":70},[74,1206,1207],{"class":76,"line":77},[74,1208,1209],{},"from datetime import datetime\n",[74,1211,1212],{"class":76,"line":87},[74,1213,1051],{"emptyLinePlaceholder":190},[74,1215,1216],{"class":76,"line":388},[74,1217,1218],{},"now = datetime.now()\n",[74,1220,1221],{"class":76,"line":394},[74,1222,1223],{},"print(now)\n",[10,1225,1226],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[290,1228,1229],{"id":1229},"第三方工具丰富",[10,1231,1232,1233,1235],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1234,222],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1237,1238],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[290,1240,1241],{"id":1241},"支持多个操作系统",[10,1243,1244],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1246,1248],{"id":1247},"python-可以做什么","Python 可以做什么",[10,1250,1251],{},[26,1252],{"alt":1253,"src":1254},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1256,1257],{},"Python 的应用范围比较广，常见方向包括：",[42,1259,1260,1263,1266,1269,1272,1275,1278,1281],{},[45,1261,1262],{},"编写自动化脚本，批量处理文件和重复任务；",[45,1264,1265],{},"开发网站后端和 API 服务；",[45,1267,1268],{},"进行数据清洗、统计分析和图表展示；",[45,1270,1271],{},"编写网络爬虫和信息采集工具；",[45,1273,1274],{},"开发自动化测试程序；",[45,1276,1277],{},"进行机器学习和人工智能开发；",[45,1279,1280],{},"编写运维、监控和辅助开发工具；",[45,1282,1283],{},"开发部分桌面应用和插件。",[10,1285,1286],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1288,1290],{"id":1289},"python-的发展","Python 的发展",[10,1292,1293],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1295,1296],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1298,1300],{"id":1299},"python-也有局限","Python 也有局限",[10,1302,1303],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1305,1306],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1308,1309],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1311,1312],{"id":1312},"写在最后",[10,1314,1315],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1317,1318],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[173,1320,1321],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":70,"searchDepth":87,"depth":87,"links":1323},[1324,1325,1326,1333,1334,1335,1336],{"id":1027,"depth":87,"text":1028},{"id":1120,"depth":87,"text":1121},{"id":1177,"depth":87,"text":1178,"children":1327},[1328,1329,1330,1331,1332],{"id":1181,"depth":388,"text":1181},{"id":1187,"depth":388,"text":1187},{"id":1193,"depth":388,"text":1193},{"id":1229,"depth":388,"text":1229},{"id":1241,"depth":388,"text":1241},{"id":1247,"depth":87,"text":1248},{"id":1289,"depth":87,"text":1290},{"id":1299,"depth":87,"text":1300},{"id":1312,"depth":87,"text":1312},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1010,"description":70},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[186,1345,1346],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1349,"title":1350,"body":1351,"category":186,"cover":187,"description":1355,"extension":188,"meta":1475,"navigation":190,"path":1476,"pinned":192,"publishedAt":193,"seo":1477,"slug":1478,"stem":1479,"summary":1480,"tags":1481,"updatedAt":193,"visible":190,"__hash__":1483},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1352,"toc":1465},[1353,1356,1358,1361,1363,1369,1374,1376,1390,1392,1395,1404,1406,1412,1414,1416,1432,1434,1445,1447,1455,1457,1459,1462],[10,1354,1355],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1357,16],{"id":16},[10,1359,1360],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1362,22],{"id":22},[10,1364,1365],{},[26,1366],{"alt":1367,"src":1368},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1370,1371,1373],{},[34,1372,1127],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1375,40],{"id":40},[42,1377,1378,1384,1387],{},[45,1379,1380,1381,1383],{},"源代码是人编写的文本，通常保存在 ",[34,1382,1127],{}," 文件中。",[45,1385,1386],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[45,1388,1389],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1391,60],{"id":60},[10,1393,1394],{},"把下面代码保存到本课脚本并运行：",[65,1396,1398],{"className":371,"code":1397,"language":373,"meta":70,"style":70},"print(\"你好，Python\")\n",[34,1399,1400],{"__ignoreMap":70},[74,1401,1402],{"class":76,"line":77},[74,1403,1397],{},[10,1405,101],{},[65,1407,1410],{"className":1408,"code":1409,"language":107,"meta":70},[105],"你好，Python\n",[34,1411,1409],{"__ignoreMap":70},[10,1413,112],{},[14,1415,115],{"id":115},[117,1417,1418,1425],{},[45,1419,1420,1421,1424],{},"终端启动解释器后，解释器读取 ",[34,1422,1423],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[45,1426,1427,1428,1431],{},"字符串对象先准备好，再交给 ",[34,1429,1430],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1433,133],{"id":133},[42,1435,1436,1439],{},[45,1437,1438],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[45,1440,1441,1442,1444],{},"认为 ",[34,1443,1127],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1446,150],{"id":150},[117,1448,1449,1452],{},[45,1450,1451],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[45,1453,1454],{},"把示例文字改成自己的学习目标并重新运行。",[10,1456,165],{},[14,1458,168],{"id":168},[10,1460,1461],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,1463,1464],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":70,"searchDepth":87,"depth":87,"links":1466},[1467,1468,1469,1470,1471,1472,1473,1474],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1350,"description":1355},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[186,1345,1482],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":4,"title":5,"body":1485,"category":186,"cover":187,"description":12,"extension":188,"meta":1600,"navigation":190,"path":191,"pinned":192,"publishedAt":193,"seo":1601,"slug":195,"stem":196,"summary":197,"tags":1602,"updatedAt":193,"visible":190,"__hash__":201},{"type":7,"value":1486,"toc":1590},[1487,1489,1491,1493,1495,1499,1503,1505,1515,1517,1519,1539,1541,1546,1548,1550,1560,1562,1572,1574,1582,1584,1586,1588],[10,1488,12],{},[14,1490,16],{"id":16},[10,1492,19],{},[14,1494,22],{"id":22},[10,1496,1497],{},[26,1498],{"alt":28,"src":29},[10,1500,32,1501,37],{},[34,1502,36],{},[14,1504,40],{"id":40},[42,1506,1507,1509,1511],{},[45,1508,47],{},[45,1510,50],{},[45,1512,53,1513,57],{},[34,1514,56],{},[14,1516,60],{"id":60},[10,1518,63],{},[65,1520,1521],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,1522,1523,1529],{"__ignoreMap":70},[74,1524,1525,1527],{"class":76,"line":77},[74,1526,36],{"class":80},[74,1528,84],{"class":83},[74,1530,1531,1533,1535,1537],{"class":76,"line":87},[74,1532,36],{"class":80},[74,1534,92],{"class":83},[74,1536,96],{"class":95},[74,1538,84],{"class":83},[10,1540,101],{},[65,1542,1544],{"className":1543,"code":106,"language":107,"meta":70},[105],[34,1545,106],{"__ignoreMap":70},[10,1547,112],{},[14,1549,115],{"id":115},[117,1551,1552,1556],{},[45,1553,1554,124],{},[34,1555,123],{},[45,1557,1558,130],{},[34,1559,129],{},[14,1561,133],{"id":133},[42,1563,1564,1568],{},[45,1565,138,1566,141],{},[34,1567,36],{},[45,1569,144,1570,147],{},[34,1571,36],{},[14,1573,150],{"id":150},[117,1575,1576,1580],{},[45,1577,155,1578,159],{},[34,1579,158],{},[45,1581,162],{},[10,1583,165],{},[14,1585,168],{"id":168},[10,1587,171],{},[173,1589,175],{},{"title":70,"searchDepth":87,"depth":87,"links":1591},[1592,1593,1594,1595,1596,1597,1598,1599],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5,"description":12},[186,199,200],{"id":1604,"title":1605,"body":1606,"category":186,"cover":187,"description":1771,"extension":188,"meta":1772,"navigation":190,"path":1773,"pinned":192,"publishedAt":193,"seo":1774,"slug":1775,"stem":1776,"summary":1777,"tags":1778,"updatedAt":193,"visible":190,"__hash__":1781},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1607,"toc":1761},[1608,1614,1616,1619,1621,1627,1630,1632,1656,1658,1660,1687,1689,1695,1697,1699,1717,1719,1733,1735,1749,1751,1753,1759],[10,1609,1610,1611,1613],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1612,1127],{}," 脚本。",[14,1615,16],{"id":16},[10,1617,1618],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1620,22],{"id":22},[10,1622,1623],{},[26,1624],{"alt":1625,"src":1626},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1628,1629],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1631,40],{"id":40},[42,1633,1634,1643,1650],{},[45,1635,1636,1637,1639,1640,324],{},"在终端输入 ",[34,1638,36],{}," 进入 REPL，提示符通常是 ",[34,1641,1642],{},">>>",[45,1644,1645,1646,1649],{},"输入 ",[34,1647,1648],{},"exit()"," 或按 Control-D 退出 REPL。",[45,1651,1652,1653,1655],{},"需要保存、复查或多次运行的代码应写入 ",[34,1654,1127],{}," 文件。",[14,1657,60],{"id":60},[10,1659,1394],{},[65,1661,1665],{"className":1662,"code":1663,"language":1664,"meta":70,"style":70},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1666,1667,1672,1677,1682],{"__ignoreMap":70},[74,1668,1669],{"class":76,"line":77},[74,1670,1671],{},">>> 2 + 3\n",[74,1673,1674],{"class":76,"line":87},[74,1675,1676],{},"5\n",[74,1678,1679],{"class":76,"line":388},[74,1680,1681],{},">>> \"python\".upper()\n",[74,1683,1684],{"class":76,"line":394},[74,1685,1686],{},"'PYTHON'\n",[10,1688,101],{},[65,1690,1693],{"className":1691,"code":1692,"language":107,"meta":70},[105],"REPL 会直接显示表达式结果\n",[34,1694,1692],{"__ignoreMap":70},[10,1696,112],{},[14,1698,115],{"id":115},[117,1700,1701,1711],{},[45,1702,1703,1704,1707,1708,324],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1705,1706],{},"2 + 3"," 能直接看到 ",[34,1709,1710],{},"5",[45,1712,1713,1714,1716],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1715,1430],{}," 才会写到标准输出。",[14,1718,133],{"id":133},[42,1720,1721,1730],{},[45,1722,1723,1724,1726,1727,1729],{},"把提示符 ",[34,1725,1642],{}," 复制进 ",[34,1728,1127],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[45,1731,1732],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1734,150],{"id":150},[117,1736,1737,1743],{},[45,1738,1739,1740,324],{},"在 REPL 计算 ",[34,1741,1742],{},"12 * 8",[45,1744,1745,1746,1748],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1747,1430],{}," 时是否显示结果。",[10,1750,165],{},[14,1752,168],{"id":168},[10,1754,1755,1756,1758],{},"本篇目标是根据任务选择 REPL 或 ",[34,1757,1127],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,1760,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":1762},[1763,1764,1765,1766,1767,1768,1769,1770],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1605,"description":1771},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[186,1779,1780],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1783,"title":1784,"body":1785,"category":186,"cover":187,"description":1789,"extension":188,"meta":1960,"navigation":190,"path":1961,"pinned":192,"publishedAt":193,"seo":1962,"slug":1963,"stem":1964,"summary":1965,"tags":1966,"updatedAt":193,"visible":190,"__hash__":1969},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1786,"toc":1950},[1787,1790,1792,1795,1797,1803,1809,1811,1829,1831,1833,1878,1880,1886,1888,1890,1912,1914,1926,1928,1940,1942,1944,1947],[10,1788,1789],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1791,16],{"id":16},[10,1793,1794],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1796,22],{"id":22},[10,1798,1799],{},[26,1800],{"alt":1801,"src":1802},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1804,1805,1808],{},[34,1806,1807],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1810,40],{"id":40},[42,1812,1813,1816,1826],{},[45,1814,1815],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[45,1817,1818,1821,1822,1825],{},[34,1819,1820],{},"pwd"," 显示当前目录，",[34,1823,1824],{},"ls"," 显示目录里的文件。",[45,1827,1828],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1830,60],{"id":60},[10,1832,63],{},[65,1834,1836],{"className":67,"code":1835,"language":69,"meta":70,"style":70},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1837,1838,1846,1853,1858,1872],{"__ignoreMap":70},[74,1839,1840,1843],{"class":76,"line":77},[74,1841,1842],{"class":80},"mkdir",[74,1844,1845],{"class":95}," python-study\n",[74,1847,1848,1851],{"class":76,"line":87},[74,1849,1850],{"class":83},"cd",[74,1852,1845],{"class":95},[74,1854,1855],{"class":76,"line":388},[74,1856,1857],{"class":83},"pwd\n",[74,1859,1860,1863,1866,1870],{"class":76,"line":394},[74,1861,1862],{"class":83},"printf",[74,1864,1865],{"class":95}," 'print(\"项目已经运行\")\\n'",[74,1867,1869],{"class":1868},"snl16"," >",[74,1871,1171],{"class":95},[74,1873,1874,1876],{"class":76,"line":1098},[74,1875,36],{"class":80},[74,1877,1171],{"class":95},[10,1879,101],{},[65,1881,1884],{"className":1882,"code":1883,"language":107,"meta":70},[105],"项目已经运行\n",[34,1885,1883],{"__ignoreMap":70},[10,1887,112],{},[14,1889,115],{"id":115},[117,1891,1892,1903],{},[45,1893,1894,1896,1897,1899,1900,1902],{},[34,1895,1842],{}," 创建目录，",[34,1898,1850],{}," 改变终端当前目录，",[34,1901,1820],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[45,1904,1905,1907,1908,1911],{},[34,1906,1807],{}," 会在当前目录寻找 ",[34,1909,1910],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1913,133],{"id":133},[42,1915,1916,1923],{},[45,1917,1918,1919,1113,1921,324],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,1920,1820],{},[34,1922,1824],{},[45,1924,1925],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1927,150],{"id":150},[117,1929,1930,1937],{},[45,1931,1932,1933,1936],{},"新建 ",[34,1934,1935],{},"lesson01.py"," 并输出课程编号。",[45,1938,1939],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1941,165],{},[14,1943,168],{"id":168},[10,1945,1946],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,1948,1949],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":70,"searchDepth":87,"depth":87,"links":1951},[1952,1953,1954,1955,1956,1957,1958,1959],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1784,"description":1789},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[186,1967,1968],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":1971,"title":1972,"body":1973,"category":186,"cover":187,"description":1977,"extension":188,"meta":2125,"navigation":190,"path":2126,"pinned":192,"publishedAt":193,"seo":2127,"slug":2128,"stem":2129,"summary":2130,"tags":2131,"updatedAt":193,"visible":190,"__hash__":2134},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":1974,"toc":2115},[1975,1978,1980,1983,1985,1991,2002,2004,2024,2026,2028,2048,2050,2056,2058,2060,2079,2081,2089,2091,2106,2108,2110,2113],[10,1976,1977],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,1979,16],{"id":16},[10,1981,1982],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1984,22],{"id":22},[10,1986,1987],{},[26,1988],{"alt":1989,"src":1990},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,1992,1993,1994,324,1996,1999,2000,324],{},"Python 先计算表达式，再把得到的对象交给 ",[34,1995,1430],{},[34,1997,1998],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2001,1706],{},[14,2003,40],{"id":40},[42,2005,2006,2012,2021],{},[45,2007,2008,2011],{},[34,2009,2010],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[45,2013,2014,2017,2018,324],{},[34,2015,2016],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2019,2020],{},"12",[45,2022,2023],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2025,60],{"id":60},[10,2027,1394],{},[65,2029,2031],{"className":371,"code":2030,"language":373,"meta":70,"style":70},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2032,2033,2038,2043],{"__ignoreMap":70},[74,2034,2035],{"class":76,"line":77},[74,2036,2037],{},"print(42)\n",[74,2039,2040],{"class":76,"line":87},[74,2041,2042],{},"print(7 + 5)\n",[74,2044,2045],{"class":76,"line":388},[74,2046,2047],{},"print(\"Python 基础课\")\n",[10,2049,101],{},[65,2051,2054],{"className":2052,"code":2053,"language":107,"meta":70},[105],"42\n12\nPython 基础课\n",[34,2055,2053],{"__ignoreMap":70},[10,2057,112],{},[14,2059,115],{"id":115},[117,2061,2062,2070],{},[45,2063,2064,2067,2068,324],{},[34,2065,2066],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2069,2020],{},[45,2071,2072,2074,2075,2078],{},[34,2073,1430],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2076,2077],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2080,133],{"id":133},[42,2082,2083,2086],{},[45,2084,2085],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[45,2087,2088],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2090,150],{"id":150},[117,2092,2093,2096],{},[45,2094,2095],{},"分别输出一个整数、一个小数和一段文本。",[45,2097,2098,2099,2101,2102,2105],{},"比较 ",[34,2100,1998],{}," 与 ",[34,2103,2104],{},"print(\"2 + 3\")"," 的结果。",[10,2107,165],{},[14,2109,168],{"id":168},[10,2111,2112],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,2114,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":2116},[2117,2118,2119,2120,2121,2122,2123,2124],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":1972,"description":1977},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[186,2132,2133],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2136,"title":2137,"body":2138,"category":186,"cover":187,"description":2142,"extension":188,"meta":2309,"navigation":190,"path":2310,"pinned":192,"publishedAt":193,"seo":2311,"slug":2312,"stem":2313,"summary":2314,"tags":2315,"updatedAt":193,"visible":190,"__hash__":2318},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2139,"toc":2299},[2140,2143,2145,2148,2150,2156,2159,2161,2187,2189,2191,2219,2221,2227,2229,2231,2255,2257,2273,2275,2290,2292,2294,2297],[10,2141,2142],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2144,16],{"id":16},[10,2146,2147],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2149,22],{"id":22},[10,2151,2152],{},[26,2153],{"alt":2154,"src":2155},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2157,2158],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2160,40],{"id":40},[42,2162,2163,2166,2176],{},[45,2164,2165],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[45,2167,2168,2169,2101,2172,2175],{},"变量名区分大小写，",[34,2170,2171],{},"score",[34,2173,2174],{},"Score"," 是两个名字。",[45,2177,2178,2179,2182,2183,2186],{},"使用能表达含义的名称；不要用 ",[34,2180,2181],{},"list","、",[34,2184,2185],{},"str"," 等内置名称作为普通变量名。",[14,2188,60],{"id":60},[10,2190,1394],{},[65,2192,2194],{"className":371,"code":2193,"language":373,"meta":70,"style":70},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2195,2196,2201,2206,2210,2215],{"__ignoreMap":70},[74,2197,2198],{"class":76,"line":77},[74,2199,2200],{},"score = 90\n",[74,2202,2203],{"class":76,"line":87},[74,2204,2205],{},"print(score)\n",[74,2207,2208],{"class":76,"line":388},[74,2209,1051],{"emptyLinePlaceholder":190},[74,2211,2212],{"class":76,"line":394},[74,2213,2214],{},"score = 95\n",[74,2216,2217],{"class":76,"line":1098},[74,2218,2205],{},[10,2220,101],{},[65,2222,2225],{"className":2223,"code":2224,"language":107,"meta":70},[105],"90\n95\n",[34,2226,2224],{"__ignoreMap":70},[10,2228,112],{},[14,2230,115],{"id":115},[117,2232,2233,2242],{},[45,2234,155,2235,2238,2239,2241],{},[34,2236,2237],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2240,2171],{}," 再绑定到它。",[45,2243,155,2244,2247,2248,2251,2252,324],{},[34,2245,2246],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2249,2250],{},"90"," 没有被改造成 ",[34,2253,2254],{},"95",[14,2256,133],{"id":133},[42,2258,2259,2262],{},[45,2260,2261],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[45,2263,2264,2265,2182,2267,2182,2269,2272],{},"使用 ",[34,2266,2181],{},[34,2268,2185],{},[34,2270,2271],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2274,150],{"id":150},[117,2276,2277,2287],{},[45,2278,2279,2280,1113,2283,2286],{},"创建 ",[34,2281,2282],{},"course_name",[34,2284,2285],{},"lesson_count"," 两个变量并输出。",[45,2288,2289],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2291,165],{},[14,2293,168],{"id":168},[10,2295,2296],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,2298,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":2300},[2301,2302,2303,2304,2305,2306,2307,2308],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2137,"description":2142},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[186,2316,2317],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2320,"title":2321,"body":2322,"category":186,"cover":187,"description":2326,"extension":188,"meta":2492,"navigation":190,"path":2493,"pinned":192,"publishedAt":193,"seo":2494,"slug":2495,"stem":2496,"summary":2497,"tags":2498,"updatedAt":193,"visible":190,"__hash__":2501},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2323,"toc":2482},[2324,2327,2329,2332,2334,2340,2343,2345,2374,2376,2378,2424,2426,2432,2434,2436,2450,2452,2463,2465,2473,2475,2477,2480],[10,2325,2326],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2328,16],{"id":16},[10,2330,2331],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2333,22],{"id":22},[10,2335,2336],{},[26,2337],{"alt":2338,"src":2339},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2341,2342],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2344,40],{"id":40},[42,2346,2347,2357,2371],{},[45,2348,2349,2352,2353,2356],{},[34,2350,2351],{},"int"," 表示整数，",[34,2354,2355],{},"float"," 表示浮点数。",[45,2358,2359,2362,2363,2366,2367,2370],{},[34,2360,2361],{},"\u002F"," 总是进行真除法；",[34,2364,2365],{},"\u002F\u002F"," 是向下取整除法，",[34,2368,2369],{},"%"," 得到余数。",[45,2372,2373],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2375,60],{"id":60},[10,2377,1394],{},[65,2379,2381],{"className":371,"code":2380,"language":373,"meta":70,"style":70},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2382,2383,2388,2393,2398,2402,2407,2412,2418],{"__ignoreMap":70},[74,2384,2385],{"class":76,"line":77},[74,2386,2387],{},"price = 25\n",[74,2389,2390],{"class":76,"line":87},[74,2391,2392],{},"count = 4\n",[74,2394,2395],{"class":76,"line":388},[74,2396,2397],{},"discount = 0.9\n",[74,2399,2400],{"class":76,"line":394},[74,2401,1051],{"emptyLinePlaceholder":190},[74,2403,2404],{"class":76,"line":1098},[74,2405,2406],{},"total = price * count * discount\n",[74,2408,2409],{"class":76,"line":1104},[74,2410,2411],{},"average = total \u002F count\n",[74,2413,2415],{"class":76,"line":2414},7,[74,2416,2417],{},"print(total)\n",[74,2419,2421],{"class":76,"line":2420},8,[74,2422,2423],{},"print(average)\n",[10,2425,101],{},[65,2427,2430],{"className":2428,"code":2429,"language":107,"meta":70},[105],"90.0\n22.5\n",[34,2431,2429],{"__ignoreMap":70},[10,2433,112],{},[14,2435,115],{"id":115},[117,2437,2438,2444],{},[45,2439,2440,2443],{},[34,2441,2442],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[45,2445,2446,2449],{},[34,2447,2448],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2451,133],{"id":133},[42,2453,2454,2460],{},[45,2455,2456,2457,324],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2458,2459],{},"decimal.Decimal",[45,2461,2462],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2464,150],{"id":150},[117,2466,2467,2470],{},[45,2468,2469],{},"计算 137 除以 10 的商和余数。",[45,2471,2472],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2474,165],{},[14,2476,168],{"id":168},[10,2478,2479],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,2481,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":2483},[2484,2485,2486,2487,2488,2489,2490,2491],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2321,"description":2326},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[186,2499,2500],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2503,"title":2504,"body":2505,"category":186,"cover":187,"description":2509,"extension":188,"meta":2685,"navigation":190,"path":2686,"pinned":192,"publishedAt":193,"seo":2687,"slug":2688,"stem":2689,"summary":2690,"tags":2691,"updatedAt":193,"visible":190,"__hash__":2694},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2506,"toc":2673},[2507,2510,2512,2515,2517,2523,2533,2535,2546,2548,2550,2580,2582,2588,2590,2592,2622,2625,2628,2634,2637,2639,2647,2649,2664,2666,2668,2671],[10,2508,2509],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2511,16],{"id":16},[10,2513,2514],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2516,22],{"id":22},[10,2518,2519],{},[26,2520],{"alt":2521,"src":2522},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2524,2525,2526,2529,2530,324],{},"切片 ",[34,2527,2528],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2531,2532],{},"stop - start",[14,2534,40],{"id":40},[42,2536,2537,2540,2543],{},[45,2538,2539],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[45,2541,2542],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[45,2544,2545],{},"切片会创建新的字符串，不会修改原字符串。",[14,2547,60],{"id":60},[10,2549,1394],{},[65,2551,2553],{"className":371,"code":2552,"language":373,"meta":70,"style":70},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2554,2555,2560,2565,2570,2575],{"__ignoreMap":70},[74,2556,2557],{"class":76,"line":77},[74,2558,2559],{},"language = \"Python\"\n",[74,2561,2562],{"class":76,"line":87},[74,2563,2564],{},"print(language[0])\n",[74,2566,2567],{"class":76,"line":388},[74,2568,2569],{},"print(language[-1])\n",[74,2571,2572],{"class":76,"line":394},[74,2573,2574],{},"print(language[0:3])\n",[74,2576,2577],{"class":76,"line":1098},[74,2578,2579],{},"print(language + \" 3.14\")\n",[10,2581,101],{},[65,2583,2586],{"className":2584,"code":2585,"language":107,"meta":70},[105],"P\nn\nPyt\nPython 3.14\n",[34,2587,2585],{"__ignoreMap":70},[10,2589,112],{},[14,2591,115],{"id":115},[117,2593,2594,2608],{},[45,2595,2596,2597,2599,2600,2603,2604,2607],{},"字符串 ",[34,2598,186],{}," 的正索引从 ",[34,2601,2602],{},"P"," 的 0 开始，负索引从末尾 ",[34,2605,2606],{},"n"," 的 -1 开始。",[45,2609,2610,2613,2614,2617,2618,2621],{},[34,2611,2612],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2615,2616],{},"Pyt","；索引 3 的 ",[34,2619,2620],{},"h"," 不在结果中。",[290,2623,2624],{"id":2624},"再看一个具体细节",[10,2626,2627],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2629,2630],{},[26,2631],{"alt":2632,"src":2633},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2635,2636],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2638,133],{"id":133},[42,2640,2641,2644],{},[45,2642,2643],{},"把第一个字符写成索引 1，造成整体偏移一位。",[45,2645,2646],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2648,150],{"id":150},[117,2650,2651,2661],{},[45,2652,2653,2654,2657,2658,324],{},"从 ",[34,2655,2656],{},"\"programming\""," 中切出 ",[34,2659,2660],{},"\"gram\"",[45,2662,2663],{},"使用负索引取得字符串倒数第二个字符。",[10,2665,165],{},[14,2667,168],{"id":168},[10,2669,2670],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,2672,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":2674},[2675,2676,2677,2678,2679,2682,2683,2684],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":2680},[2681],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2504,"description":2509},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[186,2692,2693],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2696,"title":2697,"body":2698,"category":186,"cover":187,"description":2702,"extension":188,"meta":2916,"navigation":190,"path":2917,"pinned":192,"publishedAt":193,"seo":2918,"slug":2919,"stem":2920,"summary":2921,"tags":2922,"updatedAt":193,"visible":190,"__hash__":2925},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2699,"toc":2904},[2700,2703,2705,2708,2710,2716,2726,2728,2761,2763,2765,2809,2811,2817,2819,2821,2842,2844,2847,2853,2861,2863,2877,2879,2895,2897,2899,2902],[10,2701,2702],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2704,16],{"id":16},[10,2706,2707],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2709,22],{"id":22},[10,2711,2712],{},[26,2713],{"alt":2714,"src":2715},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2717,2718,2719,963,2722,2725],{},"比较表达式先产生 ",[34,2720,2721],{},"True",[34,2723,2724],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2727,40],{"id":40},[42,2729,2730,2744,2758],{},[45,2731,2732,2735,2736,2739,2740,2743],{},[34,2733,2734],{},"=="," 判断是否相等，",[34,2737,2738],{},"!="," 判断是否不等；单个 ",[34,2741,2742],{},"="," 是赋值。",[45,2745,2746,2749,2750,2753,2754,2757],{},[34,2747,2748],{},"and"," 要求两侧都为真，",[34,2751,2752],{},"or"," 只需一侧为真，",[34,2755,2756],{},"not"," 取反。",[45,2759,2760],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2762,60],{"id":60},[10,2764,1394],{},[65,2766,2768],{"className":371,"code":2767,"language":373,"meta":70,"style":70},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[34,2769,2770,2775,2780,2784,2789,2794,2799,2804],{"__ignoreMap":70},[74,2771,2772],{"class":76,"line":77},[74,2773,2774],{},"age = 20\n",[74,2776,2777],{"class":76,"line":87},[74,2778,2779],{},"has_ticket = True\n",[74,2781,2782],{"class":76,"line":388},[74,2783,1051],{"emptyLinePlaceholder":190},[74,2785,2786],{"class":76,"line":394},[74,2787,2788],{},"is_adult = age >= 18\n",[74,2790,2791],{"class":76,"line":1098},[74,2792,2793],{},"can_enter = is_adult and has_ticket\n",[74,2795,2796],{"class":76,"line":1104},[74,2797,2798],{},"print(is_adult)\n",[74,2800,2801],{"class":76,"line":2414},[74,2802,2803],{},"print(can_enter)\n",[74,2805,2806],{"class":76,"line":2420},[74,2807,2808],{},"print(not has_ticket)\n",[10,2810,101],{},[65,2812,2815],{"className":2813,"code":2814,"language":107,"meta":70},[105],"True\nTrue\nFalse\n",[34,2816,2814],{"__ignoreMap":70},[10,2818,112],{},[14,2820,115],{"id":115},[117,2822,2823,2833],{},[45,2824,2825,2828,2829,2832],{},[34,2826,2827],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2830,2831],{},"is_adult","，这一步没有任何分支跳转。",[45,2834,2835,2838,2839,2841],{},[34,2836,2837],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2840,2756],{}," 只对紧随其后的值取反。",[290,2843,2624],{"id":2624},[10,2845,2846],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2848,2849],{},[26,2850],{"alt":2851,"src":2852},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2854,2855,2857,2858,2860],{},[34,2856,2748],{}," 只有“真、真”得到真；",[34,2859,2752],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2862,133],{"id":133},[42,2864,2865,2874],{},[45,2866,2867,2868,2870,2871,2873],{},"用单个等号判断相等。",[34,2869,2742],{}," 是赋值，",[34,2872,2734],{}," 才是相等比较。",[45,2875,2876],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2878,150],{"id":150},[117,2880,2881,2888],{},[45,2882,2883,2884,2887],{},"判断数字 ",[34,2885,2886],{},"15"," 是否同时大于 10 且小于 20。",[45,2889,2890,2891,2894],{},"分别修改年龄和票据状态，记录 ",[34,2892,2893],{},"can_enter"," 的四种组合结果。",[10,2896,165],{},[14,2898,168],{"id":168},[10,2900,2901],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,2903,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":2905},[2906,2907,2908,2909,2910,2913,2914,2915],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":2911},[2912],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2697,"description":2702},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[186,2923,2924],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2927,"title":2928,"body":2929,"category":186,"cover":187,"description":2933,"extension":188,"meta":3101,"navigation":190,"path":3102,"pinned":192,"publishedAt":193,"seo":3103,"slug":3104,"stem":3105,"summary":3106,"tags":3107,"updatedAt":193,"visible":190,"__hash__":3109},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2930,"toc":3091},[2931,2934,2936,2939,2941,2947,2965,2967,2980,2982,2984,3018,3020,3026,3028,3030,3052,3054,3066,3068,3082,3084,3086,3089],[10,2932,2933],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2935,16],{"id":16},[10,2937,2938],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2940,22],{"id":22},[10,2942,2943],{},[26,2944],{"alt":2945,"src":2946},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2948,2949,2952,2953,2956,2957,2960,2961,2964],{},[34,2950,2951],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,2954,2955],{},"18","，程序首先得到的也是 ",[34,2958,2959],{},"\"18\"","，需要 ",[34,2962,2963],{},"int()"," 后才能按整数参与计算。",[14,2966,40],{"id":40},[42,2968,2969,2972,2977],{},[45,2970,2971],{},"提示文字应告诉用户需要输入什么。",[45,2973,2974,2976],{},[34,2975,2963],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[45,2978,2979],{},"输入转换和业务计算分开写，定位问题更直接。",[14,2981,60],{"id":60},[10,2983,1394],{},[65,2985,2987],{"className":371,"code":2986,"language":373,"meta":70,"style":70},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,2988,2989,2994,2999,3004,3008,3013],{"__ignoreMap":70},[74,2990,2991],{"class":76,"line":77},[74,2992,2993],{},"name = input(\"请输入姓名：\")\n",[74,2995,2996],{"class":76,"line":87},[74,2997,2998],{},"age_text = input(\"请输入年龄：\")\n",[74,3000,3001],{"class":76,"line":388},[74,3002,3003],{},"age = int(age_text)\n",[74,3005,3006],{"class":76,"line":394},[74,3007,1051],{"emptyLinePlaceholder":190},[74,3009,3010],{"class":76,"line":1098},[74,3011,3012],{},"print(\"你好，\" + name)\n",[74,3014,3015],{"class":76,"line":1104},[74,3016,3017],{},"print(age + 1)\n",[10,3019,101],{},[65,3021,3024],{"className":3022,"code":3023,"language":107,"meta":70},[105],"根据输入显示姓名，并输出下一年的年龄\n",[34,3025,3023],{"__ignoreMap":70},[10,3027,112],{},[14,3029,115],{"id":115},[117,3031,3032,3042],{},[45,3033,3034,3035,3037,3038,3041],{},"两次 ",[34,3036,2951],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3039,3040],{},"age_text"," 用来提醒这仍是文本。",[45,3043,3044,3047,3048,3051],{},[34,3045,3046],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3049,3050],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3053,133],{"id":133},[42,3055,3056,3063],{},[45,3057,3058,3059,3062],{},"直接计算 ",[34,3060,3061],{},"input(...) + 1","，忽略输入结果是字符串。",[45,3064,3065],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3067,150],{"id":150},[117,3069,3070,3073],{},[45,3071,3072],{},"接收两个整数并输出它们的和。",[45,3074,1645,3075,3078,3079,3081],{},[34,3076,3077],{},"18.5"," 给 ",[34,3080,2963],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3083,165],{},[14,3085,168],{"id":168},[10,3087,3088],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,3090,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":3092},[3093,3094,3095,3096,3097,3098,3099,3100],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2928,"description":2933},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[186,2271,3108],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3111,"title":3112,"body":3113,"category":186,"cover":187,"description":3117,"extension":188,"meta":3277,"navigation":190,"path":3278,"pinned":192,"publishedAt":193,"seo":3279,"slug":3280,"stem":3281,"summary":3282,"tags":3283,"updatedAt":193,"visible":190,"__hash__":3286},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3114,"toc":3267},[3115,3118,3120,3123,3125,3131,3138,3140,3154,3156,3158,3197,3199,3205,3207,3209,3228,3230,3245,3247,3258,3260,3262,3265],[10,3116,3117],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3119,16],{"id":16},[10,3121,3122],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3124,22],{"id":22},[10,3126,3127],{},[26,3128],{"alt":3129,"src":3130},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3132,3133,3134,3137],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3135,3136],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3139,40],{"id":40},[42,3141,3142,3145,3148],{},[45,3143,3144],{},"列表使用方括号，元素之间用逗号分隔。",[45,3146,3147],{},"列表可变，可以替换、追加和删除元素。",[45,3149,3150,3151,324],{},"访问不存在的索引会产生 ",[34,3152,3153],{},"IndexError",[14,3155,60],{"id":60},[10,3157,1394],{},[65,3159,3161],{"className":371,"code":3160,"language":373,"meta":70,"style":70},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3162,3163,3168,3173,3177,3182,3187,3192],{"__ignoreMap":70},[74,3164,3165],{"class":76,"line":77},[74,3166,3167],{},"scores = [82, 90, 76]\n",[74,3169,3170],{"class":76,"line":87},[74,3171,3172],{},"print(scores[0])\n",[74,3174,3175],{"class":76,"line":388},[74,3176,1051],{"emptyLinePlaceholder":190},[74,3178,3179],{"class":76,"line":394},[74,3180,3181],{},"scores[1] = 95\n",[74,3183,3184],{"class":76,"line":1098},[74,3185,3186],{},"scores.append(88)\n",[74,3188,3189],{"class":76,"line":1104},[74,3190,3191],{},"print(scores)\n",[74,3193,3194],{"class":76,"line":2414},[74,3195,3196],{},"print(len(scores))\n",[10,3198,101],{},[65,3200,3203],{"className":3201,"code":3202,"language":107,"meta":70},[105],"82\n[82, 95, 76, 88]\n4\n",[34,3204,3202],{"__ignoreMap":70},[10,3206,112],{},[14,3208,115],{"id":115},[117,3210,3211,3214],{},[45,3212,3213],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[45,3215,3216,3219,3220,3223,3224,3227],{},[34,3217,3218],{},"scores[1] = 95"," 替换第二个位置，",[34,3221,3222],{},"append(88)"," 在末尾增加新位置，",[34,3225,3226],{},"len()"," 因而从 3 变为 4。",[14,3229,133],{"id":133},[42,3231,3232,3242],{},[45,3233,3234,3235,3238,3239,324],{},"访问 ",[34,3236,3237],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3240,3241],{},"len(scores) - 1",[45,3243,3244],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3246,150],{"id":150},[117,3248,3249,3252],{},[45,3250,3251],{},"建立三项学习任务列表，再追加第四项。",[45,3253,3254,3255,3257],{},"修改第二项，并用 ",[34,3256,3226],{}," 检查元素数量。",[10,3259,165],{},[14,3261,168],{"id":168},[10,3263,3264],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,3266,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":3268},[3269,3270,3271,3272,3273,3274,3275,3276],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3112,"description":3117},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[186,3284,3285],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3288,"title":3289,"body":3290,"category":186,"cover":187,"description":3294,"extension":188,"meta":3435,"navigation":190,"path":3436,"pinned":192,"publishedAt":193,"seo":3437,"slug":3438,"stem":3439,"summary":3440,"tags":3441,"updatedAt":193,"visible":190,"__hash__":3443},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3291,"toc":3425},[3292,3295,3297,3300,3302,3308,3311,3313,3324,3326,3328,3362,3364,3370,3372,3374,3388,3390,3402,3404,3416,3418,3420,3423],[10,3293,3294],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3296,16],{"id":16},[10,3298,3299],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3301,22],{"id":22},[10,3303,3304],{},[26,3305],{"alt":3306,"src":3307},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3309,3310],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3312,40],{"id":40},[42,3314,3315,3318,3321],{},[45,3316,3317],{},"元组常用来表达固定数量、固定含义的一组值。",[45,3319,3320],{},"只有一个元素的元组必须保留尾随逗号。",[45,3322,3323],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3325,60],{"id":60},[10,3327,1394],{},[65,3329,3331],{"className":371,"code":3330,"language":373,"meta":70,"style":70},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3332,3333,3338,3343,3348,3352,3357],{"__ignoreMap":70},[74,3334,3335],{"class":76,"line":77},[74,3336,3337],{},"point = (120, 80)\n",[74,3339,3340],{"class":76,"line":87},[74,3341,3342],{},"print(point[0])\n",[74,3344,3345],{"class":76,"line":388},[74,3346,3347],{},"print(point[1])\n",[74,3349,3350],{"class":76,"line":394},[74,3351,1051],{"emptyLinePlaceholder":190},[74,3353,3354],{"class":76,"line":1098},[74,3355,3356],{},"single = (5,)\n",[74,3358,3359],{"class":76,"line":1104},[74,3360,3361],{},"print(single)\n",[10,3363,101],{},[65,3365,3368],{"className":3366,"code":3367,"language":107,"meta":70},[105],"120\n80\n(5,)\n",[34,3369,3367],{"__ignoreMap":70},[10,3371,112],{},[14,3373,115],{"id":115},[117,3375,3376,3382],{},[45,3377,3378,3381],{},[34,3379,3380],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[45,3383,3384,3387],{},[34,3385,3386],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3389,133],{"id":133},[42,3391,3392,3399],{},[45,3393,3394,3395,3398],{},"把 ",[34,3396,3397],{},"(5)"," 当作元组，实际它仍是整数。",[45,3400,3401],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3403,150],{"id":150},[117,3405,3406,3409],{},[45,3407,3408],{},"用元组表示宽度和高度。",[45,3410,2098,3411,2101,3413,3415],{},[34,3412,3397],{},[34,3414,3386],{}," 的类型。",[10,3417,165],{},[14,3419,168],{"id":168},[10,3421,3422],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,3424,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":3426},[3427,3428,3429,3430,3431,3432,3433,3434],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3289,"description":3294},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[186,3442,3285],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3445,"title":3446,"body":3447,"category":186,"cover":187,"description":3451,"extension":188,"meta":3606,"navigation":190,"path":3607,"pinned":192,"publishedAt":193,"seo":3608,"slug":3609,"stem":3610,"summary":3611,"tags":3612,"updatedAt":193,"visible":190,"__hash__":3614},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3448,"toc":3596},[3449,3452,3454,3457,3459,3465,3475,3477,3491,3493,3495,3529,3531,3537,3539,3541,3556,3558,3577,3579,3587,3589,3591,3594],[10,3450,3451],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3453,16],{"id":16},[10,3455,3456],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3458,22],{"id":22},[10,3460,3461],{},[26,3462],{"alt":3463,"src":3464},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3466,3467,3468,3471,3472,3474],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3469,3470],{},"student[\"score\"]"," 读取的是键 ",[34,3473,2171],{}," 对应的值，而不是“第几个元素”。",[14,3476,40],{"id":40},[42,3478,3479,3482,3488],{},[45,3480,3481],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[45,3483,2264,3484,3487],{},[34,3485,3486],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[45,3489,3490],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3492,60],{"id":60},[10,3494,1394],{},[65,3496,3498],{"className":371,"code":3497,"language":373,"meta":70,"style":70},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3499,3500,3505,3510,3514,3519,3524],{"__ignoreMap":70},[74,3501,3502],{"class":76,"line":77},[74,3503,3504],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[74,3506,3507],{"class":76,"line":87},[74,3508,3509],{},"print(student[\"name\"])\n",[74,3511,3512],{"class":76,"line":388},[74,3513,1051],{"emptyLinePlaceholder":190},[74,3515,3516],{"class":76,"line":394},[74,3517,3518],{},"student[\"score\"] = 95\n",[74,3520,3521],{"class":76,"line":1098},[74,3522,3523],{},"student[\"city\"] = \"郑州\"\n",[74,3525,3526],{"class":76,"line":1104},[74,3527,3528],{},"print(student)\n",[10,3530,101],{},[65,3532,3535],{"className":3533,"code":3534,"language":107,"meta":70},[105],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3536,3534],{"__ignoreMap":70},[10,3538,112],{},[14,3540,115],{"id":115},[117,3542,3543,3546],{},[45,3544,3545],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[45,3547,3548,3549,3551,3552,3555],{},"给已有键 ",[34,3550,2171],{}," 赋值会更新映射，给新键 ",[34,3553,3554],{},"city"," 赋值会增加映射。",[14,3557,133],{"id":133},[42,3559,3560,3567],{},[45,3561,3562,3563,3566],{},"按位置理解字典并尝试 ",[34,3564,3565],{},"student[0]","，而实际键是字符串。",[45,3568,3569,3570,3573,3574,324],{},"直接读取不确定存在的键并忽略 ",[34,3571,3572],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3575,3576],{},"get()",[14,3578,150],{"id":150},[117,3580,3581,3584],{},[45,3582,3583],{},"建立一本书的标题、作者和页数字典。",[45,3585,3586],{},"添加分类键，再修改页数。",[10,3588,165],{},[14,3590,168],{"id":168},[10,3592,3593],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,3595,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":3597},[3598,3599,3600,3601,3602,3603,3604,3605],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3446,"description":3451},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[186,3613,3285],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3616,"title":3617,"body":3618,"category":186,"cover":187,"description":3622,"extension":188,"meta":3771,"navigation":190,"path":3772,"pinned":192,"publishedAt":193,"seo":3773,"slug":3774,"stem":3775,"summary":3776,"tags":3777,"updatedAt":193,"visible":190,"__hash__":3779},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3619,"toc":3761},[3620,3623,3625,3628,3630,3636,3639,3641,3660,3662,3664,3698,3700,3706,3708,3710,3725,3727,3739,3741,3752,3754,3756,3759],[10,3621,3622],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3624,16],{"id":16},[10,3626,3627],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3629,22],{"id":22},[10,3631,3632],{},[26,3633],{"alt":3634,"src":3635},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3637,3638],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3640,40],{"id":40},[42,3642,3643,3646,3649],{},[45,3644,3645],{},"集合中的元素不重复。",[45,3647,3648],{},"集合是无序容器，不要依赖打印顺序或索引。",[45,3650,3651,3652,3655,3656,3659],{},"创建空集合必须写 ",[34,3653,3654],{},"set()","；",[34,3657,3658],{},"{}"," 创建的是空字典。",[14,3661,60],{"id":60},[10,3663,1394],{},[65,3665,3667],{"className":371,"code":3666,"language":373,"meta":70,"style":70},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3668,3669,3674,3679,3683,3688,3693],{"__ignoreMap":70},[74,3670,3671],{"class":76,"line":77},[74,3672,3673],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[74,3675,3676],{"class":76,"line":87},[74,3677,3678],{},"right = {\"Python\", \"Docker\"}\n",[74,3680,3681],{"class":76,"line":388},[74,3682,1051],{"emptyLinePlaceholder":190},[74,3684,3685],{"class":76,"line":394},[74,3686,3687],{},"print(left & right)\n",[74,3689,3690],{"class":76,"line":1098},[74,3691,3692],{},"print(left | right)\n",[74,3694,3695],{"class":76,"line":1104},[74,3696,3697],{},"print(\"Git\" in left)\n",[10,3699,101],{},[65,3701,3704],{"className":3702,"code":3703,"language":107,"meta":70},[105],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3705,3703],{"__ignoreMap":70},[10,3707,112],{},[14,3709,115],{"id":115},[117,3711,3712,3715],{},[45,3713,3714],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[45,3716,3717,3720,3721,3724],{},[34,3718,3719],{},"&"," 计算交集，",[34,3722,3723],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3726,133],{"id":133},[42,3728,3729,3736],{},[45,3730,2264,3731,3733,3734,324],{},[34,3732,3658],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3735,3654],{},[45,3737,3738],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3740,150],{"id":150},[117,3742,3743,3749],{},[45,3744,3745,3746,3748],{},"把包含重复标签的列表交给 ",[34,3747,3654],{}," 去重。",[45,3750,3751],{},"计算两组课程标签的交集和差集。",[10,3753,165],{},[14,3755,168],{"id":168},[10,3757,3758],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,3760,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":3762},[3763,3764,3765,3766,3767,3768,3769,3770],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3617,"description":3622},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[186,3778,3285],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3781,"title":3782,"body":3783,"category":186,"cover":187,"description":3787,"extension":188,"meta":3985,"navigation":190,"path":3986,"pinned":192,"publishedAt":193,"seo":3987,"slug":3988,"stem":3989,"summary":3990,"tags":3991,"updatedAt":193,"visible":190,"__hash__":3994},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3784,"toc":3973},[3785,3788,3790,3793,3795,3801,3811,3813,3830,3832,3834,3884,3886,3892,3894,3896,3918,3920,3923,3929,3932,3934,3947,3949,3964,3966,3968,3971],[10,3786,3787],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3789,16],{"id":16},[10,3791,3792],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3794,22],{"id":22},[10,3796,3797],{},[26,3798],{"alt":3799,"src":3800},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3802,3803,3806,3807,3810],{},[34,3804,3805],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3808,3809],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3812,40],{"id":40},[42,3814,3815,3824,3827],{},[45,3816,3817,3819,3820,3823],{},[34,3818,2734],{}," 比较内容是否相等，",[34,3821,3822],{},"is"," 比较是否为同一个对象。",[45,3825,3826],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[45,3828,3829],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3831,60],{"id":60},[10,3833,1394],{},[65,3835,3837],{"className":371,"code":3836,"language":373,"meta":70,"style":70},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3838,3839,3844,3849,3854,3858,3863,3868,3873,3878],{"__ignoreMap":70},[74,3840,3841],{"class":76,"line":77},[74,3842,3843],{},"tasks = [\"变量\", \"字符串\"]\n",[74,3845,3846],{"class":76,"line":87},[74,3847,3848],{},"shared = tasks\n",[74,3850,3851],{"class":76,"line":388},[74,3852,3853],{},"backup = tasks.copy()\n",[74,3855,3856],{"class":76,"line":394},[74,3857,1051],{"emptyLinePlaceholder":190},[74,3859,3860],{"class":76,"line":1098},[74,3861,3862],{},"tasks.append(\"列表\")\n",[74,3864,3865],{"class":76,"line":1104},[74,3866,3867],{},"print(shared)\n",[74,3869,3870],{"class":76,"line":2414},[74,3871,3872],{},"print(backup)\n",[74,3874,3875],{"class":76,"line":2420},[74,3876,3877],{},"print(tasks is shared)\n",[74,3879,3881],{"class":76,"line":3880},9,[74,3882,3883],{},"print(tasks is backup)\n",[10,3885,101],{},[65,3887,3890],{"className":3888,"code":3889,"language":107,"meta":70},[105],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3891,3889],{"__ignoreMap":70},[10,3893,112],{},[14,3895,115],{"id":115},[117,3897,3898,3904],{},[45,3899,3900,3903],{},[34,3901,3902],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[45,3905,3906,3909,3910,3913,3914,3917],{},[34,3907,3908],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3911,3912],{},"shared"," 能观察到变化，",[34,3915,3916],{},"backup"," 不会。",[290,3919,2624],{"id":2624},[10,3921,3922],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3924,3925],{},[26,3926],{"alt":3927,"src":3928},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3930,3931],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3933,133],{"id":133},[42,3935,3936,3944],{},[45,3937,3938,3939,3941,3942,324],{},"用 ",[34,3940,2734],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,3943,3822],{},[45,3945,3946],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3948,150],{"id":150},[117,3950,3951,3954],{},[45,3952,3953],{},"让两个变量引用同一个字典并修改其中一个。",[45,3955,2264,3956,3959,3960,1113,3962,324],{},[34,3957,3958],{},"copy()"," 创建外层副本，再比较 ",[34,3961,3822],{},[34,3963,2734],{},[10,3965,165],{},[14,3967,168],{"id":168},[10,3969,3970],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,3972,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":3974},[3975,3976,3977,3978,3979,3982,3983,3984],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":3980},[3981],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3782,"description":3787},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[186,3992,3993],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":3996,"title":3997,"body":3998,"category":186,"cover":187,"description":4002,"extension":188,"meta":4215,"navigation":190,"path":4216,"pinned":192,"publishedAt":193,"seo":4217,"slug":4218,"stem":4219,"summary":4220,"tags":4221,"updatedAt":193,"visible":190,"__hash__":4223},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":3999,"toc":4202},[4000,4003,4005,4008,4010,4016,4026,4028,4039,4041,4043,4096,4098,4104,4106,4108,4126,4128,4131,4137,4145,4148,4151,4157,4163,4165,4183,4185,4193,4195,4197,4200],[10,4001,4002],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4004,16],{"id":16},[10,4006,4007],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4009,22],{"id":22},[10,4011,4012],{},[26,4013],{"alt":4014,"src":4015},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4017,4018,2182,4020,2182,4023,4025],{},[34,4019,1112],{},[34,4021,4022],{},"elif",[34,4024,1116],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4027,40],{"id":40},[42,4029,4030,4033,4036],{},[45,4031,4032],{},"冒号表示接下来开始一个代码块。",[45,4034,4035],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[45,4037,4038],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4040,60],{"id":60},[10,4042,1394],{},[65,4044,4046],{"className":371,"code":4045,"language":373,"meta":70,"style":70},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4047,4048,4053,4057,4062,4067,4072,4077,4081,4086,4090],{"__ignoreMap":70},[74,4049,4050],{"class":76,"line":77},[74,4051,4052],{},"score = int(input(\"请输入分数：\"))\n",[74,4054,4055],{"class":76,"line":87},[74,4056,1051],{"emptyLinePlaceholder":190},[74,4058,4059],{"class":76,"line":388},[74,4060,4061],{},"if score >= 90:\n",[74,4063,4064],{"class":76,"line":394},[74,4065,4066],{},"    level = \"优秀\"\n",[74,4068,4069],{"class":76,"line":1098},[74,4070,4071],{},"elif score >= 60:\n",[74,4073,4074],{"class":76,"line":1104},[74,4075,4076],{},"    level = \"合格\"\n",[74,4078,4079],{"class":76,"line":2414},[74,4080,1101],{},[74,4082,4083],{"class":76,"line":2420},[74,4084,4085],{},"    level = \"需要继续学习\"\n",[74,4087,4088],{"class":76,"line":3880},[74,4089,1051],{"emptyLinePlaceholder":190},[74,4091,4093],{"class":76,"line":4092},10,[74,4094,4095],{},"print(level)\n",[10,4097,101],{},[65,4099,4102],{"className":4100,"code":4101,"language":107,"meta":70},[105],"输入 85 时输出：合格\n",[34,4103,4101],{"__ignoreMap":70},[10,4105,112],{},[14,4107,115],{"id":115},[117,4109,4110,4117],{},[45,4111,4112,4113,4116],{},"输入先转换为整数，程序从 ",[34,4114,4115],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[45,4118,4119,4122,4123,4125],{},[34,4120,4121],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4124,1116],{}," 被跳过；最终三个分支只会选择一个。",[290,4127,2624],{"id":2624},[10,4129,4130],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4132,4133],{},[26,4134],{"alt":4135,"src":4136},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4138,4139,4141,4142,4144],{},[34,4140,4115],{}," 必须放在 ",[34,4143,4121],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[290,4146,2624],{"id":4147},"再看一个具体细节-1",[10,4149,4150],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4152,4153],{},[26,4154],{"alt":4155,"src":4156},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4158,4159,4160,4162],{},"同一缩进层级属于同一个代码块；回到 ",[34,4161,1112],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4164,133],{"id":133},[42,4166,4167,4173],{},[45,4168,4169,4170,4172],{},"先写 ",[34,4171,4121],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[45,4174,4175,4176,4178,4179,4182],{},"混用多个独立 ",[34,4177,1112],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4180,4181],{},"if\u002Felif\u002Felse"," 链。",[14,4184,150],{"id":150},[117,4186,4187,4190],{},[45,4188,4189],{},"根据温度输出“冷、适中、热”三个等级。",[45,4191,4192],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4194,165],{},[14,4196,168],{"id":168},[10,4198,4199],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,4201,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":4203},[4204,4205,4206,4207,4208,4212,4213,4214],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":4209},[4210,4211],{"id":2624,"depth":388,"text":2624},{"id":4147,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":3997,"description":4002},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[186,1112,4222],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4225,"title":4226,"body":4227,"category":186,"cover":187,"description":4231,"extension":188,"meta":4397,"navigation":190,"path":4398,"pinned":192,"publishedAt":193,"seo":4399,"slug":4400,"stem":4401,"summary":4402,"tags":4403,"updatedAt":193,"visible":190,"__hash__":4405},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4228,"toc":4385},[4229,4232,4234,4237,4239,4245,4251,4253,4268,4270,4272,4310,4312,4318,4320,4322,4337,4339,4342,4348,4354,4356,4364,4366,4376,4378,4380,4383],[10,4230,4231],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4233,16],{"id":16},[10,4235,4236],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4238,22],{"id":22},[10,4240,4241],{},[26,4242],{"alt":4243,"src":4244},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4246,4247,4250],{},[34,4248,4249],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4252,40],{"id":40},[42,4254,4255,4258,4261],{},[45,4256,4257],{},"进入循环前先准备参与条件判断的状态。",[45,4259,4260],{},"循环体中必须有机会让条件变为假。",[45,4262,4263,4264,4267],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4265,4266],{},"for"," 通常更直接。",[14,4269,60],{"id":60},[10,4271,1394],{},[65,4273,4275],{"className":371,"code":4274,"language":373,"meta":70,"style":70},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4276,4277,4282,4286,4291,4296,4301,4305],{"__ignoreMap":70},[74,4278,4279],{"class":76,"line":77},[74,4280,4281],{},"count = 1\n",[74,4283,4284],{"class":76,"line":87},[74,4285,1051],{"emptyLinePlaceholder":190},[74,4287,4288],{"class":76,"line":388},[74,4289,4290],{},"while count \u003C= 3:\n",[74,4292,4293],{"class":76,"line":394},[74,4294,4295],{},"    print(\"第\", count, \"次练习\")\n",[74,4297,4298],{"class":76,"line":1098},[74,4299,4300],{},"    count = count + 1\n",[74,4302,4303],{"class":76,"line":1104},[74,4304,1051],{"emptyLinePlaceholder":190},[74,4306,4307],{"class":76,"line":2414},[74,4308,4309],{},"print(\"练习结束\")\n",[10,4311,101],{},[65,4313,4316],{"className":4314,"code":4315,"language":107,"meta":70},[105],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4317,4315],{"__ignoreMap":70},[10,4319,112],{},[14,4321,115],{"id":115},[117,4323,4324,4331],{},[45,4325,4326,4327,4330],{},"进入循环前 ",[34,4328,4329],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[45,4332,4333,4334,4336],{},"循环体末尾把 ",[34,4335,4329],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[290,4338,2624],{"id":2624},[10,4340,4341],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4343,4344],{},[26,4345],{"alt":4346,"src":4347},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4349,4350,4351,4353],{},"第4次检查时 ",[34,4352,4329],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4355,133],{"id":133},[42,4357,4358,4361],{},[45,4359,4360],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[45,4362,4363],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4365,150],{"id":150},[117,4367,4368,4373],{},[45,4369,2264,4370,4372],{},[34,4371,4249],{}," 输出 1 到 5。",[45,4374,4375],{},"计算 1 到 10 的累加和。",[10,4377,165],{},[14,4379,168],{"id":168},[10,4381,4382],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,4384,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":4386},[4387,4388,4389,4390,4391,4394,4395,4396],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":4392},[4393],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4226,"description":4231},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[186,4249,4404],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4407,"title":4408,"body":4409,"category":186,"cover":187,"description":4413,"extension":188,"meta":4561,"navigation":190,"path":4562,"pinned":192,"publishedAt":193,"seo":4563,"slug":4564,"stem":4565,"summary":4566,"tags":4567,"updatedAt":193,"visible":190,"__hash__":4569},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4410,"toc":4551},[4411,4414,4416,4419,4421,4427,4432,4434,4448,4450,4452,4490,4492,4498,4500,4502,4519,4521,4529,4531,4542,4544,4546,4549],[10,4412,4413],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4415,16],{"id":16},[10,4417,4418],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4420,22],{"id":22},[10,4422,4423],{},[26,4424],{"alt":4425,"src":4426},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4428,4429,4431],{},[34,4430,4266],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4433,40],{"id":40},[42,4435,4436,4442,4445],{},[45,4437,4438,4441],{},[34,4439,4440],{},"range(1, 4)"," 包含 1，不包含 4。",[45,4443,4444],{},"只需要元素时直接遍历元素，不必手工维护索引。",[45,4446,4447],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4449,60],{"id":60},[10,4451,1394],{},[65,4453,4455],{"className":371,"code":4454,"language":373,"meta":70,"style":70},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4456,4457,4462,4466,4471,4476,4480,4485],{"__ignoreMap":70},[74,4458,4459],{"class":76,"line":77},[74,4460,4461],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[74,4463,4464],{"class":76,"line":87},[74,4465,1051],{"emptyLinePlaceholder":190},[74,4467,4468],{"class":76,"line":388},[74,4469,4470],{},"for course in courses:\n",[74,4472,4473],{"class":76,"line":394},[74,4474,4475],{},"    print(course)\n",[74,4477,4478],{"class":76,"line":1098},[74,4479,1051],{"emptyLinePlaceholder":190},[74,4481,4482],{"class":76,"line":1104},[74,4483,4484],{},"for number in range(1, 4):\n",[74,4486,4487],{"class":76,"line":2414},[74,4488,4489],{},"    print(number)\n",[10,4491,101],{},[65,4493,4496],{"className":4494,"code":4495,"language":107,"meta":70},[105],"变量\n字符串\n列表\n1\n2\n3\n",[34,4497,4495],{"__ignoreMap":70},[10,4499,112],{},[14,4501,115],{"id":115},[117,4503,4504,4514],{},[45,4505,4506,4507,4509,4510,4513],{},"第一个 ",[34,4508,4266],{}," 依次从列表取得字符串，循环变量 ",[34,4511,4512],{},"course"," 每轮重新绑定。",[45,4515,4516,4518],{},[34,4517,4440],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4520,133],{"id":133},[42,4522,4523,4526],{},[45,4524,4525],{},"只需要元素却手工维护索引，增加越界风险。",[45,4527,4528],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4530,150],{"id":150},[117,4532,4533,4536],{},[45,4534,4535],{},"逐项输出一个字符串中的字符。",[45,4537,2264,4538,4541],{},[34,4539,4540],{},"range()"," 输出 2、4、6、8。",[10,4543,165],{},[14,4545,168],{"id":168},[10,4547,4548],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,4550,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":4552},[4553,4554,4555,4556,4557,4558,4559,4560],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4408,"description":4413},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[186,4266,4568],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4571,"title":4572,"body":4573,"category":186,"cover":187,"description":4577,"extension":188,"meta":4751,"navigation":190,"path":4752,"pinned":192,"publishedAt":193,"seo":4753,"slug":4754,"stem":4755,"summary":4756,"tags":4757,"updatedAt":193,"visible":190,"__hash__":4758},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4574,"toc":4741},[4575,4578,4580,4583,4585,4591,4601,4603,4622,4624,4626,4678,4680,4686,4688,4690,4704,4706,4722,4724,4732,4734,4736,4739],[10,4576,4577],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4579,16],{"id":16},[10,4581,4582],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4584,22],{"id":22},[10,4586,4587],{},[26,4588],{"alt":4589,"src":4590},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4592,4593,4596,4597,4600],{},[34,4594,4595],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4598,4599],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4602,40],{"id":40},[42,4604,4605,4608,4616],{},[45,4606,4607],{},"先写普通循环，再在确有需要时加入流程控制语句。",[45,4609,4610,4612,4613,4615],{},[34,4611,4595],{}," 前要确认不会跳过 ",[34,4614,4249],{}," 循环中的状态更新。",[45,4617,4618,4619,4621],{},"多层嵌套中 ",[34,4620,4599],{}," 只结束它所在的最内层循环。",[14,4623,60],{"id":60},[10,4625,1394],{},[65,4627,4629],{"className":371,"code":4628,"language":373,"meta":70,"style":70},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,4630,4631,4636,4640,4645,4650,4655,4660,4665,4669,4673],{"__ignoreMap":70},[74,4632,4633],{"class":76,"line":77},[74,4634,4635],{},"numbers = [3, -1, 0, 8, 12]\n",[74,4637,4638],{"class":76,"line":87},[74,4639,1051],{"emptyLinePlaceholder":190},[74,4641,4642],{"class":76,"line":388},[74,4643,4644],{},"for number in numbers:\n",[74,4646,4647],{"class":76,"line":394},[74,4648,4649],{},"    if number \u003C 0:\n",[74,4651,4652],{"class":76,"line":1098},[74,4653,4654],{},"        continue\n",[74,4656,4657],{"class":76,"line":1104},[74,4658,4659],{},"    if number == 0:\n",[74,4661,4662],{"class":76,"line":2414},[74,4663,4664],{},"        break\n",[74,4666,4667],{"class":76,"line":2420},[74,4668,4489],{},[74,4670,4671],{"class":76,"line":3880},[74,4672,1051],{"emptyLinePlaceholder":190},[74,4674,4675],{"class":76,"line":4092},[74,4676,4677],{},"print(\"循环结束\")\n",[10,4679,101],{},[65,4681,4684],{"className":4682,"code":4683,"language":107,"meta":70},[105],"3\n循环结束\n",[34,4685,4683],{"__ignoreMap":70},[10,4687,112],{},[14,4689,115],{"id":115},[117,4691,4692,4698],{},[45,4693,4694,4695,4697],{},"遇到 -1 时 ",[34,4696,4595],{}," 立即结束本轮，后面的判断和输出都不执行。",[45,4699,4700,4701,4703],{},"遇到 0 时 ",[34,4702,4599],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4705,133],{"id":133},[42,4707,4708,4713],{},[45,4709,3394,4710,4712],{},[34,4711,4595],{}," 当作结束循环，实际它只跳到下一轮。",[45,4714,4715,4716,4718,4719,4721],{},"在 ",[34,4717,4249],{}," 中把状态更新放在可能被 ",[34,4720,4595],{}," 跳过的位置，造成无限循环。",[14,4723,150],{"id":150},[117,4725,4726,4729],{},[45,4727,4728],{},"跳过列表中的空字符串并输出其他内容。",[45,4730,4731],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4733,165],{},[14,4735,168],{"id":168},[10,4737,4738],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,4740,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":4742},[4743,4744,4745,4746,4747,4748,4749,4750],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4572,"description":4577},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[186,4599,4595],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4760,"title":4761,"body":4762,"category":186,"cover":187,"description":4766,"extension":188,"meta":4937,"navigation":190,"path":4938,"pinned":192,"publishedAt":193,"seo":4939,"slug":4940,"stem":4941,"summary":4942,"tags":4943,"updatedAt":193,"visible":190,"__hash__":4946},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4763,"toc":4925},[4764,4767,4769,4772,4774,4780,4783,4785,4809,4811,4813,4847,4849,4855,4857,4859,4876,4878,4881,4887,4890,4892,4906,4908,4916,4918,4920,4923],[10,4765,4766],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4768,16],{"id":16},[10,4770,4771],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4773,22],{"id":22},[10,4775,4776],{},[26,4777],{"alt":4778,"src":4779},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4781,4782],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4784,40],{"id":40},[42,4786,4787,4790,4793],{},[45,4788,4789],{},"每增加一层嵌套，阅读成本都会上升。",[45,4791,4792],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[45,4794,4795,4796,2182,4799,4802,4803,2182,4806,324],{},"变量名使用 ",[34,4797,4798],{},"row",[34,4800,4801],{},"cell"," 等层级含义，避免全部写成 ",[34,4804,4805],{},"i",[34,4807,4808],{},"j",[14,4810,60],{"id":60},[10,4812,1394],{},[65,4814,4816],{"className":371,"code":4815,"language":373,"meta":70,"style":70},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4817,4818,4823,4827,4832,4837,4842],{"__ignoreMap":70},[74,4819,4820],{"class":76,"line":77},[74,4821,4822],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[74,4824,4825],{"class":76,"line":87},[74,4826,1051],{"emptyLinePlaceholder":190},[74,4828,4829],{"class":76,"line":388},[74,4830,4831],{},"for row in table:\n",[74,4833,4834],{"class":76,"line":394},[74,4835,4836],{},"    for cell in row:\n",[74,4838,4839],{"class":76,"line":1098},[74,4840,4841],{},"        print(cell)\n",[74,4843,4844],{"class":76,"line":1104},[74,4845,4846],{},"    print(\"一行结束\")\n",[10,4848,101],{},[65,4850,4853],{"className":4851,"code":4852,"language":107,"meta":70},[105],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4854,4852],{"__ignoreMap":70},[10,4856,112],{},[14,4858,115],{"id":115},[117,4860,4861,4873],{},[45,4862,4863,4864,4866,4867,1113,4870,324],{},"外层变量 ",[34,4865,4798],{}," 先引用第一行列表，内层才依次处理 ",[34,4868,4869],{},"A1",[34,4871,4872],{},"A2",[45,4874,4875],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[290,4877,2624],{"id":2624},[10,4879,4880],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4882,4883],{},[26,4884],{"alt":4885,"src":4886},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4888,4889],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4891,133],{"id":133},[42,4893,4894,4903],{},[45,4895,4896,4897,963,4900,4902],{},"把两层循环变量都叫 ",[34,4898,4899],{},"item",[34,4901,4805],{},"，难以确认当前层级。",[45,4904,4905],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4907,150],{"id":150},[117,4909,4910,4913],{},[45,4911,4912],{},"打印一个 2×3 数字表。",[45,4914,4915],{},"在内层增加条件，只输出大于 3 的元素。",[10,4917,165],{},[14,4919,168],{"id":168},[10,4921,4922],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,4924,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":4926},[4927,4928,4929,4930,4931,4934,4935,4936],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":4932},[4933],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4761,"description":4766},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[186,4944,4945],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4948,"title":4949,"body":4950,"category":186,"cover":187,"description":4954,"extension":188,"meta":5092,"navigation":190,"path":5093,"pinned":192,"publishedAt":193,"seo":5094,"slug":5095,"stem":5096,"summary":5097,"tags":5098,"updatedAt":193,"visible":190,"__hash__":5101},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4951,"toc":5082},[4952,4955,4957,4960,4962,4968,4971,4973,4984,4986,4988,5026,5028,5034,5036,5038,5050,5052,5063,5065,5073,5075,5077,5080],[10,4953,4954],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4956,16],{"id":16},[10,4958,4959],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4961,22],{"id":22},[10,4963,4964],{},[26,4965],{"alt":4966,"src":4967},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4969,4970],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4972,40],{"id":40},[42,4974,4975,4978,4981],{},[45,4976,4977],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[45,4979,4980],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[45,4982,4983],{},"推导式创建新列表，不修改输入列表。",[14,4985,60],{"id":60},[10,4987,1394],{},[65,4989,4991],{"className":371,"code":4990,"language":373,"meta":70,"style":70},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,4992,4993,4998,5002,5007,5012,5016,5021],{"__ignoreMap":70},[74,4994,4995],{"class":76,"line":77},[74,4996,4997],{},"numbers = [1, 2, 3, 4, 5]\n",[74,4999,5000],{"class":76,"line":87},[74,5001,1051],{"emptyLinePlaceholder":190},[74,5003,5004],{"class":76,"line":388},[74,5005,5006],{},"squares = [number * number for number in numbers]\n",[74,5008,5009],{"class":76,"line":394},[74,5010,5011],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[74,5013,5014],{"class":76,"line":1098},[74,5015,1051],{"emptyLinePlaceholder":190},[74,5017,5018],{"class":76,"line":1104},[74,5019,5020],{},"print(squares)\n",[74,5022,5023],{"class":76,"line":2414},[74,5024,5025],{},"print(even_squares)\n",[10,5027,101],{},[65,5029,5032],{"className":5030,"code":5031,"language":107,"meta":70},[105],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5033,5031],{"__ignoreMap":70},[10,5035,112],{},[14,5037,115],{"id":115},[117,5039,5040,5043],{},[45,5041,5042],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[45,5044,5045,5046,5049],{},"第二条先用 ",[34,5047,5048],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5051,133],{"id":133},[42,5053,5054,5060],{},[45,5055,5056,5057,5059],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5058,4266],{}," 开始找输入。",[45,5061,5062],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5064,150],{"id":150},[117,5066,5067,5070],{},[45,5068,5069],{},"把字符串列表转换为长度列表。",[45,5071,5072],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5074,165],{},[14,5076,168],{"id":168},[10,5078,5079],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,5081,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":5083},[5084,5085,5086,5087,5088,5089,5090,5091],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4949,"description":4954},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[186,5099,5100],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5103,"title":5104,"body":5105,"category":186,"cover":187,"description":5109,"extension":188,"meta":5252,"navigation":190,"path":5253,"pinned":192,"publishedAt":193,"seo":5254,"slug":5255,"stem":5256,"summary":5257,"tags":5258,"updatedAt":193,"visible":190,"__hash__":5261},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5106,"toc":5242},[5107,5110,5112,5115,5117,5123,5126,5128,5139,5141,5143,5182,5184,5190,5192,5194,5209,5211,5219,5221,5233,5235,5237,5240],[10,5108,5109],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5111,16],{"id":16},[10,5113,5114],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5116,22],{"id":22},[10,5118,5119],{},[26,5120],{"alt":5121,"src":5122},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5124,5125],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5127,40],{"id":40},[42,5129,5130,5133,5136],{},[45,5131,5132],{},"函数名描述动作，使用小写字母和下划线。",[45,5134,5135],{},"函数定义要先执行，之后才能调用。",[45,5137,5138],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5140,60],{"id":60},[10,5142,1394],{},[65,5144,5146],{"className":371,"code":5145,"language":373,"meta":70,"style":70},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5147,5148,5153,5158,5163,5167,5172,5177],{"__ignoreMap":70},[74,5149,5150],{"class":76,"line":77},[74,5151,5152],{},"def show_progress():\n",[74,5154,5155],{"class":76,"line":87},[74,5156,5157],{},"    print(\"正在学习函数\")\n",[74,5159,5160],{"class":76,"line":388},[74,5161,5162],{},"    print(\"本节完成 50%\")\n",[74,5164,5165],{"class":76,"line":394},[74,5166,1051],{"emptyLinePlaceholder":190},[74,5168,5169],{"class":76,"line":1098},[74,5170,5171],{},"print(\"调用前\")\n",[74,5173,5174],{"class":76,"line":1104},[74,5175,5176],{},"show_progress()\n",[74,5178,5179],{"class":76,"line":2414},[74,5180,5181],{},"print(\"调用后\")\n",[10,5183,101],{},[65,5185,5188],{"className":5186,"code":5187,"language":107,"meta":70},[105],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5189,5187],{"__ignoreMap":70},[10,5191,112],{},[14,5193,115],{"id":115},[117,5195,5196,5202],{},[45,5197,155,5198,5201],{},[34,5199,5200],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[45,5203,5204,5205,5208],{},"运行到 ",[34,5206,5207],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5210,133],{"id":133},[42,5212,5213,5216],{},[45,5214,5215],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[45,5217,5218],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5220,150],{"id":150},[117,5222,5223,5230],{},[45,5224,5225,5226,5229],{},"定义 ",[34,5227,5228],{},"show_plan()"," 输出两行学习计划。",[45,5231,5232],{},"连续调用同一个函数两次，观察执行顺序。",[10,5234,165],{},[14,5236,168],{"id":168},[10,5238,5239],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,5241,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":5243},[5244,5245,5246,5247,5248,5249,5250,5251],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5104,"description":5109},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[186,5259,5260],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5263,"title":5264,"body":5265,"category":186,"cover":187,"description":5269,"extension":188,"meta":5449,"navigation":190,"path":5450,"pinned":192,"publishedAt":193,"seo":5451,"slug":5452,"stem":5453,"summary":5454,"tags":5455,"updatedAt":193,"visible":190,"__hash__":5458},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5266,"toc":5437},[5267,5270,5272,5275,5277,5283,5290,5292,5309,5311,5313,5347,5349,5355,5357,5359,5380,5382,5385,5391,5401,5403,5418,5420,5428,5430,5432,5435],[10,5268,5269],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5271,16],{"id":16},[10,5273,5274],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5276,22],{"id":22},[10,5278,5279],{},[26,5280],{"alt":5281,"src":5282},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5284,5285,5286,5289],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5287,5288],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5291,40],{"id":40},[42,5293,5294,5297,5300],{},[45,5295,5296],{},"形参出现在函数定义中，实参出现在函数调用中。",[45,5298,5299],{},"局部变量默认只在函数内部可见。",[45,5301,5302,5303,5305,5306,324],{},"没有显式 ",[34,5304,5288],{}," 的函数会返回 ",[34,5307,5308],{},"None",[14,5310,60],{"id":60},[10,5312,1394],{},[65,5314,5316],{"className":371,"code":5315,"language":373,"meta":70,"style":70},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,5317,5318,5323,5328,5333,5337,5342],{"__ignoreMap":70},[74,5319,5320],{"class":76,"line":77},[74,5321,5322],{},"def calculate_total(price, count):\n",[74,5324,5325],{"class":76,"line":87},[74,5326,5327],{},"    total = price * count\n",[74,5329,5330],{"class":76,"line":388},[74,5331,5332],{},"    return total\n",[74,5334,5335],{"class":76,"line":394},[74,5336,1051],{"emptyLinePlaceholder":190},[74,5338,5339],{"class":76,"line":1098},[74,5340,5341],{},"result = calculate_total(25, 4)\n",[74,5343,5344],{"class":76,"line":1104},[74,5345,5346],{},"print(result)\n",[10,5348,101],{},[65,5350,5353],{"className":5351,"code":5352,"language":107,"meta":70},[105],"100\n",[34,5354,5352],{"__ignoreMap":70},[10,5356,112],{},[14,5358,115],{"id":115},[117,5360,5361,5370],{},[45,5362,5363,5364,2182,5367,5369],{},"调用时 25 和 4 分别绑定到 ",[34,5365,5366],{},"price",[34,5368,4329],{},"，它们只在本次函数调用的局部范围中使用。",[45,5371,5372,5375,5376,5379],{},[34,5373,5374],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5377,5378],{},"result"," 并输出。",[290,5381,2624],{"id":2624},[10,5383,5384],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5386,5387],{},[26,5388],{"alt":5389,"src":5390},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5392,5393,2182,5395,1113,5397,5400],{},[34,5394,5366],{},[34,5396,4329],{},[34,5398,5399],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5402,133],{"id":133},[42,5404,5405,5412],{},[45,5406,5407,5408,5411],{},"在函数内部只 ",[34,5409,5410],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[45,5413,5414,5415,5417],{},"试图在函数外直接访问局部变量 ",[34,5416,5399],{},"，它的名字只在调用期间的局部作用域存在。",[14,5419,150],{"id":150},[117,5421,5422,5425],{},[45,5423,5424],{},"编写计算长方形面积的函数。",[45,5426,5427],{},"让函数返回结果后在调用方加上单位再输出。",[10,5429,165],{},[14,5431,168],{"id":168},[10,5433,5434],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,5436,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":5438},[5439,5440,5441,5442,5443,5446,5447,5448],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":5444},[5445],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5264,"description":5269},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[186,5456,5457],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5460,"title":5461,"body":5462,"category":186,"cover":187,"description":5466,"extension":188,"meta":5646,"navigation":190,"path":5647,"pinned":192,"publishedAt":193,"seo":5648,"slug":5649,"stem":5650,"summary":5651,"tags":5652,"updatedAt":193,"visible":190,"__hash__":5655},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5463,"toc":5634},[5464,5467,5469,5472,5474,5480,5483,5485,5502,5504,5506,5558,5560,5566,5568,5570,5588,5590,5593,5599,5602,5604,5615,5617,5625,5627,5629,5632],[10,5465,5466],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5468,16],{"id":16},[10,5470,5471],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5473,22],{"id":22},[10,5475,5476],{},[26,5477],{"alt":5478,"src":5479},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5481,5482],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5484,40],{"id":40},[42,5486,5487,5490,5496],{},[45,5488,5489],{},"必需参数应放在有默认值的参数之前。",[45,5491,5492,5495],{},[34,5493,5494],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[45,5497,5498,5501],{},[34,5499,5500],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5503,60],{"id":60},[10,5505,1394],{},[65,5507,5509],{"className":371,"code":5508,"language":373,"meta":70,"style":70},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,5510,5511,5516,5521,5525,5530,5535,5539,5544,5549,5553],{"__ignoreMap":70},[74,5512,5513],{"class":76,"line":77},[74,5514,5515],{},"def build_title(name, level=\"基础\"):\n",[74,5517,5518],{"class":76,"line":87},[74,5519,5520],{},"    return name + \"｜\" + level\n",[74,5522,5523],{"class":76,"line":388},[74,5524,1051],{"emptyLinePlaceholder":190},[74,5526,5527],{"class":76,"line":394},[74,5528,5529],{},"print(build_title(\"Python\"))\n",[74,5531,5532],{"class":76,"line":1098},[74,5533,5534],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[74,5536,5537],{"class":76,"line":1104},[74,5538,1051],{"emptyLinePlaceholder":190},[74,5540,5541],{"class":76,"line":2414},[74,5542,5543],{},"def total(*numbers):\n",[74,5545,5546],{"class":76,"line":2420},[74,5547,5548],{},"    return sum(numbers)\n",[74,5550,5551],{"class":76,"line":3880},[74,5552,1051],{"emptyLinePlaceholder":190},[74,5554,5555],{"class":76,"line":4092},[74,5556,5557],{},"print(total(10, 20, 30))\n",[10,5559,101],{},[65,5561,5564],{"className":5562,"code":5563,"language":107,"meta":70},[105],"Python｜基础\n异常处理｜进阶\n60\n",[34,5565,5563],{"__ignoreMap":70},[10,5567,112],{},[14,5569,115],{"id":115},[117,5571,5572,5579],{},[45,5573,5574,5575,5578],{},"第一次调用只提供必需参数，",[34,5576,5577],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[45,5580,5581,5584,5585,324],{},[34,5582,5583],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5586,5587],{},"sum()",[290,5589,2624],{"id":2624},[10,5591,5592],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5594,5595],{},[26,5596],{"alt":5597,"src":5598},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5600,5601],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5603,133],{"id":133},[42,5605,5606,5612],{},[45,5607,5608,5609,5611],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5610,5308],{}," 再在函数内创建。",[45,5613,5614],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5616,150],{"id":150},[117,5618,5619,5622],{},[45,5620,5621],{},"给问候函数增加默认称呼。",[45,5623,5624],{},"编写接收任意数量分数并返回总分的函数。",[10,5626,165],{},[14,5628,168],{"id":168},[10,5630,5631],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,5633,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":5635},[5636,5637,5638,5639,5640,5643,5644,5645],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":5641},[5642],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5461,"description":5466},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[186,5653,5654],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5657,"title":5658,"body":5659,"category":186,"cover":187,"description":5663,"extension":188,"meta":5860,"navigation":190,"path":5861,"pinned":192,"publishedAt":193,"seo":5862,"slug":5863,"stem":5864,"summary":5865,"tags":5866,"updatedAt":193,"visible":190,"__hash__":5869},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5660,"toc":5848},[5661,5664,5666,5669,5671,5677,5680,5682,5699,5701,5703,5766,5768,5774,5776,5778,5805,5807,5810,5816,5819,5821,5829,5831,5839,5841,5843,5846],[10,5662,5663],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5665,16],{"id":16},[10,5667,5668],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5670,22],{"id":22},[10,5672,5673],{},[26,5674],{"alt":5675,"src":5676},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5678,5679],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5681,40],{"id":40},[42,5683,5684,5687,5690],{},[45,5685,5686],{},"函数内部赋值默认创建局部变量。",[45,5688,5689],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[45,5691,5692,2101,5695,5698],{},[34,5693,5694],{},"global",[34,5696,5697],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5700,60],{"id":60},[10,5702,1394],{},[65,5704,5706],{"className":371,"code":5705,"language":373,"meta":70,"style":70},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5707,5708,5713,5717,5722,5727,5731,5736,5741,5746,5750,5755,5760],{"__ignoreMap":70},[74,5709,5710],{"class":76,"line":77},[74,5711,5712],{},"course = \"Python\"\n",[74,5714,5715],{"class":76,"line":87},[74,5716,1051],{"emptyLinePlaceholder":190},[74,5718,5719],{"class":76,"line":388},[74,5720,5721],{},"def outer():\n",[74,5723,5724],{"class":76,"line":394},[74,5725,5726],{},"    level = \"基础\"\n",[74,5728,5729],{"class":76,"line":1098},[74,5730,1051],{"emptyLinePlaceholder":190},[74,5732,5733],{"class":76,"line":1104},[74,5734,5735],{},"    def show():\n",[74,5737,5738],{"class":76,"line":2414},[74,5739,5740],{},"        lesson = \"作用域\"\n",[74,5742,5743],{"class":76,"line":2420},[74,5744,5745],{},"        print(course, level, lesson)\n",[74,5747,5748],{"class":76,"line":3880},[74,5749,1051],{"emptyLinePlaceholder":190},[74,5751,5752],{"class":76,"line":4092},[74,5753,5754],{},"    show()\n",[74,5756,5758],{"class":76,"line":5757},11,[74,5759,1051],{"emptyLinePlaceholder":190},[74,5761,5763],{"class":76,"line":5762},12,[74,5764,5765],{},"outer()\n",[10,5767,101],{},[65,5769,5772],{"className":5770,"code":5771,"language":107,"meta":70},[105],"Python 基础 作用域\n",[34,5773,5771],{"__ignoreMap":70},[10,5775,112],{},[14,5777,115],{"id":115},[117,5779,5780,5797],{},[45,5781,5782,5785,5786,5789,5790,5792,5793,5796],{},[34,5783,5784],{},"show()"," 中查找 ",[34,5787,5788],{},"lesson"," 时先在局部找到，查找 ",[34,5791,5577],{}," 时到外层 ",[34,5794,5795],{},"outer()"," 找到。",[45,5798,5799,5801,5802,5804],{},[34,5800,4512],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5803,2133],{}," 最后在内置作用域找到。",[290,5806,2624],{"id":2624},[10,5808,5809],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5811,5812],{},[26,5813],{"alt":5814,"src":5815},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5817,5818],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5820,133],{"id":133},[42,5822,5823,5826],{},[45,5824,5825],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[45,5827,5828],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5830,150],{"id":150},[117,5832,5833,5836],{},[45,5834,5835],{},"在内外层定义同名变量，观察最近作用域优先。",[45,5837,5838],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5840,165],{},[14,5842,168],{"id":168},[10,5844,5845],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,5847,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":5849},[5850,5851,5852,5853,5854,5857,5858,5859],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":5855},[5856],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5658,"description":5663},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[186,5867,5868],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5871,"title":5872,"body":5873,"category":186,"cover":187,"description":5877,"extension":188,"meta":6027,"navigation":190,"path":6028,"pinned":192,"publishedAt":193,"seo":6029,"slug":6030,"stem":6031,"summary":6032,"tags":6033,"updatedAt":193,"visible":190,"__hash__":6036},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5874,"toc":6017},[5875,5878,5880,5883,5885,5891,5894,5896,5915,5917,5919,5953,5955,5961,5963,5965,5980,5982,5994,5996,6008,6010,6012,6015],[10,5876,5877],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5879,16],{"id":16},[10,5881,5882],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5884,22],{"id":22},[10,5886,5887],{},[26,5888],{"alt":5889,"src":5890},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5892,5893],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5895,40],{"id":40},[42,5897,5898,5901,5904],{},[45,5899,5900],{},"文档字符串紧跟在函数定义后的第一条语句。",[45,5902,5903],{},"注解表达接口意图，不代替输入校验和测试。",[45,5905,5906,5907,2182,5909,2182,5911,5914],{},"基础注解优先使用 ",[34,5908,2185],{},[34,5910,2351],{},[34,5912,5913],{},"list[str]"," 等直接写法。",[14,5916,60],{"id":60},[10,5918,1394],{},[65,5920,5922],{"className":371,"code":5921,"language":373,"meta":70,"style":70},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5923,5924,5929,5934,5939,5943,5948],{"__ignoreMap":70},[74,5925,5926],{"class":76,"line":77},[74,5927,5928],{},"def format_score(name: str, score: int) -> str:\n",[74,5930,5931],{"class":76,"line":87},[74,5932,5933],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[74,5935,5936],{"class":76,"line":388},[74,5937,5938],{},"    return name + \"：\" + str(score)\n",[74,5940,5941],{"class":76,"line":394},[74,5942,1051],{"emptyLinePlaceholder":190},[74,5944,5945],{"class":76,"line":1098},[74,5946,5947],{},"print(format_score(\"小郑\", 95))\n",[74,5949,5950],{"class":76,"line":1104},[74,5951,5952],{},"print(format_score.__doc__)\n",[10,5954,101],{},[65,5956,5959],{"className":5957,"code":5958,"language":107,"meta":70},[105],"小郑：95\n返回带姓名的分数文本。\n",[34,5960,5958],{"__ignoreMap":70},[10,5962,112],{},[14,5964,115],{"id":115},[117,5966,5967,5977],{},[45,5968,5969,5970,5973,5974,5976],{},"函数签名说明 ",[34,5971,5972],{},"name"," 预期为字符串、",[34,5975,2171],{}," 预期为整数，返回值预期为字符串。",[45,5978,5979],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5981,133],{"id":133},[42,5983,5984,5991],{},[45,5985,5986,5987,5990],{},"认为加了 ",[34,5988,5989],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[45,5992,5993],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,5995,150],{"id":150},[117,5997,5998,6001],{},[45,5999,6000],{},"为面积函数补充参数和返回值注解。",[45,6002,6003,6004,6007],{},"通过 ",[34,6005,6006],{},"函数名.__doc__"," 查看文档字符串。",[10,6009,165],{},[14,6011,168],{"id":168},[10,6013,6014],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,6016,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":6018},[6019,6020,6021,6022,6023,6024,6025,6026],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5872,"description":5877},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[186,6034,6035],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6038,"title":6039,"body":6040,"category":186,"cover":187,"description":6044,"extension":188,"meta":6271,"navigation":190,"path":6272,"pinned":192,"publishedAt":193,"seo":6273,"slug":6274,"stem":6275,"summary":6276,"tags":6277,"updatedAt":193,"visible":190,"__hash__":6280},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6041,"toc":6259},[6042,6045,6047,6053,6055,6061,6072,6074,6092,6094,6101,6130,6137,6156,6165,6167,6173,6175,6177,6200,6202,6205,6211,6217,6219,6235,6237,6250,6252,6254,6257],[10,6043,6044],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6046,16],{"id":16},[10,6048,6049,6050,6052],{},"本篇只处理“模块、import 与 ",[256,6051,5972],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6054,22],{"id":22},[10,6056,6057],{},[26,6058],{"alt":6059,"src":6060},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6062,6063,6064,6067,6068,6071],{},"同一个文件直接运行时 ",[34,6065,6066],{},"__name__"," 等于 ",[34,6069,6070],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6073,40],{"id":40},[42,6075,6076,6082,6085],{},[45,6077,6078,6079,6081],{},"一个 ",[34,6080,1127],{}," 文件就是一个模块。",[45,6083,6084],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[45,6086,6087,6088,6091],{},"避免使用 ",[34,6089,6090],{},"from module import *","，它会让名字来源不清楚。",[14,6093,60],{"id":60},[10,6095,6096,6097,6100],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6098,6099],{},"calculator.py","：",[65,6102,6104],{"className":371,"code":6103,"language":373,"meta":70,"style":70},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6105,6106,6111,6116,6120,6125],{"__ignoreMap":70},[74,6107,6108],{"class":76,"line":77},[74,6109,6110],{},"def add(left, right):\n",[74,6112,6113],{"class":76,"line":87},[74,6114,6115],{},"    return left + right\n",[74,6117,6118],{"class":76,"line":388},[74,6119,1051],{"emptyLinePlaceholder":190},[74,6121,6122],{"class":76,"line":394},[74,6123,6124],{},"if __name__ == \"__main__\":\n",[74,6126,6127],{"class":76,"line":1098},[74,6128,6129],{},"    print(add(2, 3))\n",[10,6131,6132,6133,6136],{},"再创建 ",[34,6134,6135],{},"app.py","，从模块中导入函数：",[65,6138,6140],{"className":371,"code":6139,"language":373,"meta":70,"style":70},"from calculator import add\n\nprint(add(10, 20))\n",[34,6141,6142,6147,6151],{"__ignoreMap":70},[74,6143,6144],{"class":76,"line":77},[74,6145,6146],{},"from calculator import add\n",[74,6148,6149],{"class":76,"line":87},[74,6150,1051],{"emptyLinePlaceholder":190},[74,6152,6153],{"class":76,"line":388},[74,6154,6155],{},"print(add(10, 20))\n",[10,6157,6158,6159,1113,6162,324],{},"分别执行 ",[34,6160,6161],{},"python3 calculator.py",[34,6163,6164],{},"python3 app.py",[10,6166,101],{},[65,6168,6171],{"className":6169,"code":6170,"language":107,"meta":70},[105],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6172,6170],{"__ignoreMap":70},[10,6174,112],{},[14,6176,115],{"id":115},[117,6178,6179,6189],{},[45,6180,6181,6182,6184,6185,6188],{},"直接运行 ",[34,6183,6099],{}," 时，模块名是 ",[34,6186,6187],{},"__main__","，入口代码输出 5。",[45,6190,6191,6193,6194,6196,6197,6199],{},[34,6192,6135],{}," 导入模块时，",[34,6195,6099],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6198,6135],{}," 调用函数输出 30。",[290,6201,2624],{"id":2624},[10,6203,6204],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6206,6207],{},[26,6208],{"alt":6209,"src":6210},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6212,6213,6214,6216],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6215,6187],{}," 保护下的演示代码。",[14,6218,133],{"id":133},[42,6220,6221,6228],{},[45,6222,6223,6224,1113,6226,324],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6225,6099],{},[34,6227,6135],{},[45,6229,6230,6231,6234],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6232,6233],{},"json.py","，导致导入目标被遮蔽。",[14,6236,150],{"id":150},[117,6238,6239,6245],{},[45,6240,2279,6241,6244],{},[34,6242,6243],{},"text_tools.py"," 并导出一个格式化函数。",[45,6246,6247,6248,324],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6249,6066],{},[10,6251,165],{},[14,6253,168],{"id":168},[10,6255,6256],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,6258,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":6260},[6261,6262,6263,6264,6265,6268,6269,6270],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":6266},[6267],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6039,"description":6044},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[186,6278,6279],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6282,"title":6283,"body":6284,"category":186,"cover":187,"description":6288,"extension":188,"meta":6453,"navigation":190,"path":6454,"pinned":192,"publishedAt":193,"seo":6455,"slug":6456,"stem":6457,"summary":6458,"tags":6459,"updatedAt":193,"visible":190,"__hash__":6461},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6285,"toc":6443},[6286,6289,6291,6294,6296,6302,6305,6307,6321,6323,6325,6371,6373,6379,6381,6383,6409,6411,6421,6423,6434,6436,6438,6441],[10,6287,6288],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6290,16],{"id":16},[10,6292,6293],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6295,22],{"id":22},[10,6297,6298],{},[26,6299],{"alt":6300,"src":6301},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6303,6304],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6306,40],{"id":40},[42,6308,6309,6315,6318],{},[45,6310,6311,6314],{},[34,6312,6313],{},".venv"," 是常见目录名，不应提交到 Git。",[45,6316,6317],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[45,6319,6320],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6322,60],{"id":60},[10,6324,63],{},[65,6326,6328],{"className":67,"code":6327,"language":69,"meta":70,"style":70},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6329,6330,6342,6350,6356,6366],{"__ignoreMap":70},[74,6331,6332,6334,6336,6339],{"class":76,"line":77},[74,6333,36],{"class":80},[74,6335,92],{"class":83},[74,6337,6338],{"class":95}," venv",[74,6340,6341],{"class":95}," .venv\n",[74,6343,6344,6347],{"class":76,"line":87},[74,6345,6346],{"class":83},"source",[74,6348,6349],{"class":95}," .venv\u002Fbin\u002Factivate\n",[74,6351,6352,6354],{"class":76,"line":388},[74,6353,373],{"class":80},[74,6355,84],{"class":83},[74,6357,6358,6360,6362,6364],{"class":76,"line":394},[74,6359,373],{"class":80},[74,6361,92],{"class":83},[74,6363,96],{"class":95},[74,6365,84],{"class":83},[74,6367,6368],{"class":76,"line":1098},[74,6369,6370],{"class":80},"deactivate\n",[10,6372,101],{},[65,6374,6377],{"className":6375,"code":6376,"language":107,"meta":70},[105],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6378,6376],{"__ignoreMap":70},[10,6380,112],{},[14,6382,115],{"id":115},[117,6384,6385,6394],{},[45,6386,6387,6390,6391,6393],{},[34,6388,6389],{},"venv"," 根据当前 ",[34,6392,36],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[45,6395,6396,6397,2101,6399,6402,6403,3655,6405,6408],{},"激活后 ",[34,6398,373],{},[34,6400,6401],{},"python -m pip"," 优先指向 ",[34,6404,6313],{},[34,6406,6407],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6410,133],{"id":133},[42,6412,6413,6416],{},[45,6414,6415],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[45,6417,3394,6418,6420],{},[34,6419,6313],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6422,150],{"id":150},[117,6424,6425,6431],{},[45,6426,6427,6428,324],{},"创建虚拟环境并记录激活前后的 ",[34,6429,6430],{},"which python",[45,6432,6433],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6435,165],{},[14,6437,168],{"id":168},[10,6439,6440],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,6442,175],{},{"title":70,"searchDepth":87,"depth":87,"links":6444},[6445,6446,6447,6448,6449,6450,6451,6452],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6283,"description":6288},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[186,6460,222],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6463,"title":6464,"body":6465,"category":186,"cover":187,"description":6469,"extension":188,"meta":6657,"navigation":190,"path":6658,"pinned":192,"publishedAt":193,"seo":6659,"slug":6660,"stem":6661,"summary":6662,"tags":6663,"updatedAt":193,"visible":190,"__hash__":6666},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6466,"toc":6647},[6467,6470,6472,6475,6477,6483,6492,6494,6518,6520,6522,6575,6577,6583,6585,6587,6603,6605,6624,6626,6638,6640,6642,6645],[10,6468,6469],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6471,16],{"id":16},[10,6473,6474],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6476,22],{"id":22},[10,6478,6479],{},[26,6480],{"alt":6481,"src":6482},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6484,6485,6488,6489,6491],{},[34,6486,6487],{},"Path"," 使用 ",[34,6490,2361],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6493,40],{"id":40},[42,6495,6496,6499,6511],{},[45,6497,6498],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[45,6500,6501,2182,6504,2182,6507,6510],{},[34,6502,6503],{},"exists()",[34,6505,6506],{},"is_file()",[34,6508,6509],{},"is_dir()"," 检查真实文件系统状态。",[45,6512,6513,6514,6517],{},"创建目录前明确目标；",[34,6515,6516],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6519,60],{"id":60},[10,6521,1394],{},[65,6523,6525],{"className":371,"code":6524,"language":373,"meta":70,"style":70},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,6526,6527,6532,6536,6541,6546,6551,6555,6560,6565,6570],{"__ignoreMap":70},[74,6528,6529],{"class":76,"line":77},[74,6530,6531],{},"from pathlib import Path\n",[74,6533,6534],{"class":76,"line":87},[74,6535,1051],{"emptyLinePlaceholder":190},[74,6537,6538],{"class":76,"line":388},[74,6539,6540],{},"project = Path.cwd()\n",[74,6542,6543],{"class":76,"line":394},[74,6544,6545],{},"data_dir = project \u002F \"data\"\n",[74,6547,6548],{"class":76,"line":1098},[74,6549,6550],{},"file_path = data_dir \u002F \"records.json\"\n",[74,6552,6553],{"class":76,"line":1104},[74,6554,1051],{"emptyLinePlaceholder":190},[74,6556,6557],{"class":76,"line":2414},[74,6558,6559],{},"print(project)\n",[74,6561,6562],{"class":76,"line":2420},[74,6563,6564],{},"print(file_path.name)\n",[74,6566,6567],{"class":76,"line":3880},[74,6568,6569],{},"print(file_path.suffix)\n",[74,6571,6572],{"class":76,"line":4092},[74,6573,6574],{},"print(file_path.exists())\n",[10,6576,101],{},[65,6578,6581],{"className":6579,"code":6580,"language":107,"meta":70},[105],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6582,6580],{"__ignoreMap":70},[10,6584,112],{},[14,6586,115],{"id":115},[117,6588,6589,6595],{},[45,6590,6591,6594],{},[34,6592,6593],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[45,6596,2264,6597,6599,6600,6602],{},[34,6598,2361],{}," 组合路径片段只创建新的 ",[34,6601,6487],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6604,133],{"id":133},[42,6606,6607,6615],{},[45,6608,3394,6609,6611,6612,6614],{},[34,6610,6487],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6613,6503],{}," 等方法确认。",[45,6616,6617,6618,963,6620,6623],{},"手工拼接 ",[34,6619,2361],{},[34,6621,6622],{},"\\"," 分隔符，降低跨平台可读性。",[14,6625,150],{"id":150},[117,6627,6628,6635],{},[45,6629,6630,6631,6634],{},"组合 ",[34,6632,6633],{},"output\u002Freport.txt"," 路径但先不创建文件。",[45,6636,6637],{},"输出路径的父目录、文件名和扩展名。",[10,6639,165],{},[14,6641,168],{"id":168},[10,6643,6644],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,6646,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":6648},[6649,6650,6651,6652,6653,6654,6655,6656],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6464,"description":6469},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[186,6664,6665],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6668,"title":6669,"body":6670,"category":186,"cover":187,"description":6674,"extension":188,"meta":6852,"navigation":190,"path":6853,"pinned":192,"publishedAt":193,"seo":6854,"slug":6855,"stem":6856,"summary":6857,"tags":6858,"updatedAt":193,"visible":190,"__hash__":6861},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6671,"toc":6842},[6672,6675,6677,6680,6682,6688,6691,6693,6721,6723,6725,6782,6784,6790,6792,6794,6805,6807,6820,6822,6833,6835,6837,6840],[10,6673,6674],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6676,16],{"id":16},[10,6678,6679],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6681,22],{"id":22},[10,6683,6684],{},[26,6685],{"alt":6686,"src":6687},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6689,6690],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6692,40],{"id":40},[42,6694,6695,6701,6710],{},[45,6696,6697,6700],{},[34,6698,6699],{},"w"," 模式会截断原文件，写入前必须确认目标。",[45,6702,6703,6706,6707,324],{},[34,6704,6705],{},"r"," 模式读取不存在文件会产生 ",[34,6708,6709],{},"FileNotFoundError",[45,6711,6712,6713,6716,6717,6720],{},"本篇显式调用 ",[34,6714,6715],{},"close()","；第 34 篇会用 ",[34,6718,6719],{},"with"," 更可靠地管理关闭动作。",[14,6722,60],{"id":60},[10,6724,1394],{},[65,6726,6728],{"className":371,"code":6727,"language":373,"meta":70,"style":70},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,6729,6730,6734,6738,6743,6748,6753,6758,6762,6767,6772,6777],{"__ignoreMap":70},[74,6731,6732],{"class":76,"line":77},[74,6733,6531],{},[74,6735,6736],{"class":76,"line":87},[74,6737,1051],{"emptyLinePlaceholder":190},[74,6739,6740],{"class":76,"line":388},[74,6741,6742],{},"file_path = Path(\"notes.txt\")\n",[74,6744,6745],{"class":76,"line":394},[74,6746,6747],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[74,6749,6750],{"class":76,"line":1098},[74,6751,6752],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[74,6754,6755],{"class":76,"line":1104},[74,6756,6757],{},"writer.close()\n",[74,6759,6760],{"class":76,"line":2414},[74,6761,1051],{"emptyLinePlaceholder":190},[74,6763,6764],{"class":76,"line":2420},[74,6765,6766],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[74,6768,6769],{"class":76,"line":3880},[74,6770,6771],{},"content = reader.read()\n",[74,6773,6774],{"class":76,"line":4092},[74,6775,6776],{},"reader.close()\n",[74,6778,6779],{"class":76,"line":5757},[74,6780,6781],{},"print(content)\n",[10,6783,101],{},[65,6785,6788],{"className":6786,"code":6787,"language":107,"meta":70},[105],"变量\n循环\n函数\n",[34,6789,6787],{"__ignoreMap":70},[10,6791,112],{},[14,6793,115],{"id":115},[117,6795,6796,6802],{},[45,6797,6798,6799,6801],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6800,6715],{}," 确保缓冲内容交给文件系统。",[45,6803,6804],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6806,133],{"id":133},[42,6808,6809,6814],{},[45,6810,2264,6811,6813],{},[34,6812,6699],{}," 模式打开重要文件却未确认覆盖风险。",[45,6815,6816,6817,324],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6818,6819],{},"encoding=\"utf-8\"",[14,6821,150],{"id":150},[117,6823,6824,6827],{},[45,6825,6826],{},"写入三行学习记录并读取。",[45,6828,6829,6830,6832],{},"改用 ",[34,6831,298],{}," 模式追加一行，确认原内容仍保留。",[10,6834,165],{},[14,6836,168],{"id":168},[10,6838,6839],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,6841,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":6843},[6844,6845,6846,6847,6848,6849,6850,6851],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6669,"description":6674},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[186,6859,6860],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6863,"title":6864,"body":6865,"category":186,"cover":187,"description":6869,"extension":188,"meta":7036,"navigation":190,"path":7037,"pinned":192,"publishedAt":193,"seo":7038,"slug":7039,"stem":7040,"summary":7041,"tags":7042,"updatedAt":193,"visible":190,"__hash__":7045},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6866,"toc":7026},[6867,6870,6872,6875,6877,6883,6893,6895,6909,6911,6913,6973,6975,6981,6983,6985,6997,6999,7007,7009,7017,7019,7021,7024],[10,6868,6869],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6871,16],{"id":16},[10,6873,6874],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6876,22],{"id":22},[10,6878,6879],{},[26,6880],{"alt":6881,"src":6882},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6884,6885,6888,6889,6892],{},[34,6886,6887],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6890,6891],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6894,40],{"id":40},[42,6896,6897,6900,6906],{},[45,6898,6899],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[45,6901,6902,6905],{},[34,6903,6904],{},"ensure_ascii=False"," 让中文以可读字符写入。",[45,6907,6908],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6910,60],{"id":60},[10,6912,1394],{},[65,6914,6916],{"className":371,"code":6915,"language":373,"meta":70,"style":70},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,6917,6918,6923,6927,6932,6936,6941,6946,6950,6954,6959,6964,6968],{"__ignoreMap":70},[74,6919,6920],{"class":76,"line":77},[74,6921,6922],{},"import json\n",[74,6924,6925],{"class":76,"line":87},[74,6926,1051],{"emptyLinePlaceholder":190},[74,6928,6929],{"class":76,"line":388},[74,6930,6931],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[74,6933,6934],{"class":76,"line":394},[74,6935,1051],{"emptyLinePlaceholder":190},[74,6937,6938],{"class":76,"line":1098},[74,6939,6940],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[74,6942,6943],{"class":76,"line":1104},[74,6944,6945],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[74,6947,6948],{"class":76,"line":2414},[74,6949,6757],{},[74,6951,6952],{"class":76,"line":2420},[74,6953,1051],{"emptyLinePlaceholder":190},[74,6955,6956],{"class":76,"line":3880},[74,6957,6958],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[74,6960,6961],{"class":76,"line":4092},[74,6962,6963],{},"loaded = json.load(reader)\n",[74,6965,6966],{"class":76,"line":5757},[74,6967,6776],{},[74,6969,6970],{"class":76,"line":5762},[74,6971,6972],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6974,101],{},[65,6976,6979],{"className":6977,"code":6978,"language":107,"meta":70},[105],"Python 60\n",[34,6980,6978],{"__ignoreMap":70},[10,6982,112],{},[14,6984,115],{"id":115},[117,6986,6987,6992],{},[45,6988,6989,6991],{},[34,6990,6887],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[45,6993,6994,6996],{},[34,6995,6891],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,6998,133],{"id":133},[42,7000,7001,7004],{},[45,7002,7003],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[45,7005,7006],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7008,150],{"id":150},[117,7010,7011,7014],{},[45,7012,7013],{},"保存包含两条学习记录的列表。",[45,7015,7016],{},"读取后修改进度，再重新写回文件。",[10,7018,165],{},[14,7020,168],{"id":168},[10,7022,7023],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,7025,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":7027},[7028,7029,7030,7031,7032,7033,7034,7035],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6864,"description":6869},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[186,7043,7044],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7047,"title":7048,"body":7049,"category":186,"cover":187,"description":7053,"extension":188,"meta":7237,"navigation":190,"path":7238,"pinned":192,"publishedAt":193,"seo":7239,"slug":7240,"stem":7241,"summary":7242,"tags":7243,"updatedAt":193,"visible":190,"__hash__":7246},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7050,"toc":7227},[7051,7054,7056,7059,7061,7067,7073,7075,7097,7099,7101,7164,7166,7172,7174,7176,7192,7194,7208,7210,7218,7220,7222,7225],[10,7052,7053],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7055,16],{"id":16},[10,7057,7058],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7060,22],{"id":22},[10,7062,7063],{},[26,7064],{"alt":7065,"src":7066},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7068,7069,7072],{},[34,7070,7071],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7074,40],{"id":40},[42,7076,7077,7087,7094],{},[45,7078,2264,7079,7082,7083,7086],{},[34,7080,7081],{},"newline=\"\""," 让 ",[34,7084,7085],{},"csv"," 模块正确处理换行。",[45,7088,7089,7090,7093],{},"字段顺序由 ",[34,7091,7092],{},"fieldnames"," 决定，字典键需要与字段名一致。",[45,7095,7096],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7098,60],{"id":60},[10,7100,1394],{},[65,7102,7104],{"className":371,"code":7103,"language":373,"meta":70,"style":70},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,7105,7106,7111,7115,7120,7125,7130,7135,7140,7144,7149,7154,7159],{"__ignoreMap":70},[74,7107,7108],{"class":76,"line":77},[74,7109,7110],{},"import csv\n",[74,7112,7113],{"class":76,"line":87},[74,7114,1051],{"emptyLinePlaceholder":190},[74,7116,7117],{"class":76,"line":388},[74,7118,7119],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[74,7121,7122],{"class":76,"line":394},[74,7123,7124],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[74,7126,7127],{"class":76,"line":1098},[74,7128,7129],{},"writer.writeheader()\n",[74,7131,7132],{"class":76,"line":1104},[74,7133,7134],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[74,7136,7137],{"class":76,"line":2414},[74,7138,7139],{},"writer_file.close()\n",[74,7141,7142],{"class":76,"line":2420},[74,7143,1051],{"emptyLinePlaceholder":190},[74,7145,7146],{"class":76,"line":3880},[74,7147,7148],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[74,7150,7151],{"class":76,"line":4092},[74,7152,7153],{},"for row in csv.DictReader(reader_file):\n",[74,7155,7156],{"class":76,"line":5757},[74,7157,7158],{},"    print(row[\"name\"], row[\"score\"])\n",[74,7160,7161],{"class":76,"line":5762},[74,7162,7163],{},"reader_file.close()\n",[10,7165,101],{},[65,7167,7170],{"className":7168,"code":7169,"language":107,"meta":70},[105],"小郑 95\n",[34,7171,7169],{"__ignoreMap":70},[10,7173,112],{},[14,7175,115],{"id":115},[117,7177,7178,7187],{},[45,7179,7180,7183,7184,7186],{},[34,7181,7182],{},"DictWriter"," 按 ",[34,7185,7092],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[45,7188,7189,7191],{},[34,7190,7071],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7193,133],{"id":133},[42,7195,7196,7199],{},[45,7197,7198],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[45,7200,7201,7202,7204,7205,7207],{},"在 macOS 以外环境忽略 ",[34,7203,7081],{}," 可能出现额外空行；统一交给 ",[34,7206,7085],{}," 模块管理换行。",[14,7209,150],{"id":150},[117,7211,7212,7215],{},[45,7213,7214],{},"写入三名学习者的课程和分数。",[45,7216,7217],{},"读取 CSV 后把分数字符串转换为整数。",[10,7219,165],{},[14,7221,168],{"id":168},[10,7223,7224],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,7226,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":7228},[7229,7230,7231,7232,7233,7234,7235,7236],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7048,"description":7053},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[186,7244,7245],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7248,"title":7249,"body":7250,"category":186,"cover":187,"description":7254,"extension":188,"meta":7527,"navigation":190,"path":7528,"pinned":192,"publishedAt":193,"seo":7529,"slug":7530,"stem":7531,"summary":7532,"tags":7533,"updatedAt":193,"visible":190,"__hash__":7536},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7251,"toc":7514},[7252,7255,7257,7260,7262,7268,7279,7281,7298,7300,7302,7377,7379,7385,7387,7389,7414,7416,7425,7431,7442,7444,7450,7456,7465,7467,7482,7484,7505,7507,7509,7512],[10,7253,7254],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7256,16],{"id":16},[10,7258,7259],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7261,22],{"id":22},[10,7263,7264],{},[26,7265],{"alt":7266,"src":7267},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7269,7270,7271,7274,7275,7278],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7272,7273],{},"except","；无论是否异常，",[34,7276,7277],{},"finally"," 都会在离开结构前执行。",[14,7280,40],{"id":40},[42,7282,7283,7289,7295],{},[45,7284,7285,7286,7288],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7287,7273],{}," 吞掉全部错误。",[45,7290,7291,7294],{},[34,7292,7293],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[45,7296,7297],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7299,60],{"id":60},[10,7301,1394],{},[65,7303,7305],{"className":371,"code":7304,"language":373,"meta":70,"style":70},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,7306,7307,7312,7317,7322,7327,7332,7336,7341,7346,7351,7356,7360,7365,7371],{"__ignoreMap":70},[74,7308,7309],{"class":76,"line":77},[74,7310,7311],{},"def parse_age(text):\n",[74,7313,7314],{"class":76,"line":87},[74,7315,7316],{},"    age = int(text)\n",[74,7318,7319],{"class":76,"line":388},[74,7320,7321],{},"    if age \u003C 0:\n",[74,7323,7324],{"class":76,"line":394},[74,7325,7326],{},"        raise ValueError(\"年龄不能为负数\")\n",[74,7328,7329],{"class":76,"line":1098},[74,7330,7331],{},"    return age\n",[74,7333,7334],{"class":76,"line":1104},[74,7335,1051],{"emptyLinePlaceholder":190},[74,7337,7338],{"class":76,"line":2414},[74,7339,7340],{},"try:\n",[74,7342,7343],{"class":76,"line":2420},[74,7344,7345],{},"    age = parse_age(\"18\")\n",[74,7347,7348],{"class":76,"line":3880},[74,7349,7350],{},"except ValueError as error:\n",[74,7352,7353],{"class":76,"line":4092},[74,7354,7355],{},"    print(\"输入错误：\", error)\n",[74,7357,7358],{"class":76,"line":5757},[74,7359,1101],{},[74,7361,7362],{"class":76,"line":5762},[74,7363,7364],{},"    print(\"年龄：\", age)\n",[74,7366,7368],{"class":76,"line":7367},13,[74,7369,7370],{},"finally:\n",[74,7372,7374],{"class":76,"line":7373},14,[74,7375,7376],{},"    print(\"处理结束\")\n",[10,7378,101],{},[65,7380,7383],{"className":7381,"code":7382,"language":107,"meta":70},[105],"年龄： 18\n处理结束\n",[34,7384,7382],{"__ignoreMap":70},[10,7386,112],{},[14,7388,115],{"id":115},[117,7390,7391,7403],{},[45,7392,7393,7395,7396,7398,7399,7402],{},[34,7394,2963],{}," 或主动 ",[34,7397,7293],{}," 都可能产生 ",[34,7400,7401],{},"ValueError","，控制流立即离开当前正常路径。",[45,7404,7405,7406,7408,7409,7411,7412,324],{},"有异常时进入匹配的 ",[34,7407,7273],{},"；没有异常时执行 ",[34,7410,1116],{},"；两种情况最后都会执行 ",[34,7413,7277],{},[290,7415,2624],{"id":2624},[10,7417,7418,2182,7420,1113,7422,7424],{},[34,7419,7273],{},[34,7421,1116],{},[34,7423,7277],{}," 的职责不同，不能只看它们出现的顺序。",[10,7426,7427],{},[26,7428],{"alt":7429,"src":7430},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7432,7433,7435,7436,7438,7439,7441],{},[34,7434,7273],{}," 处理匹配异常，",[34,7437,1116],{}," 只在无异常时运行，",[34,7440,7277],{}," 负责两条路径都需要的清理动作。",[290,7443,2624],{"id":4147},[10,7445,7446,7449],{},[34,7447,7448],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7451,7452],{},[26,7453],{"alt":7454,"src":7455},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7457,7458,7459,7461,7462,7464],{},"只把可能产生预期异常的操作放进 ",[34,7460,7448],{},"，后续正常业务放进 ",[34,7463,1116],{},"，错误边界会更清楚。",[14,7466,133],{"id":133},[42,7468,7469,7476],{},[45,7470,7471,7472,7475],{},"使用裸 ",[34,7473,7474],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[45,7477,7478,7479,7481],{},"把整个程序包在一个巨大 ",[34,7480,7448],{}," 中，无法判断究竟哪一步允许失败。",[14,7483,150],{"id":150},[117,7485,7486,7499],{},[45,7487,7488,7489,7492,7493,1113,7496,324],{},"让 ",[34,7490,7491],{},"parse_age"," 分别处理 ",[34,7494,7495],{},"\"abc\"",[34,7497,7498],{},"\"-1\"",[45,7500,7501,7502,7504],{},"为文件读取捕获 ",[34,7503,6709],{}," 并给出清晰提示。",[10,7506,165],{},[14,7508,168],{"id":168},[10,7510,7511],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,7513,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":7515},[7516,7517,7518,7519,7520,7524,7525,7526],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":7521},[7522,7523],{"id":2624,"depth":388,"text":2624},{"id":4147,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7249,"description":7254},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[186,7534,7535],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7538,"title":7539,"body":7540,"category":186,"cover":187,"description":7544,"extension":188,"meta":7720,"navigation":190,"path":7721,"pinned":192,"publishedAt":193,"seo":7722,"slug":7723,"stem":7724,"summary":7725,"tags":7726,"updatedAt":193,"visible":190,"__hash__":7728},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7541,"toc":7710},[7542,7545,7547,7550,7552,7558,7564,7566,7582,7584,7586,7640,7642,7648,7650,7652,7665,7667,7680,7682,7701,7703,7705,7708],[10,7543,7544],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7546,16],{"id":16},[10,7548,7549],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7551,22],{"id":22},[10,7553,7554],{},[26,7555],{"alt":7556,"src":7557},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7559,7560,7561,7563],{},"进入 ",[34,7562,6719],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7565,40],{"id":40},[42,7567,7568,7573,7579],{},[45,7569,7570,7572],{},[34,7571,6719],{}," 把资源获取和释放配成一个清晰边界。",[45,7574,7575,7578],{},[34,7576,7577],{},"as file"," 得到的是上下文返回的资源对象。",[45,7580,7581],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7583,60],{"id":60},[10,7585,1394],{},[65,7587,7589],{"className":371,"code":7588,"language":373,"meta":70,"style":70},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[34,7590,7591,7595,7599,7603,7607,7612,7617,7621,7626,7631,7635],{"__ignoreMap":70},[74,7592,7593],{"class":76,"line":77},[74,7594,6531],{},[74,7596,7597],{"class":76,"line":87},[74,7598,1051],{"emptyLinePlaceholder":190},[74,7600,7601],{"class":76,"line":388},[74,7602,6742],{},[74,7604,7605],{"class":76,"line":394},[74,7606,1051],{"emptyLinePlaceholder":190},[74,7608,7609],{"class":76,"line":1098},[74,7610,7611],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,7613,7614],{"class":76,"line":1104},[74,7615,7616],{},"    file.write(\"上下文管理器\\n\")\n",[74,7618,7619],{"class":76,"line":2414},[74,7620,1051],{"emptyLinePlaceholder":190},[74,7622,7623],{"class":76,"line":2420},[74,7624,7625],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[74,7627,7628],{"class":76,"line":3880},[74,7629,7630],{},"    print(file.read())\n",[74,7632,7633],{"class":76,"line":4092},[74,7634,1051],{"emptyLinePlaceholder":190},[74,7636,7637],{"class":76,"line":5757},[74,7638,7639],{},"print(file.closed)\n",[10,7641,101],{},[65,7643,7646],{"className":7644,"code":7645,"language":107,"meta":70},[105],"上下文管理器\n\nTrue\n",[34,7647,7645],{"__ignoreMap":70},[10,7649,112],{},[14,7651,115],{"id":115},[117,7653,7654,7662],{},[45,7655,7560,7656,7658,7659,324],{},[34,7657,6719],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7660,7661],{},"file",[45,7663,7664],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7666,133],{"id":133},[42,7668,7669,7674],{},[45,7670,4715,7671,7673],{},[34,7672,6719],{}," 代码块外继续读写已经关闭的文件对象。",[45,7675,7676,7677,7679],{},"误以为 ",[34,7678,6719],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7681,150],{"id":150},[117,7683,7684,7693],{},[45,7685,7686,7687,7690,7691,324],{},"把第 30 篇的手动 ",[34,7688,7689],{},"open\u002Fclose"," 改写为 ",[34,7692,6719],{},[45,7694,4715,7695,7697,7698,324],{},[34,7696,6719],{}," 块后检查 ",[34,7699,7700],{},"file.closed",[10,7702,165],{},[14,7704,168],{"id":168},[10,7706,7707],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,7709,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":7711},[7712,7713,7714,7715,7716,7717,7718,7719],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7539,"description":7544},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[186,6719,7727],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7730,"title":7731,"body":7732,"category":186,"cover":187,"description":7736,"extension":188,"meta":7948,"navigation":190,"path":7949,"pinned":192,"publishedAt":193,"seo":7950,"slug":7951,"stem":7952,"summary":7953,"tags":7954,"updatedAt":193,"visible":190,"__hash__":7957},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7733,"toc":7936},[7734,7737,7739,7742,7744,7750,7753,7755,7772,7774,7776,7844,7846,7852,7854,7856,7881,7883,7886,7892,7901,7903,7914,7916,7927,7929,7931,7934],[10,7735,7736],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7738,16],{"id":16},[10,7740,7741],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7743,22],{"id":22},[10,7745,7746],{},[26,7747],{"alt":7748,"src":7749},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7751,7752],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7754,40],{"id":40},[42,7756,7757,7763,7769],{},[45,7758,7759,7762],{},[34,7760,7761],{},"self"," 表示当前实例，由方法调用自动传入。",[45,7764,7765,7768],{},[34,7766,7767],{},"__init__"," 在实例创建过程中初始化属性。",[45,7770,7771],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7773,60],{"id":60},[10,7775,1394],{},[65,7777,7779],{"className":371,"code":7778,"language":373,"meta":70,"style":70},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,7780,7781,7786,7791,7796,7801,7805,7810,7815,7820,7825,7829,7834,7839],{"__ignoreMap":70},[74,7782,7783],{"class":76,"line":77},[74,7784,7785],{},"class LearningRecord:\n",[74,7787,7788],{"class":76,"line":87},[74,7789,7790],{},"    def __init__(self, course, progress=0):\n",[74,7792,7793],{"class":76,"line":388},[74,7794,7795],{},"        self.course = course\n",[74,7797,7798],{"class":76,"line":394},[74,7799,7800],{},"        self.progress = progress\n",[74,7802,7803],{"class":76,"line":1098},[74,7804,1051],{"emptyLinePlaceholder":190},[74,7806,7807],{"class":76,"line":1104},[74,7808,7809],{},"    def advance(self, amount):\n",[74,7811,7812],{"class":76,"line":2414},[74,7813,7814],{},"        self.progress = self.progress + amount\n",[74,7816,7817],{"class":76,"line":2420},[74,7818,7819],{},"        if self.progress > 100:\n",[74,7821,7822],{"class":76,"line":3880},[74,7823,7824],{},"            self.progress = 100\n",[74,7826,7827],{"class":76,"line":4092},[74,7828,1051],{"emptyLinePlaceholder":190},[74,7830,7831],{"class":76,"line":5757},[74,7832,7833],{},"record = LearningRecord(\"Python\", 40)\n",[74,7835,7836],{"class":76,"line":5762},[74,7837,7838],{},"record.advance(15)\n",[74,7840,7841],{"class":76,"line":7367},[74,7842,7843],{},"print(record.course, record.progress)\n",[10,7845,101],{},[65,7847,7850],{"className":7848,"code":7849,"language":107,"meta":70},[105],"Python 55\n",[34,7851,7849],{"__ignoreMap":70},[10,7853,112],{},[14,7855,115],{"id":115},[117,7857,7858,7868],{},[45,7859,7860,7861,7864,7865,7867],{},"调用 ",[34,7862,7863],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7866,7767],{}," 把课程和进度保存在该实例属性中。",[45,7869,7870,7873,7874,7877,7878,7880],{},[34,7871,7872],{},"record.advance(15)"," 自动把 ",[34,7875,7876],{},"record"," 作为 ",[34,7879,7761],{},"，方法更新同一实例的进度并限制上限。",[290,7882,2624],{"id":2624},[10,7884,7885],{},"类是共同定义，实例则各自保存状态。",[10,7887,7888],{},[26,7889],{"alt":7890,"src":7891},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7893,7894,7895,1113,7897,7900],{},"两个实例共享同一套方法定义，但 ",[34,7896,4512],{},[34,7898,7899],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7902,133],{"id":133},[42,7904,7905,7911],{},[45,7906,7907,7908,7910],{},"调用实例方法时手工再传一次 ",[34,7909,7761],{},"。通过实例调用时 Python 会自动绑定。",[45,7912,7913],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7915,150],{"id":150},[117,7917,7918,7924],{},[45,7919,5225,7920,7923],{},[34,7921,7922],{},"Book"," 类，保存标题和阅读页数。",[45,7925,7926],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7928,165],{},[14,7930,168],{"id":168},[10,7932,7933],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,7935,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":7937},[7938,7939,7940,7941,7942,7945,7946,7947],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":7943},[7944],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7731,"description":7736},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[186,7955,7956],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7959,"title":7960,"body":7961,"category":186,"cover":187,"description":7965,"extension":188,"meta":8143,"navigation":190,"path":8144,"pinned":192,"publishedAt":193,"seo":8145,"slug":8146,"stem":8147,"summary":8148,"tags":8149,"updatedAt":193,"visible":190,"__hash__":8152},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7962,"toc":8133},[7963,7966,7968,7971,7973,7979,7982,7984,7995,7997,7999,8066,8068,8074,8076,8078,8097,8099,8107,8109,8124,8126,8128,8131],[10,7964,7965],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7967,16],{"id":16},[10,7969,7970],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7972,22],{"id":22},[10,7974,7975],{},[26,7976],{"alt":7977,"src":7978},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7980,7981],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7983,40],{"id":40},[42,7985,7986,7989,7992],{},[45,7987,7988],{},"封装让对象通过方法维护自己的有效状态。",[45,7990,7991],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[45,7993,7994],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,7996,60],{"id":60},[10,7998,1394],{},[65,8000,8002],{"className":371,"code":8001,"language":373,"meta":70,"style":70},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,8003,8004,8009,8014,8019,8023,8028,8033,8038,8042,8047,8052,8056,8061],{"__ignoreMap":70},[74,8005,8006],{"class":76,"line":77},[74,8007,8008],{},"class Storage:\n",[74,8010,8011],{"class":76,"line":87},[74,8012,8013],{},"    def save(self, text):\n",[74,8015,8016],{"class":76,"line":388},[74,8017,8018],{},"        print(\"保存：\", text)\n",[74,8020,8021],{"class":76,"line":394},[74,8022,1051],{"emptyLinePlaceholder":190},[74,8024,8025],{"class":76,"line":1098},[74,8026,8027],{},"class LearningService:\n",[74,8029,8030],{"class":76,"line":1104},[74,8031,8032],{},"    def __init__(self, storage):\n",[74,8034,8035],{"class":76,"line":2414},[74,8036,8037],{},"        self.storage = storage\n",[74,8039,8040],{"class":76,"line":2420},[74,8041,1051],{"emptyLinePlaceholder":190},[74,8043,8044],{"class":76,"line":3880},[74,8045,8046],{},"    def finish_lesson(self, title):\n",[74,8048,8049],{"class":76,"line":4092},[74,8050,8051],{},"        self.storage.save(title)\n",[74,8053,8054],{"class":76,"line":5757},[74,8055,1051],{"emptyLinePlaceholder":190},[74,8057,8058],{"class":76,"line":5762},[74,8059,8060],{},"service = LearningService(Storage())\n",[74,8062,8063],{"class":76,"line":7367},[74,8064,8065],{},"service.finish_lesson(\"异常处理\")\n",[10,8067,101],{},[65,8069,8072],{"className":8070,"code":8071,"language":107,"meta":70},[105],"保存： 异常处理\n",[34,8073,8071],{"__ignoreMap":70},[10,8075,112],{},[14,8077,115],{"id":115},[117,8079,8080,8090],{},[45,8081,8082,8085,8086,8089],{},[34,8083,8084],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8087,8088],{},"save()"," 的协作对象。",[45,8091,8092,8093,8096],{},"调用业务方法时，服务把保存动作委托给 ",[34,8094,8095],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8098,133],{"id":133},[42,8100,8101,8104],{},[45,8102,8103],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[45,8105,8106],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8108,150],{"id":150},[117,8110,8111,8121],{},[45,8112,8113,8114,8117,8118,324],{},"用组合让 ",[34,8115,8116],{},"OrderService"," 使用一个 ",[34,8119,8120],{},"Notifier",[45,8122,8123],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8125,165],{},[14,8127,168],{"id":168},[10,8129,8130],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,8132,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":8134},[8135,8136,8137,8138,8139,8140,8141,8142],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7960,"description":7965},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[186,8150,8151],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8154,"title":8155,"body":8156,"category":186,"cover":187,"description":8160,"extension":188,"meta":8363,"navigation":190,"path":8364,"pinned":192,"publishedAt":193,"seo":8365,"slug":8366,"stem":8367,"summary":8368,"tags":8369,"updatedAt":193,"visible":190,"__hash__":8372},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8157,"toc":8351},[8158,8161,8163,8166,8168,8174,8181,8183,8208,8210,8212,8264,8266,8272,8274,8276,8297,8299,8305,8311,8317,8319,8327,8329,8342,8344,8346,8349],[10,8159,8160],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8162,16],{"id":16},[10,8164,8165],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8167,22],{"id":22},[10,8169,8170],{},[26,8171],{"alt":8172,"src":8173},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8175,8176,8177,8180],{},"生成器运行到 ",[34,8178,8179],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8182,40],{"id":40},[42,8184,8185,8195,8205],{},[45,8186,8187,8190,8191,8194],{},[34,8188,8189],{},"iter()"," 从可迭代对象取得迭代器，",[34,8192,8193],{},"next()"," 请求下一个值。",[45,8196,8197,8198,8201,8202,8204],{},"没有更多值时迭代器抛出 ",[34,8199,8200],{},"StopIteration","，",[34,8203,4266],{}," 会自动处理。",[45,8206,8207],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8209,60],{"id":60},[10,8211,1394],{},[65,8213,8215],{"className":371,"code":8214,"language":373,"meta":70,"style":70},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,8216,8217,8222,8227,8232,8237,8242,8246,8251,8256,8260],{"__ignoreMap":70},[74,8218,8219],{"class":76,"line":77},[74,8220,8221],{},"def countdown(start):\n",[74,8223,8224],{"class":76,"line":87},[74,8225,8226],{},"    current = start\n",[74,8228,8229],{"class":76,"line":388},[74,8230,8231],{},"    while current > 0:\n",[74,8233,8234],{"class":76,"line":394},[74,8235,8236],{},"        yield current\n",[74,8238,8239],{"class":76,"line":1098},[74,8240,8241],{},"        current = current - 1\n",[74,8243,8244],{"class":76,"line":1104},[74,8245,1051],{"emptyLinePlaceholder":190},[74,8247,8248],{"class":76,"line":2414},[74,8249,8250],{},"iterator = countdown(3)\n",[74,8252,8253],{"class":76,"line":2420},[74,8254,8255],{},"print(next(iterator))\n",[74,8257,8258],{"class":76,"line":3880},[74,8259,8255],{},[74,8261,8262],{"class":76,"line":4092},[74,8263,8255],{},[10,8265,101],{},[65,8267,8270],{"className":8268,"code":8269,"language":107,"meta":70},[105],"3\n2\n1\n",[34,8271,8269],{"__ignoreMap":70},[10,8273,112],{},[14,8275,115],{"id":115},[117,8277,8278,8284],{},[45,8279,7860,8280,8283],{},[34,8281,8282],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[45,8285,8286,8287,8289,8290,8292,8293,8296],{},"每次 ",[34,8288,8193],{}," 运行到下一个 ",[34,8291,8179],{}," 并暂停，局部变量 ",[34,8294,8295],{},"current"," 和执行位置被保留。",[290,8298,2624],{"id":2624},[10,8300,8301,8302,8304],{},"生成器的暂停位置可以展开成多次 ",[34,8303,8193],{}," 的时间线。",[10,8306,8307],{},[26,8308],{"alt":8309,"src":8310},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8312,8313,8314,8316],{},"每次请求只推进到下一个 ",[34,8315,8179],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8318,133],{"id":133},[42,8320,8321,8324],{},[45,8322,8323],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[45,8325,8326],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8328,150],{"id":150},[117,8330,8331,8334],{},[45,8332,8333],{},"编写产生 1 到指定上限偶数的生成器。",[45,8335,3938,8336,8338,8339,8341],{},[34,8337,4266],{}," 遍历生成器，比较手动 ",[34,8340,8193],{}," 的差异。",[10,8343,165],{},[14,8345,168],{"id":168},[10,8347,8348],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,8350,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":8352},[8353,8354,8355,8356,8357,8360,8361,8362],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":8358},[8359],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8155,"description":8160},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[186,8370,8371],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8374,"title":8375,"body":8376,"category":186,"cover":187,"description":8380,"extension":188,"meta":8604,"navigation":190,"path":8605,"pinned":192,"publishedAt":193,"seo":8606,"slug":8607,"stem":8608,"summary":8609,"tags":8610,"updatedAt":193,"visible":190,"__hash__":8612},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8377,"toc":8592},[8378,8381,8383,8386,8388,8394,8397,8399,8419,8421,8423,8505,8507,8513,8515,8517,8539,8541,8544,8550,8557,8559,8569,8571,8583,8585,8587,8590],[10,8379,8380],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8382,16],{"id":16},[10,8384,8385],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8387,22],{"id":22},[10,8389,8390],{},[26,8391],{"alt":8392,"src":8393},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8395,8396],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8398,40],{"id":40},[42,8400,8401,8410,8413],{},[45,8402,8403,8406,8407,324],{},[34,8404,8405],{},"@trace"," 等价于 ",[34,8408,8409],{},"add = trace(add)",[45,8411,8412],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[45,8414,8415,8418],{},[34,8416,8417],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8420,60],{"id":60},[10,8422,1394],{},[65,8424,8426],{"className":371,"code":8425,"language":373,"meta":70,"style":70},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,8427,8428,8433,8437,8442,8447,8452,8457,8462,8467,8472,8477,8481,8486,8490,8494,8499],{"__ignoreMap":70},[74,8429,8430],{"class":76,"line":77},[74,8431,8432],{},"from functools import wraps\n",[74,8434,8435],{"class":76,"line":87},[74,8436,1051],{"emptyLinePlaceholder":190},[74,8438,8439],{"class":76,"line":388},[74,8440,8441],{},"def trace(function):\n",[74,8443,8444],{"class":76,"line":394},[74,8445,8446],{},"    @wraps(function)\n",[74,8448,8449],{"class":76,"line":1098},[74,8450,8451],{},"    def wrapper(*args, **kwargs):\n",[74,8453,8454],{"class":76,"line":1104},[74,8455,8456],{},"        print(\"开始：\", function.__name__)\n",[74,8458,8459],{"class":76,"line":2414},[74,8460,8461],{},"        result = function(*args, **kwargs)\n",[74,8463,8464],{"class":76,"line":2420},[74,8465,8466],{},"        print(\"结束：\", function.__name__)\n",[74,8468,8469],{"class":76,"line":3880},[74,8470,8471],{},"        return result\n",[74,8473,8474],{"class":76,"line":4092},[74,8475,8476],{},"    return wrapper\n",[74,8478,8479],{"class":76,"line":5757},[74,8480,1051],{"emptyLinePlaceholder":190},[74,8482,8483],{"class":76,"line":5762},[74,8484,8485],{},"@trace\n",[74,8487,8488],{"class":76,"line":7367},[74,8489,6110],{},[74,8491,8492],{"class":76,"line":7373},[74,8493,6115],{},[74,8495,8497],{"class":76,"line":8496},15,[74,8498,1051],{"emptyLinePlaceholder":190},[74,8500,8502],{"class":76,"line":8501},16,[74,8503,8504],{},"print(add(2, 3))\n",[10,8506,101],{},[65,8508,8511],{"className":8509,"code":8510,"language":107,"meta":70},[105],"开始： add\n结束： add\n5\n",[34,8512,8510],{"__ignoreMap":70},[10,8514,112],{},[14,8516,115],{"id":115},[117,8518,8519,8536],{},[45,8520,8521,8522,8525,8526,8529,8530,8533,8534,324],{},"解释器执行定义时，把原 ",[34,8523,8524],{},"add"," 函数交给 ",[34,8527,8528],{},"trace","，返回的 ",[34,8531,8532],{},"wrapper"," 重新绑定到名字 ",[34,8535,8524],{},[45,8537,8538],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[290,8540,2624],{"id":2624},[10,8542,8543],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8545,8546],{},[26,8547],{"alt":8548,"src":8549},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8551,8552,8554,8555,324],{},[34,8553,8405],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8556,8409],{},[14,8558,133],{"id":133},[42,8560,8561,8566],{},[45,8562,8563,8564,324],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8565,5308],{},[45,8567,8568],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8570,150],{"id":150},[117,8572,8573,8576],{},[45,8574,8575],{},"编写只记录调用次数的简单装饰器。",[45,8577,8578,8579,8582],{},"删除包装函数的 ",[34,8580,8581],{},"return result","，观察调用方得到什么。",[10,8584,165],{},[14,8586,168],{"id":168},[10,8588,8589],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,8591,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":8593},[8594,8595,8596,8597,8598,8601,8602,8603],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":8599},[8600],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8375,"description":8380},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[186,8611,5259],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8614,"title":8615,"body":8616,"category":186,"cover":187,"description":8620,"extension":188,"meta":8807,"navigation":190,"path":8808,"pinned":192,"publishedAt":193,"seo":8809,"slug":8810,"stem":8811,"summary":8812,"tags":8813,"updatedAt":193,"visible":190,"__hash__":8816},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8617,"toc":8795},[8618,8621,8623,8626,8628,8634,8637,8639,8650,8652,8654,8729,8731,8737,8739,8741,8752,8754,8757,8763,8766,8768,8776,8778,8786,8788,8790,8793],[10,8619,8620],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8622,16],{"id":16},[10,8624,8625],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8627,22],{"id":22},[10,8629,8630],{},[26,8631],{"alt":8632,"src":8633},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8635,8636],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8638,40],{"id":40},[42,8640,8641,8644,8647],{},[45,8642,8643],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[45,8645,8646],{},"日志记录运行状态，测试判断结果是否符合约定。",[45,8648,8649],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8651,60],{"id":60},[10,8653,1394],{},[65,8655,8657],{"className":371,"code":8656,"language":373,"meta":70,"style":70},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,8658,8659,8664,8669,8673,8678,8682,8687,8692,8697,8701,8706,8711,8716,8720,8724],{"__ignoreMap":70},[74,8660,8661],{"class":76,"line":77},[74,8662,8663],{},"import logging\n",[74,8665,8666],{"class":76,"line":87},[74,8667,8668],{},"import unittest\n",[74,8670,8671],{"class":76,"line":388},[74,8672,1051],{"emptyLinePlaceholder":190},[74,8674,8675],{"class":76,"line":394},[74,8676,8677],{},"logging.basicConfig(level=logging.INFO)\n",[74,8679,8680],{"class":76,"line":1098},[74,8681,1051],{"emptyLinePlaceholder":190},[74,8683,8684],{"class":76,"line":1104},[74,8685,8686],{},"def clamp_progress(value):\n",[74,8688,8689],{"class":76,"line":2414},[74,8690,8691],{},"    logging.info(\"检查进度：%s\", value)\n",[74,8693,8694],{"class":76,"line":2420},[74,8695,8696],{},"    return max(0, min(100, value))\n",[74,8698,8699],{"class":76,"line":3880},[74,8700,1051],{"emptyLinePlaceholder":190},[74,8702,8703],{"class":76,"line":4092},[74,8704,8705],{},"class ProgressTest(unittest.TestCase):\n",[74,8707,8708],{"class":76,"line":5757},[74,8709,8710],{},"    def test_upper_limit(self):\n",[74,8712,8713],{"class":76,"line":5762},[74,8714,8715],{},"        self.assertEqual(clamp_progress(120), 100)\n",[74,8717,8718],{"class":76,"line":7367},[74,8719,1051],{"emptyLinePlaceholder":190},[74,8721,8722],{"class":76,"line":7373},[74,8723,6124],{},[74,8725,8726],{"class":76,"line":8496},[74,8727,8728],{},"    unittest.main()\n",[10,8730,101],{},[65,8732,8735],{"className":8733,"code":8734,"language":107,"meta":70},[105],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8736,8734],{"__ignoreMap":70},[10,8738,112],{},[14,8740,115],{"id":115},[117,8742,8743,8749],{},[45,8744,8745,8748],{},[34,8746,8747],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[45,8750,8751],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[290,8753,2624],{"id":2624},[10,8755,8756],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8758,8759],{},[26,8760],{"alt":8761,"src":8762},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8764,8765],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8767,133],{"id":133},[42,8769,8770,8773],{},[45,8771,8772],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[45,8774,8775],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8777,150],{"id":150},[117,8779,8780,8783],{},[45,8781,8782],{},"为负数进度增加测试。",[45,8784,8785],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8787,165],{},[14,8789,168],{"id":168},[10,8791,8792],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,8794,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":8796},[8797,8798,8799,8800,8801,8804,8805,8806],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":8802},[8803],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8615,"description":8620},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[186,8814,8815],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8818,"title":8819,"body":8820,"category":186,"cover":187,"description":8824,"extension":188,"meta":9124,"navigation":190,"path":9125,"pinned":192,"publishedAt":193,"seo":9126,"slug":9127,"stem":9128,"summary":9129,"tags":9130,"updatedAt":193,"visible":190,"__hash__":9133},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8821,"toc":9111},[8822,8825,8827,8830,8832,8838,8841,8843,8858,8860,8862,9009,9011,9017,9019,9021,9034,9036,9039,9045,9048,9050,9053,9059,9066,9068,9079,9081,9102,9104,9106,9109],[10,8823,8824],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8826,16],{"id":16},[10,8828,8829],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8831,22],{"id":22},[10,8833,8834],{},[26,8835],{"alt":8836,"src":8837},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8839,8840],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8842,40],{"id":40},[42,8844,8845,8848,8851],{},[45,8846,8847],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[45,8849,8850],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[45,8852,8853,8854,8857],{},"实际扩展前先为 ",[34,8855,8856],{},"add()"," 和存储边界补充测试。",[14,8859,60],{"id":60},[10,8861,1394],{},[65,8863,8865],{"className":371,"code":8864,"language":373,"meta":70,"style":70},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,8866,8867,8871,8875,8879,8884,8889,8894,8899,8903,8908,8913,8918,8923,8928,8932,8937,8942,8948,8953,8959,8964,8969,8975,8981,8987,8992,8998,9003],{"__ignoreMap":70},[74,8868,8869],{"class":76,"line":77},[74,8870,6922],{},[74,8872,8873],{"class":76,"line":87},[74,8874,6531],{},[74,8876,8877],{"class":76,"line":388},[74,8878,1051],{"emptyLinePlaceholder":190},[74,8880,8881],{"class":76,"line":394},[74,8882,8883],{},"class LearningRecords:\n",[74,8885,8886],{"class":76,"line":1098},[74,8887,8888],{},"    def __init__(self, file_path):\n",[74,8890,8891],{"class":76,"line":1104},[74,8892,8893],{},"        self.file_path = Path(file_path)\n",[74,8895,8896],{"class":76,"line":2414},[74,8897,8898],{},"        self.items = []\n",[74,8900,8901],{"class":76,"line":2420},[74,8902,1051],{"emptyLinePlaceholder":190},[74,8904,8905],{"class":76,"line":3880},[74,8906,8907],{},"    def add(self, title):\n",[74,8909,8910],{"class":76,"line":4092},[74,8911,8912],{},"        title = title.strip()\n",[74,8914,8915],{"class":76,"line":5757},[74,8916,8917],{},"        if not title:\n",[74,8919,8920],{"class":76,"line":5762},[74,8921,8922],{},"            raise ValueError(\"课程名称不能为空\")\n",[74,8924,8925],{"class":76,"line":7367},[74,8926,8927],{},"        self.items.append({\"title\": title, \"done\": False})\n",[74,8929,8930],{"class":76,"line":7373},[74,8931,1051],{"emptyLinePlaceholder":190},[74,8933,8934],{"class":76,"line":8496},[74,8935,8936],{},"    def save(self):\n",[74,8938,8939],{"class":76,"line":8501},[74,8940,8941],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,8943,8945],{"class":76,"line":8944},17,[74,8946,8947],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[74,8949,8951],{"class":76,"line":8950},18,[74,8952,1051],{"emptyLinePlaceholder":190},[74,8954,8956],{"class":76,"line":8955},19,[74,8957,8958],{},"records = LearningRecords(\"learning-records.json\")\n",[74,8960,8962],{"class":76,"line":8961},20,[74,8963,1051],{"emptyLinePlaceholder":190},[74,8965,8967],{"class":76,"line":8966},21,[74,8968,7340],{},[74,8970,8972],{"class":76,"line":8971},22,[74,8973,8974],{},"    title = input(\"输入已学习课程：\")\n",[74,8976,8978],{"class":76,"line":8977},23,[74,8979,8980],{},"    records.add(title)\n",[74,8982,8984],{"class":76,"line":8983},24,[74,8985,8986],{},"    records.save()\n",[74,8988,8990],{"class":76,"line":8989},25,[74,8991,7350],{},[74,8993,8995],{"class":76,"line":8994},26,[74,8996,8997],{},"    print(\"无法保存：\", error)\n",[74,8999,9001],{"class":76,"line":9000},27,[74,9002,1101],{},[74,9004,9006],{"class":76,"line":9005},28,[74,9007,9008],{},"    print(\"已保存 1 条学习记录\")\n",[10,9010,101],{},[65,9012,9015],{"className":9013,"code":9014,"language":107,"meta":70},[105],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9016,9014],{"__ignoreMap":70},[10,9018,112],{},[14,9020,115],{"id":115},[117,9022,9023,9029],{},[45,9024,9025,9026,9028],{},"输入层取得课程名后，",[34,9027,8856],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[45,9030,9031,9033],{},[34,9032,8088],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[290,9035,2624],{"id":2624},[10,9037,9038],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9040,9041],{},[26,9042],{"alt":9043,"src":9044},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9046,9047],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[290,9049,2624],{"id":4147},[10,9051,9052],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9054,9055],{},[26,9056],{"alt":9057,"src":9058},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9060,9061,9062,9065],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9063,9064],{},"load()"," 把文件状态恢复到内存。",[14,9067,133],{"id":133},[42,9069,9070,9073],{},[45,9071,9072],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[45,9074,9075,9076,9078],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9077,9064],{}," 是下一项必要扩展。",[14,9080,150],{"id":150},[117,9082,9083,9089,9092],{},[45,9084,9085,9086,9088],{},"增加 ",[34,9087,9064],{},"，文件不存在时从空列表开始。",[45,9090,9091],{},"增加按序号标记完成的功能，并校验序号范围。",[45,9093,9094,9095,9098,9099,9101],{},"把输入循环放进 ",[34,9096,9097],{},"main()","，通过 ",[34,9100,6066],{}," 控制程序入口。",[10,9103,165],{},[14,9105,168],{"id":168},[10,9107,9108],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[173,9110,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":9112},[9113,9114,9115,9116,9117,9121,9122,9123],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":9118},[9119,9120],{"id":2624,"depth":388,"text":2624},{"id":4147,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8819,"description":8824},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[186,9131,9132],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9135,9238,9357,9488,9631,9756,9893,10030,10171,10340,10477,10610,10733,10862,10989,11152,11328,11469,11598,11747,11890,12011,12134,12283,12436,12601,12728,12909,13052,13209,13360,13507,13662,13880,14035,14210,14361,14528,14715,14878,15120,15360],{"id":1349,"title":1350,"body":9136,"category":186,"cover":187,"description":1355,"extension":188,"meta":9235,"navigation":190,"path":1476,"pinned":192,"publishedAt":193,"seo":9236,"slug":1478,"stem":1479,"summary":1480,"tags":9237,"updatedAt":193,"visible":190,"__hash__":1483},{"type":7,"value":9137,"toc":9225},[9138,9140,9142,9144,9146,9150,9154,9156,9166,9168,9170,9178,9180,9185,9187,9189,9199,9201,9209,9211,9217,9219,9221,9223],[10,9139,1355],{},[14,9141,16],{"id":16},[10,9143,1360],{},[14,9145,22],{"id":22},[10,9147,9148],{},[26,9149],{"alt":1367,"src":1368},[10,9151,9152,1373],{},[34,9153,1127],{},[14,9155,40],{"id":40},[42,9157,9158,9162,9164],{},[45,9159,1380,9160,1383],{},[34,9161,1127],{},[45,9163,1386],{},[45,9165,1389],{},[14,9167,60],{"id":60},[10,9169,1394],{},[65,9171,9172],{"className":371,"code":1397,"language":373,"meta":70,"style":70},[34,9173,9174],{"__ignoreMap":70},[74,9175,9176],{"class":76,"line":77},[74,9177,1397],{},[10,9179,101],{},[65,9181,9183],{"className":9182,"code":1409,"language":107,"meta":70},[105],[34,9184,1409],{"__ignoreMap":70},[10,9186,112],{},[14,9188,115],{"id":115},[117,9190,9191,9195],{},[45,9192,1420,9193,1424],{},[34,9194,1423],{},[45,9196,1427,9197,1431],{},[34,9198,1430],{},[14,9200,133],{"id":133},[42,9202,9203,9205],{},[45,9204,1438],{},[45,9206,1441,9207,1444],{},[34,9208,1127],{},[14,9210,150],{"id":150},[117,9212,9213,9215],{},[45,9214,1451],{},[45,9216,1454],{},[10,9218,165],{},[14,9220,168],{"id":168},[10,9222,1461],{},[173,9224,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":9226},[9227,9228,9229,9230,9231,9232,9233,9234],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":1350,"description":1355},[186,1345,1482],{"id":4,"title":5,"body":9239,"category":186,"cover":187,"description":12,"extension":188,"meta":9354,"navigation":190,"path":191,"pinned":192,"publishedAt":193,"seo":9355,"slug":195,"stem":196,"summary":197,"tags":9356,"updatedAt":193,"visible":190,"__hash__":201},{"type":7,"value":9240,"toc":9344},[9241,9243,9245,9247,9249,9253,9257,9259,9269,9271,9273,9293,9295,9300,9302,9304,9314,9316,9326,9328,9336,9338,9340,9342],[10,9242,12],{},[14,9244,16],{"id":16},[10,9246,19],{},[14,9248,22],{"id":22},[10,9250,9251],{},[26,9252],{"alt":28,"src":29},[10,9254,32,9255,37],{},[34,9256,36],{},[14,9258,40],{"id":40},[42,9260,9261,9263,9265],{},[45,9262,47],{},[45,9264,50],{},[45,9266,53,9267,57],{},[34,9268,56],{},[14,9270,60],{"id":60},[10,9272,63],{},[65,9274,9275],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,9276,9277,9283],{"__ignoreMap":70},[74,9278,9279,9281],{"class":76,"line":77},[74,9280,36],{"class":80},[74,9282,84],{"class":83},[74,9284,9285,9287,9289,9291],{"class":76,"line":87},[74,9286,36],{"class":80},[74,9288,92],{"class":83},[74,9290,96],{"class":95},[74,9292,84],{"class":83},[10,9294,101],{},[65,9296,9298],{"className":9297,"code":106,"language":107,"meta":70},[105],[34,9299,106],{"__ignoreMap":70},[10,9301,112],{},[14,9303,115],{"id":115},[117,9305,9306,9310],{},[45,9307,9308,124],{},[34,9309,123],{},[45,9311,9312,130],{},[34,9313,129],{},[14,9315,133],{"id":133},[42,9317,9318,9322],{},[45,9319,138,9320,141],{},[34,9321,36],{},[45,9323,144,9324,147],{},[34,9325,36],{},[14,9327,150],{"id":150},[117,9329,9330,9334],{},[45,9331,155,9332,159],{},[34,9333,158],{},[45,9335,162],{},[10,9337,165],{},[14,9339,168],{"id":168},[10,9341,171],{},[173,9343,175],{},{"title":70,"searchDepth":87,"depth":87,"links":9345},[9346,9347,9348,9349,9350,9351,9352,9353],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5,"description":12},[186,199,200],{"id":1604,"title":1605,"body":9358,"category":186,"cover":187,"description":1771,"extension":188,"meta":9485,"navigation":190,"path":1773,"pinned":192,"publishedAt":193,"seo":9486,"slug":1775,"stem":1776,"summary":1777,"tags":9487,"updatedAt":193,"visible":190,"__hash__":1781},{"type":7,"value":9359,"toc":9475},[9360,9364,9366,9368,9370,9374,9376,9378,9394,9396,9398,9418,9420,9425,9427,9429,9441,9443,9453,9455,9465,9467,9469,9473],[10,9361,1610,9362,1613],{},[34,9363,1127],{},[14,9365,16],{"id":16},[10,9367,1618],{},[14,9369,22],{"id":22},[10,9371,9372],{},[26,9373],{"alt":1625,"src":1626},[10,9375,1629],{},[14,9377,40],{"id":40},[42,9379,9380,9386,9390],{},[45,9381,1636,9382,1639,9384,324],{},[34,9383,36],{},[34,9385,1642],{},[45,9387,1645,9388,1649],{},[34,9389,1648],{},[45,9391,1652,9392,1655],{},[34,9393,1127],{},[14,9395,60],{"id":60},[10,9397,1394],{},[65,9399,9400],{"className":1662,"code":1663,"language":1664,"meta":70,"style":70},[34,9401,9402,9406,9410,9414],{"__ignoreMap":70},[74,9403,9404],{"class":76,"line":77},[74,9405,1671],{},[74,9407,9408],{"class":76,"line":87},[74,9409,1676],{},[74,9411,9412],{"class":76,"line":388},[74,9413,1681],{},[74,9415,9416],{"class":76,"line":394},[74,9417,1686],{},[10,9419,101],{},[65,9421,9423],{"className":9422,"code":1692,"language":107,"meta":70},[105],[34,9424,1692],{"__ignoreMap":70},[10,9426,112],{},[14,9428,115],{"id":115},[117,9430,9431,9437],{},[45,9432,1703,9433,1707,9435,324],{},[34,9434,1706],{},[34,9436,1710],{},[45,9438,1713,9439,1716],{},[34,9440,1430],{},[14,9442,133],{"id":133},[42,9444,9445,9451],{},[45,9446,1723,9447,1726,9449,1729],{},[34,9448,1642],{},[34,9450,1127],{},[45,9452,1732],{},[14,9454,150],{"id":150},[117,9456,9457,9461],{},[45,9458,1739,9459,324],{},[34,9460,1742],{},[45,9462,1745,9463,1748],{},[34,9464,1430],{},[10,9466,165],{},[14,9468,168],{"id":168},[10,9470,1755,9471,1758],{},[34,9472,1127],{},[173,9474,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":9476},[9477,9478,9479,9480,9481,9482,9483,9484],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":1605,"description":1771},[186,1779,1780],{"id":1783,"title":1784,"body":9489,"category":186,"cover":187,"description":1789,"extension":188,"meta":9628,"navigation":190,"path":1961,"pinned":192,"publishedAt":193,"seo":9629,"slug":1963,"stem":1964,"summary":1965,"tags":9630,"updatedAt":193,"visible":190,"__hash__":1969},{"type":7,"value":9490,"toc":9618},[9491,9493,9495,9497,9499,9503,9507,9509,9521,9523,9525,9561,9563,9568,9570,9572,9588,9590,9600,9602,9610,9612,9614,9616],[10,9492,1789],{},[14,9494,16],{"id":16},[10,9496,1794],{},[14,9498,22],{"id":22},[10,9500,9501],{},[26,9502],{"alt":1801,"src":1802},[10,9504,9505,1808],{},[34,9506,1807],{},[14,9508,40],{"id":40},[42,9510,9511,9513,9519],{},[45,9512,1815],{},[45,9514,9515,1821,9517,1825],{},[34,9516,1820],{},[34,9518,1824],{},[45,9520,1828],{},[14,9522,60],{"id":60},[10,9524,63],{},[65,9526,9527],{"className":67,"code":1835,"language":69,"meta":70,"style":70},[34,9528,9529,9535,9541,9545,9555],{"__ignoreMap":70},[74,9530,9531,9533],{"class":76,"line":77},[74,9532,1842],{"class":80},[74,9534,1845],{"class":95},[74,9536,9537,9539],{"class":76,"line":87},[74,9538,1850],{"class":83},[74,9540,1845],{"class":95},[74,9542,9543],{"class":76,"line":388},[74,9544,1857],{"class":83},[74,9546,9547,9549,9551,9553],{"class":76,"line":394},[74,9548,1862],{"class":83},[74,9550,1865],{"class":95},[74,9552,1869],{"class":1868},[74,9554,1171],{"class":95},[74,9556,9557,9559],{"class":76,"line":1098},[74,9558,36],{"class":80},[74,9560,1171],{"class":95},[10,9562,101],{},[65,9564,9566],{"className":9565,"code":1883,"language":107,"meta":70},[105],[34,9567,1883],{"__ignoreMap":70},[10,9569,112],{},[14,9571,115],{"id":115},[117,9573,9574,9582],{},[45,9575,9576,1896,9578,1899,9580,1902],{},[34,9577,1842],{},[34,9579,1850],{},[34,9581,1820],{},[45,9583,9584,1907,9586,1911],{},[34,9585,1807],{},[34,9587,1910],{},[14,9589,133],{"id":133},[42,9591,9592,9598],{},[45,9593,1918,9594,1113,9596,324],{},[34,9595,1820],{},[34,9597,1824],{},[45,9599,1925],{},[14,9601,150],{"id":150},[117,9603,9604,9608],{},[45,9605,1932,9606,1936],{},[34,9607,1935],{},[45,9609,1939],{},[10,9611,165],{},[14,9613,168],{"id":168},[10,9615,1946],{},[173,9617,1949],{},{"title":70,"searchDepth":87,"depth":87,"links":9619},[9620,9621,9622,9623,9624,9625,9626,9627],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":1784,"description":1789},[186,1967,1968],{"id":1971,"title":1972,"body":9632,"category":186,"cover":187,"description":1977,"extension":188,"meta":9753,"navigation":190,"path":2126,"pinned":192,"publishedAt":193,"seo":9754,"slug":2128,"stem":2129,"summary":2130,"tags":9755,"updatedAt":193,"visible":190,"__hash__":2134},{"type":7,"value":9633,"toc":9743},[9634,9636,9638,9640,9642,9646,9654,9656,9670,9672,9674,9690,9692,9697,9699,9701,9715,9717,9723,9725,9735,9737,9739,9741],[10,9635,1977],{},[14,9637,16],{"id":16},[10,9639,1982],{},[14,9641,22],{"id":22},[10,9643,9644],{},[26,9645],{"alt":1989,"src":1990},[10,9647,1993,9648,324,9650,1999,9652,324],{},[34,9649,1430],{},[34,9651,1998],{},[34,9653,1706],{},[14,9655,40],{"id":40},[42,9657,9658,9662,9668],{},[45,9659,9660,2011],{},[34,9661,2010],{},[45,9663,9664,2017,9666,324],{},[34,9665,2016],{},[34,9667,2020],{},[45,9669,2023],{},[14,9671,60],{"id":60},[10,9673,1394],{},[65,9675,9676],{"className":371,"code":2030,"language":373,"meta":70,"style":70},[34,9677,9678,9682,9686],{"__ignoreMap":70},[74,9679,9680],{"class":76,"line":77},[74,9681,2037],{},[74,9683,9684],{"class":76,"line":87},[74,9685,2042],{},[74,9687,9688],{"class":76,"line":388},[74,9689,2047],{},[10,9691,101],{},[65,9693,9695],{"className":9694,"code":2053,"language":107,"meta":70},[105],[34,9696,2053],{"__ignoreMap":70},[10,9698,112],{},[14,9700,115],{"id":115},[117,9702,9703,9709],{},[45,9704,9705,2067,9707,324],{},[34,9706,2066],{},[34,9708,2020],{},[45,9710,9711,2074,9713,2078],{},[34,9712,1430],{},[34,9714,2077],{},[14,9716,133],{"id":133},[42,9718,9719,9721],{},[45,9720,2085],{},[45,9722,2088],{},[14,9724,150],{"id":150},[117,9726,9727,9729],{},[45,9728,2095],{},[45,9730,2098,9731,2101,9733,2105],{},[34,9732,1998],{},[34,9734,2104],{},[10,9736,165],{},[14,9738,168],{"id":168},[10,9740,2112],{},[173,9742,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":9744},[9745,9746,9747,9748,9749,9750,9751,9752],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":1972,"description":1977},[186,2132,2133],{"id":2136,"title":2137,"body":9757,"category":186,"cover":187,"description":2142,"extension":188,"meta":9890,"navigation":190,"path":2310,"pinned":192,"publishedAt":193,"seo":9891,"slug":2312,"stem":2313,"summary":2314,"tags":9892,"updatedAt":193,"visible":190,"__hash__":2318},{"type":7,"value":9758,"toc":9880},[9759,9761,9763,9765,9767,9771,9773,9775,9791,9793,9795,9819,9821,9826,9828,9830,9846,9848,9860,9862,9872,9874,9876,9878],[10,9760,2142],{},[14,9762,16],{"id":16},[10,9764,2147],{},[14,9766,22],{"id":22},[10,9768,9769],{},[26,9770],{"alt":2154,"src":2155},[10,9772,2158],{},[14,9774,40],{"id":40},[42,9776,9777,9779,9785],{},[45,9778,2165],{},[45,9780,2168,9781,2101,9783,2175],{},[34,9782,2171],{},[34,9784,2174],{},[45,9786,2178,9787,2182,9789,2186],{},[34,9788,2181],{},[34,9790,2185],{},[14,9792,60],{"id":60},[10,9794,1394],{},[65,9796,9797],{"className":371,"code":2193,"language":373,"meta":70,"style":70},[34,9798,9799,9803,9807,9811,9815],{"__ignoreMap":70},[74,9800,9801],{"class":76,"line":77},[74,9802,2200],{},[74,9804,9805],{"class":76,"line":87},[74,9806,2205],{},[74,9808,9809],{"class":76,"line":388},[74,9810,1051],{"emptyLinePlaceholder":190},[74,9812,9813],{"class":76,"line":394},[74,9814,2214],{},[74,9816,9817],{"class":76,"line":1098},[74,9818,2205],{},[10,9820,101],{},[65,9822,9824],{"className":9823,"code":2224,"language":107,"meta":70},[105],[34,9825,2224],{"__ignoreMap":70},[10,9827,112],{},[14,9829,115],{"id":115},[117,9831,9832,9838],{},[45,9833,155,9834,2238,9836,2241],{},[34,9835,2237],{},[34,9837,2171],{},[45,9839,155,9840,2247,9842,2251,9844,324],{},[34,9841,2246],{},[34,9843,2250],{},[34,9845,2254],{},[14,9847,133],{"id":133},[42,9849,9850,9852],{},[45,9851,2261],{},[45,9853,2264,9854,2182,9856,2182,9858,2272],{},[34,9855,2181],{},[34,9857,2185],{},[34,9859,2271],{},[14,9861,150],{"id":150},[117,9863,9864,9870],{},[45,9865,2279,9866,1113,9868,2286],{},[34,9867,2282],{},[34,9869,2285],{},[45,9871,2289],{},[10,9873,165],{},[14,9875,168],{"id":168},[10,9877,2296],{},[173,9879,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":9881},[9882,9883,9884,9885,9886,9887,9888,9889],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":2137,"description":2142},[186,2316,2317],{"id":2320,"title":2321,"body":9894,"category":186,"cover":187,"description":2326,"extension":188,"meta":10027,"navigation":190,"path":2493,"pinned":192,"publishedAt":193,"seo":10028,"slug":2495,"stem":2496,"summary":2497,"tags":10029,"updatedAt":193,"visible":190,"__hash__":2501},{"type":7,"value":9895,"toc":10017},[9896,9898,9900,9902,9904,9908,9910,9912,9930,9932,9934,9970,9972,9977,9979,9981,9991,9993,10001,10003,10009,10011,10013,10015],[10,9897,2326],{},[14,9899,16],{"id":16},[10,9901,2331],{},[14,9903,22],{"id":22},[10,9905,9906],{},[26,9907],{"alt":2338,"src":2339},[10,9909,2342],{},[14,9911,40],{"id":40},[42,9913,9914,9920,9928],{},[45,9915,9916,2352,9918,2356],{},[34,9917,2351],{},[34,9919,2355],{},[45,9921,9922,2362,9924,2366,9926,2370],{},[34,9923,2361],{},[34,9925,2365],{},[34,9927,2369],{},[45,9929,2373],{},[14,9931,60],{"id":60},[10,9933,1394],{},[65,9935,9936],{"className":371,"code":2380,"language":373,"meta":70,"style":70},[34,9937,9938,9942,9946,9950,9954,9958,9962,9966],{"__ignoreMap":70},[74,9939,9940],{"class":76,"line":77},[74,9941,2387],{},[74,9943,9944],{"class":76,"line":87},[74,9945,2392],{},[74,9947,9948],{"class":76,"line":388},[74,9949,2397],{},[74,9951,9952],{"class":76,"line":394},[74,9953,1051],{"emptyLinePlaceholder":190},[74,9955,9956],{"class":76,"line":1098},[74,9957,2406],{},[74,9959,9960],{"class":76,"line":1104},[74,9961,2411],{},[74,9963,9964],{"class":76,"line":2414},[74,9965,2417],{},[74,9967,9968],{"class":76,"line":2420},[74,9969,2423],{},[10,9971,101],{},[65,9973,9975],{"className":9974,"code":2429,"language":107,"meta":70},[105],[34,9976,2429],{"__ignoreMap":70},[10,9978,112],{},[14,9980,115],{"id":115},[117,9982,9983,9987],{},[45,9984,9985,2443],{},[34,9986,2442],{},[45,9988,9989,2449],{},[34,9990,2448],{},[14,9992,133],{"id":133},[42,9994,9995,9999],{},[45,9996,2456,9997,324],{},[34,9998,2459],{},[45,10000,2462],{},[14,10002,150],{"id":150},[117,10004,10005,10007],{},[45,10006,2469],{},[45,10008,2472],{},[10,10010,165],{},[14,10012,168],{"id":168},[10,10014,2479],{},[173,10016,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10018},[10019,10020,10021,10022,10023,10024,10025,10026],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":2321,"description":2326},[186,2499,2500],{"id":2503,"title":2504,"body":10031,"category":186,"cover":187,"description":2509,"extension":188,"meta":10168,"navigation":190,"path":2686,"pinned":192,"publishedAt":193,"seo":10169,"slug":2688,"stem":2689,"summary":2690,"tags":10170,"updatedAt":193,"visible":190,"__hash__":2694},{"type":7,"value":10032,"toc":10156},[10033,10035,10037,10039,10041,10045,10051,10053,10061,10063,10065,10089,10091,10096,10098,10100,10118,10120,10122,10126,10128,10130,10136,10138,10148,10150,10152,10154],[10,10034,2509],{},[14,10036,16],{"id":16},[10,10038,2514],{},[14,10040,22],{"id":22},[10,10042,10043],{},[26,10044],{"alt":2521,"src":2522},[10,10046,2525,10047,2529,10049,324],{},[34,10048,2528],{},[34,10050,2532],{},[14,10052,40],{"id":40},[42,10054,10055,10057,10059],{},[45,10056,2539],{},[45,10058,2542],{},[45,10060,2545],{},[14,10062,60],{"id":60},[10,10064,1394],{},[65,10066,10067],{"className":371,"code":2552,"language":373,"meta":70,"style":70},[34,10068,10069,10073,10077,10081,10085],{"__ignoreMap":70},[74,10070,10071],{"class":76,"line":77},[74,10072,2559],{},[74,10074,10075],{"class":76,"line":87},[74,10076,2564],{},[74,10078,10079],{"class":76,"line":388},[74,10080,2569],{},[74,10082,10083],{"class":76,"line":394},[74,10084,2574],{},[74,10086,10087],{"class":76,"line":1098},[74,10088,2579],{},[10,10090,101],{},[65,10092,10094],{"className":10093,"code":2585,"language":107,"meta":70},[105],[34,10095,2585],{"__ignoreMap":70},[10,10097,112],{},[14,10099,115],{"id":115},[117,10101,10102,10110],{},[45,10103,2596,10104,2599,10106,2603,10108,2607],{},[34,10105,186],{},[34,10107,2602],{},[34,10109,2606],{},[45,10111,10112,2613,10114,2617,10116,2621],{},[34,10113,2612],{},[34,10115,2616],{},[34,10117,2620],{},[290,10119,2624],{"id":2624},[10,10121,2627],{},[10,10123,10124],{},[26,10125],{"alt":2632,"src":2633},[10,10127,2636],{},[14,10129,133],{"id":133},[42,10131,10132,10134],{},[45,10133,2643],{},[45,10135,2646],{},[14,10137,150],{"id":150},[117,10139,10140,10146],{},[45,10141,2653,10142,2657,10144,324],{},[34,10143,2656],{},[34,10145,2660],{},[45,10147,2663],{},[10,10149,165],{},[14,10151,168],{"id":168},[10,10153,2670],{},[173,10155,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10157},[10158,10159,10160,10161,10162,10165,10166,10167],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":10163},[10164],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":2504,"description":2509},[186,2692,2693],{"id":2696,"title":2697,"body":10172,"category":186,"cover":187,"description":2702,"extension":188,"meta":10337,"navigation":190,"path":2917,"pinned":192,"publishedAt":193,"seo":10338,"slug":2919,"stem":2920,"summary":2921,"tags":10339,"updatedAt":193,"visible":190,"__hash__":2925},{"type":7,"value":10173,"toc":10325},[10174,10176,10178,10180,10182,10186,10192,10194,10214,10216,10218,10254,10256,10261,10263,10265,10279,10281,10283,10287,10293,10295,10305,10307,10317,10319,10321,10323],[10,10175,2702],{},[14,10177,16],{"id":16},[10,10179,2707],{},[14,10181,22],{"id":22},[10,10183,10184],{},[26,10185],{"alt":2714,"src":2715},[10,10187,2718,10188,963,10190,2725],{},[34,10189,2721],{},[34,10191,2724],{},[14,10193,40],{"id":40},[42,10195,10196,10204,10212],{},[45,10197,10198,2735,10200,2739,10202,2743],{},[34,10199,2734],{},[34,10201,2738],{},[34,10203,2742],{},[45,10205,10206,2749,10208,2753,10210,2757],{},[34,10207,2748],{},[34,10209,2752],{},[34,10211,2756],{},[45,10213,2760],{},[14,10215,60],{"id":60},[10,10217,1394],{},[65,10219,10220],{"className":371,"code":2767,"language":373,"meta":70,"style":70},[34,10221,10222,10226,10230,10234,10238,10242,10246,10250],{"__ignoreMap":70},[74,10223,10224],{"class":76,"line":77},[74,10225,2774],{},[74,10227,10228],{"class":76,"line":87},[74,10229,2779],{},[74,10231,10232],{"class":76,"line":388},[74,10233,1051],{"emptyLinePlaceholder":190},[74,10235,10236],{"class":76,"line":394},[74,10237,2788],{},[74,10239,10240],{"class":76,"line":1098},[74,10241,2793],{},[74,10243,10244],{"class":76,"line":1104},[74,10245,2798],{},[74,10247,10248],{"class":76,"line":2414},[74,10249,2803],{},[74,10251,10252],{"class":76,"line":2420},[74,10253,2808],{},[10,10255,101],{},[65,10257,10259],{"className":10258,"code":2814,"language":107,"meta":70},[105],[34,10260,2814],{"__ignoreMap":70},[10,10262,112],{},[14,10264,115],{"id":115},[117,10266,10267,10273],{},[45,10268,10269,2828,10271,2832],{},[34,10270,2827],{},[34,10272,2831],{},[45,10274,10275,2838,10277,2841],{},[34,10276,2837],{},[34,10278,2756],{},[290,10280,2624],{"id":2624},[10,10282,2846],{},[10,10284,10285],{},[26,10286],{"alt":2851,"src":2852},[10,10288,10289,2857,10291,2860],{},[34,10290,2748],{},[34,10292,2752],{},[14,10294,133],{"id":133},[42,10296,10297,10303],{},[45,10298,2867,10299,2870,10301,2873],{},[34,10300,2742],{},[34,10302,2734],{},[45,10304,2876],{},[14,10306,150],{"id":150},[117,10308,10309,10313],{},[45,10310,2883,10311,2887],{},[34,10312,2886],{},[45,10314,2890,10315,2894],{},[34,10316,2893],{},[10,10318,165],{},[14,10320,168],{"id":168},[10,10322,2901],{},[173,10324,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10326},[10327,10328,10329,10330,10331,10334,10335,10336],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":10332},[10333],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":2697,"description":2702},[186,2923,2924],{"id":2927,"title":2928,"body":10341,"category":186,"cover":187,"description":2933,"extension":188,"meta":10474,"navigation":190,"path":3102,"pinned":192,"publishedAt":193,"seo":10475,"slug":3104,"stem":3105,"summary":3106,"tags":10476,"updatedAt":193,"visible":190,"__hash__":3109},{"type":7,"value":10342,"toc":10464},[10343,10345,10347,10349,10351,10355,10365,10367,10377,10379,10381,10409,10411,10416,10418,10420,10434,10436,10444,10446,10456,10458,10460,10462],[10,10344,2933],{},[14,10346,16],{"id":16},[10,10348,2938],{},[14,10350,22],{"id":22},[10,10352,10353],{},[26,10354],{"alt":2945,"src":2946},[10,10356,10357,2952,10359,2956,10361,2960,10363,2964],{},[34,10358,2951],{},[34,10360,2955],{},[34,10362,2959],{},[34,10364,2963],{},[14,10366,40],{"id":40},[42,10368,10369,10371,10375],{},[45,10370,2971],{},[45,10372,10373,2976],{},[34,10374,2963],{},[45,10376,2979],{},[14,10378,60],{"id":60},[10,10380,1394],{},[65,10382,10383],{"className":371,"code":2986,"language":373,"meta":70,"style":70},[34,10384,10385,10389,10393,10397,10401,10405],{"__ignoreMap":70},[74,10386,10387],{"class":76,"line":77},[74,10388,2993],{},[74,10390,10391],{"class":76,"line":87},[74,10392,2998],{},[74,10394,10395],{"class":76,"line":388},[74,10396,3003],{},[74,10398,10399],{"class":76,"line":394},[74,10400,1051],{"emptyLinePlaceholder":190},[74,10402,10403],{"class":76,"line":1098},[74,10404,3012],{},[74,10406,10407],{"class":76,"line":1104},[74,10408,3017],{},[10,10410,101],{},[65,10412,10414],{"className":10413,"code":3023,"language":107,"meta":70},[105],[34,10415,3023],{"__ignoreMap":70},[10,10417,112],{},[14,10419,115],{"id":115},[117,10421,10422,10428],{},[45,10423,3034,10424,3037,10426,3041],{},[34,10425,2951],{},[34,10427,3040],{},[45,10429,10430,3047,10432,3051],{},[34,10431,3046],{},[34,10433,3050],{},[14,10435,133],{"id":133},[42,10437,10438,10442],{},[45,10439,3058,10440,3062],{},[34,10441,3061],{},[45,10443,3065],{},[14,10445,150],{"id":150},[117,10447,10448,10450],{},[45,10449,3072],{},[45,10451,1645,10452,3078,10454,3081],{},[34,10453,3077],{},[34,10455,2963],{},[10,10457,165],{},[14,10459,168],{"id":168},[10,10461,3088],{},[173,10463,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10465},[10466,10467,10468,10469,10470,10471,10472,10473],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":2928,"description":2933},[186,2271,3108],{"id":3111,"title":3112,"body":10478,"category":186,"cover":187,"description":3117,"extension":188,"meta":10607,"navigation":190,"path":3278,"pinned":192,"publishedAt":193,"seo":10608,"slug":3280,"stem":3281,"summary":3282,"tags":10609,"updatedAt":193,"visible":190,"__hash__":3286},{"type":7,"value":10479,"toc":10597},[10480,10482,10484,10486,10488,10492,10496,10498,10508,10510,10512,10544,10546,10551,10553,10555,10567,10569,10579,10581,10589,10591,10593,10595],[10,10481,3117],{},[14,10483,16],{"id":16},[10,10485,3122],{},[14,10487,22],{"id":22},[10,10489,10490],{},[26,10491],{"alt":3129,"src":3130},[10,10493,3133,10494,3137],{},[34,10495,3136],{},[14,10497,40],{"id":40},[42,10499,10500,10502,10504],{},[45,10501,3144],{},[45,10503,3147],{},[45,10505,3150,10506,324],{},[34,10507,3153],{},[14,10509,60],{"id":60},[10,10511,1394],{},[65,10513,10514],{"className":371,"code":3160,"language":373,"meta":70,"style":70},[34,10515,10516,10520,10524,10528,10532,10536,10540],{"__ignoreMap":70},[74,10517,10518],{"class":76,"line":77},[74,10519,3167],{},[74,10521,10522],{"class":76,"line":87},[74,10523,3172],{},[74,10525,10526],{"class":76,"line":388},[74,10527,1051],{"emptyLinePlaceholder":190},[74,10529,10530],{"class":76,"line":394},[74,10531,3181],{},[74,10533,10534],{"class":76,"line":1098},[74,10535,3186],{},[74,10537,10538],{"class":76,"line":1104},[74,10539,3191],{},[74,10541,10542],{"class":76,"line":2414},[74,10543,3196],{},[10,10545,101],{},[65,10547,10549],{"className":10548,"code":3202,"language":107,"meta":70},[105],[34,10550,3202],{"__ignoreMap":70},[10,10552,112],{},[14,10554,115],{"id":115},[117,10556,10557,10559],{},[45,10558,3213],{},[45,10560,10561,3219,10563,3223,10565,3227],{},[34,10562,3218],{},[34,10564,3222],{},[34,10566,3226],{},[14,10568,133],{"id":133},[42,10570,10571,10577],{},[45,10572,3234,10573,3238,10575,324],{},[34,10574,3237],{},[34,10576,3241],{},[45,10578,3244],{},[14,10580,150],{"id":150},[117,10582,10583,10585],{},[45,10584,3251],{},[45,10586,3254,10587,3257],{},[34,10588,3226],{},[10,10590,165],{},[14,10592,168],{"id":168},[10,10594,3264],{},[173,10596,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10598},[10599,10600,10601,10602,10603,10604,10605,10606],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":3112,"description":3117},[186,3284,3285],{"id":3288,"title":3289,"body":10611,"category":186,"cover":187,"description":3294,"extension":188,"meta":10730,"navigation":190,"path":3436,"pinned":192,"publishedAt":193,"seo":10731,"slug":3438,"stem":3439,"summary":3440,"tags":10732,"updatedAt":193,"visible":190,"__hash__":3443},{"type":7,"value":10612,"toc":10720},[10613,10615,10617,10619,10621,10625,10627,10629,10637,10639,10641,10669,10671,10676,10678,10680,10690,10692,10700,10702,10712,10714,10716,10718],[10,10614,3294],{},[14,10616,16],{"id":16},[10,10618,3299],{},[14,10620,22],{"id":22},[10,10622,10623],{},[26,10624],{"alt":3306,"src":3307},[10,10626,3310],{},[14,10628,40],{"id":40},[42,10630,10631,10633,10635],{},[45,10632,3317],{},[45,10634,3320],{},[45,10636,3323],{},[14,10638,60],{"id":60},[10,10640,1394],{},[65,10642,10643],{"className":371,"code":3330,"language":373,"meta":70,"style":70},[34,10644,10645,10649,10653,10657,10661,10665],{"__ignoreMap":70},[74,10646,10647],{"class":76,"line":77},[74,10648,3337],{},[74,10650,10651],{"class":76,"line":87},[74,10652,3342],{},[74,10654,10655],{"class":76,"line":388},[74,10656,3347],{},[74,10658,10659],{"class":76,"line":394},[74,10660,1051],{"emptyLinePlaceholder":190},[74,10662,10663],{"class":76,"line":1098},[74,10664,3356],{},[74,10666,10667],{"class":76,"line":1104},[74,10668,3361],{},[10,10670,101],{},[65,10672,10674],{"className":10673,"code":3367,"language":107,"meta":70},[105],[34,10675,3367],{"__ignoreMap":70},[10,10677,112],{},[14,10679,115],{"id":115},[117,10681,10682,10686],{},[45,10683,10684,3381],{},[34,10685,3380],{},[45,10687,10688,3387],{},[34,10689,3386],{},[14,10691,133],{"id":133},[42,10693,10694,10698],{},[45,10695,3394,10696,3398],{},[34,10697,3397],{},[45,10699,3401],{},[14,10701,150],{"id":150},[117,10703,10704,10706],{},[45,10705,3408],{},[45,10707,2098,10708,2101,10710,3415],{},[34,10709,3397],{},[34,10711,3386],{},[10,10713,165],{},[14,10715,168],{"id":168},[10,10717,3422],{},[173,10719,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10721},[10722,10723,10724,10725,10726,10727,10728,10729],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":3289,"description":3294},[186,3442,3285],{"id":3445,"title":3446,"body":10734,"category":186,"cover":187,"description":3451,"extension":188,"meta":10859,"navigation":190,"path":3607,"pinned":192,"publishedAt":193,"seo":10860,"slug":3609,"stem":3610,"summary":3611,"tags":10861,"updatedAt":193,"visible":190,"__hash__":3614},{"type":7,"value":10735,"toc":10849},[10736,10738,10740,10742,10744,10748,10754,10756,10766,10768,10770,10798,10800,10805,10807,10809,10819,10821,10833,10835,10841,10843,10845,10847],[10,10737,3451],{},[14,10739,16],{"id":16},[10,10741,3456],{},[14,10743,22],{"id":22},[10,10745,10746],{},[26,10747],{"alt":3463,"src":3464},[10,10749,3467,10750,3471,10752,3474],{},[34,10751,3470],{},[34,10753,2171],{},[14,10755,40],{"id":40},[42,10757,10758,10760,10764],{},[45,10759,3481],{},[45,10761,2264,10762,3487],{},[34,10763,3486],{},[45,10765,3490],{},[14,10767,60],{"id":60},[10,10769,1394],{},[65,10771,10772],{"className":371,"code":3497,"language":373,"meta":70,"style":70},[34,10773,10774,10778,10782,10786,10790,10794],{"__ignoreMap":70},[74,10775,10776],{"class":76,"line":77},[74,10777,3504],{},[74,10779,10780],{"class":76,"line":87},[74,10781,3509],{},[74,10783,10784],{"class":76,"line":388},[74,10785,1051],{"emptyLinePlaceholder":190},[74,10787,10788],{"class":76,"line":394},[74,10789,3518],{},[74,10791,10792],{"class":76,"line":1098},[74,10793,3523],{},[74,10795,10796],{"class":76,"line":1104},[74,10797,3528],{},[10,10799,101],{},[65,10801,10803],{"className":10802,"code":3534,"language":107,"meta":70},[105],[34,10804,3534],{"__ignoreMap":70},[10,10806,112],{},[14,10808,115],{"id":115},[117,10810,10811,10813],{},[45,10812,3545],{},[45,10814,3548,10815,3551,10817,3555],{},[34,10816,2171],{},[34,10818,3554],{},[14,10820,133],{"id":133},[42,10822,10823,10827],{},[45,10824,3562,10825,3566],{},[34,10826,3565],{},[45,10828,3569,10829,3573,10831,324],{},[34,10830,3572],{},[34,10832,3576],{},[14,10834,150],{"id":150},[117,10836,10837,10839],{},[45,10838,3583],{},[45,10840,3586],{},[10,10842,165],{},[14,10844,168],{"id":168},[10,10846,3593],{},[173,10848,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10850},[10851,10852,10853,10854,10855,10856,10857,10858],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":3446,"description":3451},[186,3613,3285],{"id":3616,"title":3617,"body":10863,"category":186,"cover":187,"description":3622,"extension":188,"meta":10986,"navigation":190,"path":3772,"pinned":192,"publishedAt":193,"seo":10987,"slug":3774,"stem":3775,"summary":3776,"tags":10988,"updatedAt":193,"visible":190,"__hash__":3779},{"type":7,"value":10864,"toc":10976},[10865,10867,10869,10871,10873,10877,10879,10881,10893,10895,10897,10925,10927,10932,10934,10936,10946,10948,10958,10960,10968,10970,10972,10974],[10,10866,3622],{},[14,10868,16],{"id":16},[10,10870,3627],{},[14,10872,22],{"id":22},[10,10874,10875],{},[26,10876],{"alt":3634,"src":3635},[10,10878,3638],{},[14,10880,40],{"id":40},[42,10882,10883,10885,10887],{},[45,10884,3645],{},[45,10886,3648],{},[45,10888,3651,10889,3655,10891,3659],{},[34,10890,3654],{},[34,10892,3658],{},[14,10894,60],{"id":60},[10,10896,1394],{},[65,10898,10899],{"className":371,"code":3666,"language":373,"meta":70,"style":70},[34,10900,10901,10905,10909,10913,10917,10921],{"__ignoreMap":70},[74,10902,10903],{"class":76,"line":77},[74,10904,3673],{},[74,10906,10907],{"class":76,"line":87},[74,10908,3678],{},[74,10910,10911],{"class":76,"line":388},[74,10912,1051],{"emptyLinePlaceholder":190},[74,10914,10915],{"class":76,"line":394},[74,10916,3687],{},[74,10918,10919],{"class":76,"line":1098},[74,10920,3692],{},[74,10922,10923],{"class":76,"line":1104},[74,10924,3697],{},[10,10926,101],{},[65,10928,10930],{"className":10929,"code":3703,"language":107,"meta":70},[105],[34,10931,3703],{"__ignoreMap":70},[10,10933,112],{},[14,10935,115],{"id":115},[117,10937,10938,10940],{},[45,10939,3714],{},[45,10941,10942,3720,10944,3724],{},[34,10943,3719],{},[34,10945,3723],{},[14,10947,133],{"id":133},[42,10949,10950,10956],{},[45,10951,2264,10952,3733,10954,324],{},[34,10953,3658],{},[34,10955,3654],{},[45,10957,3738],{},[14,10959,150],{"id":150},[117,10961,10962,10966],{},[45,10963,3745,10964,3748],{},[34,10965,3654],{},[45,10967,3751],{},[10,10969,165],{},[14,10971,168],{"id":168},[10,10973,3758],{},[173,10975,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":10977},[10978,10979,10980,10981,10982,10983,10984,10985],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":3617,"description":3622},[186,3778,3285],{"id":3781,"title":3782,"body":10990,"category":186,"cover":187,"description":3787,"extension":188,"meta":11149,"navigation":190,"path":3986,"pinned":192,"publishedAt":193,"seo":11150,"slug":3988,"stem":3989,"summary":3990,"tags":11151,"updatedAt":193,"visible":190,"__hash__":3994},{"type":7,"value":10991,"toc":11137},[10992,10994,10996,10998,11000,11004,11010,11012,11024,11026,11028,11068,11070,11075,11077,11079,11093,11095,11097,11101,11103,11105,11115,11117,11129,11131,11133,11135],[10,10993,3787],{},[14,10995,16],{"id":16},[10,10997,3792],{},[14,10999,22],{"id":22},[10,11001,11002],{},[26,11003],{"alt":3799,"src":3800},[10,11005,11006,3806,11008,3810],{},[34,11007,3805],{},[34,11009,3809],{},[14,11011,40],{"id":40},[42,11013,11014,11020,11022],{},[45,11015,11016,3819,11018,3823],{},[34,11017,2734],{},[34,11019,3822],{},[45,11021,3826],{},[45,11023,3829],{},[14,11025,60],{"id":60},[10,11027,1394],{},[65,11029,11030],{"className":371,"code":3836,"language":373,"meta":70,"style":70},[34,11031,11032,11036,11040,11044,11048,11052,11056,11060,11064],{"__ignoreMap":70},[74,11033,11034],{"class":76,"line":77},[74,11035,3843],{},[74,11037,11038],{"class":76,"line":87},[74,11039,3848],{},[74,11041,11042],{"class":76,"line":388},[74,11043,3853],{},[74,11045,11046],{"class":76,"line":394},[74,11047,1051],{"emptyLinePlaceholder":190},[74,11049,11050],{"class":76,"line":1098},[74,11051,3862],{},[74,11053,11054],{"class":76,"line":1104},[74,11055,3867],{},[74,11057,11058],{"class":76,"line":2414},[74,11059,3872],{},[74,11061,11062],{"class":76,"line":2420},[74,11063,3877],{},[74,11065,11066],{"class":76,"line":3880},[74,11067,3883],{},[10,11069,101],{},[65,11071,11073],{"className":11072,"code":3889,"language":107,"meta":70},[105],[34,11074,3889],{"__ignoreMap":70},[10,11076,112],{},[14,11078,115],{"id":115},[117,11080,11081,11085],{},[45,11082,11083,3903],{},[34,11084,3902],{},[45,11086,11087,3909,11089,3913,11091,3917],{},[34,11088,3908],{},[34,11090,3912],{},[34,11092,3916],{},[290,11094,2624],{"id":2624},[10,11096,3922],{},[10,11098,11099],{},[26,11100],{"alt":3927,"src":3928},[10,11102,3931],{},[14,11104,133],{"id":133},[42,11106,11107,11113],{},[45,11108,3938,11109,3941,11111,324],{},[34,11110,2734],{},[34,11112,3822],{},[45,11114,3946],{},[14,11116,150],{"id":150},[117,11118,11119,11121],{},[45,11120,3953],{},[45,11122,2264,11123,3959,11125,1113,11127,324],{},[34,11124,3958],{},[34,11126,3822],{},[34,11128,2734],{},[10,11130,165],{},[14,11132,168],{"id":168},[10,11134,3970],{},[173,11136,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11138},[11139,11140,11141,11142,11143,11146,11147,11148],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":11144},[11145],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":3782,"description":3787},[186,3992,3993],{"id":3996,"title":3997,"body":11153,"category":186,"cover":187,"description":4002,"extension":188,"meta":11325,"navigation":190,"path":4216,"pinned":192,"publishedAt":193,"seo":11326,"slug":4218,"stem":4219,"summary":4220,"tags":11327,"updatedAt":193,"visible":190,"__hash__":4223},{"type":7,"value":11154,"toc":11312},[11155,11157,11159,11161,11163,11167,11175,11177,11185,11187,11189,11233,11235,11240,11242,11244,11256,11258,11260,11264,11270,11272,11274,11278,11282,11284,11296,11298,11304,11306,11308,11310],[10,11156,4002],{},[14,11158,16],{"id":16},[10,11160,4007],{},[14,11162,22],{"id":22},[10,11164,11165],{},[26,11166],{"alt":4014,"src":4015},[10,11168,11169,2182,11171,2182,11173,4025],{},[34,11170,1112],{},[34,11172,4022],{},[34,11174,1116],{},[14,11176,40],{"id":40},[42,11178,11179,11181,11183],{},[45,11180,4032],{},[45,11182,4035],{},[45,11184,4038],{},[14,11186,60],{"id":60},[10,11188,1394],{},[65,11190,11191],{"className":371,"code":4045,"language":373,"meta":70,"style":70},[34,11192,11193,11197,11201,11205,11209,11213,11217,11221,11225,11229],{"__ignoreMap":70},[74,11194,11195],{"class":76,"line":77},[74,11196,4052],{},[74,11198,11199],{"class":76,"line":87},[74,11200,1051],{"emptyLinePlaceholder":190},[74,11202,11203],{"class":76,"line":388},[74,11204,4061],{},[74,11206,11207],{"class":76,"line":394},[74,11208,4066],{},[74,11210,11211],{"class":76,"line":1098},[74,11212,4071],{},[74,11214,11215],{"class":76,"line":1104},[74,11216,4076],{},[74,11218,11219],{"class":76,"line":2414},[74,11220,1101],{},[74,11222,11223],{"class":76,"line":2420},[74,11224,4085],{},[74,11226,11227],{"class":76,"line":3880},[74,11228,1051],{"emptyLinePlaceholder":190},[74,11230,11231],{"class":76,"line":4092},[74,11232,4095],{},[10,11234,101],{},[65,11236,11238],{"className":11237,"code":4101,"language":107,"meta":70},[105],[34,11239,4101],{"__ignoreMap":70},[10,11241,112],{},[14,11243,115],{"id":115},[117,11245,11246,11250],{},[45,11247,4112,11248,4116],{},[34,11249,4115],{},[45,11251,11252,4122,11254,4125],{},[34,11253,4121],{},[34,11255,1116],{},[290,11257,2624],{"id":2624},[10,11259,4130],{},[10,11261,11262],{},[26,11263],{"alt":4135,"src":4136},[10,11265,11266,4141,11268,4144],{},[34,11267,4115],{},[34,11269,4121],{},[290,11271,2624],{"id":4147},[10,11273,4150],{},[10,11275,11276],{},[26,11277],{"alt":4155,"src":4156},[10,11279,4159,11280,4162],{},[34,11281,1112],{},[14,11283,133],{"id":133},[42,11285,11286,11290],{},[45,11287,4169,11288,4172],{},[34,11289,4121],{},[45,11291,4175,11292,4178,11294,4182],{},[34,11293,1112],{},[34,11295,4181],{},[14,11297,150],{"id":150},[117,11299,11300,11302],{},[45,11301,4189],{},[45,11303,4192],{},[10,11305,165],{},[14,11307,168],{"id":168},[10,11309,4199],{},[173,11311,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11313},[11314,11315,11316,11317,11318,11322,11323,11324],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":11319},[11320,11321],{"id":2624,"depth":388,"text":2624},{"id":4147,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":3997,"description":4002},[186,1112,4222],{"id":4225,"title":4226,"body":11329,"category":186,"cover":187,"description":4231,"extension":188,"meta":11466,"navigation":190,"path":4398,"pinned":192,"publishedAt":193,"seo":11467,"slug":4400,"stem":4401,"summary":4402,"tags":11468,"updatedAt":193,"visible":190,"__hash__":4405},{"type":7,"value":11330,"toc":11454},[11331,11333,11335,11337,11339,11343,11347,11349,11359,11361,11363,11395,11397,11402,11404,11406,11416,11418,11420,11424,11428,11430,11436,11438,11446,11448,11450,11452],[10,11332,4231],{},[14,11334,16],{"id":16},[10,11336,4236],{},[14,11338,22],{"id":22},[10,11340,11341],{},[26,11342],{"alt":4243,"src":4244},[10,11344,11345,4250],{},[34,11346,4249],{},[14,11348,40],{"id":40},[42,11350,11351,11353,11355],{},[45,11352,4257],{},[45,11354,4260],{},[45,11356,4263,11357,4267],{},[34,11358,4266],{},[14,11360,60],{"id":60},[10,11362,1394],{},[65,11364,11365],{"className":371,"code":4274,"language":373,"meta":70,"style":70},[34,11366,11367,11371,11375,11379,11383,11387,11391],{"__ignoreMap":70},[74,11368,11369],{"class":76,"line":77},[74,11370,4281],{},[74,11372,11373],{"class":76,"line":87},[74,11374,1051],{"emptyLinePlaceholder":190},[74,11376,11377],{"class":76,"line":388},[74,11378,4290],{},[74,11380,11381],{"class":76,"line":394},[74,11382,4295],{},[74,11384,11385],{"class":76,"line":1098},[74,11386,4300],{},[74,11388,11389],{"class":76,"line":1104},[74,11390,1051],{"emptyLinePlaceholder":190},[74,11392,11393],{"class":76,"line":2414},[74,11394,4309],{},[10,11396,101],{},[65,11398,11400],{"className":11399,"code":4315,"language":107,"meta":70},[105],[34,11401,4315],{"__ignoreMap":70},[10,11403,112],{},[14,11405,115],{"id":115},[117,11407,11408,11412],{},[45,11409,4326,11410,4330],{},[34,11411,4329],{},[45,11413,4333,11414,4336],{},[34,11415,4329],{},[290,11417,2624],{"id":2624},[10,11419,4341],{},[10,11421,11422],{},[26,11423],{"alt":4346,"src":4347},[10,11425,4350,11426,4353],{},[34,11427,4329],{},[14,11429,133],{"id":133},[42,11431,11432,11434],{},[45,11433,4360],{},[45,11435,4363],{},[14,11437,150],{"id":150},[117,11439,11440,11444],{},[45,11441,2264,11442,4372],{},[34,11443,4249],{},[45,11445,4375],{},[10,11447,165],{},[14,11449,168],{"id":168},[10,11451,4382],{},[173,11453,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11455},[11456,11457,11458,11459,11460,11463,11464,11465],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":11461},[11462],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":4226,"description":4231},[186,4249,4404],{"id":4407,"title":4408,"body":11470,"category":186,"cover":187,"description":4413,"extension":188,"meta":11595,"navigation":190,"path":4562,"pinned":192,"publishedAt":193,"seo":11596,"slug":4564,"stem":4565,"summary":4566,"tags":11597,"updatedAt":193,"visible":190,"__hash__":4569},{"type":7,"value":11471,"toc":11585},[11472,11474,11476,11478,11480,11484,11488,11490,11500,11502,11504,11536,11538,11543,11545,11547,11559,11561,11567,11569,11577,11579,11581,11583],[10,11473,4413],{},[14,11475,16],{"id":16},[10,11477,4418],{},[14,11479,22],{"id":22},[10,11481,11482],{},[26,11483],{"alt":4425,"src":4426},[10,11485,11486,4431],{},[34,11487,4266],{},[14,11489,40],{"id":40},[42,11491,11492,11496,11498],{},[45,11493,11494,4441],{},[34,11495,4440],{},[45,11497,4444],{},[45,11499,4447],{},[14,11501,60],{"id":60},[10,11503,1394],{},[65,11505,11506],{"className":371,"code":4454,"language":373,"meta":70,"style":70},[34,11507,11508,11512,11516,11520,11524,11528,11532],{"__ignoreMap":70},[74,11509,11510],{"class":76,"line":77},[74,11511,4461],{},[74,11513,11514],{"class":76,"line":87},[74,11515,1051],{"emptyLinePlaceholder":190},[74,11517,11518],{"class":76,"line":388},[74,11519,4470],{},[74,11521,11522],{"class":76,"line":394},[74,11523,4475],{},[74,11525,11526],{"class":76,"line":1098},[74,11527,1051],{"emptyLinePlaceholder":190},[74,11529,11530],{"class":76,"line":1104},[74,11531,4484],{},[74,11533,11534],{"class":76,"line":2414},[74,11535,4489],{},[10,11537,101],{},[65,11539,11541],{"className":11540,"code":4495,"language":107,"meta":70},[105],[34,11542,4495],{"__ignoreMap":70},[10,11544,112],{},[14,11546,115],{"id":115},[117,11548,11549,11555],{},[45,11550,4506,11551,4509,11553,4513],{},[34,11552,4266],{},[34,11554,4512],{},[45,11556,11557,4518],{},[34,11558,4440],{},[14,11560,133],{"id":133},[42,11562,11563,11565],{},[45,11564,4525],{},[45,11566,4528],{},[14,11568,150],{"id":150},[117,11570,11571,11573],{},[45,11572,4535],{},[45,11574,2264,11575,4541],{},[34,11576,4540],{},[10,11578,165],{},[14,11580,168],{"id":168},[10,11582,4548],{},[173,11584,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11586},[11587,11588,11589,11590,11591,11592,11593,11594],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":4408,"description":4413},[186,4266,4568],{"id":4571,"title":4572,"body":11599,"category":186,"cover":187,"description":4577,"extension":188,"meta":11744,"navigation":190,"path":4752,"pinned":192,"publishedAt":193,"seo":11745,"slug":4754,"stem":4755,"summary":4756,"tags":11746,"updatedAt":193,"visible":190,"__hash__":4758},{"type":7,"value":11600,"toc":11734},[11601,11603,11605,11607,11609,11613,11619,11621,11635,11637,11639,11683,11685,11690,11692,11694,11704,11706,11718,11720,11726,11728,11730,11732],[10,11602,4577],{},[14,11604,16],{"id":16},[10,11606,4582],{},[14,11608,22],{"id":22},[10,11610,11611],{},[26,11612],{"alt":4589,"src":4590},[10,11614,11615,4596,11617,4600],{},[34,11616,4595],{},[34,11618,4599],{},[14,11620,40],{"id":40},[42,11622,11623,11625,11631],{},[45,11624,4607],{},[45,11626,11627,4612,11629,4615],{},[34,11628,4595],{},[34,11630,4249],{},[45,11632,4618,11633,4621],{},[34,11634,4599],{},[14,11636,60],{"id":60},[10,11638,1394],{},[65,11640,11641],{"className":371,"code":4628,"language":373,"meta":70,"style":70},[34,11642,11643,11647,11651,11655,11659,11663,11667,11671,11675,11679],{"__ignoreMap":70},[74,11644,11645],{"class":76,"line":77},[74,11646,4635],{},[74,11648,11649],{"class":76,"line":87},[74,11650,1051],{"emptyLinePlaceholder":190},[74,11652,11653],{"class":76,"line":388},[74,11654,4644],{},[74,11656,11657],{"class":76,"line":394},[74,11658,4649],{},[74,11660,11661],{"class":76,"line":1098},[74,11662,4654],{},[74,11664,11665],{"class":76,"line":1104},[74,11666,4659],{},[74,11668,11669],{"class":76,"line":2414},[74,11670,4664],{},[74,11672,11673],{"class":76,"line":2420},[74,11674,4489],{},[74,11676,11677],{"class":76,"line":3880},[74,11678,1051],{"emptyLinePlaceholder":190},[74,11680,11681],{"class":76,"line":4092},[74,11682,4677],{},[10,11684,101],{},[65,11686,11688],{"className":11687,"code":4683,"language":107,"meta":70},[105],[34,11689,4683],{"__ignoreMap":70},[10,11691,112],{},[14,11693,115],{"id":115},[117,11695,11696,11700],{},[45,11697,4694,11698,4697],{},[34,11699,4595],{},[45,11701,4700,11702,4703],{},[34,11703,4599],{},[14,11705,133],{"id":133},[42,11707,11708,11712],{},[45,11709,3394,11710,4712],{},[34,11711,4595],{},[45,11713,4715,11714,4718,11716,4721],{},[34,11715,4249],{},[34,11717,4595],{},[14,11719,150],{"id":150},[117,11721,11722,11724],{},[45,11723,4728],{},[45,11725,4731],{},[10,11727,165],{},[14,11729,168],{"id":168},[10,11731,4738],{},[173,11733,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11735},[11736,11737,11738,11739,11740,11741,11742,11743],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":4572,"description":4577},[186,4599,4595],{"id":4760,"title":4761,"body":11748,"category":186,"cover":187,"description":4766,"extension":188,"meta":11887,"navigation":190,"path":4938,"pinned":192,"publishedAt":193,"seo":11888,"slug":4940,"stem":4941,"summary":4942,"tags":11889,"updatedAt":193,"visible":190,"__hash__":4946},{"type":7,"value":11749,"toc":11875},[11750,11752,11754,11756,11758,11762,11764,11766,11782,11784,11786,11814,11816,11821,11823,11825,11837,11839,11841,11845,11847,11849,11859,11861,11867,11869,11871,11873],[10,11751,4766],{},[14,11753,16],{"id":16},[10,11755,4771],{},[14,11757,22],{"id":22},[10,11759,11760],{},[26,11761],{"alt":4778,"src":4779},[10,11763,4782],{},[14,11765,40],{"id":40},[42,11767,11768,11770,11772],{},[45,11769,4789],{},[45,11771,4792],{},[45,11773,4795,11774,2182,11776,4802,11778,2182,11780,324],{},[34,11775,4798],{},[34,11777,4801],{},[34,11779,4805],{},[34,11781,4808],{},[14,11783,60],{"id":60},[10,11785,1394],{},[65,11787,11788],{"className":371,"code":4815,"language":373,"meta":70,"style":70},[34,11789,11790,11794,11798,11802,11806,11810],{"__ignoreMap":70},[74,11791,11792],{"class":76,"line":77},[74,11793,4822],{},[74,11795,11796],{"class":76,"line":87},[74,11797,1051],{"emptyLinePlaceholder":190},[74,11799,11800],{"class":76,"line":388},[74,11801,4831],{},[74,11803,11804],{"class":76,"line":394},[74,11805,4836],{},[74,11807,11808],{"class":76,"line":1098},[74,11809,4841],{},[74,11811,11812],{"class":76,"line":1104},[74,11813,4846],{},[10,11815,101],{},[65,11817,11819],{"className":11818,"code":4852,"language":107,"meta":70},[105],[34,11820,4852],{"__ignoreMap":70},[10,11822,112],{},[14,11824,115],{"id":115},[117,11826,11827,11835],{},[45,11828,4863,11829,4866,11831,1113,11833,324],{},[34,11830,4798],{},[34,11832,4869],{},[34,11834,4872],{},[45,11836,4875],{},[290,11838,2624],{"id":2624},[10,11840,4880],{},[10,11842,11843],{},[26,11844],{"alt":4885,"src":4886},[10,11846,4889],{},[14,11848,133],{"id":133},[42,11850,11851,11857],{},[45,11852,4896,11853,963,11855,4902],{},[34,11854,4899],{},[34,11856,4805],{},[45,11858,4905],{},[14,11860,150],{"id":150},[117,11862,11863,11865],{},[45,11864,4912],{},[45,11866,4915],{},[10,11868,165],{},[14,11870,168],{"id":168},[10,11872,4922],{},[173,11874,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11876},[11877,11878,11879,11880,11881,11884,11885,11886],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":11882},[11883],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":4761,"description":4766},[186,4944,4945],{"id":4948,"title":4949,"body":11891,"category":186,"cover":187,"description":4954,"extension":188,"meta":12008,"navigation":190,"path":5093,"pinned":192,"publishedAt":193,"seo":12009,"slug":5095,"stem":5096,"summary":5097,"tags":12010,"updatedAt":193,"visible":190,"__hash__":5101},{"type":7,"value":11892,"toc":11998},[11893,11895,11897,11899,11901,11905,11907,11909,11917,11919,11921,11953,11955,11960,11962,11964,11972,11974,11982,11984,11990,11992,11994,11996],[10,11894,4954],{},[14,11896,16],{"id":16},[10,11898,4959],{},[14,11900,22],{"id":22},[10,11902,11903],{},[26,11904],{"alt":4966,"src":4967},[10,11906,4970],{},[14,11908,40],{"id":40},[42,11910,11911,11913,11915],{},[45,11912,4977],{},[45,11914,4980],{},[45,11916,4983],{},[14,11918,60],{"id":60},[10,11920,1394],{},[65,11922,11923],{"className":371,"code":4990,"language":373,"meta":70,"style":70},[34,11924,11925,11929,11933,11937,11941,11945,11949],{"__ignoreMap":70},[74,11926,11927],{"class":76,"line":77},[74,11928,4997],{},[74,11930,11931],{"class":76,"line":87},[74,11932,1051],{"emptyLinePlaceholder":190},[74,11934,11935],{"class":76,"line":388},[74,11936,5006],{},[74,11938,11939],{"class":76,"line":394},[74,11940,5011],{},[74,11942,11943],{"class":76,"line":1098},[74,11944,1051],{"emptyLinePlaceholder":190},[74,11946,11947],{"class":76,"line":1104},[74,11948,5020],{},[74,11950,11951],{"class":76,"line":2414},[74,11952,5025],{},[10,11954,101],{},[65,11956,11958],{"className":11957,"code":5031,"language":107,"meta":70},[105],[34,11959,5031],{"__ignoreMap":70},[10,11961,112],{},[14,11963,115],{"id":115},[117,11965,11966,11968],{},[45,11967,5042],{},[45,11969,5045,11970,5049],{},[34,11971,5048],{},[14,11973,133],{"id":133},[42,11975,11976,11980],{},[45,11977,5056,11978,5059],{},[34,11979,4266],{},[45,11981,5062],{},[14,11983,150],{"id":150},[117,11985,11986,11988],{},[45,11987,5069],{},[45,11989,5072],{},[10,11991,165],{},[14,11993,168],{"id":168},[10,11995,5079],{},[173,11997,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":11999},[12000,12001,12002,12003,12004,12005,12006,12007],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":4949,"description":4954},[186,5099,5100],{"id":5103,"title":5104,"body":12012,"category":186,"cover":187,"description":5109,"extension":188,"meta":12131,"navigation":190,"path":5253,"pinned":192,"publishedAt":193,"seo":12132,"slug":5255,"stem":5256,"summary":5257,"tags":12133,"updatedAt":193,"visible":190,"__hash__":5261},{"type":7,"value":12013,"toc":12121},[12014,12016,12018,12020,12022,12026,12028,12030,12038,12040,12042,12074,12076,12081,12083,12085,12095,12097,12103,12105,12113,12115,12117,12119],[10,12015,5109],{},[14,12017,16],{"id":16},[10,12019,5114],{},[14,12021,22],{"id":22},[10,12023,12024],{},[26,12025],{"alt":5121,"src":5122},[10,12027,5125],{},[14,12029,40],{"id":40},[42,12031,12032,12034,12036],{},[45,12033,5132],{},[45,12035,5135],{},[45,12037,5138],{},[14,12039,60],{"id":60},[10,12041,1394],{},[65,12043,12044],{"className":371,"code":5145,"language":373,"meta":70,"style":70},[34,12045,12046,12050,12054,12058,12062,12066,12070],{"__ignoreMap":70},[74,12047,12048],{"class":76,"line":77},[74,12049,5152],{},[74,12051,12052],{"class":76,"line":87},[74,12053,5157],{},[74,12055,12056],{"class":76,"line":388},[74,12057,5162],{},[74,12059,12060],{"class":76,"line":394},[74,12061,1051],{"emptyLinePlaceholder":190},[74,12063,12064],{"class":76,"line":1098},[74,12065,5171],{},[74,12067,12068],{"class":76,"line":1104},[74,12069,5176],{},[74,12071,12072],{"class":76,"line":2414},[74,12073,5181],{},[10,12075,101],{},[65,12077,12079],{"className":12078,"code":5187,"language":107,"meta":70},[105],[34,12080,5187],{"__ignoreMap":70},[10,12082,112],{},[14,12084,115],{"id":115},[117,12086,12087,12091],{},[45,12088,155,12089,5201],{},[34,12090,5200],{},[45,12092,5204,12093,5208],{},[34,12094,5207],{},[14,12096,133],{"id":133},[42,12098,12099,12101],{},[45,12100,5215],{},[45,12102,5218],{},[14,12104,150],{"id":150},[117,12106,12107,12111],{},[45,12108,5225,12109,5229],{},[34,12110,5228],{},[45,12112,5232],{},[10,12114,165],{},[14,12116,168],{"id":168},[10,12118,5239],{},[173,12120,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":12122},[12123,12124,12125,12126,12127,12128,12129,12130],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5104,"description":5109},[186,5259,5260],{"id":5263,"title":5264,"body":12135,"category":186,"cover":187,"description":5269,"extension":188,"meta":12280,"navigation":190,"path":5450,"pinned":192,"publishedAt":193,"seo":12281,"slug":5452,"stem":5453,"summary":5454,"tags":12282,"updatedAt":193,"visible":190,"__hash__":5458},{"type":7,"value":12136,"toc":12268},[12137,12139,12141,12143,12145,12149,12153,12155,12167,12169,12171,12199,12201,12206,12208,12210,12224,12226,12228,12232,12240,12242,12252,12254,12260,12262,12264,12266],[10,12138,5269],{},[14,12140,16],{"id":16},[10,12142,5274],{},[14,12144,22],{"id":22},[10,12146,12147],{},[26,12148],{"alt":5281,"src":5282},[10,12150,5285,12151,5289],{},[34,12152,5288],{},[14,12154,40],{"id":40},[42,12156,12157,12159,12161],{},[45,12158,5296],{},[45,12160,5299],{},[45,12162,5302,12163,5305,12165,324],{},[34,12164,5288],{},[34,12166,5308],{},[14,12168,60],{"id":60},[10,12170,1394],{},[65,12172,12173],{"className":371,"code":5315,"language":373,"meta":70,"style":70},[34,12174,12175,12179,12183,12187,12191,12195],{"__ignoreMap":70},[74,12176,12177],{"class":76,"line":77},[74,12178,5322],{},[74,12180,12181],{"class":76,"line":87},[74,12182,5327],{},[74,12184,12185],{"class":76,"line":388},[74,12186,5332],{},[74,12188,12189],{"class":76,"line":394},[74,12190,1051],{"emptyLinePlaceholder":190},[74,12192,12193],{"class":76,"line":1098},[74,12194,5341],{},[74,12196,12197],{"class":76,"line":1104},[74,12198,5346],{},[10,12200,101],{},[65,12202,12204],{"className":12203,"code":5352,"language":107,"meta":70},[105],[34,12205,5352],{"__ignoreMap":70},[10,12207,112],{},[14,12209,115],{"id":115},[117,12211,12212,12218],{},[45,12213,5363,12214,2182,12216,5369],{},[34,12215,5366],{},[34,12217,4329],{},[45,12219,12220,5375,12222,5379],{},[34,12221,5374],{},[34,12223,5378],{},[290,12225,2624],{"id":2624},[10,12227,5384],{},[10,12229,12230],{},[26,12231],{"alt":5389,"src":5390},[10,12233,12234,2182,12236,1113,12238,5400],{},[34,12235,5366],{},[34,12237,4329],{},[34,12239,5399],{},[14,12241,133],{"id":133},[42,12243,12244,12248],{},[45,12245,5407,12246,5411],{},[34,12247,5410],{},[45,12249,5414,12250,5417],{},[34,12251,5399],{},[14,12253,150],{"id":150},[117,12255,12256,12258],{},[45,12257,5424],{},[45,12259,5427],{},[10,12261,165],{},[14,12263,168],{"id":168},[10,12265,5434],{},[173,12267,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":12269},[12270,12271,12272,12273,12274,12277,12278,12279],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":12275},[12276],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5264,"description":5269},[186,5456,5457],{"id":5460,"title":5461,"body":12284,"category":186,"cover":187,"description":5466,"extension":188,"meta":12433,"navigation":190,"path":5647,"pinned":192,"publishedAt":193,"seo":12434,"slug":5649,"stem":5650,"summary":5651,"tags":12435,"updatedAt":193,"visible":190,"__hash__":5655},{"type":7,"value":12285,"toc":12421},[12286,12288,12290,12292,12294,12298,12300,12302,12314,12316,12318,12362,12364,12369,12371,12373,12385,12387,12389,12393,12395,12397,12405,12407,12413,12415,12417,12419],[10,12287,5466],{},[14,12289,16],{"id":16},[10,12291,5471],{},[14,12293,22],{"id":22},[10,12295,12296],{},[26,12297],{"alt":5478,"src":5479},[10,12299,5482],{},[14,12301,40],{"id":40},[42,12303,12304,12306,12310],{},[45,12305,5489],{},[45,12307,12308,5495],{},[34,12309,5494],{},[45,12311,12312,5501],{},[34,12313,5500],{},[14,12315,60],{"id":60},[10,12317,1394],{},[65,12319,12320],{"className":371,"code":5508,"language":373,"meta":70,"style":70},[34,12321,12322,12326,12330,12334,12338,12342,12346,12350,12354,12358],{"__ignoreMap":70},[74,12323,12324],{"class":76,"line":77},[74,12325,5515],{},[74,12327,12328],{"class":76,"line":87},[74,12329,5520],{},[74,12331,12332],{"class":76,"line":388},[74,12333,1051],{"emptyLinePlaceholder":190},[74,12335,12336],{"class":76,"line":394},[74,12337,5529],{},[74,12339,12340],{"class":76,"line":1098},[74,12341,5534],{},[74,12343,12344],{"class":76,"line":1104},[74,12345,1051],{"emptyLinePlaceholder":190},[74,12347,12348],{"class":76,"line":2414},[74,12349,5543],{},[74,12351,12352],{"class":76,"line":2420},[74,12353,5548],{},[74,12355,12356],{"class":76,"line":3880},[74,12357,1051],{"emptyLinePlaceholder":190},[74,12359,12360],{"class":76,"line":4092},[74,12361,5557],{},[10,12363,101],{},[65,12365,12367],{"className":12366,"code":5563,"language":107,"meta":70},[105],[34,12368,5563],{"__ignoreMap":70},[10,12370,112],{},[14,12372,115],{"id":115},[117,12374,12375,12379],{},[45,12376,5574,12377,5578],{},[34,12378,5577],{},[45,12380,12381,5584,12383,324],{},[34,12382,5583],{},[34,12384,5587],{},[290,12386,2624],{"id":2624},[10,12388,5592],{},[10,12390,12391],{},[26,12392],{"alt":5597,"src":5598},[10,12394,5601],{},[14,12396,133],{"id":133},[42,12398,12399,12403],{},[45,12400,5608,12401,5611],{},[34,12402,5308],{},[45,12404,5614],{},[14,12406,150],{"id":150},[117,12408,12409,12411],{},[45,12410,5621],{},[45,12412,5624],{},[10,12414,165],{},[14,12416,168],{"id":168},[10,12418,5631],{},[173,12420,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":12422},[12423,12424,12425,12426,12427,12430,12431,12432],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":12428},[12429],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5461,"description":5466},[186,5653,5654],{"id":5657,"title":5658,"body":12437,"category":186,"cover":187,"description":5663,"extension":188,"meta":12598,"navigation":190,"path":5861,"pinned":192,"publishedAt":193,"seo":12599,"slug":5863,"stem":5864,"summary":5865,"tags":12600,"updatedAt":193,"visible":190,"__hash__":5869},{"type":7,"value":12438,"toc":12586},[12439,12441,12443,12445,12447,12451,12453,12455,12467,12469,12471,12523,12525,12530,12532,12534,12552,12554,12556,12560,12562,12564,12570,12572,12578,12580,12582,12584],[10,12440,5663],{},[14,12442,16],{"id":16},[10,12444,5668],{},[14,12446,22],{"id":22},[10,12448,12449],{},[26,12450],{"alt":5675,"src":5676},[10,12452,5679],{},[14,12454,40],{"id":40},[42,12456,12457,12459,12461],{},[45,12458,5686],{},[45,12460,5689],{},[45,12462,12463,2101,12465,5698],{},[34,12464,5694],{},[34,12466,5697],{},[14,12468,60],{"id":60},[10,12470,1394],{},[65,12472,12473],{"className":371,"code":5705,"language":373,"meta":70,"style":70},[34,12474,12475,12479,12483,12487,12491,12495,12499,12503,12507,12511,12515,12519],{"__ignoreMap":70},[74,12476,12477],{"class":76,"line":77},[74,12478,5712],{},[74,12480,12481],{"class":76,"line":87},[74,12482,1051],{"emptyLinePlaceholder":190},[74,12484,12485],{"class":76,"line":388},[74,12486,5721],{},[74,12488,12489],{"class":76,"line":394},[74,12490,5726],{},[74,12492,12493],{"class":76,"line":1098},[74,12494,1051],{"emptyLinePlaceholder":190},[74,12496,12497],{"class":76,"line":1104},[74,12498,5735],{},[74,12500,12501],{"class":76,"line":2414},[74,12502,5740],{},[74,12504,12505],{"class":76,"line":2420},[74,12506,5745],{},[74,12508,12509],{"class":76,"line":3880},[74,12510,1051],{"emptyLinePlaceholder":190},[74,12512,12513],{"class":76,"line":4092},[74,12514,5754],{},[74,12516,12517],{"class":76,"line":5757},[74,12518,1051],{"emptyLinePlaceholder":190},[74,12520,12521],{"class":76,"line":5762},[74,12522,5765],{},[10,12524,101],{},[65,12526,12528],{"className":12527,"code":5771,"language":107,"meta":70},[105],[34,12529,5771],{"__ignoreMap":70},[10,12531,112],{},[14,12533,115],{"id":115},[117,12535,12536,12546],{},[45,12537,12538,5785,12540,5789,12542,5792,12544,5796],{},[34,12539,5784],{},[34,12541,5788],{},[34,12543,5577],{},[34,12545,5795],{},[45,12547,12548,5801,12550,5804],{},[34,12549,4512],{},[34,12551,2133],{},[290,12553,2624],{"id":2624},[10,12555,5809],{},[10,12557,12558],{},[26,12559],{"alt":5814,"src":5815},[10,12561,5818],{},[14,12563,133],{"id":133},[42,12565,12566,12568],{},[45,12567,5825],{},[45,12569,5828],{},[14,12571,150],{"id":150},[117,12573,12574,12576],{},[45,12575,5835],{},[45,12577,5838],{},[10,12579,165],{},[14,12581,168],{"id":168},[10,12583,5845],{},[173,12585,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":12587},[12588,12589,12590,12591,12592,12595,12596,12597],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":12593},[12594],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5658,"description":5663},[186,5867,5868],{"id":5871,"title":5872,"body":12602,"category":186,"cover":187,"description":5877,"extension":188,"meta":12725,"navigation":190,"path":6028,"pinned":192,"publishedAt":193,"seo":12726,"slug":6030,"stem":6031,"summary":6032,"tags":12727,"updatedAt":193,"visible":190,"__hash__":6036},{"type":7,"value":12603,"toc":12715},[12604,12606,12608,12610,12612,12616,12618,12620,12634,12636,12638,12666,12668,12673,12675,12677,12687,12689,12697,12699,12707,12709,12711,12713],[10,12605,5877],{},[14,12607,16],{"id":16},[10,12609,5882],{},[14,12611,22],{"id":22},[10,12613,12614],{},[26,12615],{"alt":5889,"src":5890},[10,12617,5893],{},[14,12619,40],{"id":40},[42,12621,12622,12624,12626],{},[45,12623,5900],{},[45,12625,5903],{},[45,12627,5906,12628,2182,12630,2182,12632,5914],{},[34,12629,2185],{},[34,12631,2351],{},[34,12633,5913],{},[14,12635,60],{"id":60},[10,12637,1394],{},[65,12639,12640],{"className":371,"code":5921,"language":373,"meta":70,"style":70},[34,12641,12642,12646,12650,12654,12658,12662],{"__ignoreMap":70},[74,12643,12644],{"class":76,"line":77},[74,12645,5928],{},[74,12647,12648],{"class":76,"line":87},[74,12649,5933],{},[74,12651,12652],{"class":76,"line":388},[74,12653,5938],{},[74,12655,12656],{"class":76,"line":394},[74,12657,1051],{"emptyLinePlaceholder":190},[74,12659,12660],{"class":76,"line":1098},[74,12661,5947],{},[74,12663,12664],{"class":76,"line":1104},[74,12665,5952],{},[10,12667,101],{},[65,12669,12671],{"className":12670,"code":5958,"language":107,"meta":70},[105],[34,12672,5958],{"__ignoreMap":70},[10,12674,112],{},[14,12676,115],{"id":115},[117,12678,12679,12685],{},[45,12680,5969,12681,5973,12683,5976],{},[34,12682,5972],{},[34,12684,2171],{},[45,12686,5979],{},[14,12688,133],{"id":133},[42,12690,12691,12695],{},[45,12692,5986,12693,5990],{},[34,12694,5989],{},[45,12696,5993],{},[14,12698,150],{"id":150},[117,12700,12701,12703],{},[45,12702,6000],{},[45,12704,6003,12705,6007],{},[34,12706,6006],{},[10,12708,165],{},[14,12710,168],{"id":168},[10,12712,6014],{},[173,12714,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":12716},[12717,12718,12719,12720,12721,12722,12723,12724],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":5872,"description":5877},[186,6034,6035],{"id":6038,"title":6039,"body":12729,"category":186,"cover":187,"description":6044,"extension":188,"meta":12906,"navigation":190,"path":6272,"pinned":192,"publishedAt":193,"seo":12907,"slug":6274,"stem":6275,"summary":6276,"tags":12908,"updatedAt":193,"visible":190,"__hash__":6280},{"type":7,"value":12730,"toc":12894},[12731,12733,12735,12739,12741,12745,12751,12753,12765,12767,12771,12795,12799,12815,12821,12823,12828,12830,12832,12848,12850,12852,12856,12860,12862,12874,12876,12886,12888,12890,12892],[10,12732,6044],{},[14,12734,16],{"id":16},[10,12736,6049,12737,6052],{},[256,12738,5972],{},[14,12740,22],{"id":22},[10,12742,12743],{},[26,12744],{"alt":6059,"src":6060},[10,12746,6063,12747,6067,12749,6071],{},[34,12748,6066],{},[34,12750,6070],{},[14,12752,40],{"id":40},[42,12754,12755,12759,12761],{},[45,12756,6078,12757,6081],{},[34,12758,1127],{},[45,12760,6084],{},[45,12762,6087,12763,6091],{},[34,12764,6090],{},[14,12766,60],{"id":60},[10,12768,6096,12769,6100],{},[34,12770,6099],{},[65,12772,12773],{"className":371,"code":6103,"language":373,"meta":70,"style":70},[34,12774,12775,12779,12783,12787,12791],{"__ignoreMap":70},[74,12776,12777],{"class":76,"line":77},[74,12778,6110],{},[74,12780,12781],{"class":76,"line":87},[74,12782,6115],{},[74,12784,12785],{"class":76,"line":388},[74,12786,1051],{"emptyLinePlaceholder":190},[74,12788,12789],{"class":76,"line":394},[74,12790,6124],{},[74,12792,12793],{"class":76,"line":1098},[74,12794,6129],{},[10,12796,6132,12797,6136],{},[34,12798,6135],{},[65,12800,12801],{"className":371,"code":6139,"language":373,"meta":70,"style":70},[34,12802,12803,12807,12811],{"__ignoreMap":70},[74,12804,12805],{"class":76,"line":77},[74,12806,6146],{},[74,12808,12809],{"class":76,"line":87},[74,12810,1051],{"emptyLinePlaceholder":190},[74,12812,12813],{"class":76,"line":388},[74,12814,6155],{},[10,12816,6158,12817,1113,12819,324],{},[34,12818,6161],{},[34,12820,6164],{},[10,12822,101],{},[65,12824,12826],{"className":12825,"code":6170,"language":107,"meta":70},[105],[34,12827,6170],{"__ignoreMap":70},[10,12829,112],{},[14,12831,115],{"id":115},[117,12833,12834,12840],{},[45,12835,6181,12836,6184,12838,6188],{},[34,12837,6099],{},[34,12839,6187],{},[45,12841,12842,6193,12844,6196,12846,6199],{},[34,12843,6135],{},[34,12845,6099],{},[34,12847,6135],{},[290,12849,2624],{"id":2624},[10,12851,6204],{},[10,12853,12854],{},[26,12855],{"alt":6209,"src":6210},[10,12857,6213,12858,6216],{},[34,12859,6187],{},[14,12861,133],{"id":133},[42,12863,12864,12870],{},[45,12865,6223,12866,1113,12868,324],{},[34,12867,6099],{},[34,12869,6135],{},[45,12871,6230,12872,6234],{},[34,12873,6233],{},[14,12875,150],{"id":150},[117,12877,12878,12882],{},[45,12879,2279,12880,6244],{},[34,12881,6243],{},[45,12883,6247,12884,324],{},[34,12885,6066],{},[10,12887,165],{},[14,12889,168],{"id":168},[10,12891,6256],{},[173,12893,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":12895},[12896,12897,12898,12899,12900,12903,12904,12905],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":12901},[12902],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":6039,"description":6044},[186,6278,6279],{"id":6282,"title":6283,"body":12910,"category":186,"cover":187,"description":6288,"extension":188,"meta":13049,"navigation":190,"path":6454,"pinned":192,"publishedAt":193,"seo":13050,"slug":6456,"stem":6457,"summary":6458,"tags":13051,"updatedAt":193,"visible":190,"__hash__":6461},{"type":7,"value":12911,"toc":13039},[12912,12914,12916,12918,12920,12924,12926,12928,12938,12940,12942,12982,12984,12989,12991,12993,13011,13013,13021,13023,13031,13033,13035,13037],[10,12913,6288],{},[14,12915,16],{"id":16},[10,12917,6293],{},[14,12919,22],{"id":22},[10,12921,12922],{},[26,12923],{"alt":6300,"src":6301},[10,12925,6304],{},[14,12927,40],{"id":40},[42,12929,12930,12934,12936],{},[45,12931,12932,6314],{},[34,12933,6313],{},[45,12935,6317],{},[45,12937,6320],{},[14,12939,60],{"id":60},[10,12941,63],{},[65,12943,12944],{"className":67,"code":6327,"language":69,"meta":70,"style":70},[34,12945,12946,12956,12962,12968,12978],{"__ignoreMap":70},[74,12947,12948,12950,12952,12954],{"class":76,"line":77},[74,12949,36],{"class":80},[74,12951,92],{"class":83},[74,12953,6338],{"class":95},[74,12955,6341],{"class":95},[74,12957,12958,12960],{"class":76,"line":87},[74,12959,6346],{"class":83},[74,12961,6349],{"class":95},[74,12963,12964,12966],{"class":76,"line":388},[74,12965,373],{"class":80},[74,12967,84],{"class":83},[74,12969,12970,12972,12974,12976],{"class":76,"line":394},[74,12971,373],{"class":80},[74,12973,92],{"class":83},[74,12975,96],{"class":95},[74,12977,84],{"class":83},[74,12979,12980],{"class":76,"line":1098},[74,12981,6370],{"class":80},[10,12983,101],{},[65,12985,12987],{"className":12986,"code":6376,"language":107,"meta":70},[105],[34,12988,6376],{"__ignoreMap":70},[10,12990,112],{},[14,12992,115],{"id":115},[117,12994,12995,13001],{},[45,12996,12997,6390,12999,6393],{},[34,12998,6389],{},[34,13000,36],{},[45,13002,6396,13003,2101,13005,6402,13007,3655,13009,6408],{},[34,13004,373],{},[34,13006,6401],{},[34,13008,6313],{},[34,13010,6407],{},[14,13012,133],{"id":133},[42,13014,13015,13017],{},[45,13016,6415],{},[45,13018,3394,13019,6420],{},[34,13020,6313],{},[14,13022,150],{"id":150},[117,13024,13025,13029],{},[45,13026,6427,13027,324],{},[34,13028,6430],{},[45,13030,6433],{},[10,13032,165],{},[14,13034,168],{"id":168},[10,13036,6440],{},[173,13038,175],{},{"title":70,"searchDepth":87,"depth":87,"links":13040},[13041,13042,13043,13044,13045,13046,13047,13048],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":6283,"description":6288},[186,6460,222],{"id":6463,"title":6464,"body":13053,"category":186,"cover":187,"description":6469,"extension":188,"meta":13206,"navigation":190,"path":6658,"pinned":192,"publishedAt":193,"seo":13207,"slug":6660,"stem":6661,"summary":6662,"tags":13208,"updatedAt":193,"visible":190,"__hash__":6666},{"type":7,"value":13054,"toc":13196},[13055,13057,13059,13061,13063,13067,13073,13075,13091,13093,13095,13139,13141,13146,13148,13150,13162,13164,13178,13180,13188,13190,13192,13194],[10,13056,6469],{},[14,13058,16],{"id":16},[10,13060,6474],{},[14,13062,22],{"id":22},[10,13064,13065],{},[26,13066],{"alt":6481,"src":6482},[10,13068,13069,6488,13071,6491],{},[34,13070,6487],{},[34,13072,2361],{},[14,13074,40],{"id":40},[42,13076,13077,13079,13087],{},[45,13078,6498],{},[45,13080,13081,2182,13083,2182,13085,6510],{},[34,13082,6503],{},[34,13084,6506],{},[34,13086,6509],{},[45,13088,6513,13089,6517],{},[34,13090,6516],{},[14,13092,60],{"id":60},[10,13094,1394],{},[65,13096,13097],{"className":371,"code":6524,"language":373,"meta":70,"style":70},[34,13098,13099,13103,13107,13111,13115,13119,13123,13127,13131,13135],{"__ignoreMap":70},[74,13100,13101],{"class":76,"line":77},[74,13102,6531],{},[74,13104,13105],{"class":76,"line":87},[74,13106,1051],{"emptyLinePlaceholder":190},[74,13108,13109],{"class":76,"line":388},[74,13110,6540],{},[74,13112,13113],{"class":76,"line":394},[74,13114,6545],{},[74,13116,13117],{"class":76,"line":1098},[74,13118,6550],{},[74,13120,13121],{"class":76,"line":1104},[74,13122,1051],{"emptyLinePlaceholder":190},[74,13124,13125],{"class":76,"line":2414},[74,13126,6559],{},[74,13128,13129],{"class":76,"line":2420},[74,13130,6564],{},[74,13132,13133],{"class":76,"line":3880},[74,13134,6569],{},[74,13136,13137],{"class":76,"line":4092},[74,13138,6574],{},[10,13140,101],{},[65,13142,13144],{"className":13143,"code":6580,"language":107,"meta":70},[105],[34,13145,6580],{"__ignoreMap":70},[10,13147,112],{},[14,13149,115],{"id":115},[117,13151,13152,13156],{},[45,13153,13154,6594],{},[34,13155,6593],{},[45,13157,2264,13158,6599,13160,6602],{},[34,13159,2361],{},[34,13161,6487],{},[14,13163,133],{"id":133},[42,13165,13166,13172],{},[45,13167,3394,13168,6611,13170,6614],{},[34,13169,6487],{},[34,13171,6503],{},[45,13173,6617,13174,963,13176,6623],{},[34,13175,2361],{},[34,13177,6622],{},[14,13179,150],{"id":150},[117,13181,13182,13186],{},[45,13183,6630,13184,6634],{},[34,13185,6633],{},[45,13187,6637],{},[10,13189,165],{},[14,13191,168],{"id":168},[10,13193,6644],{},[173,13195,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":13197},[13198,13199,13200,13201,13202,13203,13204,13205],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":6464,"description":6469},[186,6664,6665],{"id":6668,"title":6669,"body":13210,"category":186,"cover":187,"description":6674,"extension":188,"meta":13357,"navigation":190,"path":6853,"pinned":192,"publishedAt":193,"seo":13358,"slug":6855,"stem":6856,"summary":6857,"tags":13359,"updatedAt":193,"visible":190,"__hash__":6861},{"type":7,"value":13211,"toc":13347},[13212,13214,13216,13218,13220,13224,13226,13228,13246,13248,13250,13298,13300,13305,13307,13309,13317,13319,13329,13331,13339,13341,13343,13345],[10,13213,6674],{},[14,13215,16],{"id":16},[10,13217,6679],{},[14,13219,22],{"id":22},[10,13221,13222],{},[26,13223],{"alt":6686,"src":6687},[10,13225,6690],{},[14,13227,40],{"id":40},[42,13229,13230,13234,13240],{},[45,13231,13232,6700],{},[34,13233,6699],{},[45,13235,13236,6706,13238,324],{},[34,13237,6705],{},[34,13239,6709],{},[45,13241,6712,13242,6716,13244,6720],{},[34,13243,6715],{},[34,13245,6719],{},[14,13247,60],{"id":60},[10,13249,1394],{},[65,13251,13252],{"className":371,"code":6727,"language":373,"meta":70,"style":70},[34,13253,13254,13258,13262,13266,13270,13274,13278,13282,13286,13290,13294],{"__ignoreMap":70},[74,13255,13256],{"class":76,"line":77},[74,13257,6531],{},[74,13259,13260],{"class":76,"line":87},[74,13261,1051],{"emptyLinePlaceholder":190},[74,13263,13264],{"class":76,"line":388},[74,13265,6742],{},[74,13267,13268],{"class":76,"line":394},[74,13269,6747],{},[74,13271,13272],{"class":76,"line":1098},[74,13273,6752],{},[74,13275,13276],{"class":76,"line":1104},[74,13277,6757],{},[74,13279,13280],{"class":76,"line":2414},[74,13281,1051],{"emptyLinePlaceholder":190},[74,13283,13284],{"class":76,"line":2420},[74,13285,6766],{},[74,13287,13288],{"class":76,"line":3880},[74,13289,6771],{},[74,13291,13292],{"class":76,"line":4092},[74,13293,6776],{},[74,13295,13296],{"class":76,"line":5757},[74,13297,6781],{},[10,13299,101],{},[65,13301,13303],{"className":13302,"code":6787,"language":107,"meta":70},[105],[34,13304,6787],{"__ignoreMap":70},[10,13306,112],{},[14,13308,115],{"id":115},[117,13310,13311,13315],{},[45,13312,6798,13313,6801],{},[34,13314,6715],{},[45,13316,6804],{},[14,13318,133],{"id":133},[42,13320,13321,13325],{},[45,13322,2264,13323,6813],{},[34,13324,6699],{},[45,13326,6816,13327,324],{},[34,13328,6819],{},[14,13330,150],{"id":150},[117,13332,13333,13335],{},[45,13334,6826],{},[45,13336,6829,13337,6832],{},[34,13338,298],{},[10,13340,165],{},[14,13342,168],{"id":168},[10,13344,6839],{},[173,13346,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":13348},[13349,13350,13351,13352,13353,13354,13355,13356],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":6669,"description":6674},[186,6859,6860],{"id":6863,"title":6864,"body":13361,"category":186,"cover":187,"description":6869,"extension":188,"meta":13504,"navigation":190,"path":7037,"pinned":192,"publishedAt":193,"seo":13505,"slug":7039,"stem":7040,"summary":7041,"tags":13506,"updatedAt":193,"visible":190,"__hash__":7045},{"type":7,"value":13362,"toc":13494},[13363,13365,13367,13369,13371,13375,13381,13383,13393,13395,13397,13449,13451,13456,13458,13460,13470,13472,13478,13480,13486,13488,13490,13492],[10,13364,6869],{},[14,13366,16],{"id":16},[10,13368,6874],{},[14,13370,22],{"id":22},[10,13372,13373],{},[26,13374],{"alt":6881,"src":6882},[10,13376,13377,6888,13379,6892],{},[34,13378,6887],{},[34,13380,6891],{},[14,13382,40],{"id":40},[42,13384,13385,13387,13391],{},[45,13386,6899],{},[45,13388,13389,6905],{},[34,13390,6904],{},[45,13392,6908],{},[14,13394,60],{"id":60},[10,13396,1394],{},[65,13398,13399],{"className":371,"code":6915,"language":373,"meta":70,"style":70},[34,13400,13401,13405,13409,13413,13417,13421,13425,13429,13433,13437,13441,13445],{"__ignoreMap":70},[74,13402,13403],{"class":76,"line":77},[74,13404,6922],{},[74,13406,13407],{"class":76,"line":87},[74,13408,1051],{"emptyLinePlaceholder":190},[74,13410,13411],{"class":76,"line":388},[74,13412,6931],{},[74,13414,13415],{"class":76,"line":394},[74,13416,1051],{"emptyLinePlaceholder":190},[74,13418,13419],{"class":76,"line":1098},[74,13420,6940],{},[74,13422,13423],{"class":76,"line":1104},[74,13424,6945],{},[74,13426,13427],{"class":76,"line":2414},[74,13428,6757],{},[74,13430,13431],{"class":76,"line":2420},[74,13432,1051],{"emptyLinePlaceholder":190},[74,13434,13435],{"class":76,"line":3880},[74,13436,6958],{},[74,13438,13439],{"class":76,"line":4092},[74,13440,6963],{},[74,13442,13443],{"class":76,"line":5757},[74,13444,6776],{},[74,13446,13447],{"class":76,"line":5762},[74,13448,6972],{},[10,13450,101],{},[65,13452,13454],{"className":13453,"code":6978,"language":107,"meta":70},[105],[34,13455,6978],{"__ignoreMap":70},[10,13457,112],{},[14,13459,115],{"id":115},[117,13461,13462,13466],{},[45,13463,13464,6991],{},[34,13465,6887],{},[45,13467,13468,6996],{},[34,13469,6891],{},[14,13471,133],{"id":133},[42,13473,13474,13476],{},[45,13475,7003],{},[45,13477,7006],{},[14,13479,150],{"id":150},[117,13481,13482,13484],{},[45,13483,7013],{},[45,13485,7016],{},[10,13487,165],{},[14,13489,168],{"id":168},[10,13491,7023],{},[173,13493,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":13495},[13496,13497,13498,13499,13500,13501,13502,13503],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":6864,"description":6869},[186,7043,7044],{"id":7047,"title":7048,"body":13508,"category":186,"cover":187,"description":7053,"extension":188,"meta":13659,"navigation":190,"path":7238,"pinned":192,"publishedAt":193,"seo":13660,"slug":7240,"stem":7241,"summary":7242,"tags":13661,"updatedAt":193,"visible":190,"__hash__":7246},{"type":7,"value":13509,"toc":13649},[13510,13512,13514,13516,13518,13522,13526,13528,13542,13544,13546,13598,13600,13605,13607,13609,13621,13623,13633,13635,13641,13643,13645,13647],[10,13511,7053],{},[14,13513,16],{"id":16},[10,13515,7058],{},[14,13517,22],{"id":22},[10,13519,13520],{},[26,13521],{"alt":7065,"src":7066},[10,13523,13524,7072],{},[34,13525,7071],{},[14,13527,40],{"id":40},[42,13529,13530,13536,13540],{},[45,13531,2264,13532,7082,13534,7086],{},[34,13533,7081],{},[34,13535,7085],{},[45,13537,7089,13538,7093],{},[34,13539,7092],{},[45,13541,7096],{},[14,13543,60],{"id":60},[10,13545,1394],{},[65,13547,13548],{"className":371,"code":7103,"language":373,"meta":70,"style":70},[34,13549,13550,13554,13558,13562,13566,13570,13574,13578,13582,13586,13590,13594],{"__ignoreMap":70},[74,13551,13552],{"class":76,"line":77},[74,13553,7110],{},[74,13555,13556],{"class":76,"line":87},[74,13557,1051],{"emptyLinePlaceholder":190},[74,13559,13560],{"class":76,"line":388},[74,13561,7119],{},[74,13563,13564],{"class":76,"line":394},[74,13565,7124],{},[74,13567,13568],{"class":76,"line":1098},[74,13569,7129],{},[74,13571,13572],{"class":76,"line":1104},[74,13573,7134],{},[74,13575,13576],{"class":76,"line":2414},[74,13577,7139],{},[74,13579,13580],{"class":76,"line":2420},[74,13581,1051],{"emptyLinePlaceholder":190},[74,13583,13584],{"class":76,"line":3880},[74,13585,7148],{},[74,13587,13588],{"class":76,"line":4092},[74,13589,7153],{},[74,13591,13592],{"class":76,"line":5757},[74,13593,7158],{},[74,13595,13596],{"class":76,"line":5762},[74,13597,7163],{},[10,13599,101],{},[65,13601,13603],{"className":13602,"code":7169,"language":107,"meta":70},[105],[34,13604,7169],{"__ignoreMap":70},[10,13606,112],{},[14,13608,115],{"id":115},[117,13610,13611,13617],{},[45,13612,13613,7183,13615,7186],{},[34,13614,7182],{},[34,13616,7092],{},[45,13618,13619,7191],{},[34,13620,7071],{},[14,13622,133],{"id":133},[42,13624,13625,13627],{},[45,13626,7198],{},[45,13628,7201,13629,7204,13631,7207],{},[34,13630,7081],{},[34,13632,7085],{},[14,13634,150],{"id":150},[117,13636,13637,13639],{},[45,13638,7214],{},[45,13640,7217],{},[10,13642,165],{},[14,13644,168],{"id":168},[10,13646,7224],{},[173,13648,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":13650},[13651,13652,13653,13654,13655,13656,13657,13658],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":7048,"description":7053},[186,7244,7245],{"id":7248,"title":7249,"body":13663,"category":186,"cover":187,"description":7254,"extension":188,"meta":13877,"navigation":190,"path":7528,"pinned":192,"publishedAt":193,"seo":13878,"slug":7530,"stem":7531,"summary":7532,"tags":13879,"updatedAt":193,"visible":190,"__hash__":7536},{"type":7,"value":13664,"toc":13864},[13665,13667,13669,13671,13673,13677,13683,13685,13697,13699,13701,13761,13763,13768,13770,13772,13790,13792,13800,13804,13812,13814,13818,13822,13828,13830,13840,13842,13856,13858,13860,13862],[10,13666,7254],{},[14,13668,16],{"id":16},[10,13670,7259],{},[14,13672,22],{"id":22},[10,13674,13675],{},[26,13676],{"alt":7266,"src":7267},[10,13678,7270,13679,7274,13681,7278],{},[34,13680,7273],{},[34,13682,7277],{},[14,13684,40],{"id":40},[42,13686,13687,13691,13695],{},[45,13688,7285,13689,7288],{},[34,13690,7273],{},[45,13692,13693,7294],{},[34,13694,7293],{},[45,13696,7297],{},[14,13698,60],{"id":60},[10,13700,1394],{},[65,13702,13703],{"className":371,"code":7304,"language":373,"meta":70,"style":70},[34,13704,13705,13709,13713,13717,13721,13725,13729,13733,13737,13741,13745,13749,13753,13757],{"__ignoreMap":70},[74,13706,13707],{"class":76,"line":77},[74,13708,7311],{},[74,13710,13711],{"class":76,"line":87},[74,13712,7316],{},[74,13714,13715],{"class":76,"line":388},[74,13716,7321],{},[74,13718,13719],{"class":76,"line":394},[74,13720,7326],{},[74,13722,13723],{"class":76,"line":1098},[74,13724,7331],{},[74,13726,13727],{"class":76,"line":1104},[74,13728,1051],{"emptyLinePlaceholder":190},[74,13730,13731],{"class":76,"line":2414},[74,13732,7340],{},[74,13734,13735],{"class":76,"line":2420},[74,13736,7345],{},[74,13738,13739],{"class":76,"line":3880},[74,13740,7350],{},[74,13742,13743],{"class":76,"line":4092},[74,13744,7355],{},[74,13746,13747],{"class":76,"line":5757},[74,13748,1101],{},[74,13750,13751],{"class":76,"line":5762},[74,13752,7364],{},[74,13754,13755],{"class":76,"line":7367},[74,13756,7370],{},[74,13758,13759],{"class":76,"line":7373},[74,13760,7376],{},[10,13762,101],{},[65,13764,13766],{"className":13765,"code":7382,"language":107,"meta":70},[105],[34,13767,7382],{"__ignoreMap":70},[10,13769,112],{},[14,13771,115],{"id":115},[117,13773,13774,13782],{},[45,13775,13776,7395,13778,7398,13780,7402],{},[34,13777,2963],{},[34,13779,7293],{},[34,13781,7401],{},[45,13783,7405,13784,7408,13786,7411,13788,324],{},[34,13785,7273],{},[34,13787,1116],{},[34,13789,7277],{},[290,13791,2624],{"id":2624},[10,13793,13794,2182,13796,1113,13798,7424],{},[34,13795,7273],{},[34,13797,1116],{},[34,13799,7277],{},[10,13801,13802],{},[26,13803],{"alt":7429,"src":7430},[10,13805,13806,7435,13808,7438,13810,7441],{},[34,13807,7273],{},[34,13809,1116],{},[34,13811,7277],{},[290,13813,2624],{"id":4147},[10,13815,13816,7449],{},[34,13817,7448],{},[10,13819,13820],{},[26,13821],{"alt":7454,"src":7455},[10,13823,7458,13824,7461,13826,7464],{},[34,13825,7448],{},[34,13827,1116],{},[14,13829,133],{"id":133},[42,13831,13832,13836],{},[45,13833,7471,13834,7475],{},[34,13835,7474],{},[45,13837,7478,13838,7481],{},[34,13839,7448],{},[14,13841,150],{"id":150},[117,13843,13844,13852],{},[45,13845,7488,13846,7492,13848,1113,13850,324],{},[34,13847,7491],{},[34,13849,7495],{},[34,13851,7498],{},[45,13853,7501,13854,7504],{},[34,13855,6709],{},[10,13857,165],{},[14,13859,168],{"id":168},[10,13861,7511],{},[173,13863,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":13865},[13866,13867,13868,13869,13870,13874,13875,13876],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":13871},[13872,13873],{"id":2624,"depth":388,"text":2624},{"id":4147,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":7249,"description":7254},[186,7534,7535],{"id":7538,"title":7539,"body":13881,"category":186,"cover":187,"description":7544,"extension":188,"meta":14032,"navigation":190,"path":7721,"pinned":192,"publishedAt":193,"seo":14033,"slug":7723,"stem":7724,"summary":7725,"tags":14034,"updatedAt":193,"visible":190,"__hash__":7728},{"type":7,"value":13882,"toc":14022},[13883,13885,13887,13889,13891,13895,13899,13901,13913,13915,13917,13965,13967,13972,13974,13976,13986,13988,13998,14000,14014,14016,14018,14020],[10,13884,7544],{},[14,13886,16],{"id":16},[10,13888,7549],{},[14,13890,22],{"id":22},[10,13892,13893],{},[26,13894],{"alt":7556,"src":7557},[10,13896,7560,13897,7563],{},[34,13898,6719],{},[14,13900,40],{"id":40},[42,13902,13903,13907,13911],{},[45,13904,13905,7572],{},[34,13906,6719],{},[45,13908,13909,7578],{},[34,13910,7577],{},[45,13912,7581],{},[14,13914,60],{"id":60},[10,13916,1394],{},[65,13918,13919],{"className":371,"code":7588,"language":373,"meta":70,"style":70},[34,13920,13921,13925,13929,13933,13937,13941,13945,13949,13953,13957,13961],{"__ignoreMap":70},[74,13922,13923],{"class":76,"line":77},[74,13924,6531],{},[74,13926,13927],{"class":76,"line":87},[74,13928,1051],{"emptyLinePlaceholder":190},[74,13930,13931],{"class":76,"line":388},[74,13932,6742],{},[74,13934,13935],{"class":76,"line":394},[74,13936,1051],{"emptyLinePlaceholder":190},[74,13938,13939],{"class":76,"line":1098},[74,13940,7611],{},[74,13942,13943],{"class":76,"line":1104},[74,13944,7616],{},[74,13946,13947],{"class":76,"line":2414},[74,13948,1051],{"emptyLinePlaceholder":190},[74,13950,13951],{"class":76,"line":2420},[74,13952,7625],{},[74,13954,13955],{"class":76,"line":3880},[74,13956,7630],{},[74,13958,13959],{"class":76,"line":4092},[74,13960,1051],{"emptyLinePlaceholder":190},[74,13962,13963],{"class":76,"line":5757},[74,13964,7639],{},[10,13966,101],{},[65,13968,13970],{"className":13969,"code":7645,"language":107,"meta":70},[105],[34,13971,7645],{"__ignoreMap":70},[10,13973,112],{},[14,13975,115],{"id":115},[117,13977,13978,13984],{},[45,13979,7560,13980,7658,13982,324],{},[34,13981,6719],{},[34,13983,7661],{},[45,13985,7664],{},[14,13987,133],{"id":133},[42,13989,13990,13994],{},[45,13991,4715,13992,7673],{},[34,13993,6719],{},[45,13995,7676,13996,7679],{},[34,13997,6719],{},[14,13999,150],{"id":150},[117,14001,14002,14008],{},[45,14003,7686,14004,7690,14006,324],{},[34,14005,7689],{},[34,14007,6719],{},[45,14009,4715,14010,7697,14012,324],{},[34,14011,6719],{},[34,14013,7700],{},[10,14015,165],{},[14,14017,168],{"id":168},[10,14019,7707],{},[173,14021,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":14023},[14024,14025,14026,14027,14028,14029,14030,14031],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":7539,"description":7544},[186,6719,7727],{"id":7730,"title":7731,"body":14036,"category":186,"cover":187,"description":7736,"extension":188,"meta":14207,"navigation":190,"path":7949,"pinned":192,"publishedAt":193,"seo":14208,"slug":7951,"stem":7952,"summary":7953,"tags":14209,"updatedAt":193,"visible":190,"__hash__":7957},{"type":7,"value":14037,"toc":14195},[14038,14040,14042,14044,14046,14050,14052,14054,14066,14068,14070,14126,14128,14133,14135,14137,14153,14155,14157,14161,14167,14169,14177,14179,14187,14189,14191,14193],[10,14039,7736],{},[14,14041,16],{"id":16},[10,14043,7741],{},[14,14045,22],{"id":22},[10,14047,14048],{},[26,14049],{"alt":7748,"src":7749},[10,14051,7752],{},[14,14053,40],{"id":40},[42,14055,14056,14060,14064],{},[45,14057,14058,7762],{},[34,14059,7761],{},[45,14061,14062,7768],{},[34,14063,7767],{},[45,14065,7771],{},[14,14067,60],{"id":60},[10,14069,1394],{},[65,14071,14072],{"className":371,"code":7778,"language":373,"meta":70,"style":70},[34,14073,14074,14078,14082,14086,14090,14094,14098,14102,14106,14110,14114,14118,14122],{"__ignoreMap":70},[74,14075,14076],{"class":76,"line":77},[74,14077,7785],{},[74,14079,14080],{"class":76,"line":87},[74,14081,7790],{},[74,14083,14084],{"class":76,"line":388},[74,14085,7795],{},[74,14087,14088],{"class":76,"line":394},[74,14089,7800],{},[74,14091,14092],{"class":76,"line":1098},[74,14093,1051],{"emptyLinePlaceholder":190},[74,14095,14096],{"class":76,"line":1104},[74,14097,7809],{},[74,14099,14100],{"class":76,"line":2414},[74,14101,7814],{},[74,14103,14104],{"class":76,"line":2420},[74,14105,7819],{},[74,14107,14108],{"class":76,"line":3880},[74,14109,7824],{},[74,14111,14112],{"class":76,"line":4092},[74,14113,1051],{"emptyLinePlaceholder":190},[74,14115,14116],{"class":76,"line":5757},[74,14117,7833],{},[74,14119,14120],{"class":76,"line":5762},[74,14121,7838],{},[74,14123,14124],{"class":76,"line":7367},[74,14125,7843],{},[10,14127,101],{},[65,14129,14131],{"className":14130,"code":7849,"language":107,"meta":70},[105],[34,14132,7849],{"__ignoreMap":70},[10,14134,112],{},[14,14136,115],{"id":115},[117,14138,14139,14145],{},[45,14140,7860,14141,7864,14143,7867],{},[34,14142,7863],{},[34,14144,7767],{},[45,14146,14147,7873,14149,7877,14151,7880],{},[34,14148,7872],{},[34,14150,7876],{},[34,14152,7761],{},[290,14154,2624],{"id":2624},[10,14156,7885],{},[10,14158,14159],{},[26,14160],{"alt":7890,"src":7891},[10,14162,7894,14163,1113,14165,7900],{},[34,14164,4512],{},[34,14166,7899],{},[14,14168,133],{"id":133},[42,14170,14171,14175],{},[45,14172,7907,14173,7910],{},[34,14174,7761],{},[45,14176,7913],{},[14,14178,150],{"id":150},[117,14180,14181,14185],{},[45,14182,5225,14183,7923],{},[34,14184,7922],{},[45,14186,7926],{},[10,14188,165],{},[14,14190,168],{"id":168},[10,14192,7933],{},[173,14194,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":14196},[14197,14198,14199,14200,14201,14204,14205,14206],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":14202},[14203],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":7731,"description":7736},[186,7955,7956],{"id":7959,"title":7960,"body":14211,"category":186,"cover":187,"description":7965,"extension":188,"meta":14358,"navigation":190,"path":8144,"pinned":192,"publishedAt":193,"seo":14359,"slug":8146,"stem":8147,"summary":8148,"tags":14360,"updatedAt":193,"visible":190,"__hash__":8152},{"type":7,"value":14212,"toc":14348},[14213,14215,14217,14219,14221,14225,14227,14229,14237,14239,14241,14297,14299,14304,14306,14308,14320,14322,14328,14330,14340,14342,14344,14346],[10,14214,7965],{},[14,14216,16],{"id":16},[10,14218,7970],{},[14,14220,22],{"id":22},[10,14222,14223],{},[26,14224],{"alt":7977,"src":7978},[10,14226,7981],{},[14,14228,40],{"id":40},[42,14230,14231,14233,14235],{},[45,14232,7988],{},[45,14234,7991],{},[45,14236,7994],{},[14,14238,60],{"id":60},[10,14240,1394],{},[65,14242,14243],{"className":371,"code":8001,"language":373,"meta":70,"style":70},[34,14244,14245,14249,14253,14257,14261,14265,14269,14273,14277,14281,14285,14289,14293],{"__ignoreMap":70},[74,14246,14247],{"class":76,"line":77},[74,14248,8008],{},[74,14250,14251],{"class":76,"line":87},[74,14252,8013],{},[74,14254,14255],{"class":76,"line":388},[74,14256,8018],{},[74,14258,14259],{"class":76,"line":394},[74,14260,1051],{"emptyLinePlaceholder":190},[74,14262,14263],{"class":76,"line":1098},[74,14264,8027],{},[74,14266,14267],{"class":76,"line":1104},[74,14268,8032],{},[74,14270,14271],{"class":76,"line":2414},[74,14272,8037],{},[74,14274,14275],{"class":76,"line":2420},[74,14276,1051],{"emptyLinePlaceholder":190},[74,14278,14279],{"class":76,"line":3880},[74,14280,8046],{},[74,14282,14283],{"class":76,"line":4092},[74,14284,8051],{},[74,14286,14287],{"class":76,"line":5757},[74,14288,1051],{"emptyLinePlaceholder":190},[74,14290,14291],{"class":76,"line":5762},[74,14292,8060],{},[74,14294,14295],{"class":76,"line":7367},[74,14296,8065],{},[10,14298,101],{},[65,14300,14302],{"className":14301,"code":8071,"language":107,"meta":70},[105],[34,14303,8071],{"__ignoreMap":70},[10,14305,112],{},[14,14307,115],{"id":115},[117,14309,14310,14316],{},[45,14311,14312,8085,14314,8089],{},[34,14313,8084],{},[34,14315,8088],{},[45,14317,8092,14318,8096],{},[34,14319,8095],{},[14,14321,133],{"id":133},[42,14323,14324,14326],{},[45,14325,8103],{},[45,14327,8106],{},[14,14329,150],{"id":150},[117,14331,14332,14338],{},[45,14333,8113,14334,8117,14336,324],{},[34,14335,8116],{},[34,14337,8120],{},[45,14339,8123],{},[10,14341,165],{},[14,14343,168],{"id":168},[10,14345,8130],{},[173,14347,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":14349},[14350,14351,14352,14353,14354,14355,14356,14357],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":7960,"description":7965},[186,8150,8151],{"id":8154,"title":8155,"body":14362,"category":186,"cover":187,"description":8160,"extension":188,"meta":14525,"navigation":190,"path":8364,"pinned":192,"publishedAt":193,"seo":14526,"slug":8366,"stem":8367,"summary":8368,"tags":14527,"updatedAt":193,"visible":190,"__hash__":8372},{"type":7,"value":14363,"toc":14513},[14364,14366,14368,14370,14372,14376,14380,14382,14398,14400,14402,14446,14448,14453,14455,14457,14471,14473,14477,14481,14485,14487,14493,14495,14505,14507,14509,14511],[10,14365,8160],{},[14,14367,16],{"id":16},[10,14369,8165],{},[14,14371,22],{"id":22},[10,14373,14374],{},[26,14375],{"alt":8172,"src":8173},[10,14377,8176,14378,8180],{},[34,14379,8179],{},[14,14381,40],{"id":40},[42,14383,14384,14390,14396],{},[45,14385,14386,8190,14388,8194],{},[34,14387,8189],{},[34,14389,8193],{},[45,14391,8197,14392,8201,14394,8204],{},[34,14393,8200],{},[34,14395,4266],{},[45,14397,8207],{},[14,14399,60],{"id":60},[10,14401,1394],{},[65,14403,14404],{"className":371,"code":8214,"language":373,"meta":70,"style":70},[34,14405,14406,14410,14414,14418,14422,14426,14430,14434,14438,14442],{"__ignoreMap":70},[74,14407,14408],{"class":76,"line":77},[74,14409,8221],{},[74,14411,14412],{"class":76,"line":87},[74,14413,8226],{},[74,14415,14416],{"class":76,"line":388},[74,14417,8231],{},[74,14419,14420],{"class":76,"line":394},[74,14421,8236],{},[74,14423,14424],{"class":76,"line":1098},[74,14425,8241],{},[74,14427,14428],{"class":76,"line":1104},[74,14429,1051],{"emptyLinePlaceholder":190},[74,14431,14432],{"class":76,"line":2414},[74,14433,8250],{},[74,14435,14436],{"class":76,"line":2420},[74,14437,8255],{},[74,14439,14440],{"class":76,"line":3880},[74,14441,8255],{},[74,14443,14444],{"class":76,"line":4092},[74,14445,8255],{},[10,14447,101],{},[65,14449,14451],{"className":14450,"code":8269,"language":107,"meta":70},[105],[34,14452,8269],{"__ignoreMap":70},[10,14454,112],{},[14,14456,115],{"id":115},[117,14458,14459,14463],{},[45,14460,7860,14461,8283],{},[34,14462,8282],{},[45,14464,8286,14465,8289,14467,8292,14469,8296],{},[34,14466,8193],{},[34,14468,8179],{},[34,14470,8295],{},[290,14472,2624],{"id":2624},[10,14474,8301,14475,8304],{},[34,14476,8193],{},[10,14478,14479],{},[26,14480],{"alt":8309,"src":8310},[10,14482,8313,14483,8316],{},[34,14484,8179],{},[14,14486,133],{"id":133},[42,14488,14489,14491],{},[45,14490,8323],{},[45,14492,8326],{},[14,14494,150],{"id":150},[117,14496,14497,14499],{},[45,14498,8333],{},[45,14500,3938,14501,8338,14503,8341],{},[34,14502,4266],{},[34,14504,8193],{},[10,14506,165],{},[14,14508,168],{"id":168},[10,14510,8348],{},[173,14512,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":14514},[14515,14516,14517,14518,14519,14522,14523,14524],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":14520},[14521],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":8155,"description":8160},[186,8370,8371],{"id":8374,"title":8375,"body":14529,"category":186,"cover":187,"description":8380,"extension":188,"meta":14712,"navigation":190,"path":8605,"pinned":192,"publishedAt":193,"seo":14713,"slug":8607,"stem":8608,"summary":8609,"tags":14714,"updatedAt":193,"visible":190,"__hash__":8612},{"type":7,"value":14530,"toc":14700},[14531,14533,14535,14537,14539,14543,14545,14547,14561,14563,14565,14633,14635,14640,14642,14644,14658,14660,14662,14666,14672,14674,14682,14684,14692,14694,14696,14698],[10,14532,8380],{},[14,14534,16],{"id":16},[10,14536,8385],{},[14,14538,22],{"id":22},[10,14540,14541],{},[26,14542],{"alt":8392,"src":8393},[10,14544,8396],{},[14,14546,40],{"id":40},[42,14548,14549,14555,14557],{},[45,14550,14551,8406,14553,324],{},[34,14552,8405],{},[34,14554,8409],{},[45,14556,8412],{},[45,14558,14559,8418],{},[34,14560,8417],{},[14,14562,60],{"id":60},[10,14564,1394],{},[65,14566,14567],{"className":371,"code":8425,"language":373,"meta":70,"style":70},[34,14568,14569,14573,14577,14581,14585,14589,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629],{"__ignoreMap":70},[74,14570,14571],{"class":76,"line":77},[74,14572,8432],{},[74,14574,14575],{"class":76,"line":87},[74,14576,1051],{"emptyLinePlaceholder":190},[74,14578,14579],{"class":76,"line":388},[74,14580,8441],{},[74,14582,14583],{"class":76,"line":394},[74,14584,8446],{},[74,14586,14587],{"class":76,"line":1098},[74,14588,8451],{},[74,14590,14591],{"class":76,"line":1104},[74,14592,8456],{},[74,14594,14595],{"class":76,"line":2414},[74,14596,8461],{},[74,14598,14599],{"class":76,"line":2420},[74,14600,8466],{},[74,14602,14603],{"class":76,"line":3880},[74,14604,8471],{},[74,14606,14607],{"class":76,"line":4092},[74,14608,8476],{},[74,14610,14611],{"class":76,"line":5757},[74,14612,1051],{"emptyLinePlaceholder":190},[74,14614,14615],{"class":76,"line":5762},[74,14616,8485],{},[74,14618,14619],{"class":76,"line":7367},[74,14620,6110],{},[74,14622,14623],{"class":76,"line":7373},[74,14624,6115],{},[74,14626,14627],{"class":76,"line":8496},[74,14628,1051],{"emptyLinePlaceholder":190},[74,14630,14631],{"class":76,"line":8501},[74,14632,8504],{},[10,14634,101],{},[65,14636,14638],{"className":14637,"code":8510,"language":107,"meta":70},[105],[34,14639,8510],{"__ignoreMap":70},[10,14641,112],{},[14,14643,115],{"id":115},[117,14645,14646,14656],{},[45,14647,8521,14648,8525,14650,8529,14652,8533,14654,324],{},[34,14649,8524],{},[34,14651,8528],{},[34,14653,8532],{},[34,14655,8524],{},[45,14657,8538],{},[290,14659,2624],{"id":2624},[10,14661,8543],{},[10,14663,14664],{},[26,14665],{"alt":8548,"src":8549},[10,14667,14668,8554,14670,324],{},[34,14669,8405],{},[34,14671,8409],{},[14,14673,133],{"id":133},[42,14675,14676,14680],{},[45,14677,8563,14678,324],{},[34,14679,5308],{},[45,14681,8568],{},[14,14683,150],{"id":150},[117,14685,14686,14688],{},[45,14687,8575],{},[45,14689,8578,14690,8582],{},[34,14691,8581],{},[10,14693,165],{},[14,14695,168],{"id":168},[10,14697,8589],{},[173,14699,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":14701},[14702,14703,14704,14705,14706,14709,14710,14711],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":14707},[14708],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":8375,"description":8380},[186,8611,5259],{"id":8614,"title":8615,"body":14716,"category":186,"cover":187,"description":8620,"extension":188,"meta":14875,"navigation":190,"path":8808,"pinned":192,"publishedAt":193,"seo":14876,"slug":8810,"stem":8811,"summary":8812,"tags":14877,"updatedAt":193,"visible":190,"__hash__":8816},{"type":7,"value":14717,"toc":14863},[14718,14720,14722,14724,14726,14730,14732,14734,14742,14744,14746,14810,14812,14817,14819,14821,14829,14831,14833,14837,14839,14841,14847,14849,14855,14857,14859,14861],[10,14719,8620],{},[14,14721,16],{"id":16},[10,14723,8625],{},[14,14725,22],{"id":22},[10,14727,14728],{},[26,14729],{"alt":8632,"src":8633},[10,14731,8636],{},[14,14733,40],{"id":40},[42,14735,14736,14738,14740],{},[45,14737,8643],{},[45,14739,8646],{},[45,14741,8649],{},[14,14743,60],{"id":60},[10,14745,1394],{},[65,14747,14748],{"className":371,"code":8656,"language":373,"meta":70,"style":70},[34,14749,14750,14754,14758,14762,14766,14770,14774,14778,14782,14786,14790,14794,14798,14802,14806],{"__ignoreMap":70},[74,14751,14752],{"class":76,"line":77},[74,14753,8663],{},[74,14755,14756],{"class":76,"line":87},[74,14757,8668],{},[74,14759,14760],{"class":76,"line":388},[74,14761,1051],{"emptyLinePlaceholder":190},[74,14763,14764],{"class":76,"line":394},[74,14765,8677],{},[74,14767,14768],{"class":76,"line":1098},[74,14769,1051],{"emptyLinePlaceholder":190},[74,14771,14772],{"class":76,"line":1104},[74,14773,8686],{},[74,14775,14776],{"class":76,"line":2414},[74,14777,8691],{},[74,14779,14780],{"class":76,"line":2420},[74,14781,8696],{},[74,14783,14784],{"class":76,"line":3880},[74,14785,1051],{"emptyLinePlaceholder":190},[74,14787,14788],{"class":76,"line":4092},[74,14789,8705],{},[74,14791,14792],{"class":76,"line":5757},[74,14793,8710],{},[74,14795,14796],{"class":76,"line":5762},[74,14797,8715],{},[74,14799,14800],{"class":76,"line":7367},[74,14801,1051],{"emptyLinePlaceholder":190},[74,14803,14804],{"class":76,"line":7373},[74,14805,6124],{},[74,14807,14808],{"class":76,"line":8496},[74,14809,8728],{},[10,14811,101],{},[65,14813,14815],{"className":14814,"code":8734,"language":107,"meta":70},[105],[34,14816,8734],{"__ignoreMap":70},[10,14818,112],{},[14,14820,115],{"id":115},[117,14822,14823,14827],{},[45,14824,14825,8748],{},[34,14826,8747],{},[45,14828,8751],{},[290,14830,2624],{"id":2624},[10,14832,8756],{},[10,14834,14835],{},[26,14836],{"alt":8761,"src":8762},[10,14838,8765],{},[14,14840,133],{"id":133},[42,14842,14843,14845],{},[45,14844,8772],{},[45,14846,8775],{},[14,14848,150],{"id":150},[117,14850,14851,14853],{},[45,14852,8782],{},[45,14854,8785],{},[10,14856,165],{},[14,14858,168],{"id":168},[10,14860,8792],{},[173,14862,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":14864},[14865,14866,14867,14868,14869,14872,14873,14874],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":14870},[14871],{"id":2624,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":8615,"description":8620},[186,8814,8815],{"id":8818,"title":8819,"body":14879,"category":186,"cover":187,"description":8824,"extension":188,"meta":15117,"navigation":190,"path":9125,"pinned":192,"publishedAt":193,"seo":15118,"slug":9127,"stem":9128,"summary":9129,"tags":15119,"updatedAt":193,"visible":190,"__hash__":9133},{"type":7,"value":14880,"toc":15104},[14881,14883,14885,14887,14889,14893,14895,14897,14907,14909,14911,15027,15029,15034,15036,15038,15048,15050,15052,15056,15058,15060,15062,15066,15070,15072,15080,15082,15096,15098,15100,15102],[10,14882,8824],{},[14,14884,16],{"id":16},[10,14886,8829],{},[14,14888,22],{"id":22},[10,14890,14891],{},[26,14892],{"alt":8836,"src":8837},[10,14894,8840],{},[14,14896,40],{"id":40},[42,14898,14899,14901,14903],{},[45,14900,8847],{},[45,14902,8850],{},[45,14904,8853,14905,8857],{},[34,14906,8856],{},[14,14908,60],{"id":60},[10,14910,1394],{},[65,14912,14913],{"className":371,"code":8864,"language":373,"meta":70,"style":70},[34,14914,14915,14919,14923,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023],{"__ignoreMap":70},[74,14916,14917],{"class":76,"line":77},[74,14918,6922],{},[74,14920,14921],{"class":76,"line":87},[74,14922,6531],{},[74,14924,14925],{"class":76,"line":388},[74,14926,1051],{"emptyLinePlaceholder":190},[74,14928,14929],{"class":76,"line":394},[74,14930,8883],{},[74,14932,14933],{"class":76,"line":1098},[74,14934,8888],{},[74,14936,14937],{"class":76,"line":1104},[74,14938,8893],{},[74,14940,14941],{"class":76,"line":2414},[74,14942,8898],{},[74,14944,14945],{"class":76,"line":2420},[74,14946,1051],{"emptyLinePlaceholder":190},[74,14948,14949],{"class":76,"line":3880},[74,14950,8907],{},[74,14952,14953],{"class":76,"line":4092},[74,14954,8912],{},[74,14956,14957],{"class":76,"line":5757},[74,14958,8917],{},[74,14960,14961],{"class":76,"line":5762},[74,14962,8922],{},[74,14964,14965],{"class":76,"line":7367},[74,14966,8927],{},[74,14968,14969],{"class":76,"line":7373},[74,14970,1051],{"emptyLinePlaceholder":190},[74,14972,14973],{"class":76,"line":8496},[74,14974,8936],{},[74,14976,14977],{"class":76,"line":8501},[74,14978,8941],{},[74,14980,14981],{"class":76,"line":8944},[74,14982,8947],{},[74,14984,14985],{"class":76,"line":8950},[74,14986,1051],{"emptyLinePlaceholder":190},[74,14988,14989],{"class":76,"line":8955},[74,14990,8958],{},[74,14992,14993],{"class":76,"line":8961},[74,14994,1051],{"emptyLinePlaceholder":190},[74,14996,14997],{"class":76,"line":8966},[74,14998,7340],{},[74,15000,15001],{"class":76,"line":8971},[74,15002,8974],{},[74,15004,15005],{"class":76,"line":8977},[74,15006,8980],{},[74,15008,15009],{"class":76,"line":8983},[74,15010,8986],{},[74,15012,15013],{"class":76,"line":8989},[74,15014,7350],{},[74,15016,15017],{"class":76,"line":8994},[74,15018,8997],{},[74,15020,15021],{"class":76,"line":9000},[74,15022,1101],{},[74,15024,15025],{"class":76,"line":9005},[74,15026,9008],{},[10,15028,101],{},[65,15030,15032],{"className":15031,"code":9014,"language":107,"meta":70},[105],[34,15033,9014],{"__ignoreMap":70},[10,15035,112],{},[14,15037,115],{"id":115},[117,15039,15040,15044],{},[45,15041,9025,15042,9028],{},[34,15043,8856],{},[45,15045,15046,9033],{},[34,15047,8088],{},[290,15049,2624],{"id":2624},[10,15051,9038],{},[10,15053,15054],{},[26,15055],{"alt":9043,"src":9044},[10,15057,9047],{},[290,15059,2624],{"id":4147},[10,15061,9052],{},[10,15063,15064],{},[26,15065],{"alt":9057,"src":9058},[10,15067,9061,15068,9065],{},[34,15069,9064],{},[14,15071,133],{"id":133},[42,15073,15074,15076],{},[45,15075,9072],{},[45,15077,9075,15078,9078],{},[34,15079,9064],{},[14,15081,150],{"id":150},[117,15083,15084,15088,15090],{},[45,15085,9085,15086,9088],{},[34,15087,9064],{},[45,15089,9091],{},[45,15091,9094,15092,9098,15094,9101],{},[34,15093,9097],{},[34,15095,6066],{},[10,15097,165],{},[14,15099,168],{"id":168},[10,15101,9108],{},[173,15103,1464],{},{"title":70,"searchDepth":87,"depth":87,"links":15105},[15106,15107,15108,15109,15110,15114,15115,15116],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":40,"depth":87,"text":40},{"id":60,"depth":87,"text":60},{"id":115,"depth":87,"text":115,"children":15111},[15112,15113],{"id":2624,"depth":388,"text":2624},{"id":4147,"depth":388,"text":2624},{"id":133,"depth":87,"text":133},{"id":150,"depth":87,"text":150},{"id":168,"depth":87,"text":168},{},{"title":8819,"description":8824},[186,9131,9132],{"id":1009,"title":1010,"body":15121,"category":186,"cover":1018,"description":70,"extension":188,"meta":15357,"navigation":190,"path":1338,"pinned":192,"publishedAt":1339,"seo":15358,"slug":1341,"stem":1342,"summary":1343,"tags":15359,"updatedAt":1339,"visible":190,"__hash__":1347},{"type":7,"value":15122,"toc":15342},[15123,15127,15129,15131,15133,15135,15155,15157,15162,15164,15166,15194,15200,15202,15206,15208,15228,15230,15240,15242,15244,15246,15248,15250,15252,15254,15256,15258,15278,15280,15282,15286,15288,15290,15292,15294,15298,15300,15318,15320,15322,15324,15326,15328,15330,15332,15334,15336,15338,15340],[10,15124,15125],{},[26,15126],{"alt":1017,"src":1018},[10,15128,1021],{},[10,15130,1024],{},[14,15132,1028],{"id":1027},[10,15134,1031],{},[65,15136,15137],{"className":371,"code":1034,"language":373,"meta":70,"style":70},[34,15138,15139,15143,15147,15151],{"__ignoreMap":70},[74,15140,15141],{"class":76,"line":77},[74,15142,1041],{},[74,15144,15145],{"class":76,"line":87},[74,15146,1046],{},[74,15148,15149],{"class":76,"line":388},[74,15150,1051],{"emptyLinePlaceholder":190},[74,15152,15153],{"class":76,"line":394},[74,15154,1056],{},[10,15156,1059],{},[65,15158,15160],{"className":15159,"code":1063,"language":107,"meta":70},[105],[34,15161,1063],{"__ignoreMap":70},[10,15163,1068],{},[10,15165,1071],{},[65,15167,15168],{"className":371,"code":1074,"language":373,"meta":70,"style":70},[34,15169,15170,15174,15178,15182,15186,15190],{"__ignoreMap":70},[74,15171,15172],{"class":76,"line":77},[74,15173,1081],{},[74,15175,15176],{"class":76,"line":87},[74,15177,1051],{"emptyLinePlaceholder":190},[74,15179,15180],{"class":76,"line":388},[74,15181,1090],{},[74,15183,15184],{"class":76,"line":394},[74,15185,1095],{},[74,15187,15188],{"class":76,"line":1098},[74,15189,1101],{},[74,15191,15192],{"class":76,"line":1104},[74,15193,1107],{},[10,15195,15196,1113,15198,1117],{},[34,15197,1112],{},[34,15199,1116],{},[14,15201,1121],{"id":1120},[10,15203,1124,15204,1128],{},[34,15205,1127],{},[10,15207,1131],{},[65,15209,15210],{"className":371,"code":1134,"language":373,"meta":70,"style":70},[34,15211,15212,15216,15220,15224],{"__ignoreMap":70},[74,15213,15214],{"class":76,"line":77},[74,15215,1141],{},[74,15217,15218],{"class":76,"line":87},[74,15219,1146],{},[74,15221,15222],{"class":76,"line":388},[74,15223,1151],{},[74,15225,15226],{"class":76,"line":394},[74,15227,1156],{},[10,15229,1159],{},[65,15231,15232],{"className":67,"code":1162,"language":69,"meta":70,"style":70},[34,15233,15234],{"__ignoreMap":70},[74,15235,15236,15238],{"class":76,"line":77},[74,15237,36],{"class":80},[74,15239,1171],{"class":95},[10,15241,1174],{},[14,15243,1178],{"id":1177},[290,15245,1181],{"id":1181},[10,15247,1184],{},[290,15249,1187],{"id":1187},[10,15251,1190],{},[290,15253,1193],{"id":1193},[10,15255,1196],{},[10,15257,1199],{},[65,15259,15260],{"className":371,"code":1202,"language":373,"meta":70,"style":70},[34,15261,15262,15266,15270,15274],{"__ignoreMap":70},[74,15263,15264],{"class":76,"line":77},[74,15265,1209],{},[74,15267,15268],{"class":76,"line":87},[74,15269,1051],{"emptyLinePlaceholder":190},[74,15271,15272],{"class":76,"line":388},[74,15273,1218],{},[74,15275,15276],{"class":76,"line":394},[74,15277,1223],{},[10,15279,1226],{},[290,15281,1229],{"id":1229},[10,15283,1232,15284,1235],{},[34,15285,222],{},[10,15287,1238],{},[290,15289,1241],{"id":1241},[10,15291,1244],{},[14,15293,1248],{"id":1247},[10,15295,15296],{},[26,15297],{"alt":1253,"src":1254},[10,15299,1257],{},[42,15301,15302,15304,15306,15308,15310,15312,15314,15316],{},[45,15303,1262],{},[45,15305,1265],{},[45,15307,1268],{},[45,15309,1271],{},[45,15311,1274],{},[45,15313,1277],{},[45,15315,1280],{},[45,15317,1283],{},[10,15319,1286],{},[14,15321,1290],{"id":1289},[10,15323,1293],{},[10,15325,1296],{},[14,15327,1300],{"id":1299},[10,15329,1303],{},[10,15331,1306],{},[10,15333,1309],{},[14,15335,1312],{"id":1312},[10,15337,1315],{},[10,15339,1318],{},[173,15341,1321],{},{"title":70,"searchDepth":87,"depth":87,"links":15343},[15344,15345,15346,15353,15354,15355,15356],{"id":1027,"depth":87,"text":1028},{"id":1120,"depth":87,"text":1121},{"id":1177,"depth":87,"text":1178,"children":15347},[15348,15349,15350,15351,15352],{"id":1181,"depth":388,"text":1181},{"id":1187,"depth":388,"text":1187},{"id":1193,"depth":388,"text":1193},{"id":1229,"depth":388,"text":1229},{"id":1241,"depth":388,"text":1241},{"id":1247,"depth":87,"text":1248},{"id":1289,"depth":87,"text":1290},{"id":1299,"depth":87,"text":1300},{"id":1312,"depth":87,"text":1312},{},{"title":1010,"description":70},[186,1345,1346],{"id":204,"title":205,"body":15361,"category":186,"cover":187,"description":70,"extension":188,"meta":15940,"navigation":190,"path":999,"pinned":192,"publishedAt":1000,"seo":15941,"slug":1002,"stem":1003,"summary":1004,"tags":15942,"updatedAt":1000,"visible":190,"__hash__":1007},{"type":7,"value":15362,"toc":15916},[15363,15365,15367,15369,15373,15375,15377,15401,15413,15415,15417,15422,15426,15430,15442,15446,15450,15454,15456,15490,15492,15496,15500,15502,15524,15554,15566,15576,15584,15586,15592,15602,15604,15609,15613,15615,15629,15635,15655,15657,15659,15661,15671,15675,15677,15686,15690,15692,15694,15714,15718,15720,15722,15724,15726,15746,15748,15750,15752,15778,15780,15796,15798,15814,15818,15820,15822,15842,15844,15846,15848,15852,15862,15864,15866,15868,15878,15886,15888,15890,15904,15914],[14,15364,210],{"id":210},[10,15366,213],{},[10,15368,216],{},[10,15370,219,15371,223],{},[34,15372,222],{},[14,15374,226],{"id":226},[10,15376,229],{},[231,15378,15379,15381],{},[10,15380,235],{},[231,15382,15383,15389,15391,15395,15397],{},[10,15384,240,15385,244,15387,248],{},[34,15386,243],{},[34,15388,247],{},[10,15390,251],{},[10,15392,254,15393,259],{},[256,15394,258],{},[10,15396,262],{},[10,15398,15399],{},[26,15400],{"alt":267,"src":268},[231,15402,15403,15405],{},[10,15404,273],{},[231,15406,15407,15409],{},[10,15408,278],{},[10,15410,15411],{},[26,15412],{"alt":283,"src":284},[14,15414,288],{"id":287},[290,15416,293],{"id":292},[10,15418,296,15419,304],{},[298,15420,303],{"href":300,"rel":15421},[302],[231,15423,15424],{},[10,15425,309],{},[10,15427,15428],{},[26,15429],{"alt":314,"src":315},[42,15431,15432,15436,15440],{},[45,15433,320,15434,324],{},[256,15435,323],{},[45,15437,327,15438,324],{},[256,15439,330],{},[45,15441,333],{},[10,15443,15444],{},[26,15445],{"alt":338,"src":339},[231,15447,15448],{},[10,15449,344],{},[10,15451,15452],{},[26,15453],{"alt":349,"src":350},[290,15455,354],{"id":353},[231,15457,15458,15462,15466,15486],{},[231,15459,15460],{},[10,15461,361],{},[10,15463,364,15464,368],{},[256,15465,367],{},[65,15467,15468],{"className":371,"code":372,"language":373,"meta":70,"style":70},[34,15469,15470,15474,15478,15482],{"__ignoreMap":70},[74,15471,15472],{"class":76,"line":77},[74,15473,380],{},[74,15475,15476],{"class":76,"line":87},[74,15477,385],{},[74,15479,15480],{"class":76,"line":388},[74,15481,391],{},[74,15483,15484],{"class":76,"line":394},[74,15485,397],{},[10,15487,400,15488,404],{},[256,15489,403],{},[10,15491,407],{},[10,15493,410,15494,413],{},[34,15495,373],{},[10,15497,15498],{},[26,15499],{"alt":418,"src":419},[10,15501,422],{},[231,15503,15504,15506,15510],{},[10,15505,427],{},[10,15507,15508],{},[256,15509,432],{},[231,15511,15512,15516,15520],{},[10,15513,437,15514,440],{},[34,15515,373],{},[10,15517,443,15518,446],{},[34,15519,373],{},[10,15521,449,15522,453],{},[256,15523,452],{},[231,15525,15526,15528,15532],{},[10,15527,458],{},[10,15529,15530],{},[256,15531,463],{},[231,15533,15534,15540,15548,15550],{},[10,15535,15536,471,15538,475],{},[34,15537,470],{},[34,15539,474],{},[10,15541,478,15542,481,15544,485,15546,489],{},[34,15543,470],{},[256,15545,484],{},[256,15547,488],{},[10,15549,492],{},[10,15551,15552,498],{},[256,15553,497],{},[231,15555,15556,15558],{},[10,15557,503],{},[231,15559,15560,15564],{},[10,15561,508,15562,512],{},[256,15563,511],{},[10,15565,515],{},[231,15567,15568,15572],{},[10,15569,520,15570],{},[256,15571,523],{},[10,15573,15574],{},[26,15575],{"alt":528,"src":529},[231,15577,15578,15580],{},[10,15579,534],{},[10,15581,15582],{},[26,15583],{"alt":528,"src":539},[290,15585,543],{"id":542},[10,15587,546,15588,550,15590,554],{},[34,15589,549],{},[34,15591,553],{},[65,15593,15594],{"className":67,"code":557,"language":69,"meta":70,"style":70},[34,15595,15596],{"__ignoreMap":70},[74,15597,15598,15600],{"class":76,"line":77},[74,15599,373],{"class":80},[74,15601,84],{"class":83},[10,15603,568],{},[65,15605,15607],{"className":15606,"code":572,"language":107,"meta":70},[105],[34,15608,572],{"__ignoreMap":70},[10,15610,15611],{},[26,15612],{"alt":528,"src":579},[10,15614,582],{},[65,15616,15617],{"className":67,"code":585,"language":69,"meta":70,"style":70},[34,15618,15619],{"__ignoreMap":70},[74,15620,15621,15623,15625,15627],{"class":76,"line":77},[74,15622,373],{"class":80},[74,15624,92],{"class":83},[74,15626,96],{"class":95},[74,15628,84],{"class":83},[10,15630,600,15631,603,15633,607],{},[34,15632,373],{},[34,15634,606],{},[65,15636,15637],{"className":67,"code":610,"language":69,"meta":70,"style":70},[34,15638,15639,15645],{"__ignoreMap":70},[74,15640,15641,15643],{"class":76,"line":77},[74,15642,474],{"class":80},[74,15644,84],{"class":83},[74,15646,15647,15649,15651,15653],{"class":76,"line":87},[74,15648,474],{"class":80},[74,15650,92],{"class":83},[74,15652,96],{"class":95},[74,15654,84],{"class":83},[14,15656,632],{"id":631},[290,15658,636],{"id":635},[10,15660,639],{},[65,15662,15663],{"className":67,"code":642,"language":69,"meta":70,"style":70},[34,15664,15665],{"__ignoreMap":70},[74,15666,15667,15669],{"class":76,"line":77},[74,15668,36],{"class":80},[74,15670,84],{"class":83},[10,15672,653,15673,656],{},[34,15674,129],{},[290,15676,660],{"id":659},[10,15678,296,15679,668,15682,324,15684,675],{},[298,15680,667],{"href":665,"rel":15681},[302],[256,15683,671],{},[34,15685,674],{},[10,15687,678,15688,682],{},[34,15689,681],{},[290,15691,686],{"id":685},[10,15693,689],{},[65,15695,15696],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,15697,15698,15704],{"__ignoreMap":70},[74,15699,15700,15702],{"class":76,"line":77},[74,15701,36],{"class":80},[74,15703,84],{"class":83},[74,15705,15706,15708,15710,15712],{"class":76,"line":87},[74,15707,36],{"class":80},[74,15709,92],{"class":83},[74,15711,96],{"class":95},[74,15713,84],{"class":83},[10,15715,712,15716,715],{},[34,15717,36],{},[14,15719,719],{"id":718},[10,15721,722],{},[290,15723,726],{"id":725},[10,15725,729],{},[65,15727,15728],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,15729,15730,15736],{"__ignoreMap":70},[74,15731,15732,15734],{"class":76,"line":77},[74,15733,36],{"class":80},[74,15735,84],{"class":83},[74,15737,15738,15740,15742,15744],{"class":76,"line":87},[74,15739,36],{"class":80},[74,15741,92],{"class":83},[74,15743,96],{"class":95},[74,15745,84],{"class":83},[10,15747,752],{},[290,15749,756],{"id":755},[10,15751,759],{},[65,15753,15754],{"className":67,"code":762,"language":69,"meta":70,"style":70},[34,15755,15756,15764],{"__ignoreMap":70},[74,15757,15758,15760,15762],{"class":76,"line":77},[74,15759,769],{"class":80},[74,15761,772],{"class":95},[74,15763,775],{"class":95},[74,15765,15766,15768,15770,15772,15774,15776],{"class":76,"line":87},[74,15767,769],{"class":80},[74,15769,772],{"class":95},[74,15771,784],{"class":95},[74,15773,787],{"class":95},[74,15775,790],{"class":95},[74,15777,793],{"class":95},[10,15779,796],{},[65,15781,15782],{"className":67,"code":799,"language":69,"meta":70,"style":70},[34,15783,15784],{"__ignoreMap":70},[74,15785,15786,15788,15790,15792,15794],{"class":76,"line":77},[74,15787,769],{"class":80},[74,15789,808],{"class":95},[74,15791,784],{"class":95},[74,15793,787],{"class":95},[74,15795,815],{"class":95},[10,15797,818],{},[65,15799,15800],{"className":67,"code":821,"language":69,"meta":70,"style":70},[34,15801,15802],{"__ignoreMap":70},[74,15803,15804,15806,15808,15810,15812],{"class":76,"line":77},[74,15805,769],{"class":80},[74,15807,830],{"class":95},[74,15809,833],{"class":83},[74,15811,836],{"class":95},[74,15813,839],{"class":95},[10,15815,15816,844],{},[34,15817,769],{},[290,15819,848],{"id":847},[10,15821,851],{},[65,15823,15824],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,15825,15826,15832],{"__ignoreMap":70},[74,15827,15828,15830],{"class":76,"line":77},[74,15829,36],{"class":80},[74,15831,84],{"class":83},[74,15833,15834,15836,15838,15840],{"class":76,"line":87},[74,15835,36],{"class":80},[74,15837,92],{"class":83},[74,15839,96],{"class":95},[74,15841,84],{"class":83},[10,15843,874],{},[14,15845,877],{"id":877},[290,15847,881],{"id":880},[10,15849,884,15850,888],{},[34,15851,887],{},[117,15853,15854,15858,15860],{},[45,15855,155,15856,895],{},[34,15857,606],{},[45,15859,898],{},[45,15861,901],{},[10,15863,904],{},[290,15865,908],{"id":907},[10,15867,911],{},[65,15869,15870],{"className":67,"code":642,"language":69,"meta":70,"style":70},[34,15871,15872],{"__ignoreMap":70},[74,15873,15874,15876],{"class":76,"line":77},[74,15875,36],{"class":80},[74,15877,84],{"class":83},[10,15879,924,15880,927,15882,930,15884,324],{},[34,15881,36],{},[34,15883,373],{},[34,15885,36],{},[290,15887,936],{"id":935},[10,15889,939],{},[65,15891,15892],{"className":67,"code":942,"language":69,"meta":70,"style":70},[34,15893,15894],{"__ignoreMap":70},[74,15895,15896,15898,15900,15902],{"class":76,"line":77},[74,15897,36],{"class":80},[74,15899,92],{"class":83},[74,15901,96],{"class":95},[74,15903,84],{"class":83},[10,15905,957,15906,960,15908,963,15910,966,15912,970],{},[34,15907,36],{},[34,15909,373],{},[34,15911,474],{},[34,15913,969],{},[173,15915,973],{},{"title":70,"searchDepth":87,"depth":87,"links":15917},[15918,15919,15920,15925,15930,15935],{"id":210,"depth":87,"text":210},{"id":226,"depth":87,"text":226},{"id":287,"depth":87,"text":288,"children":15921},[15922,15923,15924],{"id":292,"depth":388,"text":293},{"id":353,"depth":388,"text":354},{"id":542,"depth":388,"text":543},{"id":631,"depth":87,"text":632,"children":15926},[15927,15928,15929],{"id":635,"depth":388,"text":636},{"id":659,"depth":388,"text":660},{"id":685,"depth":388,"text":686},{"id":718,"depth":87,"text":719,"children":15931},[15932,15933,15934],{"id":725,"depth":388,"text":726},{"id":755,"depth":388,"text":756},{"id":847,"depth":388,"text":848},{"id":877,"depth":87,"text":877,"children":15936},[15937,15938,15939],{"id":880,"depth":388,"text":881},{"id":907,"depth":388,"text":908},{"id":935,"depth":388,"text":936},{},{"title":205,"description":70},[186,200,1006],1786973363810]