[{"data":1,"prerenderedAt":15961},["ShallowReactive",2],{"post-python-numbers-and-arithmetic":3,"sidebar-posts":230,"post-related-source":9152},{"id":4,"title":5,"body":6,"category":215,"cover":216,"description":12,"extension":217,"meta":218,"navigation":108,"path":219,"pinned":220,"publishedAt":221,"seo":222,"slug":223,"stem":224,"summary":225,"tags":226,"updatedAt":221,"visible":108,"__hash__":229},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":8,"toc":205},"minimark",[9,13,17,20,23,30,33,36,68,71,74,134,137,145,148,151,166,169,181,184,192,195,198,201],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,31,32],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,34,35],{"id":35},"核心概念",[37,38,39,51,65],"ul",{},[40,41,42,46,47,50],"li",{},[43,44,45],"code",{},"int"," 表示整数，",[43,48,49],{},"float"," 表示浮点数。",[40,52,53,56,57,60,61,64],{},[43,54,55],{},"\u002F"," 总是进行真除法；",[43,58,59],{},"\u002F\u002F"," 是向下取整除法，",[43,62,63],{},"%"," 得到余数。",[40,66,67],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,69,70],{"id":70},"跟着示例运行",[10,72,73],{},"把下面代码保存到本课脚本并运行：",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-python shiki shiki-themes github-dark","price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n","python","",[43,82,83,91,97,103,110,116,122,128],{"__ignoreMap":80},[84,85,88],"span",{"class":86,"line":87},"line",1,[84,89,90],{},"price = 25\n",[84,92,94],{"class":86,"line":93},2,[84,95,96],{},"count = 4\n",[84,98,100],{"class":86,"line":99},3,[84,101,102],{},"discount = 0.9\n",[84,104,106],{"class":86,"line":105},4,[84,107,109],{"emptyLinePlaceholder":108},true,"\n",[84,111,113],{"class":86,"line":112},5,[84,114,115],{},"total = price * count * discount\n",[84,117,119],{"class":86,"line":118},6,[84,120,121],{},"average = total \u002F count\n",[84,123,125],{"class":86,"line":124},7,[84,126,127],{},"print(total)\n",[84,129,131],{"class":86,"line":130},8,[84,132,133],{},"print(average)\n",[10,135,136],{},"预期结果：",[75,138,143],{"className":139,"code":141,"language":142,"meta":80},[140],"language-text","90.0\n22.5\n","text",[43,144,141],{"__ignoreMap":80},[10,146,147],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,149,150],{"id":150},"按执行顺序拆开看",[152,153,154,160],"ol",{},[40,155,156,159],{},[43,157,158],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,161,162,165],{},[43,163,164],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,167,168],{"id":168},"初学者容易混淆的地方",[37,170,171,178],{},[40,172,173,174,177],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[43,175,176],{},"decimal.Decimal","。",[40,179,180],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,182,183],{"id":183},"练习",[152,185,186,189],{},[40,187,188],{},"计算 137 除以 10 的商和余数。",[40,190,191],{},"给总价表达式加括号，验证结果是否保持一致。",[10,193,194],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,196,197],{"id":197},"本篇边界",[10,199,200],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,203,204],"style",{},"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":80,"searchDepth":93,"depth":93,"links":206},[207,208,209,210,211,212,213,214],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",false,"2026-08-17",{"title":5,"description":12},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[215,227,228],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",[231,1044,1381,1515,1667,1846,2034,2199,2383,2520,2713,2944,3128,3305,3462,3633,3798,4013,4242,4424,4588,4777,4965,5120,5280,5477,5674,5888,6055,6299,6480,6685,6880,7064,7265,7555,7747,7976,8171,8391,8631,8835],{"id":232,"title":233,"body":234,"category":215,"cover":216,"description":80,"extension":217,"meta":1033,"navigation":108,"path":1034,"pinned":220,"publishedAt":1035,"seo":1036,"slug":1037,"stem":1038,"summary":1039,"tags":1040,"updatedAt":1035,"visible":108,"__hash__":1043},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":235,"toc":1009},[236,239,242,245,252,255,258,297,313,317,322,333,338,344,361,367,372,378,382,428,431,437,443,446,477,522,539,553,563,567,578,594,597,603,608,611,629,639,660,664,668,671,683,690,694,709,716,720,723,744,750,754,757,761,764,784,787,791,794,828,831,850,853,874,879,883,886,906,909,912,916,923,937,940,944,947,957,968,972,975,990,1006],[14,237,238],{"id":238},"引言",[10,240,241],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,243,244],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,246,247,248,251],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[43,249,250],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,253,254],{"id":254},"扫盲",[10,256,257],{},"那么这里有几个概念：",[259,260,261,264],"blockquote",{},[10,262,263],{},"为什么需要安装python解释器？",[259,265,266,277,280,288,291],{},[10,267,268,269,272,273,276],{},"我们写的代码，电脑其实看不懂，电脑只认识",[43,270,271],{},"0","和",[43,274,275],{},"1","组成的机器指令。",[10,278,279],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,281,282,283,287],{},"这样，我们就能用",[284,285,286],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,289,290],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,292,293],{},[26,294],{"alt":295,"src":296},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[259,298,299,302],{},[10,300,301],{},"pip又是什么？",[259,303,304,307],{},[10,305,306],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,308,309],{},[26,310],{"alt":311,"src":312},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,314,316],{"id":315},"windows-安装","Windows 安装",[318,319,321],"h3",{"id":320},"_1-下载官方安装程序","1. 下载官方安装程序",[10,323,324,325,332],{},"打开 ",[326,327,331],"a",{"href":328,"rel":329},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[330],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[259,334,335],{},[10,336,337],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,339,340],{},[26,341],{"alt":342,"src":343},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,345,346,352,358],{},[40,347,348,349,177],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[284,350,351],{},"Windows installer (64-bit)",[40,353,354,355,177],{},"搭载 ARM 处理器的 Windows 设备选择 ",[284,356,357],{},"Windows installer (ARM64)",[40,359,360],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,362,363],{},[26,364],{"alt":365,"src":366},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[259,368,369],{},[10,370,371],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,373,374],{},[26,375],{"alt":376,"src":377},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[318,379,381],{"id":380},"_2-安装并加入-path","2. 安装并加入 PATH",[259,383,384,389,396,421],{},[259,385,386],{},[10,387,388],{},"PATH 环境变量",[10,390,391,392,395],{},"Windows 有一个特殊的变量叫 ",[284,393,394],{},"PATH","，它里面存了一串文件夹路径，比如：",[75,397,399],{"className":77,"code":398,"language":79,"meta":80,"style":80},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[43,400,401,406,411,416],{"__ignoreMap":80},[84,402,403],{"class":86,"line":87},[84,404,405],{},"D:\\Python313\\\n",[84,407,408],{"class":86,"line":93},[84,409,410],{},"D:\\Python313\\Scripts\\\n",[84,412,413],{"class":86,"line":99},[84,414,415],{},"C:\\Windows\\System32\\\n",[84,417,418],{"class":86,"line":105},[84,419,420],{},"...\n",[10,422,423,424,427],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[284,425,426],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,429,430],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,432,433,434,436],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[43,435,79],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,438,439],{},[26,440],{"alt":441,"src":442},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,444,445],{},"对安装界面最底部的两个勾选项分别解释 :",[259,447,448,451,456],{},[10,449,450],{},"Add python.exe to PATH",[10,452,453],{},[284,454,455],{},"把 Python 添加到系统环境变量",[259,457,458,464,470],{},[10,459,460,461,463],{},"勾选后，你可以在命令行任意位置直接输入 ",[43,462,79],{}," 就能运行",[10,465,466,467,469],{},"不勾选的话，命令行输入 ",[43,468,79],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,471,472,473,476],{},"必须",[284,474,475],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[259,478,479,482,487],{},[10,480,481],{},"Use admin privileges when installing py.exe",[10,483,484],{},[284,485,486],{},"使用管理员权限安装 py.exe（Python 启动器）",[259,488,489,499,513,516],{},[10,490,491,494,495,498],{},[43,492,493],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[43,496,497],{},"py"," 来启动 Python。",[10,500,501,502,504,505,508,509,512],{},"勾选后，",[43,503,493],{}," 会安装到",[284,506,507],{},"系统级目录","，电脑上",[284,510,511],{},"所有用户账户","都能用",[10,514,515],{},"不勾选，只有当前用户能用",[10,517,518,521],{},[284,519,520],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[259,523,524,527],{},[10,525,526],{},"操作建议",[259,528,529,536],{},[10,530,531,532,535],{},"两个都勾上之后，再点 ",[284,533,534],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,537,538],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[259,540,541,547],{},[10,542,543,544],{},"Python 安装的",[284,545,546],{},"可选功能页",[10,548,549],{},[26,550],{"alt":551,"src":552},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[259,554,555,558],{},[10,556,557],{},"高级选项页",[10,559,560],{},[26,561],{"alt":551,"src":562},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[318,564,566],{"id":565},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,568,569,570,573,574,577],{},"按 ",[43,571,572],{},"Win + R","，输入 ",[43,575,576],{},"cmd"," 并回车，然后执行：",[75,579,583],{"className":580,"code":581,"language":582,"meta":80,"style":80},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[43,584,585],{"__ignoreMap":80},[84,586,587,590],{"class":86,"line":87},[84,588,79],{"class":589},"svObZ",[84,591,593],{"class":592},"sDLfK"," --version\n",[10,595,596],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[75,598,601],{"className":599,"code":600,"language":142,"meta":80},[140],"Python 3.x.x\n",[43,602,600],{"__ignoreMap":80},[10,604,605],{},[26,606],{"alt":551,"src":607},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,609,610],{},"继续检查 pip：",[75,612,614],{"className":580,"code":613,"language":582,"meta":80,"style":80},"python -m pip --version\n",[43,615,616],{"__ignoreMap":80},[84,617,618,620,623,627],{"class":86,"line":87},[84,619,79],{"class":589},[84,621,622],{"class":592}," -m",[84,624,626],{"class":625},"sU2Wk"," pip",[84,628,593],{"class":592},[10,630,631,632,634,635,638],{},"如果 ",[43,633,79],{}," 无法识别，但 ",[43,636,637],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[75,640,642],{"className":580,"code":641,"language":582,"meta":80,"style":80},"py --version\npy -m pip --version\n",[43,643,644,650],{"__ignoreMap":80},[84,645,646,648],{"class":86,"line":87},[84,647,497],{"class":589},[84,649,593],{"class":592},[84,651,652,654,656,658],{"class":86,"line":93},[84,653,497],{"class":589},[84,655,622],{"class":592},[84,657,626],{"class":625},[84,659,593],{"class":592},[14,661,663],{"id":662},"macos-安装","macOS 安装",[318,665,667],{"id":666},"_1-先检查现有环境","1. 先检查现有环境",[10,669,670],{},"打开“终端”应用，执行：",[75,672,674],{"className":580,"code":673,"language":582,"meta":80,"style":80},"python3 --version\n",[43,675,676],{"__ignoreMap":80},[84,677,678,681],{"class":86,"line":87},[84,679,680],{"class":589},"python3",[84,682,593],{"class":592},[10,684,685,686,689],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[43,687,688],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[318,691,693],{"id":692},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,695,324,696,701,702,177,705,708],{},[326,697,700],{"href":698,"rel":699},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[330],"Python macOS 下载页","，下载当前稳定版的 ",[284,703,704],{},"macOS 64-bit universal2 installer",[43,706,707],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,710,711,712,715],{},"下载完成后打开 ",[43,713,714],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[318,717,719],{"id":718},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,721,722],{},"安装完成后重新打开终端，执行：",[75,724,726],{"className":580,"code":725,"language":582,"meta":80,"style":80},"python3 --version\npython3 -m pip --version\n",[43,727,728,734],{"__ignoreMap":80},[84,729,730,732],{"class":86,"line":87},[84,731,680],{"class":589},[84,733,593],{"class":592},[84,735,736,738,740,742],{"class":86,"line":93},[84,737,680],{"class":589},[84,739,622],{"class":592},[84,741,626],{"class":625},[84,743,593],{"class":592},[10,745,746,747,749],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[43,748,680],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,751,753],{"id":752},"linux-安装","Linux 安装",[10,755,756],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[318,758,760],{"id":759},"_1-检查是否已经安装","1. 检查是否已经安装",[10,762,763],{},"打开终端，执行：",[75,765,766],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,767,768,774],{"__ignoreMap":80},[84,769,770,772],{"class":86,"line":87},[84,771,680],{"class":589},[84,773,593],{"class":592},[84,775,776,778,780,782],{"class":86,"line":93},[84,777,680],{"class":589},[84,779,622],{"class":592},[84,781,626],{"class":625},[84,783,593],{"class":592},[10,785,786],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[318,788,790],{"id":789},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,792,793],{},"Ubuntu 或 Debian：",[75,795,797],{"className":580,"code":796,"language":582,"meta":80,"style":80},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[43,798,799,810],{"__ignoreMap":80},[84,800,801,804,807],{"class":86,"line":87},[84,802,803],{"class":589},"sudo",[84,805,806],{"class":625}," apt",[84,808,809],{"class":625}," update\n",[84,811,812,814,816,819,822,825],{"class":86,"line":93},[84,813,803],{"class":589},[84,815,806],{"class":625},[84,817,818],{"class":625}," install",[84,820,821],{"class":625}," python3",[84,823,824],{"class":625}," python3-pip",[84,826,827],{"class":625}," python3-venv\n",[10,829,830],{},"Fedora：",[75,832,834],{"className":580,"code":833,"language":582,"meta":80,"style":80},"sudo dnf install python3 python3-pip\n",[43,835,836],{"__ignoreMap":80},[84,837,838,840,843,845,847],{"class":86,"line":87},[84,839,803],{"class":589},[84,841,842],{"class":625}," dnf",[84,844,818],{"class":625},[84,846,821],{"class":625},[84,848,849],{"class":625}," python3-pip\n",[10,851,852],{},"Arch Linux：",[75,854,856],{"className":580,"code":855,"language":582,"meta":80,"style":80},"sudo pacman -S python python-pip\n",[43,857,858],{"__ignoreMap":80},[84,859,860,862,865,868,871],{"class":86,"line":87},[84,861,803],{"class":589},[84,863,864],{"class":625}," pacman",[84,866,867],{"class":592}," -S",[84,869,870],{"class":625}," python",[84,872,873],{"class":625}," python-pip\n",[10,875,876,878],{},[43,877,803],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[318,880,882],{"id":881},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,884,885],{},"安装结束后执行：",[75,887,888],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,889,890,896],{"__ignoreMap":80},[84,891,892,894],{"class":86,"line":87},[84,893,680],{"class":589},[84,895,593],{"class":592},[84,897,898,900,902,904],{"class":86,"line":93},[84,899,680],{"class":589},[84,901,622],{"class":592},[84,903,626],{"class":625},[84,905,593],{"class":592},[10,907,908],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,910,911],{"id":911},"常见问题",[318,913,915],{"id":914},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,917,918,919,922],{},"先关闭当前命令提示符并重新打开，再执行 ",[43,920,921],{},"python --version","。如果仍然失败，按下面的顺序检查：",[152,924,925,931,934],{},[40,926,927,928,930],{},"执行 ",[43,929,637],{},"，确认 Python Launcher 是否可用。",[40,932,933],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,935,936],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,938,939],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[318,941,943],{"id":942},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,945,946],{},"先尝试：",[75,948,949],{"className":580,"code":673,"language":582,"meta":80,"style":80},[43,950,951],{"__ignoreMap":80},[84,952,953,955],{"class":86,"line":87},[84,954,680],{"class":589},[84,956,593],{"class":592},[10,958,959,960,962,963,965,966,177],{},"在这两个系统中，只有 ",[43,961,680],{}," 命令而没有 ",[43,964,79],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[43,967,680],{},[318,969,971],{"id":970},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,973,974],{},"先使用模块方式检查：",[75,976,978],{"className":580,"code":977,"language":582,"meta":80,"style":80},"python3 -m pip --version\n",[43,979,980],{"__ignoreMap":80},[84,981,982,984,986,988],{"class":86,"line":87},[84,983,680],{"class":589},[84,985,622],{"class":592},[84,987,626],{"class":625},[84,989,593],{"class":592},[10,991,992,993,995,996,998,999,1001,1002,1005],{},"Windows 用户将命令中的 ",[43,994,680],{}," 换成 ",[43,997,79],{}," 或 ",[43,1000,497],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[43,1003,1004],{},"python3-pip","；不要直接使用其他系统的安装命令。",[202,1007,1008],{},"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":80,"searchDepth":93,"depth":93,"links":1010},[1011,1012,1013,1018,1023,1028],{"id":238,"depth":93,"text":238},{"id":254,"depth":93,"text":254},{"id":315,"depth":93,"text":316,"children":1014},[1015,1016,1017],{"id":320,"depth":99,"text":321},{"id":380,"depth":99,"text":381},{"id":565,"depth":99,"text":566},{"id":662,"depth":93,"text":663,"children":1019},[1020,1021,1022],{"id":666,"depth":99,"text":667},{"id":692,"depth":99,"text":693},{"id":718,"depth":99,"text":719},{"id":752,"depth":93,"text":753,"children":1024},[1025,1026,1027],{"id":759,"depth":99,"text":760},{"id":789,"depth":99,"text":790},{"id":881,"depth":99,"text":882},{"id":911,"depth":93,"text":911,"children":1029},[1030,1031,1032],{"id":914,"depth":99,"text":915},{"id":942,"depth":99,"text":943},{"id":970,"depth":99,"text":971},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":233,"description":80},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[215,1041,1042],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1045,"title":1046,"body":1047,"category":215,"cover":1054,"description":80,"extension":217,"meta":1370,"navigation":108,"path":1371,"pinned":220,"publishedAt":1372,"seo":1373,"slug":1374,"stem":1375,"summary":1376,"tags":1377,"updatedAt":1372,"visible":108,"__hash__":1380},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1048,"toc":1355},[1049,1055,1058,1061,1065,1068,1092,1095,1101,1104,1107,1141,1151,1155,1162,1165,1190,1193,1205,1208,1212,1215,1218,1221,1224,1227,1230,1233,1257,1260,1263,1269,1272,1275,1278,1282,1288,1291,1317,1320,1324,1327,1330,1334,1337,1340,1343,1346,1349,1352],[10,1050,1051],{},[26,1052],{"alt":1053,"src":1054},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1056,1057],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1059,1060],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1062,1064],{"id":1063},"python-代码是什么样的","Python 代码是什么样的",[10,1066,1067],{},"下面是一段简单的 Python 代码：",[75,1069,1071],{"className":77,"code":1070,"language":79,"meta":80,"style":80},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[43,1072,1073,1078,1083,1087],{"__ignoreMap":80},[84,1074,1075],{"class":86,"line":87},[84,1076,1077],{},"name = \"Python\"\n",[84,1079,1080],{"class":86,"line":93},[84,1081,1082],{},"year = 2026\n",[84,1084,1085],{"class":86,"line":99},[84,1086,109],{"emptyLinePlaceholder":108},[84,1088,1089],{"class":86,"line":105},[84,1090,1091],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1093,1094],{},"运行结果：",[75,1096,1099],{"className":1097,"code":1098,"language":142,"meta":80},[140],"正在学习 Python，当前年份是 2026\n",[43,1100,1098],{"__ignoreMap":80},[10,1102,1103],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1105,1106],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[75,1108,1110],{"className":77,"code":1109,"language":79,"meta":80,"style":80},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[43,1111,1112,1117,1121,1126,1131,1136],{"__ignoreMap":80},[84,1113,1114],{"class":86,"line":87},[84,1115,1116],{},"score = 85\n",[84,1118,1119],{"class":86,"line":93},[84,1120,109],{"emptyLinePlaceholder":108},[84,1122,1123],{"class":86,"line":99},[84,1124,1125],{},"if score >= 60:\n",[84,1127,1128],{"class":86,"line":105},[84,1129,1130],{},"    print(\"成绩合格\")\n",[84,1132,1133],{"class":86,"line":112},[84,1134,1135],{},"else:\n",[84,1137,1138],{"class":86,"line":118},[84,1139,1140],{},"    print(\"需要继续学习\")\n",[10,1142,1143,1146,1147,1150],{},[43,1144,1145],{},"if"," 和 ",[43,1148,1149],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1152,1154],{"id":1153},"python-如何运行代码","Python 如何运行代码",[10,1156,1157,1158,1161],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[43,1159,1160],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1163,1164],{},"交互式环境适合快速验证一个表达式：",[75,1166,1168],{"className":77,"code":1167,"language":79,"meta":80,"style":80},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[43,1169,1170,1175,1180,1185],{"__ignoreMap":80},[84,1171,1172],{"class":86,"line":87},[84,1173,1174],{},">>> 10 + 20\n",[84,1176,1177],{"class":86,"line":93},[84,1178,1179],{},"30\n",[84,1181,1182],{"class":86,"line":99},[84,1183,1184],{},">>> \"Python\".lower()\n",[84,1186,1187],{"class":86,"line":105},[84,1188,1189],{},"'python'\n",[10,1191,1192],{},"需要保存和重复运行的程序，则可以写入文件：",[75,1194,1196],{"className":580,"code":1195,"language":582,"meta":80,"style":80},"python3 hello.py\n",[43,1197,1198],{"__ignoreMap":80},[84,1199,1200,1202],{"class":86,"line":87},[84,1201,680],{"class":589},[84,1203,1204],{"class":625}," hello.py\n",[10,1206,1207],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1209,1211],{"id":1210},"python-的特点","Python 的特点",[318,1213,1214],{"id":1214},"语法相对简洁",[10,1216,1217],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[318,1219,1220],{"id":1220},"支持多种编程方式",[10,1222,1223],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[318,1225,1226],{"id":1226},"标准库比较完整",[10,1228,1229],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1231,1232],{},"例如，获取当前时间：",[75,1234,1236],{"className":77,"code":1235,"language":79,"meta":80,"style":80},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[43,1237,1238,1243,1247,1252],{"__ignoreMap":80},[84,1239,1240],{"class":86,"line":87},[84,1241,1242],{},"from datetime import datetime\n",[84,1244,1245],{"class":86,"line":93},[84,1246,109],{"emptyLinePlaceholder":108},[84,1248,1249],{"class":86,"line":99},[84,1250,1251],{},"now = datetime.now()\n",[84,1253,1254],{"class":86,"line":105},[84,1255,1256],{},"print(now)\n",[10,1258,1259],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[318,1261,1262],{"id":1262},"第三方工具丰富",[10,1264,1265,1266,1268],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[43,1267,250],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1270,1271],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[318,1273,1274],{"id":1274},"支持多个操作系统",[10,1276,1277],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1279,1281],{"id":1280},"python-可以做什么","Python 可以做什么",[10,1283,1284],{},[26,1285],{"alt":1286,"src":1287},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1289,1290],{},"Python 的应用范围比较广，常见方向包括：",[37,1292,1293,1296,1299,1302,1305,1308,1311,1314],{},[40,1294,1295],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1297,1298],{},"开发网站后端和 API 服务；",[40,1300,1301],{},"进行数据清洗、统计分析和图表展示；",[40,1303,1304],{},"编写网络爬虫和信息采集工具；",[40,1306,1307],{},"开发自动化测试程序；",[40,1309,1310],{},"进行机器学习和人工智能开发；",[40,1312,1313],{},"编写运维、监控和辅助开发工具；",[40,1315,1316],{},"开发部分桌面应用和插件。",[10,1318,1319],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1321,1323],{"id":1322},"python-的发展","Python 的发展",[10,1325,1326],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1328,1329],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1331,1333],{"id":1332},"python-也有局限","Python 也有局限",[10,1335,1336],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1338,1339],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1341,1342],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1344,1345],{"id":1345},"写在最后",[10,1347,1348],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1350,1351],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[202,1353,1354],{},"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":80,"searchDepth":93,"depth":93,"links":1356},[1357,1358,1359,1366,1367,1368,1369],{"id":1063,"depth":93,"text":1064},{"id":1153,"depth":93,"text":1154},{"id":1210,"depth":93,"text":1211,"children":1360},[1361,1362,1363,1364,1365],{"id":1214,"depth":99,"text":1214},{"id":1220,"depth":99,"text":1220},{"id":1226,"depth":99,"text":1226},{"id":1262,"depth":99,"text":1262},{"id":1274,"depth":99,"text":1274},{"id":1280,"depth":93,"text":1281},{"id":1322,"depth":93,"text":1323},{"id":1332,"depth":93,"text":1333},{"id":1345,"depth":93,"text":1345},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1046,"description":80},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[215,1378,1379],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1382,"title":1383,"body":1384,"category":215,"cover":216,"description":1388,"extension":217,"meta":1506,"navigation":108,"path":1507,"pinned":220,"publishedAt":221,"seo":1508,"slug":1509,"stem":1510,"summary":1511,"tags":1512,"updatedAt":221,"visible":108,"__hash__":1514},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1385,"toc":1496},[1386,1389,1391,1394,1396,1402,1407,1409,1423,1425,1427,1436,1438,1444,1446,1448,1464,1466,1477,1479,1487,1489,1491,1494],[10,1387,1388],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1390,16],{"id":16},[10,1392,1393],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1395,22],{"id":22},[10,1397,1398],{},[26,1399],{"alt":1400,"src":1401},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1403,1404,1406],{},[43,1405,1160],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1408,35],{"id":35},[37,1410,1411,1417,1420],{},[40,1412,1413,1414,1416],{},"源代码是人编写的文本，通常保存在 ",[43,1415,1160],{}," 文件中。",[40,1418,1419],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1421,1422],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1424,70],{"id":70},[10,1426,73],{},[75,1428,1430],{"className":77,"code":1429,"language":79,"meta":80,"style":80},"print(\"你好，Python\")\n",[43,1431,1432],{"__ignoreMap":80},[84,1433,1434],{"class":86,"line":87},[84,1435,1429],{},[10,1437,136],{},[75,1439,1442],{"className":1440,"code":1441,"language":142,"meta":80},[140],"你好，Python\n",[43,1443,1441],{"__ignoreMap":80},[10,1445,147],{},[14,1447,150],{"id":150},[152,1449,1450,1457],{},[40,1451,1452,1453,1456],{},"终端启动解释器后，解释器读取 ",[43,1454,1455],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1458,1459,1460,1463],{},"字符串对象先准备好，再交给 ",[43,1461,1462],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1465,168],{"id":168},[37,1467,1468,1471],{},[40,1469,1470],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1472,1473,1474,1476],{},"认为 ",[43,1475,1160],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1478,183],{"id":183},[152,1480,1481,1484],{},[40,1482,1483],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1485,1486],{},"把示例文字改成自己的学习目标并重新运行。",[10,1488,194],{},[14,1490,197],{"id":197},[10,1492,1493],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,1495,204],{},{"title":80,"searchDepth":93,"depth":93,"links":1497},[1498,1499,1500,1501,1502,1503,1504,1505],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1383,"description":1388},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[215,1378,1513],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1516,"title":1517,"body":1518,"category":215,"cover":216,"description":1522,"extension":217,"meta":1658,"navigation":108,"path":1659,"pinned":220,"publishedAt":221,"seo":1660,"slug":1661,"stem":1662,"summary":1663,"tags":1664,"updatedAt":221,"visible":108,"__hash__":1666},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1519,"toc":1648},[1520,1523,1525,1528,1530,1536,1542,1544,1559,1561,1564,1584,1586,1592,1594,1596,1609,1611,1625,1627,1638,1640,1642,1645],[10,1521,1522],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1524,16],{"id":16},[10,1526,1527],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1529,22],{"id":22},[10,1531,1532],{},[26,1533],{"alt":1534,"src":1535},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1537,1538,1539,1541],{},"终端收到 ",[43,1540,680],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1543,35],{"id":35},[37,1545,1546,1549,1552],{},[40,1547,1548],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1550,1551],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1553,1554,1555,1558],{},"检查 pip 时使用 ",[43,1556,1557],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1560,70],{"id":70},[10,1562,1563],{},"在 macOS 终端执行：",[75,1565,1566],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,1567,1568,1574],{"__ignoreMap":80},[84,1569,1570,1572],{"class":86,"line":87},[84,1571,680],{"class":589},[84,1573,593],{"class":592},[84,1575,1576,1578,1580,1582],{"class":86,"line":93},[84,1577,680],{"class":589},[84,1579,622],{"class":592},[84,1581,626],{"class":625},[84,1583,593],{"class":592},[10,1585,136],{},[75,1587,1590],{"className":1588,"code":1589,"language":142,"meta":80},[140],"Python 3.14.x\npip 版本信息与安装路径\n",[43,1591,1589],{"__ignoreMap":80},[10,1593,147],{},[14,1595,150],{"id":150},[152,1597,1598,1604],{},[40,1599,1600,1603],{},[43,1601,1602],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1605,1606,1608],{},[43,1607,688],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1610,168],{"id":168},[37,1612,1613,1619],{},[40,1614,1615,1616,1618],{},"看到系统已有 ",[43,1617,680],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1620,1621,1622,1624],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[43,1623,680],{},"，不修改系统自带工具。",[14,1626,183],{"id":183},[152,1628,1629,1635],{},[40,1630,927,1631,1634],{},[43,1632,1633],{},"which python3","，记录当前解释器路径。",[40,1636,1637],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1639,194],{},[14,1641,197],{"id":197},[10,1643,1644],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,1646,1647],{},"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":80,"searchDepth":93,"depth":93,"links":1649},[1650,1651,1652,1653,1654,1655,1656,1657],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1517,"description":1522},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[215,1665,1041],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1668,"title":1669,"body":1670,"category":215,"cover":216,"description":1835,"extension":217,"meta":1836,"navigation":108,"path":1837,"pinned":220,"publishedAt":221,"seo":1838,"slug":1839,"stem":1840,"summary":1841,"tags":1842,"updatedAt":221,"visible":108,"__hash__":1845},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1671,"toc":1825},[1672,1678,1680,1683,1685,1691,1694,1696,1720,1722,1724,1751,1753,1759,1761,1763,1781,1783,1797,1799,1813,1815,1817,1823],[10,1673,1674,1675,1677],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[43,1676,1160],{}," 脚本。",[14,1679,16],{"id":16},[10,1681,1682],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1684,22],{"id":22},[10,1686,1687],{},[26,1688],{"alt":1689,"src":1690},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1692,1693],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1695,35],{"id":35},[37,1697,1698,1707,1714],{},[40,1699,1700,1701,1703,1704,177],{},"在终端输入 ",[43,1702,680],{}," 进入 REPL，提示符通常是 ",[43,1705,1706],{},">>>",[40,1708,1709,1710,1713],{},"输入 ",[43,1711,1712],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1715,1716,1717,1719],{},"需要保存、复查或多次运行的代码应写入 ",[43,1718,1160],{}," 文件。",[14,1721,70],{"id":70},[10,1723,73],{},[75,1725,1729],{"className":1726,"code":1727,"language":1728,"meta":80,"style":80},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[43,1730,1731,1736,1741,1746],{"__ignoreMap":80},[84,1732,1733],{"class":86,"line":87},[84,1734,1735],{},">>> 2 + 3\n",[84,1737,1738],{"class":86,"line":93},[84,1739,1740],{},"5\n",[84,1742,1743],{"class":86,"line":99},[84,1744,1745],{},">>> \"python\".upper()\n",[84,1747,1748],{"class":86,"line":105},[84,1749,1750],{},"'PYTHON'\n",[10,1752,136],{},[75,1754,1757],{"className":1755,"code":1756,"language":142,"meta":80},[140],"REPL 会直接显示表达式结果\n",[43,1758,1756],{"__ignoreMap":80},[10,1760,147],{},[14,1762,150],{"id":150},[152,1764,1765,1775],{},[40,1766,1767,1768,1771,1772,177],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[43,1769,1770],{},"2 + 3"," 能直接看到 ",[43,1773,1774],{},"5",[40,1776,1777,1778,1780],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[43,1779,1462],{}," 才会写到标准输出。",[14,1782,168],{"id":168},[37,1784,1785,1794],{},[40,1786,1787,1788,1790,1791,1793],{},"把提示符 ",[43,1789,1706],{}," 复制进 ",[43,1792,1160],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1795,1796],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1798,183],{"id":183},[152,1800,1801,1807],{},[40,1802,1803,1804,177],{},"在 REPL 计算 ",[43,1805,1806],{},"12 * 8",[40,1808,1809,1810,1812],{},"把同一表达式写入脚本；观察脚本中不调用 ",[43,1811,1462],{}," 时是否显示结果。",[10,1814,194],{},[14,1816,197],{"id":197},[10,1818,1819,1820,1822],{},"本篇目标是根据任务选择 REPL 或 ",[43,1821,1160],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,1824,204],{},{"title":80,"searchDepth":93,"depth":93,"links":1826},[1827,1828,1829,1830,1831,1832,1833,1834],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1669,"description":1835},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[215,1843,1844],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1847,"title":1848,"body":1849,"category":215,"cover":216,"description":1853,"extension":217,"meta":2024,"navigation":108,"path":2025,"pinned":220,"publishedAt":221,"seo":2026,"slug":2027,"stem":2028,"summary":2029,"tags":2030,"updatedAt":221,"visible":108,"__hash__":2033},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1850,"toc":2014},[1851,1854,1856,1859,1861,1867,1873,1875,1893,1895,1897,1942,1944,1950,1952,1954,1976,1978,1990,1992,2004,2006,2008,2011],[10,1852,1853],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1855,16],{"id":16},[10,1857,1858],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1860,22],{"id":22},[10,1862,1863],{},[26,1864],{"alt":1865,"src":1866},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1868,1869,1872],{},[43,1870,1871],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1874,35],{"id":35},[37,1876,1877,1880,1890],{},[40,1878,1879],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1881,1882,1885,1886,1889],{},[43,1883,1884],{},"pwd"," 显示当前目录，",[43,1887,1888],{},"ls"," 显示目录里的文件。",[40,1891,1892],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1894,70],{"id":70},[10,1896,1563],{},[75,1898,1900],{"className":580,"code":1899,"language":582,"meta":80,"style":80},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[43,1901,1902,1910,1917,1922,1936],{"__ignoreMap":80},[84,1903,1904,1907],{"class":86,"line":87},[84,1905,1906],{"class":589},"mkdir",[84,1908,1909],{"class":625}," python-study\n",[84,1911,1912,1915],{"class":86,"line":93},[84,1913,1914],{"class":592},"cd",[84,1916,1909],{"class":625},[84,1918,1919],{"class":86,"line":99},[84,1920,1921],{"class":592},"pwd\n",[84,1923,1924,1927,1930,1934],{"class":86,"line":105},[84,1925,1926],{"class":592},"printf",[84,1928,1929],{"class":625}," 'print(\"项目已经运行\")\\n'",[84,1931,1933],{"class":1932},"snl16"," >",[84,1935,1204],{"class":625},[84,1937,1938,1940],{"class":86,"line":112},[84,1939,680],{"class":589},[84,1941,1204],{"class":625},[10,1943,136],{},[75,1945,1948],{"className":1946,"code":1947,"language":142,"meta":80},[140],"项目已经运行\n",[43,1949,1947],{"__ignoreMap":80},[10,1951,147],{},[14,1953,150],{"id":150},[152,1955,1956,1967],{},[40,1957,1958,1960,1961,1963,1964,1966],{},[43,1959,1906],{}," 创建目录，",[43,1962,1914],{}," 改变终端当前目录，",[43,1965,1884],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1968,1969,1971,1972,1975],{},[43,1970,1871],{}," 会在当前目录寻找 ",[43,1973,1974],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1977,168],{"id":168},[37,1979,1980,1987],{},[40,1981,1982,1983,1146,1985,177],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[43,1984,1884],{},[43,1986,1888],{},[40,1988,1989],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1991,183],{"id":183},[152,1993,1994,2001],{},[40,1995,1996,1997,2000],{},"新建 ",[43,1998,1999],{},"lesson01.py"," 并输出课程编号。",[40,2002,2003],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2005,194],{},[14,2007,197],{"id":197},[10,2009,2010],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,2012,2013],{},"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":80,"searchDepth":93,"depth":93,"links":2015},[2016,2017,2018,2019,2020,2021,2022,2023],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1848,"description":1853},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[215,2031,2032],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2035,"title":2036,"body":2037,"category":215,"cover":216,"description":2041,"extension":217,"meta":2189,"navigation":108,"path":2190,"pinned":220,"publishedAt":221,"seo":2191,"slug":2192,"stem":2193,"summary":2194,"tags":2195,"updatedAt":221,"visible":108,"__hash__":2198},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2038,"toc":2179},[2039,2042,2044,2047,2049,2055,2066,2068,2088,2090,2092,2112,2114,2120,2122,2124,2143,2145,2153,2155,2170,2172,2174,2177],[10,2040,2041],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2043,16],{"id":16},[10,2045,2046],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2048,22],{"id":22},[10,2050,2051],{},[26,2052],{"alt":2053,"src":2054},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2056,2057,2058,177,2060,2063,2064,177],{},"Python 先计算表达式，再把得到的对象交给 ",[43,2059,1462],{},[43,2061,2062],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[43,2065,1770],{},[14,2067,35],{"id":35},[37,2069,2070,2076,2085],{},[40,2071,2072,2075],{},[43,2073,2074],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2077,2078,2081,2082,177],{},[43,2079,2080],{},"7 + 5"," 是表达式，运行时先求值得到 ",[43,2083,2084],{},"12",[40,2086,2087],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2089,70],{"id":70},[10,2091,73],{},[75,2093,2095],{"className":77,"code":2094,"language":79,"meta":80,"style":80},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[43,2096,2097,2102,2107],{"__ignoreMap":80},[84,2098,2099],{"class":86,"line":87},[84,2100,2101],{},"print(42)\n",[84,2103,2104],{"class":86,"line":93},[84,2105,2106],{},"print(7 + 5)\n",[84,2108,2109],{"class":86,"line":99},[84,2110,2111],{},"print(\"Python 基础课\")\n",[10,2113,136],{},[75,2115,2118],{"className":2116,"code":2117,"language":142,"meta":80},[140],"42\n12\nPython 基础课\n",[43,2119,2117],{"__ignoreMap":80},[10,2121,147],{},[14,2123,150],{"id":150},[152,2125,2126,2134],{},[40,2127,2128,2131,2132,177],{},[43,2129,2130],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[43,2133,2084],{},[40,2135,2136,2138,2139,2142],{},[43,2137,1462],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[43,2140,2141],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2144,168],{"id":168},[37,2146,2147,2150],{},[40,2148,2149],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2151,2152],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2154,183],{"id":183},[152,2156,2157,2160],{},[40,2158,2159],{},"分别输出一个整数、一个小数和一段文本。",[40,2161,2162,2163,2165,2166,2169],{},"比较 ",[43,2164,2062],{}," 与 ",[43,2167,2168],{},"print(\"2 + 3\")"," 的结果。",[10,2171,194],{},[14,2173,197],{"id":197},[10,2175,2176],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,2178,204],{},{"title":80,"searchDepth":93,"depth":93,"links":2180},[2181,2182,2183,2184,2185,2186,2187,2188],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2036,"description":2041},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[215,2196,2197],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2200,"title":2201,"body":2202,"category":215,"cover":216,"description":2206,"extension":217,"meta":2373,"navigation":108,"path":2374,"pinned":220,"publishedAt":221,"seo":2375,"slug":2376,"stem":2377,"summary":2378,"tags":2379,"updatedAt":221,"visible":108,"__hash__":2382},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2203,"toc":2363},[2204,2207,2209,2212,2214,2220,2223,2225,2251,2253,2255,2283,2285,2291,2293,2295,2319,2321,2337,2339,2354,2356,2358,2361],[10,2205,2206],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2208,16],{"id":16},[10,2210,2211],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2213,22],{"id":22},[10,2215,2216],{},[26,2217],{"alt":2218,"src":2219},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2221,2222],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2224,35],{"id":35},[37,2226,2227,2230,2240],{},[40,2228,2229],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2231,2232,2233,2165,2236,2239],{},"变量名区分大小写，",[43,2234,2235],{},"score",[43,2237,2238],{},"Score"," 是两个名字。",[40,2241,2242,2243,2246,2247,2250],{},"使用能表达含义的名称；不要用 ",[43,2244,2245],{},"list","、",[43,2248,2249],{},"str"," 等内置名称作为普通变量名。",[14,2252,70],{"id":70},[10,2254,73],{},[75,2256,2258],{"className":77,"code":2257,"language":79,"meta":80,"style":80},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[43,2259,2260,2265,2270,2274,2279],{"__ignoreMap":80},[84,2261,2262],{"class":86,"line":87},[84,2263,2264],{},"score = 90\n",[84,2266,2267],{"class":86,"line":93},[84,2268,2269],{},"print(score)\n",[84,2271,2272],{"class":86,"line":99},[84,2273,109],{"emptyLinePlaceholder":108},[84,2275,2276],{"class":86,"line":105},[84,2277,2278],{},"score = 95\n",[84,2280,2281],{"class":86,"line":112},[84,2282,2269],{},[10,2284,136],{},[75,2286,2289],{"className":2287,"code":2288,"language":142,"meta":80},[140],"90\n95\n",[43,2290,2288],{"__ignoreMap":80},[10,2292,147],{},[14,2294,150],{"id":150},[152,2296,2297,2306],{},[40,2298,927,2299,2302,2303,2305],{},[43,2300,2301],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[43,2304,2235],{}," 再绑定到它。",[40,2307,927,2308,2311,2312,2315,2316,177],{},[43,2309,2310],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[43,2313,2314],{},"90"," 没有被改造成 ",[43,2317,2318],{},"95",[14,2320,168],{"id":168},[37,2322,2323,2326],{},[40,2324,2325],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2327,2328,2329,2246,2331,2246,2333,2336],{},"使用 ",[43,2330,2245],{},[43,2332,2249],{},[43,2334,2335],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2338,183],{"id":183},[152,2340,2341,2351],{},[40,2342,2343,2344,1146,2347,2350],{},"创建 ",[43,2345,2346],{},"course_name",[43,2348,2349],{},"lesson_count"," 两个变量并输出。",[40,2352,2353],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2355,194],{},[14,2357,197],{"id":197},[10,2359,2360],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,2362,204],{},{"title":80,"searchDepth":93,"depth":93,"links":2364},[2365,2366,2367,2368,2369,2370,2371,2372],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2201,"description":2206},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[215,2380,2381],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":4,"title":5,"body":2384,"category":215,"cover":216,"description":12,"extension":217,"meta":2517,"navigation":108,"path":219,"pinned":220,"publishedAt":221,"seo":2518,"slug":223,"stem":224,"summary":225,"tags":2519,"updatedAt":221,"visible":108,"__hash__":229},{"type":7,"value":2385,"toc":2507},[2386,2388,2390,2392,2394,2398,2400,2402,2420,2422,2424,2460,2462,2467,2469,2471,2481,2483,2491,2493,2499,2501,2503,2505],[10,2387,12],{},[14,2389,16],{"id":16},[10,2391,19],{},[14,2393,22],{"id":22},[10,2395,2396],{},[26,2397],{"alt":28,"src":29},[10,2399,32],{},[14,2401,35],{"id":35},[37,2403,2404,2410,2418],{},[40,2405,2406,46,2408,50],{},[43,2407,45],{},[43,2409,49],{},[40,2411,2412,56,2414,60,2416,64],{},[43,2413,55],{},[43,2415,59],{},[43,2417,63],{},[40,2419,67],{},[14,2421,70],{"id":70},[10,2423,73],{},[75,2425,2426],{"className":77,"code":78,"language":79,"meta":80,"style":80},[43,2427,2428,2432,2436,2440,2444,2448,2452,2456],{"__ignoreMap":80},[84,2429,2430],{"class":86,"line":87},[84,2431,90],{},[84,2433,2434],{"class":86,"line":93},[84,2435,96],{},[84,2437,2438],{"class":86,"line":99},[84,2439,102],{},[84,2441,2442],{"class":86,"line":105},[84,2443,109],{"emptyLinePlaceholder":108},[84,2445,2446],{"class":86,"line":112},[84,2447,115],{},[84,2449,2450],{"class":86,"line":118},[84,2451,121],{},[84,2453,2454],{"class":86,"line":124},[84,2455,127],{},[84,2457,2458],{"class":86,"line":130},[84,2459,133],{},[10,2461,136],{},[75,2463,2465],{"className":2464,"code":141,"language":142,"meta":80},[140],[43,2466,141],{"__ignoreMap":80},[10,2468,147],{},[14,2470,150],{"id":150},[152,2472,2473,2477],{},[40,2474,2475,159],{},[43,2476,158],{},[40,2478,2479,165],{},[43,2480,164],{},[14,2482,168],{"id":168},[37,2484,2485,2489],{},[40,2486,173,2487,177],{},[43,2488,176],{},[40,2490,180],{},[14,2492,183],{"id":183},[152,2494,2495,2497],{},[40,2496,188],{},[40,2498,191],{},[10,2500,194],{},[14,2502,197],{"id":197},[10,2504,200],{},[202,2506,204],{},{"title":80,"searchDepth":93,"depth":93,"links":2508},[2509,2510,2511,2512,2513,2514,2515,2516],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5,"description":12},[215,227,228],{"id":2521,"title":2522,"body":2523,"category":215,"cover":216,"description":2527,"extension":217,"meta":2703,"navigation":108,"path":2704,"pinned":220,"publishedAt":221,"seo":2705,"slug":2706,"stem":2707,"summary":2708,"tags":2709,"updatedAt":221,"visible":108,"__hash__":2712},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2524,"toc":2691},[2525,2528,2530,2533,2535,2541,2551,2553,2564,2566,2568,2598,2600,2606,2608,2610,2640,2643,2646,2652,2655,2657,2665,2667,2682,2684,2686,2689],[10,2526,2527],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2529,16],{"id":16},[10,2531,2532],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2534,22],{"id":22},[10,2536,2537],{},[26,2538],{"alt":2539,"src":2540},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2542,2543,2544,2547,2548,177],{},"切片 ",[43,2545,2546],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[43,2549,2550],{},"stop - start",[14,2552,35],{"id":35},[37,2554,2555,2558,2561],{},[40,2556,2557],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2559,2560],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2562,2563],{},"切片会创建新的字符串，不会修改原字符串。",[14,2565,70],{"id":70},[10,2567,73],{},[75,2569,2571],{"className":77,"code":2570,"language":79,"meta":80,"style":80},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[43,2572,2573,2578,2583,2588,2593],{"__ignoreMap":80},[84,2574,2575],{"class":86,"line":87},[84,2576,2577],{},"language = \"Python\"\n",[84,2579,2580],{"class":86,"line":93},[84,2581,2582],{},"print(language[0])\n",[84,2584,2585],{"class":86,"line":99},[84,2586,2587],{},"print(language[-1])\n",[84,2589,2590],{"class":86,"line":105},[84,2591,2592],{},"print(language[0:3])\n",[84,2594,2595],{"class":86,"line":112},[84,2596,2597],{},"print(language + \" 3.14\")\n",[10,2599,136],{},[75,2601,2604],{"className":2602,"code":2603,"language":142,"meta":80},[140],"P\nn\nPyt\nPython 3.14\n",[43,2605,2603],{"__ignoreMap":80},[10,2607,147],{},[14,2609,150],{"id":150},[152,2611,2612,2626],{},[40,2613,2614,2615,2617,2618,2621,2622,2625],{},"字符串 ",[43,2616,215],{}," 的正索引从 ",[43,2619,2620],{},"P"," 的 0 开始，负索引从末尾 ",[43,2623,2624],{},"n"," 的 -1 开始。",[40,2627,2628,2631,2632,2635,2636,2639],{},[43,2629,2630],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[43,2633,2634],{},"Pyt","；索引 3 的 ",[43,2637,2638],{},"h"," 不在结果中。",[318,2641,2642],{"id":2642},"再看一个具体细节",[10,2644,2645],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2647,2648],{},[26,2649],{"alt":2650,"src":2651},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2653,2654],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2656,168],{"id":168},[37,2658,2659,2662],{},[40,2660,2661],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2663,2664],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2666,183],{"id":183},[152,2668,2669,2679],{},[40,2670,2671,2672,2675,2676,177],{},"从 ",[43,2673,2674],{},"\"programming\""," 中切出 ",[43,2677,2678],{},"\"gram\"",[40,2680,2681],{},"使用负索引取得字符串倒数第二个字符。",[10,2683,194],{},[14,2685,197],{"id":197},[10,2687,2688],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,2690,204],{},{"title":80,"searchDepth":93,"depth":93,"links":2692},[2693,2694,2695,2696,2697,2700,2701,2702],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":2698},[2699],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2522,"description":2527},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[215,2710,2711],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2714,"title":2715,"body":2716,"category":215,"cover":216,"description":2720,"extension":217,"meta":2934,"navigation":108,"path":2935,"pinned":220,"publishedAt":221,"seo":2936,"slug":2937,"stem":2938,"summary":2939,"tags":2940,"updatedAt":221,"visible":108,"__hash__":2943},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2717,"toc":2922},[2718,2721,2723,2726,2728,2734,2744,2746,2779,2781,2783,2827,2829,2835,2837,2839,2860,2862,2865,2871,2879,2881,2895,2897,2913,2915,2917,2920],[10,2719,2720],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2722,16],{"id":16},[10,2724,2725],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2727,22],{"id":22},[10,2729,2730],{},[26,2731],{"alt":2732,"src":2733},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2735,2736,2737,998,2740,2743],{},"比较表达式先产生 ",[43,2738,2739],{},"True",[43,2741,2742],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2745,35],{"id":35},[37,2747,2748,2762,2776],{},[40,2749,2750,2753,2754,2757,2758,2761],{},[43,2751,2752],{},"=="," 判断是否相等，",[43,2755,2756],{},"!="," 判断是否不等；单个 ",[43,2759,2760],{},"="," 是赋值。",[40,2763,2764,2767,2768,2771,2772,2775],{},[43,2765,2766],{},"and"," 要求两侧都为真，",[43,2769,2770],{},"or"," 只需一侧为真，",[43,2773,2774],{},"not"," 取反。",[40,2777,2778],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2780,70],{"id":70},[10,2782,73],{},[75,2784,2786],{"className":77,"code":2785,"language":79,"meta":80,"style":80},"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",[43,2787,2788,2793,2798,2802,2807,2812,2817,2822],{"__ignoreMap":80},[84,2789,2790],{"class":86,"line":87},[84,2791,2792],{},"age = 20\n",[84,2794,2795],{"class":86,"line":93},[84,2796,2797],{},"has_ticket = True\n",[84,2799,2800],{"class":86,"line":99},[84,2801,109],{"emptyLinePlaceholder":108},[84,2803,2804],{"class":86,"line":105},[84,2805,2806],{},"is_adult = age >= 18\n",[84,2808,2809],{"class":86,"line":112},[84,2810,2811],{},"can_enter = is_adult and has_ticket\n",[84,2813,2814],{"class":86,"line":118},[84,2815,2816],{},"print(is_adult)\n",[84,2818,2819],{"class":86,"line":124},[84,2820,2821],{},"print(can_enter)\n",[84,2823,2824],{"class":86,"line":130},[84,2825,2826],{},"print(not has_ticket)\n",[10,2828,136],{},[75,2830,2833],{"className":2831,"code":2832,"language":142,"meta":80},[140],"True\nTrue\nFalse\n",[43,2834,2832],{"__ignoreMap":80},[10,2836,147],{},[14,2838,150],{"id":150},[152,2840,2841,2851],{},[40,2842,2843,2846,2847,2850],{},[43,2844,2845],{},"age >= 18"," 先产生布尔值并绑定给 ",[43,2848,2849],{},"is_adult","，这一步没有任何分支跳转。",[40,2852,2853,2856,2857,2859],{},[43,2854,2855],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[43,2858,2774],{}," 只对紧随其后的值取反。",[318,2861,2642],{"id":2642},[10,2863,2864],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2866,2867],{},[26,2868],{"alt":2869,"src":2870},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2872,2873,2875,2876,2878],{},[43,2874,2766],{}," 只有“真、真”得到真；",[43,2877,2770],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2880,168],{"id":168},[37,2882,2883,2892],{},[40,2884,2885,2886,2888,2889,2891],{},"用单个等号判断相等。",[43,2887,2760],{}," 是赋值，",[43,2890,2752],{}," 才是相等比较。",[40,2893,2894],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2896,183],{"id":183},[152,2898,2899,2906],{},[40,2900,2901,2902,2905],{},"判断数字 ",[43,2903,2904],{},"15"," 是否同时大于 10 且小于 20。",[40,2907,2908,2909,2912],{},"分别修改年龄和票据状态，记录 ",[43,2910,2911],{},"can_enter"," 的四种组合结果。",[10,2914,194],{},[14,2916,197],{"id":197},[10,2918,2919],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,2921,204],{},{"title":80,"searchDepth":93,"depth":93,"links":2923},[2924,2925,2926,2927,2928,2931,2932,2933],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":2929},[2930],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2715,"description":2720},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[215,2941,2942],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2945,"title":2946,"body":2947,"category":215,"cover":216,"description":2951,"extension":217,"meta":3119,"navigation":108,"path":3120,"pinned":220,"publishedAt":221,"seo":3121,"slug":3122,"stem":3123,"summary":3124,"tags":3125,"updatedAt":221,"visible":108,"__hash__":3127},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2948,"toc":3109},[2949,2952,2954,2957,2959,2965,2983,2985,2998,3000,3002,3036,3038,3044,3046,3048,3070,3072,3084,3086,3100,3102,3104,3107],[10,2950,2951],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2953,16],{"id":16},[10,2955,2956],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2958,22],{"id":22},[10,2960,2961],{},[26,2962],{"alt":2963,"src":2964},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2966,2967,2970,2971,2974,2975,2978,2979,2982],{},[43,2968,2969],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[43,2972,2973],{},"18","，程序首先得到的也是 ",[43,2976,2977],{},"\"18\"","，需要 ",[43,2980,2981],{},"int()"," 后才能按整数参与计算。",[14,2984,35],{"id":35},[37,2986,2987,2990,2995],{},[40,2988,2989],{},"提示文字应告诉用户需要输入什么。",[40,2991,2992,2994],{},[43,2993,2981],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,2996,2997],{},"输入转换和业务计算分开写，定位问题更直接。",[14,2999,70],{"id":70},[10,3001,73],{},[75,3003,3005],{"className":77,"code":3004,"language":79,"meta":80,"style":80},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[43,3006,3007,3012,3017,3022,3026,3031],{"__ignoreMap":80},[84,3008,3009],{"class":86,"line":87},[84,3010,3011],{},"name = input(\"请输入姓名：\")\n",[84,3013,3014],{"class":86,"line":93},[84,3015,3016],{},"age_text = input(\"请输入年龄：\")\n",[84,3018,3019],{"class":86,"line":99},[84,3020,3021],{},"age = int(age_text)\n",[84,3023,3024],{"class":86,"line":105},[84,3025,109],{"emptyLinePlaceholder":108},[84,3027,3028],{"class":86,"line":112},[84,3029,3030],{},"print(\"你好，\" + name)\n",[84,3032,3033],{"class":86,"line":118},[84,3034,3035],{},"print(age + 1)\n",[10,3037,136],{},[75,3039,3042],{"className":3040,"code":3041,"language":142,"meta":80},[140],"根据输入显示姓名，并输出下一年的年龄\n",[43,3043,3041],{"__ignoreMap":80},[10,3045,147],{},[14,3047,150],{"id":150},[152,3049,3050,3060],{},[40,3051,3052,3053,3055,3056,3059],{},"两次 ",[43,3054,2969],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[43,3057,3058],{},"age_text"," 用来提醒这仍是文本。",[40,3061,3062,3065,3066,3069],{},[43,3063,3064],{},"int(age_text)"," 创建整数对象，后面的 ",[43,3067,3068],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3071,168],{"id":168},[37,3073,3074,3081],{},[40,3075,3076,3077,3080],{},"直接计算 ",[43,3078,3079],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3082,3083],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3085,183],{"id":183},[152,3087,3088,3091],{},[40,3089,3090],{},"接收两个整数并输出它们的和。",[40,3092,1709,3093,3096,3097,3099],{},[43,3094,3095],{},"18.5"," 给 ",[43,3098,2981],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3101,194],{},[14,3103,197],{"id":197},[10,3105,3106],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,3108,204],{},{"title":80,"searchDepth":93,"depth":93,"links":3110},[3111,3112,3113,3114,3115,3116,3117,3118],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2946,"description":2951},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[215,2335,3126],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3129,"title":3130,"body":3131,"category":215,"cover":216,"description":3135,"extension":217,"meta":3295,"navigation":108,"path":3296,"pinned":220,"publishedAt":221,"seo":3297,"slug":3298,"stem":3299,"summary":3300,"tags":3301,"updatedAt":221,"visible":108,"__hash__":3304},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3132,"toc":3285},[3133,3136,3138,3141,3143,3149,3156,3158,3172,3174,3176,3215,3217,3223,3225,3227,3246,3248,3263,3265,3276,3278,3280,3283],[10,3134,3135],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3137,16],{"id":16},[10,3139,3140],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3142,22],{"id":22},[10,3144,3145],{},[26,3146],{"alt":3147,"src":3148},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3150,3151,3152,3155],{},"列表为元素维护从 0 开始的位置索引。修改 ",[43,3153,3154],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3157,35],{"id":35},[37,3159,3160,3163,3166],{},[40,3161,3162],{},"列表使用方括号，元素之间用逗号分隔。",[40,3164,3165],{},"列表可变，可以替换、追加和删除元素。",[40,3167,3168,3169,177],{},"访问不存在的索引会产生 ",[43,3170,3171],{},"IndexError",[14,3173,70],{"id":70},[10,3175,73],{},[75,3177,3179],{"className":77,"code":3178,"language":79,"meta":80,"style":80},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[43,3180,3181,3186,3191,3195,3200,3205,3210],{"__ignoreMap":80},[84,3182,3183],{"class":86,"line":87},[84,3184,3185],{},"scores = [82, 90, 76]\n",[84,3187,3188],{"class":86,"line":93},[84,3189,3190],{},"print(scores[0])\n",[84,3192,3193],{"class":86,"line":99},[84,3194,109],{"emptyLinePlaceholder":108},[84,3196,3197],{"class":86,"line":105},[84,3198,3199],{},"scores[1] = 95\n",[84,3201,3202],{"class":86,"line":112},[84,3203,3204],{},"scores.append(88)\n",[84,3206,3207],{"class":86,"line":118},[84,3208,3209],{},"print(scores)\n",[84,3211,3212],{"class":86,"line":124},[84,3213,3214],{},"print(len(scores))\n",[10,3216,136],{},[75,3218,3221],{"className":3219,"code":3220,"language":142,"meta":80},[140],"82\n[82, 95, 76, 88]\n4\n",[43,3222,3220],{"__ignoreMap":80},[10,3224,147],{},[14,3226,150],{"id":150},[152,3228,3229,3232],{},[40,3230,3231],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3233,3234,3237,3238,3241,3242,3245],{},[43,3235,3236],{},"scores[1] = 95"," 替换第二个位置，",[43,3239,3240],{},"append(88)"," 在末尾增加新位置，",[43,3243,3244],{},"len()"," 因而从 3 变为 4。",[14,3247,168],{"id":168},[37,3249,3250,3260],{},[40,3251,3252,3253,3256,3257,177],{},"访问 ",[43,3254,3255],{},"scores[len(scores)]","。最后一个合法正索引是 ",[43,3258,3259],{},"len(scores) - 1",[40,3261,3262],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3264,183],{"id":183},[152,3266,3267,3270],{},[40,3268,3269],{},"建立三项学习任务列表，再追加第四项。",[40,3271,3272,3273,3275],{},"修改第二项，并用 ",[43,3274,3244],{}," 检查元素数量。",[10,3277,194],{},[14,3279,197],{"id":197},[10,3281,3282],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,3284,204],{},{"title":80,"searchDepth":93,"depth":93,"links":3286},[3287,3288,3289,3290,3291,3292,3293,3294],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3130,"description":3135},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[215,3302,3303],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3306,"title":3307,"body":3308,"category":215,"cover":216,"description":3312,"extension":217,"meta":3453,"navigation":108,"path":3454,"pinned":220,"publishedAt":221,"seo":3455,"slug":3456,"stem":3457,"summary":3458,"tags":3459,"updatedAt":221,"visible":108,"__hash__":3461},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3309,"toc":3443},[3310,3313,3315,3318,3320,3326,3329,3331,3342,3344,3346,3380,3382,3388,3390,3392,3406,3408,3420,3422,3434,3436,3438,3441],[10,3311,3312],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3314,16],{"id":16},[10,3316,3317],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3319,22],{"id":22},[10,3321,3322],{},[26,3323],{"alt":3324,"src":3325},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3327,3328],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3330,35],{"id":35},[37,3332,3333,3336,3339],{},[40,3334,3335],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3337,3338],{},"只有一个元素的元组必须保留尾随逗号。",[40,3340,3341],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3343,70],{"id":70},[10,3345,73],{},[75,3347,3349],{"className":77,"code":3348,"language":79,"meta":80,"style":80},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[43,3350,3351,3356,3361,3366,3370,3375],{"__ignoreMap":80},[84,3352,3353],{"class":86,"line":87},[84,3354,3355],{},"point = (120, 80)\n",[84,3357,3358],{"class":86,"line":93},[84,3359,3360],{},"print(point[0])\n",[84,3362,3363],{"class":86,"line":99},[84,3364,3365],{},"print(point[1])\n",[84,3367,3368],{"class":86,"line":105},[84,3369,109],{"emptyLinePlaceholder":108},[84,3371,3372],{"class":86,"line":112},[84,3373,3374],{},"single = (5,)\n",[84,3376,3377],{"class":86,"line":118},[84,3378,3379],{},"print(single)\n",[10,3381,136],{},[75,3383,3386],{"className":3384,"code":3385,"language":142,"meta":80},[140],"120\n80\n(5,)\n",[43,3387,3385],{"__ignoreMap":80},[10,3389,147],{},[14,3391,150],{"id":150},[152,3393,3394,3400],{},[40,3395,3396,3399],{},[43,3397,3398],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3401,3402,3405],{},[43,3403,3404],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3407,168],{"id":168},[37,3409,3410,3417],{},[40,3411,3412,3413,3416],{},"把 ",[43,3414,3415],{},"(5)"," 当作元组，实际它仍是整数。",[40,3418,3419],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3421,183],{"id":183},[152,3423,3424,3427],{},[40,3425,3426],{},"用元组表示宽度和高度。",[40,3428,2162,3429,2165,3431,3433],{},[43,3430,3415],{},[43,3432,3404],{}," 的类型。",[10,3435,194],{},[14,3437,197],{"id":197},[10,3439,3440],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,3442,204],{},{"title":80,"searchDepth":93,"depth":93,"links":3444},[3445,3446,3447,3448,3449,3450,3451,3452],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3307,"description":3312},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[215,3460,3303],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3463,"title":3464,"body":3465,"category":215,"cover":216,"description":3469,"extension":217,"meta":3624,"navigation":108,"path":3625,"pinned":220,"publishedAt":221,"seo":3626,"slug":3627,"stem":3628,"summary":3629,"tags":3630,"updatedAt":221,"visible":108,"__hash__":3632},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3466,"toc":3614},[3467,3470,3472,3475,3477,3483,3493,3495,3509,3511,3513,3547,3549,3555,3557,3559,3574,3576,3595,3597,3605,3607,3609,3612],[10,3468,3469],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3471,16],{"id":16},[10,3473,3474],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3476,22],{"id":22},[10,3478,3479],{},[26,3480],{"alt":3481,"src":3482},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3484,3485,3486,3489,3490,3492],{},"字典通过键定位值，不使用连续位置表达含义。",[43,3487,3488],{},"student[\"score\"]"," 读取的是键 ",[43,3491,2235],{}," 对应的值，而不是“第几个元素”。",[14,3494,35],{"id":35},[37,3496,3497,3500,3506],{},[40,3498,3499],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3501,2328,3502,3505],{},[43,3503,3504],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3507,3508],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3510,70],{"id":70},[10,3512,73],{},[75,3514,3516],{"className":77,"code":3515,"language":79,"meta":80,"style":80},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[43,3517,3518,3523,3528,3532,3537,3542],{"__ignoreMap":80},[84,3519,3520],{"class":86,"line":87},[84,3521,3522],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[84,3524,3525],{"class":86,"line":93},[84,3526,3527],{},"print(student[\"name\"])\n",[84,3529,3530],{"class":86,"line":99},[84,3531,109],{"emptyLinePlaceholder":108},[84,3533,3534],{"class":86,"line":105},[84,3535,3536],{},"student[\"score\"] = 95\n",[84,3538,3539],{"class":86,"line":112},[84,3540,3541],{},"student[\"city\"] = \"郑州\"\n",[84,3543,3544],{"class":86,"line":118},[84,3545,3546],{},"print(student)\n",[10,3548,136],{},[75,3550,3553],{"className":3551,"code":3552,"language":142,"meta":80},[140],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[43,3554,3552],{"__ignoreMap":80},[10,3556,147],{},[14,3558,150],{"id":150},[152,3560,3561,3564],{},[40,3562,3563],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3565,3566,3567,3569,3570,3573],{},"给已有键 ",[43,3568,2235],{}," 赋值会更新映射，给新键 ",[43,3571,3572],{},"city"," 赋值会增加映射。",[14,3575,168],{"id":168},[37,3577,3578,3585],{},[40,3579,3580,3581,3584],{},"按位置理解字典并尝试 ",[43,3582,3583],{},"student[0]","，而实际键是字符串。",[40,3586,3587,3588,3591,3592,177],{},"直接读取不确定存在的键并忽略 ",[43,3589,3590],{},"KeyError","；后续可根据场景使用成员检查或 ",[43,3593,3594],{},"get()",[14,3596,183],{"id":183},[152,3598,3599,3602],{},[40,3600,3601],{},"建立一本书的标题、作者和页数字典。",[40,3603,3604],{},"添加分类键，再修改页数。",[10,3606,194],{},[14,3608,197],{"id":197},[10,3610,3611],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,3613,204],{},{"title":80,"searchDepth":93,"depth":93,"links":3615},[3616,3617,3618,3619,3620,3621,3622,3623],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3464,"description":3469},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[215,3631,3303],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3634,"title":3635,"body":3636,"category":215,"cover":216,"description":3640,"extension":217,"meta":3789,"navigation":108,"path":3790,"pinned":220,"publishedAt":221,"seo":3791,"slug":3792,"stem":3793,"summary":3794,"tags":3795,"updatedAt":221,"visible":108,"__hash__":3797},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3637,"toc":3779},[3638,3641,3643,3646,3648,3654,3657,3659,3678,3680,3682,3716,3718,3724,3726,3728,3743,3745,3757,3759,3770,3772,3774,3777],[10,3639,3640],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3642,16],{"id":16},[10,3644,3645],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3647,22],{"id":22},[10,3649,3650],{},[26,3651],{"alt":3652,"src":3653},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3655,3656],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3658,35],{"id":35},[37,3660,3661,3664,3667],{},[40,3662,3663],{},"集合中的元素不重复。",[40,3665,3666],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3668,3669,3670,3673,3674,3677],{},"创建空集合必须写 ",[43,3671,3672],{},"set()","；",[43,3675,3676],{},"{}"," 创建的是空字典。",[14,3679,70],{"id":70},[10,3681,73],{},[75,3683,3685],{"className":77,"code":3684,"language":79,"meta":80,"style":80},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[43,3686,3687,3692,3697,3701,3706,3711],{"__ignoreMap":80},[84,3688,3689],{"class":86,"line":87},[84,3690,3691],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[84,3693,3694],{"class":86,"line":93},[84,3695,3696],{},"right = {\"Python\", \"Docker\"}\n",[84,3698,3699],{"class":86,"line":99},[84,3700,109],{"emptyLinePlaceholder":108},[84,3702,3703],{"class":86,"line":105},[84,3704,3705],{},"print(left & right)\n",[84,3707,3708],{"class":86,"line":112},[84,3709,3710],{},"print(left | right)\n",[84,3712,3713],{"class":86,"line":118},[84,3714,3715],{},"print(\"Git\" in left)\n",[10,3717,136],{},[75,3719,3722],{"className":3720,"code":3721,"language":142,"meta":80},[140],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[43,3723,3721],{"__ignoreMap":80},[10,3725,147],{},[14,3727,150],{"id":150},[152,3729,3730,3733],{},[40,3731,3732],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3734,3735,3738,3739,3742],{},[43,3736,3737],{},"&"," 计算交集，",[43,3740,3741],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3744,168],{"id":168},[37,3746,3747,3754],{},[40,3748,2328,3749,3751,3752,177],{},[43,3750,3676],{}," 创建空集合，实际得到空字典；空集合应写 ",[43,3753,3672],{},[40,3755,3756],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3758,183],{"id":183},[152,3760,3761,3767],{},[40,3762,3763,3764,3766],{},"把包含重复标签的列表交给 ",[43,3765,3672],{}," 去重。",[40,3768,3769],{},"计算两组课程标签的交集和差集。",[10,3771,194],{},[14,3773,197],{"id":197},[10,3775,3776],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,3778,204],{},{"title":80,"searchDepth":93,"depth":93,"links":3780},[3781,3782,3783,3784,3785,3786,3787,3788],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3635,"description":3640},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[215,3796,3303],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3799,"title":3800,"body":3801,"category":215,"cover":216,"description":3805,"extension":217,"meta":4003,"navigation":108,"path":4004,"pinned":220,"publishedAt":221,"seo":4005,"slug":4006,"stem":4007,"summary":4008,"tags":4009,"updatedAt":221,"visible":108,"__hash__":4012},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3802,"toc":3991},[3803,3806,3808,3811,3813,3819,3829,3831,3848,3850,3852,3902,3904,3910,3912,3914,3936,3938,3941,3947,3950,3952,3965,3967,3982,3984,3986,3989],[10,3804,3805],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3807,16],{"id":16},[10,3809,3810],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3812,22],{"id":22},[10,3814,3815],{},[26,3816],{"alt":3817,"src":3818},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3820,3821,3824,3825,3828],{},[43,3822,3823],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[43,3826,3827],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3830,35],{"id":35},[37,3832,3833,3842,3845],{},[40,3834,3835,3837,3838,3841],{},[43,3836,2752],{}," 比较内容是否相等，",[43,3839,3840],{},"is"," 比较是否为同一个对象。",[40,3843,3844],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3846,3847],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3849,70],{"id":70},[10,3851,73],{},[75,3853,3855],{"className":77,"code":3854,"language":79,"meta":80,"style":80},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[43,3856,3857,3862,3867,3872,3876,3881,3886,3891,3896],{"__ignoreMap":80},[84,3858,3859],{"class":86,"line":87},[84,3860,3861],{},"tasks = [\"变量\", \"字符串\"]\n",[84,3863,3864],{"class":86,"line":93},[84,3865,3866],{},"shared = tasks\n",[84,3868,3869],{"class":86,"line":99},[84,3870,3871],{},"backup = tasks.copy()\n",[84,3873,3874],{"class":86,"line":105},[84,3875,109],{"emptyLinePlaceholder":108},[84,3877,3878],{"class":86,"line":112},[84,3879,3880],{},"tasks.append(\"列表\")\n",[84,3882,3883],{"class":86,"line":118},[84,3884,3885],{},"print(shared)\n",[84,3887,3888],{"class":86,"line":124},[84,3889,3890],{},"print(backup)\n",[84,3892,3893],{"class":86,"line":130},[84,3894,3895],{},"print(tasks is shared)\n",[84,3897,3899],{"class":86,"line":3898},9,[84,3900,3901],{},"print(tasks is backup)\n",[10,3903,136],{},[75,3905,3908],{"className":3906,"code":3907,"language":142,"meta":80},[140],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[43,3909,3907],{"__ignoreMap":80},[10,3911,147],{},[14,3913,150],{"id":150},[152,3915,3916,3922],{},[40,3917,3918,3921],{},[43,3919,3920],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3923,3924,3927,3928,3931,3932,3935],{},[43,3925,3926],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[43,3929,3930],{},"shared"," 能观察到变化，",[43,3933,3934],{},"backup"," 不会。",[318,3937,2642],{"id":2642},[10,3939,3940],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3942,3943],{},[26,3944],{"alt":3945,"src":3946},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3948,3949],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3951,168],{"id":168},[37,3953,3954,3962],{},[40,3955,3956,3957,3959,3960,177],{},"用 ",[43,3958,2752],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[43,3961,3840],{},[40,3963,3964],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3966,183],{"id":183},[152,3968,3969,3972],{},[40,3970,3971],{},"让两个变量引用同一个字典并修改其中一个。",[40,3973,2328,3974,3977,3978,1146,3980,177],{},[43,3975,3976],{},"copy()"," 创建外层副本，再比较 ",[43,3979,3840],{},[43,3981,2752],{},[10,3983,194],{},[14,3985,197],{"id":197},[10,3987,3988],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,3990,204],{},{"title":80,"searchDepth":93,"depth":93,"links":3992},[3993,3994,3995,3996,3997,4000,4001,4002],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":3998},[3999],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3800,"description":3805},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[215,4010,4011],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4014,"title":4015,"body":4016,"category":215,"cover":216,"description":4020,"extension":217,"meta":4233,"navigation":108,"path":4234,"pinned":220,"publishedAt":221,"seo":4235,"slug":4236,"stem":4237,"summary":4238,"tags":4239,"updatedAt":221,"visible":108,"__hash__":4241},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4017,"toc":4220},[4018,4021,4023,4026,4028,4034,4044,4046,4057,4059,4061,4114,4116,4122,4124,4126,4144,4146,4149,4155,4163,4166,4169,4175,4181,4183,4201,4203,4211,4213,4215,4218],[10,4019,4020],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4022,16],{"id":16},[10,4024,4025],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4027,22],{"id":22},[10,4029,4030],{},[26,4031],{"alt":4032,"src":4033},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4035,4036,2246,4038,2246,4041,4043],{},[43,4037,1145],{},[43,4039,4040],{},"elif",[43,4042,1149],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4045,35],{"id":35},[37,4047,4048,4051,4054],{},[40,4049,4050],{},"冒号表示接下来开始一个代码块。",[40,4052,4053],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4055,4056],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4058,70],{"id":70},[10,4060,73],{},[75,4062,4064],{"className":77,"code":4063,"language":79,"meta":80,"style":80},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[43,4065,4066,4071,4075,4080,4085,4090,4095,4099,4104,4108],{"__ignoreMap":80},[84,4067,4068],{"class":86,"line":87},[84,4069,4070],{},"score = int(input(\"请输入分数：\"))\n",[84,4072,4073],{"class":86,"line":93},[84,4074,109],{"emptyLinePlaceholder":108},[84,4076,4077],{"class":86,"line":99},[84,4078,4079],{},"if score >= 90:\n",[84,4081,4082],{"class":86,"line":105},[84,4083,4084],{},"    level = \"优秀\"\n",[84,4086,4087],{"class":86,"line":112},[84,4088,4089],{},"elif score >= 60:\n",[84,4091,4092],{"class":86,"line":118},[84,4093,4094],{},"    level = \"合格\"\n",[84,4096,4097],{"class":86,"line":124},[84,4098,1135],{},[84,4100,4101],{"class":86,"line":130},[84,4102,4103],{},"    level = \"需要继续学习\"\n",[84,4105,4106],{"class":86,"line":3898},[84,4107,109],{"emptyLinePlaceholder":108},[84,4109,4111],{"class":86,"line":4110},10,[84,4112,4113],{},"print(level)\n",[10,4115,136],{},[75,4117,4120],{"className":4118,"code":4119,"language":142,"meta":80},[140],"输入 85 时输出：合格\n",[43,4121,4119],{"__ignoreMap":80},[10,4123,147],{},[14,4125,150],{"id":150},[152,4127,4128,4135],{},[40,4129,4130,4131,4134],{},"输入先转换为整数，程序从 ",[43,4132,4133],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4136,4137,4140,4141,4143],{},[43,4138,4139],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[43,4142,1149],{}," 被跳过；最终三个分支只会选择一个。",[318,4145,2642],{"id":2642},[10,4147,4148],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4150,4151],{},[26,4152],{"alt":4153,"src":4154},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4156,4157,4159,4160,4162],{},[43,4158,4133],{}," 必须放在 ",[43,4161,4139],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[318,4164,2642],{"id":4165},"再看一个具体细节-1",[10,4167,4168],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4170,4171],{},[26,4172],{"alt":4173,"src":4174},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4176,4177,4178,4180],{},"同一缩进层级属于同一个代码块；回到 ",[43,4179,1145],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4182,168],{"id":168},[37,4184,4185,4191],{},[40,4186,4187,4188,4190],{},"先写 ",[43,4189,4139],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4192,4193,4194,4196,4197,4200],{},"混用多个独立 ",[43,4195,1145],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[43,4198,4199],{},"if\u002Felif\u002Felse"," 链。",[14,4202,183],{"id":183},[152,4204,4205,4208],{},[40,4206,4207],{},"根据温度输出“冷、适中、热”三个等级。",[40,4209,4210],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4212,194],{},[14,4214,197],{"id":197},[10,4216,4217],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,4219,204],{},{"title":80,"searchDepth":93,"depth":93,"links":4221},[4222,4223,4224,4225,4226,4230,4231,4232],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":4227},[4228,4229],{"id":2642,"depth":99,"text":2642},{"id":4165,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4015,"description":4020},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[215,1145,4240],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4243,"title":4244,"body":4245,"category":215,"cover":216,"description":4249,"extension":217,"meta":4415,"navigation":108,"path":4416,"pinned":220,"publishedAt":221,"seo":4417,"slug":4418,"stem":4419,"summary":4420,"tags":4421,"updatedAt":221,"visible":108,"__hash__":4423},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4246,"toc":4403},[4247,4250,4252,4255,4257,4263,4269,4271,4286,4288,4290,4328,4330,4336,4338,4340,4355,4357,4360,4366,4372,4374,4382,4384,4394,4396,4398,4401],[10,4248,4249],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4251,16],{"id":16},[10,4253,4254],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4256,22],{"id":22},[10,4258,4259],{},[26,4260],{"alt":4261,"src":4262},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4264,4265,4268],{},[43,4266,4267],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4270,35],{"id":35},[37,4272,4273,4276,4279],{},[40,4274,4275],{},"进入循环前先准备参与条件判断的状态。",[40,4277,4278],{},"循环体中必须有机会让条件变为假。",[40,4280,4281,4282,4285],{},"能够预先确定遍历对象时，后续介绍的 ",[43,4283,4284],{},"for"," 通常更直接。",[14,4287,70],{"id":70},[10,4289,73],{},[75,4291,4293],{"className":77,"code":4292,"language":79,"meta":80,"style":80},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[43,4294,4295,4300,4304,4309,4314,4319,4323],{"__ignoreMap":80},[84,4296,4297],{"class":86,"line":87},[84,4298,4299],{},"count = 1\n",[84,4301,4302],{"class":86,"line":93},[84,4303,109],{"emptyLinePlaceholder":108},[84,4305,4306],{"class":86,"line":99},[84,4307,4308],{},"while count \u003C= 3:\n",[84,4310,4311],{"class":86,"line":105},[84,4312,4313],{},"    print(\"第\", count, \"次练习\")\n",[84,4315,4316],{"class":86,"line":112},[84,4317,4318],{},"    count = count + 1\n",[84,4320,4321],{"class":86,"line":118},[84,4322,109],{"emptyLinePlaceholder":108},[84,4324,4325],{"class":86,"line":124},[84,4326,4327],{},"print(\"练习结束\")\n",[10,4329,136],{},[75,4331,4334],{"className":4332,"code":4333,"language":142,"meta":80},[140],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[43,4335,4333],{"__ignoreMap":80},[10,4337,147],{},[14,4339,150],{"id":150},[152,4341,4342,4349],{},[40,4343,4344,4345,4348],{},"进入循环前 ",[43,4346,4347],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4350,4351,4352,4354],{},"循环体末尾把 ",[43,4353,4347],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[318,4356,2642],{"id":2642},[10,4358,4359],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4361,4362],{},[26,4363],{"alt":4364,"src":4365},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4367,4368,4369,4371],{},"第4次检查时 ",[43,4370,4347],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4373,168],{"id":168},[37,4375,4376,4379],{},[40,4377,4378],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4380,4381],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4383,183],{"id":183},[152,4385,4386,4391],{},[40,4387,2328,4388,4390],{},[43,4389,4267],{}," 输出 1 到 5。",[40,4392,4393],{},"计算 1 到 10 的累加和。",[10,4395,194],{},[14,4397,197],{"id":197},[10,4399,4400],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,4402,204],{},{"title":80,"searchDepth":93,"depth":93,"links":4404},[4405,4406,4407,4408,4409,4412,4413,4414],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":4410},[4411],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4244,"description":4249},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[215,4267,4422],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4425,"title":4426,"body":4427,"category":215,"cover":216,"description":4431,"extension":217,"meta":4579,"navigation":108,"path":4580,"pinned":220,"publishedAt":221,"seo":4581,"slug":4582,"stem":4583,"summary":4584,"tags":4585,"updatedAt":221,"visible":108,"__hash__":4587},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4428,"toc":4569},[4429,4432,4434,4437,4439,4445,4450,4452,4466,4468,4470,4508,4510,4516,4518,4520,4537,4539,4547,4549,4560,4562,4564,4567],[10,4430,4431],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4433,16],{"id":16},[10,4435,4436],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4438,22],{"id":22},[10,4440,4441],{},[26,4442],{"alt":4443,"src":4444},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4446,4447,4449],{},[43,4448,4284],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4451,35],{"id":35},[37,4453,4454,4460,4463],{},[40,4455,4456,4459],{},[43,4457,4458],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4461,4462],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4464,4465],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4467,70],{"id":70},[10,4469,73],{},[75,4471,4473],{"className":77,"code":4472,"language":79,"meta":80,"style":80},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[43,4474,4475,4480,4484,4489,4494,4498,4503],{"__ignoreMap":80},[84,4476,4477],{"class":86,"line":87},[84,4478,4479],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[84,4481,4482],{"class":86,"line":93},[84,4483,109],{"emptyLinePlaceholder":108},[84,4485,4486],{"class":86,"line":99},[84,4487,4488],{},"for course in courses:\n",[84,4490,4491],{"class":86,"line":105},[84,4492,4493],{},"    print(course)\n",[84,4495,4496],{"class":86,"line":112},[84,4497,109],{"emptyLinePlaceholder":108},[84,4499,4500],{"class":86,"line":118},[84,4501,4502],{},"for number in range(1, 4):\n",[84,4504,4505],{"class":86,"line":124},[84,4506,4507],{},"    print(number)\n",[10,4509,136],{},[75,4511,4514],{"className":4512,"code":4513,"language":142,"meta":80},[140],"变量\n字符串\n列表\n1\n2\n3\n",[43,4515,4513],{"__ignoreMap":80},[10,4517,147],{},[14,4519,150],{"id":150},[152,4521,4522,4532],{},[40,4523,4524,4525,4527,4528,4531],{},"第一个 ",[43,4526,4284],{}," 依次从列表取得字符串，循环变量 ",[43,4529,4530],{},"course"," 每轮重新绑定。",[40,4533,4534,4536],{},[43,4535,4458],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4538,168],{"id":168},[37,4540,4541,4544],{},[40,4542,4543],{},"只需要元素却手工维护索引，增加越界风险。",[40,4545,4546],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4548,183],{"id":183},[152,4550,4551,4554],{},[40,4552,4553],{},"逐项输出一个字符串中的字符。",[40,4555,2328,4556,4559],{},[43,4557,4558],{},"range()"," 输出 2、4、6、8。",[10,4561,194],{},[14,4563,197],{"id":197},[10,4565,4566],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,4568,204],{},{"title":80,"searchDepth":93,"depth":93,"links":4570},[4571,4572,4573,4574,4575,4576,4577,4578],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4426,"description":4431},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[215,4284,4586],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4589,"title":4590,"body":4591,"category":215,"cover":216,"description":4595,"extension":217,"meta":4769,"navigation":108,"path":4770,"pinned":220,"publishedAt":221,"seo":4771,"slug":4772,"stem":4773,"summary":4774,"tags":4775,"updatedAt":221,"visible":108,"__hash__":4776},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4592,"toc":4759},[4593,4596,4598,4601,4603,4609,4619,4621,4640,4642,4644,4696,4698,4704,4706,4708,4722,4724,4740,4742,4750,4752,4754,4757],[10,4594,4595],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4597,16],{"id":16},[10,4599,4600],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4602,22],{"id":22},[10,4604,4605],{},[26,4606],{"alt":4607,"src":4608},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4610,4611,4614,4615,4618],{},[43,4612,4613],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[43,4616,4617],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4620,35],{"id":35},[37,4622,4623,4626,4634],{},[40,4624,4625],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4627,4628,4630,4631,4633],{},[43,4629,4613],{}," 前要确认不会跳过 ",[43,4632,4267],{}," 循环中的状态更新。",[40,4635,4636,4637,4639],{},"多层嵌套中 ",[43,4638,4617],{}," 只结束它所在的最内层循环。",[14,4641,70],{"id":70},[10,4643,73],{},[75,4645,4647],{"className":77,"code":4646,"language":79,"meta":80,"style":80},"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",[43,4648,4649,4654,4658,4663,4668,4673,4678,4683,4687,4691],{"__ignoreMap":80},[84,4650,4651],{"class":86,"line":87},[84,4652,4653],{},"numbers = [3, -1, 0, 8, 12]\n",[84,4655,4656],{"class":86,"line":93},[84,4657,109],{"emptyLinePlaceholder":108},[84,4659,4660],{"class":86,"line":99},[84,4661,4662],{},"for number in numbers:\n",[84,4664,4665],{"class":86,"line":105},[84,4666,4667],{},"    if number \u003C 0:\n",[84,4669,4670],{"class":86,"line":112},[84,4671,4672],{},"        continue\n",[84,4674,4675],{"class":86,"line":118},[84,4676,4677],{},"    if number == 0:\n",[84,4679,4680],{"class":86,"line":124},[84,4681,4682],{},"        break\n",[84,4684,4685],{"class":86,"line":130},[84,4686,4507],{},[84,4688,4689],{"class":86,"line":3898},[84,4690,109],{"emptyLinePlaceholder":108},[84,4692,4693],{"class":86,"line":4110},[84,4694,4695],{},"print(\"循环结束\")\n",[10,4697,136],{},[75,4699,4702],{"className":4700,"code":4701,"language":142,"meta":80},[140],"3\n循环结束\n",[43,4703,4701],{"__ignoreMap":80},[10,4705,147],{},[14,4707,150],{"id":150},[152,4709,4710,4716],{},[40,4711,4712,4713,4715],{},"遇到 -1 时 ",[43,4714,4613],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4717,4718,4719,4721],{},"遇到 0 时 ",[43,4720,4617],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4723,168],{"id":168},[37,4725,4726,4731],{},[40,4727,3412,4728,4730],{},[43,4729,4613],{}," 当作结束循环，实际它只跳到下一轮。",[40,4732,4733,4734,4736,4737,4739],{},"在 ",[43,4735,4267],{}," 中把状态更新放在可能被 ",[43,4738,4613],{}," 跳过的位置，造成无限循环。",[14,4741,183],{"id":183},[152,4743,4744,4747],{},[40,4745,4746],{},"跳过列表中的空字符串并输出其他内容。",[40,4748,4749],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4751,194],{},[14,4753,197],{"id":197},[10,4755,4756],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,4758,204],{},{"title":80,"searchDepth":93,"depth":93,"links":4760},[4761,4762,4763,4764,4765,4766,4767,4768],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4590,"description":4595},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[215,4617,4613],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4778,"title":4779,"body":4780,"category":215,"cover":216,"description":4784,"extension":217,"meta":4955,"navigation":108,"path":4956,"pinned":220,"publishedAt":221,"seo":4957,"slug":4958,"stem":4959,"summary":4960,"tags":4961,"updatedAt":221,"visible":108,"__hash__":4964},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4781,"toc":4943},[4782,4785,4787,4790,4792,4798,4801,4803,4827,4829,4831,4865,4867,4873,4875,4877,4894,4896,4899,4905,4908,4910,4924,4926,4934,4936,4938,4941],[10,4783,4784],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4786,16],{"id":16},[10,4788,4789],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4791,22],{"id":22},[10,4793,4794],{},[26,4795],{"alt":4796,"src":4797},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4799,4800],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4802,35],{"id":35},[37,4804,4805,4808,4811],{},[40,4806,4807],{},"每增加一层嵌套，阅读成本都会上升。",[40,4809,4810],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4812,4813,4814,2246,4817,4820,4821,2246,4824,177],{},"变量名使用 ",[43,4815,4816],{},"row",[43,4818,4819],{},"cell"," 等层级含义，避免全部写成 ",[43,4822,4823],{},"i",[43,4825,4826],{},"j",[14,4828,70],{"id":70},[10,4830,73],{},[75,4832,4834],{"className":77,"code":4833,"language":79,"meta":80,"style":80},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[43,4835,4836,4841,4845,4850,4855,4860],{"__ignoreMap":80},[84,4837,4838],{"class":86,"line":87},[84,4839,4840],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[84,4842,4843],{"class":86,"line":93},[84,4844,109],{"emptyLinePlaceholder":108},[84,4846,4847],{"class":86,"line":99},[84,4848,4849],{},"for row in table:\n",[84,4851,4852],{"class":86,"line":105},[84,4853,4854],{},"    for cell in row:\n",[84,4856,4857],{"class":86,"line":112},[84,4858,4859],{},"        print(cell)\n",[84,4861,4862],{"class":86,"line":118},[84,4863,4864],{},"    print(\"一行结束\")\n",[10,4866,136],{},[75,4868,4871],{"className":4869,"code":4870,"language":142,"meta":80},[140],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[43,4872,4870],{"__ignoreMap":80},[10,4874,147],{},[14,4876,150],{"id":150},[152,4878,4879,4891],{},[40,4880,4881,4882,4884,4885,1146,4888,177],{},"外层变量 ",[43,4883,4816],{}," 先引用第一行列表，内层才依次处理 ",[43,4886,4887],{},"A1",[43,4889,4890],{},"A2",[40,4892,4893],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[318,4895,2642],{"id":2642},[10,4897,4898],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4900,4901],{},[26,4902],{"alt":4903,"src":4904},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4906,4907],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4909,168],{"id":168},[37,4911,4912,4921],{},[40,4913,4914,4915,998,4918,4920],{},"把两层循环变量都叫 ",[43,4916,4917],{},"item",[43,4919,4823],{},"，难以确认当前层级。",[40,4922,4923],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4925,183],{"id":183},[152,4927,4928,4931],{},[40,4929,4930],{},"打印一个 2×3 数字表。",[40,4932,4933],{},"在内层增加条件，只输出大于 3 的元素。",[10,4935,194],{},[14,4937,197],{"id":197},[10,4939,4940],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,4942,204],{},{"title":80,"searchDepth":93,"depth":93,"links":4944},[4945,4946,4947,4948,4949,4952,4953,4954],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":4950},[4951],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4779,"description":4784},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[215,4962,4963],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4966,"title":4967,"body":4968,"category":215,"cover":216,"description":4972,"extension":217,"meta":5110,"navigation":108,"path":5111,"pinned":220,"publishedAt":221,"seo":5112,"slug":5113,"stem":5114,"summary":5115,"tags":5116,"updatedAt":221,"visible":108,"__hash__":5119},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4969,"toc":5100},[4970,4973,4975,4978,4980,4986,4989,4991,5002,5004,5006,5044,5046,5052,5054,5056,5068,5070,5081,5083,5091,5093,5095,5098],[10,4971,4972],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4974,16],{"id":16},[10,4976,4977],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4979,22],{"id":22},[10,4981,4982],{},[26,4983],{"alt":4984,"src":4985},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4987,4988],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4990,35],{"id":35},[37,4992,4993,4996,4999],{},[40,4994,4995],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,4997,4998],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5000,5001],{},"推导式创建新列表，不修改输入列表。",[14,5003,70],{"id":70},[10,5005,73],{},[75,5007,5009],{"className":77,"code":5008,"language":79,"meta":80,"style":80},"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",[43,5010,5011,5016,5020,5025,5030,5034,5039],{"__ignoreMap":80},[84,5012,5013],{"class":86,"line":87},[84,5014,5015],{},"numbers = [1, 2, 3, 4, 5]\n",[84,5017,5018],{"class":86,"line":93},[84,5019,109],{"emptyLinePlaceholder":108},[84,5021,5022],{"class":86,"line":99},[84,5023,5024],{},"squares = [number * number for number in numbers]\n",[84,5026,5027],{"class":86,"line":105},[84,5028,5029],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[84,5031,5032],{"class":86,"line":112},[84,5033,109],{"emptyLinePlaceholder":108},[84,5035,5036],{"class":86,"line":118},[84,5037,5038],{},"print(squares)\n",[84,5040,5041],{"class":86,"line":124},[84,5042,5043],{},"print(even_squares)\n",[10,5045,136],{},[75,5047,5050],{"className":5048,"code":5049,"language":142,"meta":80},[140],"[1, 4, 9, 16, 25]\n[4, 16]\n",[43,5051,5049],{"__ignoreMap":80},[10,5053,147],{},[14,5055,150],{"id":150},[152,5057,5058,5061],{},[40,5059,5060],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5062,5063,5064,5067],{},"第二条先用 ",[43,5065,5066],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5069,168],{"id":168},[37,5071,5072,5078],{},[40,5073,5074,5075,5077],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[43,5076,4284],{}," 开始找输入。",[40,5079,5080],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5082,183],{"id":183},[152,5084,5085,5088],{},[40,5086,5087],{},"把字符串列表转换为长度列表。",[40,5089,5090],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5092,194],{},[14,5094,197],{"id":197},[10,5096,5097],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,5099,204],{},{"title":80,"searchDepth":93,"depth":93,"links":5101},[5102,5103,5104,5105,5106,5107,5108,5109],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4967,"description":4972},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[215,5117,5118],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5121,"title":5122,"body":5123,"category":215,"cover":216,"description":5127,"extension":217,"meta":5270,"navigation":108,"path":5271,"pinned":220,"publishedAt":221,"seo":5272,"slug":5273,"stem":5274,"summary":5275,"tags":5276,"updatedAt":221,"visible":108,"__hash__":5279},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5124,"toc":5260},[5125,5128,5130,5133,5135,5141,5144,5146,5157,5159,5161,5200,5202,5208,5210,5212,5227,5229,5237,5239,5251,5253,5255,5258],[10,5126,5127],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5129,16],{"id":16},[10,5131,5132],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5134,22],{"id":22},[10,5136,5137],{},[26,5138],{"alt":5139,"src":5140},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5142,5143],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5145,35],{"id":35},[37,5147,5148,5151,5154],{},[40,5149,5150],{},"函数名描述动作，使用小写字母和下划线。",[40,5152,5153],{},"函数定义要先执行，之后才能调用。",[40,5155,5156],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5158,70],{"id":70},[10,5160,73],{},[75,5162,5164],{"className":77,"code":5163,"language":79,"meta":80,"style":80},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[43,5165,5166,5171,5176,5181,5185,5190,5195],{"__ignoreMap":80},[84,5167,5168],{"class":86,"line":87},[84,5169,5170],{},"def show_progress():\n",[84,5172,5173],{"class":86,"line":93},[84,5174,5175],{},"    print(\"正在学习函数\")\n",[84,5177,5178],{"class":86,"line":99},[84,5179,5180],{},"    print(\"本节完成 50%\")\n",[84,5182,5183],{"class":86,"line":105},[84,5184,109],{"emptyLinePlaceholder":108},[84,5186,5187],{"class":86,"line":112},[84,5188,5189],{},"print(\"调用前\")\n",[84,5191,5192],{"class":86,"line":118},[84,5193,5194],{},"show_progress()\n",[84,5196,5197],{"class":86,"line":124},[84,5198,5199],{},"print(\"调用后\")\n",[10,5201,136],{},[75,5203,5206],{"className":5204,"code":5205,"language":142,"meta":80},[140],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[43,5207,5205],{"__ignoreMap":80},[10,5209,147],{},[14,5211,150],{"id":150},[152,5213,5214,5220],{},[40,5215,927,5216,5219],{},[43,5217,5218],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5221,5222,5223,5226],{},"运行到 ",[43,5224,5225],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5228,168],{"id":168},[37,5230,5231,5234],{},[40,5232,5233],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5235,5236],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5238,183],{"id":183},[152,5240,5241,5248],{},[40,5242,5243,5244,5247],{},"定义 ",[43,5245,5246],{},"show_plan()"," 输出两行学习计划。",[40,5249,5250],{},"连续调用同一个函数两次，观察执行顺序。",[10,5252,194],{},[14,5254,197],{"id":197},[10,5256,5257],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,5259,204],{},{"title":80,"searchDepth":93,"depth":93,"links":5261},[5262,5263,5264,5265,5266,5267,5268,5269],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5122,"description":5127},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[215,5277,5278],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5281,"title":5282,"body":5283,"category":215,"cover":216,"description":5287,"extension":217,"meta":5467,"navigation":108,"path":5468,"pinned":220,"publishedAt":221,"seo":5469,"slug":5470,"stem":5471,"summary":5472,"tags":5473,"updatedAt":221,"visible":108,"__hash__":5476},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5284,"toc":5455},[5285,5288,5290,5293,5295,5301,5308,5310,5327,5329,5331,5365,5367,5373,5375,5377,5398,5400,5403,5409,5419,5421,5436,5438,5446,5448,5450,5453],[10,5286,5287],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5289,16],{"id":16},[10,5291,5292],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5294,22],{"id":22},[10,5296,5297],{},[26,5298],{"alt":5299,"src":5300},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5302,5303,5304,5307],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[43,5305,5306],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5309,35],{"id":35},[37,5311,5312,5315,5318],{},[40,5313,5314],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5316,5317],{},"局部变量默认只在函数内部可见。",[40,5319,5320,5321,5323,5324,177],{},"没有显式 ",[43,5322,5306],{}," 的函数会返回 ",[43,5325,5326],{},"None",[14,5328,70],{"id":70},[10,5330,73],{},[75,5332,5334],{"className":77,"code":5333,"language":79,"meta":80,"style":80},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[43,5335,5336,5341,5346,5351,5355,5360],{"__ignoreMap":80},[84,5337,5338],{"class":86,"line":87},[84,5339,5340],{},"def calculate_total(price, count):\n",[84,5342,5343],{"class":86,"line":93},[84,5344,5345],{},"    total = price * count\n",[84,5347,5348],{"class":86,"line":99},[84,5349,5350],{},"    return total\n",[84,5352,5353],{"class":86,"line":105},[84,5354,109],{"emptyLinePlaceholder":108},[84,5356,5357],{"class":86,"line":112},[84,5358,5359],{},"result = calculate_total(25, 4)\n",[84,5361,5362],{"class":86,"line":118},[84,5363,5364],{},"print(result)\n",[10,5366,136],{},[75,5368,5371],{"className":5369,"code":5370,"language":142,"meta":80},[140],"100\n",[43,5372,5370],{"__ignoreMap":80},[10,5374,147],{},[14,5376,150],{"id":150},[152,5378,5379,5388],{},[40,5380,5381,5382,2246,5385,5387],{},"调用时 25 和 4 分别绑定到 ",[43,5383,5384],{},"price",[43,5386,4347],{},"，它们只在本次函数调用的局部范围中使用。",[40,5389,5390,5393,5394,5397],{},[43,5391,5392],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[43,5395,5396],{},"result"," 并输出。",[318,5399,2642],{"id":2642},[10,5401,5402],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5404,5405],{},[26,5406],{"alt":5407,"src":5408},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5410,5411,2246,5413,1146,5415,5418],{},[43,5412,5384],{},[43,5414,4347],{},[43,5416,5417],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5420,168],{"id":168},[37,5422,5423,5430],{},[40,5424,5425,5426,5429],{},"在函数内部只 ",[43,5427,5428],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5431,5432,5433,5435],{},"试图在函数外直接访问局部变量 ",[43,5434,5417],{},"，它的名字只在调用期间的局部作用域存在。",[14,5437,183],{"id":183},[152,5439,5440,5443],{},[40,5441,5442],{},"编写计算长方形面积的函数。",[40,5444,5445],{},"让函数返回结果后在调用方加上单位再输出。",[10,5447,194],{},[14,5449,197],{"id":197},[10,5451,5452],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,5454,204],{},{"title":80,"searchDepth":93,"depth":93,"links":5456},[5457,5458,5459,5460,5461,5464,5465,5466],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":5462},[5463],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5282,"description":5287},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[215,5474,5475],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5478,"title":5479,"body":5480,"category":215,"cover":216,"description":5484,"extension":217,"meta":5664,"navigation":108,"path":5665,"pinned":220,"publishedAt":221,"seo":5666,"slug":5667,"stem":5668,"summary":5669,"tags":5670,"updatedAt":221,"visible":108,"__hash__":5673},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5481,"toc":5652},[5482,5485,5487,5490,5492,5498,5501,5503,5520,5522,5524,5576,5578,5584,5586,5588,5606,5608,5611,5617,5620,5622,5633,5635,5643,5645,5647,5650],[10,5483,5484],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5486,16],{"id":16},[10,5488,5489],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5491,22],{"id":22},[10,5493,5494],{},[26,5495],{"alt":5496,"src":5497},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5499,5500],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5502,35],{"id":35},[37,5504,5505,5508,5514],{},[40,5506,5507],{},"必需参数应放在有默认值的参数之前。",[40,5509,5510,5513],{},[43,5511,5512],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5515,5516,5519],{},[43,5517,5518],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5521,70],{"id":70},[10,5523,73],{},[75,5525,5527],{"className":77,"code":5526,"language":79,"meta":80,"style":80},"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",[43,5528,5529,5534,5539,5543,5548,5553,5557,5562,5567,5571],{"__ignoreMap":80},[84,5530,5531],{"class":86,"line":87},[84,5532,5533],{},"def build_title(name, level=\"基础\"):\n",[84,5535,5536],{"class":86,"line":93},[84,5537,5538],{},"    return name + \"｜\" + level\n",[84,5540,5541],{"class":86,"line":99},[84,5542,109],{"emptyLinePlaceholder":108},[84,5544,5545],{"class":86,"line":105},[84,5546,5547],{},"print(build_title(\"Python\"))\n",[84,5549,5550],{"class":86,"line":112},[84,5551,5552],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[84,5554,5555],{"class":86,"line":118},[84,5556,109],{"emptyLinePlaceholder":108},[84,5558,5559],{"class":86,"line":124},[84,5560,5561],{},"def total(*numbers):\n",[84,5563,5564],{"class":86,"line":130},[84,5565,5566],{},"    return sum(numbers)\n",[84,5568,5569],{"class":86,"line":3898},[84,5570,109],{"emptyLinePlaceholder":108},[84,5572,5573],{"class":86,"line":4110},[84,5574,5575],{},"print(total(10, 20, 30))\n",[10,5577,136],{},[75,5579,5582],{"className":5580,"code":5581,"language":142,"meta":80},[140],"Python｜基础\n异常处理｜进阶\n60\n",[43,5583,5581],{"__ignoreMap":80},[10,5585,147],{},[14,5587,150],{"id":150},[152,5589,5590,5597],{},[40,5591,5592,5593,5596],{},"第一次调用只提供必需参数，",[43,5594,5595],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5598,5599,5602,5603,177],{},[43,5600,5601],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[43,5604,5605],{},"sum()",[318,5607,2642],{"id":2642},[10,5609,5610],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5612,5613],{},[26,5614],{"alt":5615,"src":5616},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5618,5619],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5621,168],{"id":168},[37,5623,5624,5630],{},[40,5625,5626,5627,5629],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[43,5628,5326],{}," 再在函数内创建。",[40,5631,5632],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5634,183],{"id":183},[152,5636,5637,5640],{},[40,5638,5639],{},"给问候函数增加默认称呼。",[40,5641,5642],{},"编写接收任意数量分数并返回总分的函数。",[10,5644,194],{},[14,5646,197],{"id":197},[10,5648,5649],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,5651,204],{},{"title":80,"searchDepth":93,"depth":93,"links":5653},[5654,5655,5656,5657,5658,5661,5662,5663],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":5659},[5660],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5479,"description":5484},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[215,5671,5672],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5675,"title":5676,"body":5677,"category":215,"cover":216,"description":5681,"extension":217,"meta":5878,"navigation":108,"path":5879,"pinned":220,"publishedAt":221,"seo":5880,"slug":5881,"stem":5882,"summary":5883,"tags":5884,"updatedAt":221,"visible":108,"__hash__":5887},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5678,"toc":5866},[5679,5682,5684,5687,5689,5695,5698,5700,5717,5719,5721,5784,5786,5792,5794,5796,5823,5825,5828,5834,5837,5839,5847,5849,5857,5859,5861,5864],[10,5680,5681],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5683,16],{"id":16},[10,5685,5686],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5688,22],{"id":22},[10,5690,5691],{},[26,5692],{"alt":5693,"src":5694},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5696,5697],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5699,35],{"id":35},[37,5701,5702,5705,5708],{},[40,5703,5704],{},"函数内部赋值默认创建局部变量。",[40,5706,5707],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5709,5710,2165,5713,5716],{},[43,5711,5712],{},"global",[43,5714,5715],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5718,70],{"id":70},[10,5720,73],{},[75,5722,5724],{"className":77,"code":5723,"language":79,"meta":80,"style":80},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[43,5725,5726,5731,5735,5740,5745,5749,5754,5759,5764,5768,5773,5778],{"__ignoreMap":80},[84,5727,5728],{"class":86,"line":87},[84,5729,5730],{},"course = \"Python\"\n",[84,5732,5733],{"class":86,"line":93},[84,5734,109],{"emptyLinePlaceholder":108},[84,5736,5737],{"class":86,"line":99},[84,5738,5739],{},"def outer():\n",[84,5741,5742],{"class":86,"line":105},[84,5743,5744],{},"    level = \"基础\"\n",[84,5746,5747],{"class":86,"line":112},[84,5748,109],{"emptyLinePlaceholder":108},[84,5750,5751],{"class":86,"line":118},[84,5752,5753],{},"    def show():\n",[84,5755,5756],{"class":86,"line":124},[84,5757,5758],{},"        lesson = \"作用域\"\n",[84,5760,5761],{"class":86,"line":130},[84,5762,5763],{},"        print(course, level, lesson)\n",[84,5765,5766],{"class":86,"line":3898},[84,5767,109],{"emptyLinePlaceholder":108},[84,5769,5770],{"class":86,"line":4110},[84,5771,5772],{},"    show()\n",[84,5774,5776],{"class":86,"line":5775},11,[84,5777,109],{"emptyLinePlaceholder":108},[84,5779,5781],{"class":86,"line":5780},12,[84,5782,5783],{},"outer()\n",[10,5785,136],{},[75,5787,5790],{"className":5788,"code":5789,"language":142,"meta":80},[140],"Python 基础 作用域\n",[43,5791,5789],{"__ignoreMap":80},[10,5793,147],{},[14,5795,150],{"id":150},[152,5797,5798,5815],{},[40,5799,5800,5803,5804,5807,5808,5810,5811,5814],{},[43,5801,5802],{},"show()"," 中查找 ",[43,5805,5806],{},"lesson"," 时先在局部找到，查找 ",[43,5809,5595],{}," 时到外层 ",[43,5812,5813],{},"outer()"," 找到。",[40,5816,5817,5819,5820,5822],{},[43,5818,4530],{}," 在局部和外层都不存在，继续到模块全局找到；",[43,5821,2197],{}," 最后在内置作用域找到。",[318,5824,2642],{"id":2642},[10,5826,5827],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5829,5830],{},[26,5831],{"alt":5832,"src":5833},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5835,5836],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5838,168],{"id":168},[37,5840,5841,5844],{},[40,5842,5843],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5845,5846],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5848,183],{"id":183},[152,5850,5851,5854],{},[40,5852,5853],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5855,5856],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5858,194],{},[14,5860,197],{"id":197},[10,5862,5863],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,5865,204],{},{"title":80,"searchDepth":93,"depth":93,"links":5867},[5868,5869,5870,5871,5872,5875,5876,5877],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":5873},[5874],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5676,"description":5681},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[215,5885,5886],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5889,"title":5890,"body":5891,"category":215,"cover":216,"description":5895,"extension":217,"meta":6045,"navigation":108,"path":6046,"pinned":220,"publishedAt":221,"seo":6047,"slug":6048,"stem":6049,"summary":6050,"tags":6051,"updatedAt":221,"visible":108,"__hash__":6054},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5892,"toc":6035},[5893,5896,5898,5901,5903,5909,5912,5914,5933,5935,5937,5971,5973,5979,5981,5983,5998,6000,6012,6014,6026,6028,6030,6033],[10,5894,5895],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5897,16],{"id":16},[10,5899,5900],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5902,22],{"id":22},[10,5904,5905],{},[26,5906],{"alt":5907,"src":5908},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5910,5911],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5913,35],{"id":35},[37,5915,5916,5919,5922],{},[40,5917,5918],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5920,5921],{},"注解表达接口意图，不代替输入校验和测试。",[40,5923,5924,5925,2246,5927,2246,5929,5932],{},"基础注解优先使用 ",[43,5926,2249],{},[43,5928,45],{},[43,5930,5931],{},"list[str]"," 等直接写法。",[14,5934,70],{"id":70},[10,5936,73],{},[75,5938,5940],{"className":77,"code":5939,"language":79,"meta":80,"style":80},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[43,5941,5942,5947,5952,5957,5961,5966],{"__ignoreMap":80},[84,5943,5944],{"class":86,"line":87},[84,5945,5946],{},"def format_score(name: str, score: int) -> str:\n",[84,5948,5949],{"class":86,"line":93},[84,5950,5951],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[84,5953,5954],{"class":86,"line":99},[84,5955,5956],{},"    return name + \"：\" + str(score)\n",[84,5958,5959],{"class":86,"line":105},[84,5960,109],{"emptyLinePlaceholder":108},[84,5962,5963],{"class":86,"line":112},[84,5964,5965],{},"print(format_score(\"小郑\", 95))\n",[84,5967,5968],{"class":86,"line":118},[84,5969,5970],{},"print(format_score.__doc__)\n",[10,5972,136],{},[75,5974,5977],{"className":5975,"code":5976,"language":142,"meta":80},[140],"小郑：95\n返回带姓名的分数文本。\n",[43,5978,5976],{"__ignoreMap":80},[10,5980,147],{},[14,5982,150],{"id":150},[152,5984,5985,5995],{},[40,5986,5987,5988,5991,5992,5994],{},"函数签名说明 ",[43,5989,5990],{},"name"," 预期为字符串、",[43,5993,2235],{}," 预期为整数，返回值预期为字符串。",[40,5996,5997],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5999,168],{"id":168},[37,6001,6002,6009],{},[40,6003,6004,6005,6008],{},"认为加了 ",[43,6006,6007],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6010,6011],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6013,183],{"id":183},[152,6015,6016,6019],{},[40,6017,6018],{},"为面积函数补充参数和返回值注解。",[40,6020,6021,6022,6025],{},"通过 ",[43,6023,6024],{},"函数名.__doc__"," 查看文档字符串。",[10,6027,194],{},[14,6029,197],{"id":197},[10,6031,6032],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,6034,204],{},{"title":80,"searchDepth":93,"depth":93,"links":6036},[6037,6038,6039,6040,6041,6042,6043,6044],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5890,"description":5895},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[215,6052,6053],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6056,"title":6057,"body":6058,"category":215,"cover":216,"description":6062,"extension":217,"meta":6289,"navigation":108,"path":6290,"pinned":220,"publishedAt":221,"seo":6291,"slug":6292,"stem":6293,"summary":6294,"tags":6295,"updatedAt":221,"visible":108,"__hash__":6298},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6059,"toc":6277},[6060,6063,6065,6071,6073,6079,6090,6092,6110,6112,6119,6148,6155,6174,6183,6185,6191,6193,6195,6218,6220,6223,6229,6235,6237,6253,6255,6268,6270,6272,6275],[10,6061,6062],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6064,16],{"id":16},[10,6066,6067,6068,6070],{},"本篇只处理“模块、import 与 ",[284,6069,5990],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6072,22],{"id":22},[10,6074,6075],{},[26,6076],{"alt":6077,"src":6078},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6080,6081,6082,6085,6086,6089],{},"同一个文件直接运行时 ",[43,6083,6084],{},"__name__"," 等于 ",[43,6087,6088],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6091,35],{"id":35},[37,6093,6094,6100,6103],{},[40,6095,6096,6097,6099],{},"一个 ",[43,6098,1160],{}," 文件就是一个模块。",[40,6101,6102],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6104,6105,6106,6109],{},"避免使用 ",[43,6107,6108],{},"from module import *","，它会让名字来源不清楚。",[14,6111,70],{"id":70},[10,6113,6114,6115,6118],{},"先在同一个目录中创建两个文件。把函数放进 ",[43,6116,6117],{},"calculator.py","：",[75,6120,6122],{"className":77,"code":6121,"language":79,"meta":80,"style":80},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[43,6123,6124,6129,6134,6138,6143],{"__ignoreMap":80},[84,6125,6126],{"class":86,"line":87},[84,6127,6128],{},"def add(left, right):\n",[84,6130,6131],{"class":86,"line":93},[84,6132,6133],{},"    return left + right\n",[84,6135,6136],{"class":86,"line":99},[84,6137,109],{"emptyLinePlaceholder":108},[84,6139,6140],{"class":86,"line":105},[84,6141,6142],{},"if __name__ == \"__main__\":\n",[84,6144,6145],{"class":86,"line":112},[84,6146,6147],{},"    print(add(2, 3))\n",[10,6149,6150,6151,6154],{},"再创建 ",[43,6152,6153],{},"app.py","，从模块中导入函数：",[75,6156,6158],{"className":77,"code":6157,"language":79,"meta":80,"style":80},"from calculator import add\n\nprint(add(10, 20))\n",[43,6159,6160,6165,6169],{"__ignoreMap":80},[84,6161,6162],{"class":86,"line":87},[84,6163,6164],{},"from calculator import add\n",[84,6166,6167],{"class":86,"line":93},[84,6168,109],{"emptyLinePlaceholder":108},[84,6170,6171],{"class":86,"line":99},[84,6172,6173],{},"print(add(10, 20))\n",[10,6175,6176,6177,1146,6180,177],{},"分别执行 ",[43,6178,6179],{},"python3 calculator.py",[43,6181,6182],{},"python3 app.py",[10,6184,136],{},[75,6186,6189],{"className":6187,"code":6188,"language":142,"meta":80},[140],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[43,6190,6188],{"__ignoreMap":80},[10,6192,147],{},[14,6194,150],{"id":150},[152,6196,6197,6207],{},[40,6198,6199,6200,6202,6203,6206],{},"直接运行 ",[43,6201,6117],{}," 时，模块名是 ",[43,6204,6205],{},"__main__","，入口代码输出 5。",[40,6208,6209,6211,6212,6214,6215,6217],{},[43,6210,6153],{}," 导入模块时，",[43,6213,6117],{}," 的函数定义会执行，但入口判断为假；随后 ",[43,6216,6153],{}," 调用函数输出 30。",[318,6219,2642],{"id":2642},[10,6221,6222],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6224,6225],{},[26,6226],{"alt":6227,"src":6228},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6230,6231,6232,6234],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[43,6233,6205],{}," 保护下的演示代码。",[14,6236,168],{"id":168},[37,6238,6239,6246],{},[40,6240,6241,6242,1146,6244,177],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[43,6243,6117],{},[43,6245,6153],{},[40,6247,6248,6249,6252],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[43,6250,6251],{},"json.py","，导致导入目标被遮蔽。",[14,6254,183],{"id":183},[152,6256,6257,6263],{},[40,6258,2343,6259,6262],{},[43,6260,6261],{},"text_tools.py"," 并导出一个格式化函数。",[40,6264,6265,6266,177],{},"分别直接运行模块和从另一个脚本导入，输出 ",[43,6267,6084],{},[10,6269,194],{},[14,6271,197],{"id":197},[10,6273,6274],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,6276,204],{},{"title":80,"searchDepth":93,"depth":93,"links":6278},[6279,6280,6281,6282,6283,6286,6287,6288],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":6284},[6285],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6057,"description":6062},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[215,6296,6297],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6300,"title":6301,"body":6302,"category":215,"cover":216,"description":6306,"extension":217,"meta":6471,"navigation":108,"path":6472,"pinned":220,"publishedAt":221,"seo":6473,"slug":6474,"stem":6475,"summary":6476,"tags":6477,"updatedAt":221,"visible":108,"__hash__":6479},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6303,"toc":6461},[6304,6307,6309,6312,6314,6320,6323,6325,6339,6341,6343,6389,6391,6397,6399,6401,6427,6429,6439,6441,6452,6454,6456,6459],[10,6305,6306],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6308,16],{"id":16},[10,6310,6311],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6313,22],{"id":22},[10,6315,6316],{},[26,6317],{"alt":6318,"src":6319},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6321,6322],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6324,35],{"id":35},[37,6326,6327,6333,6336],{},[40,6328,6329,6332],{},[43,6330,6331],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6334,6335],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6337,6338],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6340,70],{"id":70},[10,6342,1563],{},[75,6344,6346],{"className":580,"code":6345,"language":582,"meta":80,"style":80},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[43,6347,6348,6360,6368,6374,6384],{"__ignoreMap":80},[84,6349,6350,6352,6354,6357],{"class":86,"line":87},[84,6351,680],{"class":589},[84,6353,622],{"class":592},[84,6355,6356],{"class":625}," venv",[84,6358,6359],{"class":625}," .venv\n",[84,6361,6362,6365],{"class":86,"line":93},[84,6363,6364],{"class":592},"source",[84,6366,6367],{"class":625}," .venv\u002Fbin\u002Factivate\n",[84,6369,6370,6372],{"class":86,"line":99},[84,6371,79],{"class":589},[84,6373,593],{"class":592},[84,6375,6376,6378,6380,6382],{"class":86,"line":105},[84,6377,79],{"class":589},[84,6379,622],{"class":592},[84,6381,626],{"class":625},[84,6383,593],{"class":592},[84,6385,6386],{"class":86,"line":112},[84,6387,6388],{"class":589},"deactivate\n",[10,6390,136],{},[75,6392,6395],{"className":6393,"code":6394,"language":142,"meta":80},[140],"Python 和 pip 的路径应指向当前项目的 .venv\n",[43,6396,6394],{"__ignoreMap":80},[10,6398,147],{},[14,6400,150],{"id":150},[152,6402,6403,6412],{},[40,6404,6405,6408,6409,6411],{},[43,6406,6407],{},"venv"," 根据当前 ",[43,6410,680],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6413,6414,6415,2165,6417,6420,6421,3673,6423,6426],{},"激活后 ",[43,6416,79],{},[43,6418,6419],{},"python -m pip"," 优先指向 ",[43,6422,6331],{},[43,6424,6425],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6428,168],{"id":168},[37,6430,6431,6434],{},[40,6432,6433],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6435,3412,6436,6438],{},[43,6437,6331],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6440,183],{"id":183},[152,6442,6443,6449],{},[40,6444,6445,6446,177],{},"创建虚拟环境并记录激活前后的 ",[43,6447,6448],{},"which python",[40,6450,6451],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6453,194],{},[14,6455,197],{"id":197},[10,6457,6458],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,6460,1647],{},{"title":80,"searchDepth":93,"depth":93,"links":6462},[6463,6464,6465,6466,6467,6468,6469,6470],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6301,"description":6306},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[215,6478,250],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6481,"title":6482,"body":6483,"category":215,"cover":216,"description":6487,"extension":217,"meta":6675,"navigation":108,"path":6676,"pinned":220,"publishedAt":221,"seo":6677,"slug":6678,"stem":6679,"summary":6680,"tags":6681,"updatedAt":221,"visible":108,"__hash__":6684},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6484,"toc":6665},[6485,6488,6490,6493,6495,6501,6510,6512,6536,6538,6540,6593,6595,6601,6603,6605,6621,6623,6642,6644,6656,6658,6660,6663],[10,6486,6487],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6489,16],{"id":16},[10,6491,6492],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6494,22],{"id":22},[10,6496,6497],{},[26,6498],{"alt":6499,"src":6500},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6502,6503,6506,6507,6509],{},[43,6504,6505],{},"Path"," 使用 ",[43,6508,55],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6511,35],{"id":35},[37,6513,6514,6517,6529],{},[40,6515,6516],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6518,6519,2246,6522,2246,6525,6528],{},[43,6520,6521],{},"exists()",[43,6523,6524],{},"is_file()",[43,6526,6527],{},"is_dir()"," 检查真实文件系统状态。",[40,6530,6531,6532,6535],{},"创建目录前明确目标；",[43,6533,6534],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6537,70],{"id":70},[10,6539,73],{},[75,6541,6543],{"className":77,"code":6542,"language":79,"meta":80,"style":80},"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",[43,6544,6545,6550,6554,6559,6564,6569,6573,6578,6583,6588],{"__ignoreMap":80},[84,6546,6547],{"class":86,"line":87},[84,6548,6549],{},"from pathlib import Path\n",[84,6551,6552],{"class":86,"line":93},[84,6553,109],{"emptyLinePlaceholder":108},[84,6555,6556],{"class":86,"line":99},[84,6557,6558],{},"project = Path.cwd()\n",[84,6560,6561],{"class":86,"line":105},[84,6562,6563],{},"data_dir = project \u002F \"data\"\n",[84,6565,6566],{"class":86,"line":112},[84,6567,6568],{},"file_path = data_dir \u002F \"records.json\"\n",[84,6570,6571],{"class":86,"line":118},[84,6572,109],{"emptyLinePlaceholder":108},[84,6574,6575],{"class":86,"line":124},[84,6576,6577],{},"print(project)\n",[84,6579,6580],{"class":86,"line":130},[84,6581,6582],{},"print(file_path.name)\n",[84,6584,6585],{"class":86,"line":3898},[84,6586,6587],{},"print(file_path.suffix)\n",[84,6589,6590],{"class":86,"line":4110},[84,6591,6592],{},"print(file_path.exists())\n",[10,6594,136],{},[75,6596,6599],{"className":6597,"code":6598,"language":142,"meta":80},[140],"显示当前项目路径、records.json、.json 和存在状态\n",[43,6600,6598],{"__ignoreMap":80},[10,6602,147],{},[14,6604,150],{"id":150},[152,6606,6607,6613],{},[40,6608,6609,6612],{},[43,6610,6611],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6614,2328,6615,6617,6618,6620],{},[43,6616,55],{}," 组合路径片段只创建新的 ",[43,6619,6505],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6622,168],{"id":168},[37,6624,6625,6633],{},[40,6626,3412,6627,6629,6630,6632],{},[43,6628,6505],{}," 对象存在当成真实文件存在，仍需调用 ",[43,6631,6521],{}," 等方法确认。",[40,6634,6635,6636,998,6638,6641],{},"手工拼接 ",[43,6637,55],{},[43,6639,6640],{},"\\"," 分隔符，降低跨平台可读性。",[14,6643,183],{"id":183},[152,6645,6646,6653],{},[40,6647,6648,6649,6652],{},"组合 ",[43,6650,6651],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6654,6655],{},"输出路径的父目录、文件名和扩展名。",[10,6657,194],{},[14,6659,197],{"id":197},[10,6661,6662],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,6664,204],{},{"title":80,"searchDepth":93,"depth":93,"links":6666},[6667,6668,6669,6670,6671,6672,6673,6674],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6482,"description":6487},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[215,6682,6683],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6686,"title":6687,"body":6688,"category":215,"cover":216,"description":6692,"extension":217,"meta":6870,"navigation":108,"path":6871,"pinned":220,"publishedAt":221,"seo":6872,"slug":6873,"stem":6874,"summary":6875,"tags":6876,"updatedAt":221,"visible":108,"__hash__":6879},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6689,"toc":6860},[6690,6693,6695,6698,6700,6706,6709,6711,6739,6741,6743,6800,6802,6808,6810,6812,6823,6825,6838,6840,6851,6853,6855,6858],[10,6691,6692],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6694,16],{"id":16},[10,6696,6697],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6699,22],{"id":22},[10,6701,6702],{},[26,6703],{"alt":6704,"src":6705},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6707,6708],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6710,35],{"id":35},[37,6712,6713,6719,6728],{},[40,6714,6715,6718],{},[43,6716,6717],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6720,6721,6724,6725,177],{},[43,6722,6723],{},"r"," 模式读取不存在文件会产生 ",[43,6726,6727],{},"FileNotFoundError",[40,6729,6730,6731,6734,6735,6738],{},"本篇显式调用 ",[43,6732,6733],{},"close()","；第 34 篇会用 ",[43,6736,6737],{},"with"," 更可靠地管理关闭动作。",[14,6740,70],{"id":70},[10,6742,73],{},[75,6744,6746],{"className":77,"code":6745,"language":79,"meta":80,"style":80},"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",[43,6747,6748,6752,6756,6761,6766,6771,6776,6780,6785,6790,6795],{"__ignoreMap":80},[84,6749,6750],{"class":86,"line":87},[84,6751,6549],{},[84,6753,6754],{"class":86,"line":93},[84,6755,109],{"emptyLinePlaceholder":108},[84,6757,6758],{"class":86,"line":99},[84,6759,6760],{},"file_path = Path(\"notes.txt\")\n",[84,6762,6763],{"class":86,"line":105},[84,6764,6765],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[84,6767,6768],{"class":86,"line":112},[84,6769,6770],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[84,6772,6773],{"class":86,"line":118},[84,6774,6775],{},"writer.close()\n",[84,6777,6778],{"class":86,"line":124},[84,6779,109],{"emptyLinePlaceholder":108},[84,6781,6782],{"class":86,"line":130},[84,6783,6784],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[84,6786,6787],{"class":86,"line":3898},[84,6788,6789],{},"content = reader.read()\n",[84,6791,6792],{"class":86,"line":4110},[84,6793,6794],{},"reader.close()\n",[84,6796,6797],{"class":86,"line":5775},[84,6798,6799],{},"print(content)\n",[10,6801,136],{},[75,6803,6806],{"className":6804,"code":6805,"language":142,"meta":80},[140],"变量\n循环\n函数\n",[43,6807,6805],{"__ignoreMap":80},[10,6809,147],{},[14,6811,150],{"id":150},[152,6813,6814,6820],{},[40,6815,6816,6817,6819],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[43,6818,6733],{}," 确保缓冲内容交给文件系统。",[40,6821,6822],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6824,168],{"id":168},[37,6826,6827,6832],{},[40,6828,2328,6829,6831],{},[43,6830,6717],{}," 模式打开重要文件却未确认覆盖风险。",[40,6833,6834,6835,177],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[43,6836,6837],{},"encoding=\"utf-8\"",[14,6839,183],{"id":183},[152,6841,6842,6845],{},[40,6843,6844],{},"写入三行学习记录并读取。",[40,6846,6847,6848,6850],{},"改用 ",[43,6849,326],{}," 模式追加一行，确认原内容仍保留。",[10,6852,194],{},[14,6854,197],{"id":197},[10,6856,6857],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,6859,204],{},{"title":80,"searchDepth":93,"depth":93,"links":6861},[6862,6863,6864,6865,6866,6867,6868,6869],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6687,"description":6692},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[215,6877,6878],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6881,"title":6882,"body":6883,"category":215,"cover":216,"description":6887,"extension":217,"meta":7054,"navigation":108,"path":7055,"pinned":220,"publishedAt":221,"seo":7056,"slug":7057,"stem":7058,"summary":7059,"tags":7060,"updatedAt":221,"visible":108,"__hash__":7063},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6884,"toc":7044},[6885,6888,6890,6893,6895,6901,6911,6913,6927,6929,6931,6991,6993,6999,7001,7003,7015,7017,7025,7027,7035,7037,7039,7042],[10,6886,6887],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6889,16],{"id":16},[10,6891,6892],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6894,22],{"id":22},[10,6896,6897],{},[26,6898],{"alt":6899,"src":6900},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6902,6903,6906,6907,6910],{},[43,6904,6905],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[43,6908,6909],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6912,35],{"id":35},[37,6914,6915,6918,6924],{},[40,6916,6917],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6919,6920,6923],{},[43,6921,6922],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6925,6926],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6928,70],{"id":70},[10,6930,73],{},[75,6932,6934],{"className":77,"code":6933,"language":79,"meta":80,"style":80},"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",[43,6935,6936,6941,6945,6950,6954,6959,6964,6968,6972,6977,6982,6986],{"__ignoreMap":80},[84,6937,6938],{"class":86,"line":87},[84,6939,6940],{},"import json\n",[84,6942,6943],{"class":86,"line":93},[84,6944,109],{"emptyLinePlaceholder":108},[84,6946,6947],{"class":86,"line":99},[84,6948,6949],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[84,6951,6952],{"class":86,"line":105},[84,6953,109],{"emptyLinePlaceholder":108},[84,6955,6956],{"class":86,"line":112},[84,6957,6958],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[84,6960,6961],{"class":86,"line":118},[84,6962,6963],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[84,6965,6966],{"class":86,"line":124},[84,6967,6775],{},[84,6969,6970],{"class":86,"line":130},[84,6971,109],{"emptyLinePlaceholder":108},[84,6973,6974],{"class":86,"line":3898},[84,6975,6976],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[84,6978,6979],{"class":86,"line":4110},[84,6980,6981],{},"loaded = json.load(reader)\n",[84,6983,6984],{"class":86,"line":5775},[84,6985,6794],{},[84,6987,6988],{"class":86,"line":5780},[84,6989,6990],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6992,136],{},[75,6994,6997],{"className":6995,"code":6996,"language":142,"meta":80},[140],"Python 60\n",[43,6998,6996],{"__ignoreMap":80},[10,7000,147],{},[14,7002,150],{"id":150},[152,7004,7005,7010],{},[40,7006,7007,7009],{},[43,7008,6905],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7011,7012,7014],{},[43,7013,6909],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7016,168],{"id":168},[37,7018,7019,7022],{},[40,7020,7021],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7023,7024],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7026,183],{"id":183},[152,7028,7029,7032],{},[40,7030,7031],{},"保存包含两条学习记录的列表。",[40,7033,7034],{},"读取后修改进度，再重新写回文件。",[10,7036,194],{},[14,7038,197],{"id":197},[10,7040,7041],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,7043,204],{},{"title":80,"searchDepth":93,"depth":93,"links":7045},[7046,7047,7048,7049,7050,7051,7052,7053],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6882,"description":6887},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[215,7061,7062],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7065,"title":7066,"body":7067,"category":215,"cover":216,"description":7071,"extension":217,"meta":7255,"navigation":108,"path":7256,"pinned":220,"publishedAt":221,"seo":7257,"slug":7258,"stem":7259,"summary":7260,"tags":7261,"updatedAt":221,"visible":108,"__hash__":7264},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7068,"toc":7245},[7069,7072,7074,7077,7079,7085,7091,7093,7115,7117,7119,7182,7184,7190,7192,7194,7210,7212,7226,7228,7236,7238,7240,7243],[10,7070,7071],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7073,16],{"id":16},[10,7075,7076],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7078,22],{"id":22},[10,7080,7081],{},[26,7082],{"alt":7083,"src":7084},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7086,7087,7090],{},[43,7088,7089],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7092,35],{"id":35},[37,7094,7095,7105,7112],{},[40,7096,2328,7097,7100,7101,7104],{},[43,7098,7099],{},"newline=\"\""," 让 ",[43,7102,7103],{},"csv"," 模块正确处理换行。",[40,7106,7107,7108,7111],{},"字段顺序由 ",[43,7109,7110],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7113,7114],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7116,70],{"id":70},[10,7118,73],{},[75,7120,7122],{"className":77,"code":7121,"language":79,"meta":80,"style":80},"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",[43,7123,7124,7129,7133,7138,7143,7148,7153,7158,7162,7167,7172,7177],{"__ignoreMap":80},[84,7125,7126],{"class":86,"line":87},[84,7127,7128],{},"import csv\n",[84,7130,7131],{"class":86,"line":93},[84,7132,109],{"emptyLinePlaceholder":108},[84,7134,7135],{"class":86,"line":99},[84,7136,7137],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[84,7139,7140],{"class":86,"line":105},[84,7141,7142],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[84,7144,7145],{"class":86,"line":112},[84,7146,7147],{},"writer.writeheader()\n",[84,7149,7150],{"class":86,"line":118},[84,7151,7152],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[84,7154,7155],{"class":86,"line":124},[84,7156,7157],{},"writer_file.close()\n",[84,7159,7160],{"class":86,"line":130},[84,7161,109],{"emptyLinePlaceholder":108},[84,7163,7164],{"class":86,"line":3898},[84,7165,7166],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[84,7168,7169],{"class":86,"line":4110},[84,7170,7171],{},"for row in csv.DictReader(reader_file):\n",[84,7173,7174],{"class":86,"line":5775},[84,7175,7176],{},"    print(row[\"name\"], row[\"score\"])\n",[84,7178,7179],{"class":86,"line":5780},[84,7180,7181],{},"reader_file.close()\n",[10,7183,136],{},[75,7185,7188],{"className":7186,"code":7187,"language":142,"meta":80},[140],"小郑 95\n",[43,7189,7187],{"__ignoreMap":80},[10,7191,147],{},[14,7193,150],{"id":150},[152,7195,7196,7205],{},[40,7197,7198,7201,7202,7204],{},[43,7199,7200],{},"DictWriter"," 按 ",[43,7203,7110],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7206,7207,7209],{},[43,7208,7089],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7211,168],{"id":168},[37,7213,7214,7217],{},[40,7215,7216],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7218,7219,7220,7222,7223,7225],{},"在 macOS 以外环境忽略 ",[43,7221,7099],{}," 可能出现额外空行；统一交给 ",[43,7224,7103],{}," 模块管理换行。",[14,7227,183],{"id":183},[152,7229,7230,7233],{},[40,7231,7232],{},"写入三名学习者的课程和分数。",[40,7234,7235],{},"读取 CSV 后把分数字符串转换为整数。",[10,7237,194],{},[14,7239,197],{"id":197},[10,7241,7242],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,7244,204],{},{"title":80,"searchDepth":93,"depth":93,"links":7246},[7247,7248,7249,7250,7251,7252,7253,7254],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7066,"description":7071},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[215,7262,7263],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7266,"title":7267,"body":7268,"category":215,"cover":216,"description":7272,"extension":217,"meta":7545,"navigation":108,"path":7546,"pinned":220,"publishedAt":221,"seo":7547,"slug":7548,"stem":7549,"summary":7550,"tags":7551,"updatedAt":221,"visible":108,"__hash__":7554},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7269,"toc":7532},[7270,7273,7275,7278,7280,7286,7297,7299,7316,7318,7320,7395,7397,7403,7405,7407,7432,7434,7443,7449,7460,7462,7468,7474,7483,7485,7500,7502,7523,7525,7527,7530],[10,7271,7272],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7274,16],{"id":16},[10,7276,7277],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7279,22],{"id":22},[10,7281,7282],{},[26,7283],{"alt":7284,"src":7285},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7287,7288,7289,7292,7293,7296],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[43,7290,7291],{},"except","；无论是否异常，",[43,7294,7295],{},"finally"," 都会在离开结构前执行。",[14,7298,35],{"id":35},[37,7300,7301,7307,7313],{},[40,7302,7303,7304,7306],{},"只捕获能够处理的具体异常，不使用空的 ",[43,7305,7291],{}," 吞掉全部错误。",[40,7308,7309,7312],{},[43,7310,7311],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7314,7315],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7317,70],{"id":70},[10,7319,73],{},[75,7321,7323],{"className":77,"code":7322,"language":79,"meta":80,"style":80},"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",[43,7324,7325,7330,7335,7340,7345,7350,7354,7359,7364,7369,7374,7378,7383,7389],{"__ignoreMap":80},[84,7326,7327],{"class":86,"line":87},[84,7328,7329],{},"def parse_age(text):\n",[84,7331,7332],{"class":86,"line":93},[84,7333,7334],{},"    age = int(text)\n",[84,7336,7337],{"class":86,"line":99},[84,7338,7339],{},"    if age \u003C 0:\n",[84,7341,7342],{"class":86,"line":105},[84,7343,7344],{},"        raise ValueError(\"年龄不能为负数\")\n",[84,7346,7347],{"class":86,"line":112},[84,7348,7349],{},"    return age\n",[84,7351,7352],{"class":86,"line":118},[84,7353,109],{"emptyLinePlaceholder":108},[84,7355,7356],{"class":86,"line":124},[84,7357,7358],{},"try:\n",[84,7360,7361],{"class":86,"line":130},[84,7362,7363],{},"    age = parse_age(\"18\")\n",[84,7365,7366],{"class":86,"line":3898},[84,7367,7368],{},"except ValueError as error:\n",[84,7370,7371],{"class":86,"line":4110},[84,7372,7373],{},"    print(\"输入错误：\", error)\n",[84,7375,7376],{"class":86,"line":5775},[84,7377,1135],{},[84,7379,7380],{"class":86,"line":5780},[84,7381,7382],{},"    print(\"年龄：\", age)\n",[84,7384,7386],{"class":86,"line":7385},13,[84,7387,7388],{},"finally:\n",[84,7390,7392],{"class":86,"line":7391},14,[84,7393,7394],{},"    print(\"处理结束\")\n",[10,7396,136],{},[75,7398,7401],{"className":7399,"code":7400,"language":142,"meta":80},[140],"年龄： 18\n处理结束\n",[43,7402,7400],{"__ignoreMap":80},[10,7404,147],{},[14,7406,150],{"id":150},[152,7408,7409,7421],{},[40,7410,7411,7413,7414,7416,7417,7420],{},[43,7412,2981],{}," 或主动 ",[43,7415,7311],{}," 都可能产生 ",[43,7418,7419],{},"ValueError","，控制流立即离开当前正常路径。",[40,7422,7423,7424,7426,7427,7429,7430,177],{},"有异常时进入匹配的 ",[43,7425,7291],{},"；没有异常时执行 ",[43,7428,1149],{},"；两种情况最后都会执行 ",[43,7431,7295],{},[318,7433,2642],{"id":2642},[10,7435,7436,2246,7438,1146,7440,7442],{},[43,7437,7291],{},[43,7439,1149],{},[43,7441,7295],{}," 的职责不同，不能只看它们出现的顺序。",[10,7444,7445],{},[26,7446],{"alt":7447,"src":7448},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7450,7451,7453,7454,7456,7457,7459],{},[43,7452,7291],{}," 处理匹配异常，",[43,7455,1149],{}," 只在无异常时运行，",[43,7458,7295],{}," 负责两条路径都需要的清理动作。",[318,7461,2642],{"id":4165},[10,7463,7464,7467],{},[43,7465,7466],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7469,7470],{},[26,7471],{"alt":7472,"src":7473},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7475,7476,7477,7479,7480,7482],{},"只把可能产生预期异常的操作放进 ",[43,7478,7466],{},"，后续正常业务放进 ",[43,7481,1149],{},"，错误边界会更清楚。",[14,7484,168],{"id":168},[37,7486,7487,7494],{},[40,7488,7489,7490,7493],{},"使用裸 ",[43,7491,7492],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7495,7496,7497,7499],{},"把整个程序包在一个巨大 ",[43,7498,7466],{}," 中，无法判断究竟哪一步允许失败。",[14,7501,183],{"id":183},[152,7503,7504,7517],{},[40,7505,7506,7507,7510,7511,1146,7514,177],{},"让 ",[43,7508,7509],{},"parse_age"," 分别处理 ",[43,7512,7513],{},"\"abc\"",[43,7515,7516],{},"\"-1\"",[40,7518,7519,7520,7522],{},"为文件读取捕获 ",[43,7521,6727],{}," 并给出清晰提示。",[10,7524,194],{},[14,7526,197],{"id":197},[10,7528,7529],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,7531,204],{},{"title":80,"searchDepth":93,"depth":93,"links":7533},[7534,7535,7536,7537,7538,7542,7543,7544],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":7539},[7540,7541],{"id":2642,"depth":99,"text":2642},{"id":4165,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7267,"description":7272},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[215,7552,7553],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7556,"title":7557,"body":7558,"category":215,"cover":216,"description":7562,"extension":217,"meta":7738,"navigation":108,"path":7739,"pinned":220,"publishedAt":221,"seo":7740,"slug":7741,"stem":7742,"summary":7743,"tags":7744,"updatedAt":221,"visible":108,"__hash__":7746},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7559,"toc":7728},[7560,7563,7565,7568,7570,7576,7582,7584,7600,7602,7604,7658,7660,7666,7668,7670,7683,7685,7698,7700,7719,7721,7723,7726],[10,7561,7562],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7564,16],{"id":16},[10,7566,7567],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7569,22],{"id":22},[10,7571,7572],{},[26,7573],{"alt":7574,"src":7575},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7577,7578,7579,7581],{},"进入 ",[43,7580,6737],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7583,35],{"id":35},[37,7585,7586,7591,7597],{},[40,7587,7588,7590],{},[43,7589,6737],{}," 把资源获取和释放配成一个清晰边界。",[40,7592,7593,7596],{},[43,7594,7595],{},"as file"," 得到的是上下文返回的资源对象。",[40,7598,7599],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7601,70],{"id":70},[10,7603,73],{},[75,7605,7607],{"className":77,"code":7606,"language":79,"meta":80,"style":80},"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",[43,7608,7609,7613,7617,7621,7625,7630,7635,7639,7644,7649,7653],{"__ignoreMap":80},[84,7610,7611],{"class":86,"line":87},[84,7612,6549],{},[84,7614,7615],{"class":86,"line":93},[84,7616,109],{"emptyLinePlaceholder":108},[84,7618,7619],{"class":86,"line":99},[84,7620,6760],{},[84,7622,7623],{"class":86,"line":105},[84,7624,109],{"emptyLinePlaceholder":108},[84,7626,7627],{"class":86,"line":112},[84,7628,7629],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[84,7631,7632],{"class":86,"line":118},[84,7633,7634],{},"    file.write(\"上下文管理器\\n\")\n",[84,7636,7637],{"class":86,"line":124},[84,7638,109],{"emptyLinePlaceholder":108},[84,7640,7641],{"class":86,"line":130},[84,7642,7643],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[84,7645,7646],{"class":86,"line":3898},[84,7647,7648],{},"    print(file.read())\n",[84,7650,7651],{"class":86,"line":4110},[84,7652,109],{"emptyLinePlaceholder":108},[84,7654,7655],{"class":86,"line":5775},[84,7656,7657],{},"print(file.closed)\n",[10,7659,136],{},[75,7661,7664],{"className":7662,"code":7663,"language":142,"meta":80},[140],"上下文管理器\n\nTrue\n",[43,7665,7663],{"__ignoreMap":80},[10,7667,147],{},[14,7669,150],{"id":150},[152,7671,7672,7680],{},[40,7673,7578,7674,7676,7677,177],{},[43,7675,6737],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[43,7678,7679],{},"file",[40,7681,7682],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7684,168],{"id":168},[37,7686,7687,7692],{},[40,7688,4733,7689,7691],{},[43,7690,6737],{}," 代码块外继续读写已经关闭的文件对象。",[40,7693,7694,7695,7697],{},"误以为 ",[43,7696,6737],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7699,183],{"id":183},[152,7701,7702,7711],{},[40,7703,7704,7705,7708,7709,177],{},"把第 30 篇的手动 ",[43,7706,7707],{},"open\u002Fclose"," 改写为 ",[43,7710,6737],{},[40,7712,4733,7713,7715,7716,177],{},[43,7714,6737],{}," 块后检查 ",[43,7717,7718],{},"file.closed",[10,7720,194],{},[14,7722,197],{"id":197},[10,7724,7725],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,7727,204],{},{"title":80,"searchDepth":93,"depth":93,"links":7729},[7730,7731,7732,7733,7734,7735,7736,7737],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7557,"description":7562},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[215,6737,7745],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7748,"title":7749,"body":7750,"category":215,"cover":216,"description":7754,"extension":217,"meta":7966,"navigation":108,"path":7967,"pinned":220,"publishedAt":221,"seo":7968,"slug":7969,"stem":7970,"summary":7971,"tags":7972,"updatedAt":221,"visible":108,"__hash__":7975},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7751,"toc":7954},[7752,7755,7757,7760,7762,7768,7771,7773,7790,7792,7794,7862,7864,7870,7872,7874,7899,7901,7904,7910,7919,7921,7932,7934,7945,7947,7949,7952],[10,7753,7754],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7756,16],{"id":16},[10,7758,7759],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7761,22],{"id":22},[10,7763,7764],{},[26,7765],{"alt":7766,"src":7767},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7769,7770],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7772,35],{"id":35},[37,7774,7775,7781,7787],{},[40,7776,7777,7780],{},[43,7778,7779],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7782,7783,7786],{},[43,7784,7785],{},"__init__"," 在实例创建过程中初始化属性。",[40,7788,7789],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7791,70],{"id":70},[10,7793,73],{},[75,7795,7797],{"className":77,"code":7796,"language":79,"meta":80,"style":80},"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",[43,7798,7799,7804,7809,7814,7819,7823,7828,7833,7838,7843,7847,7852,7857],{"__ignoreMap":80},[84,7800,7801],{"class":86,"line":87},[84,7802,7803],{},"class LearningRecord:\n",[84,7805,7806],{"class":86,"line":93},[84,7807,7808],{},"    def __init__(self, course, progress=0):\n",[84,7810,7811],{"class":86,"line":99},[84,7812,7813],{},"        self.course = course\n",[84,7815,7816],{"class":86,"line":105},[84,7817,7818],{},"        self.progress = progress\n",[84,7820,7821],{"class":86,"line":112},[84,7822,109],{"emptyLinePlaceholder":108},[84,7824,7825],{"class":86,"line":118},[84,7826,7827],{},"    def advance(self, amount):\n",[84,7829,7830],{"class":86,"line":124},[84,7831,7832],{},"        self.progress = self.progress + amount\n",[84,7834,7835],{"class":86,"line":130},[84,7836,7837],{},"        if self.progress > 100:\n",[84,7839,7840],{"class":86,"line":3898},[84,7841,7842],{},"            self.progress = 100\n",[84,7844,7845],{"class":86,"line":4110},[84,7846,109],{"emptyLinePlaceholder":108},[84,7848,7849],{"class":86,"line":5775},[84,7850,7851],{},"record = LearningRecord(\"Python\", 40)\n",[84,7853,7854],{"class":86,"line":5780},[84,7855,7856],{},"record.advance(15)\n",[84,7858,7859],{"class":86,"line":7385},[84,7860,7861],{},"print(record.course, record.progress)\n",[10,7863,136],{},[75,7865,7868],{"className":7866,"code":7867,"language":142,"meta":80},[140],"Python 55\n",[43,7869,7867],{"__ignoreMap":80},[10,7871,147],{},[14,7873,150],{"id":150},[152,7875,7876,7886],{},[40,7877,7878,7879,7882,7883,7885],{},"调用 ",[43,7880,7881],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[43,7884,7785],{}," 把课程和进度保存在该实例属性中。",[40,7887,7888,7891,7892,7895,7896,7898],{},[43,7889,7890],{},"record.advance(15)"," 自动把 ",[43,7893,7894],{},"record"," 作为 ",[43,7897,7779],{},"，方法更新同一实例的进度并限制上限。",[318,7900,2642],{"id":2642},[10,7902,7903],{},"类是共同定义，实例则各自保存状态。",[10,7905,7906],{},[26,7907],{"alt":7908,"src":7909},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7911,7912,7913,1146,7915,7918],{},"两个实例共享同一套方法定义，但 ",[43,7914,4530],{},[43,7916,7917],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7920,168],{"id":168},[37,7922,7923,7929],{},[40,7924,7925,7926,7928],{},"调用实例方法时手工再传一次 ",[43,7927,7779],{},"。通过实例调用时 Python 会自动绑定。",[40,7930,7931],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7933,183],{"id":183},[152,7935,7936,7942],{},[40,7937,5243,7938,7941],{},[43,7939,7940],{},"Book"," 类，保存标题和阅读页数。",[40,7943,7944],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7946,194],{},[14,7948,197],{"id":197},[10,7950,7951],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,7953,204],{},{"title":80,"searchDepth":93,"depth":93,"links":7955},[7956,7957,7958,7959,7960,7963,7964,7965],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":7961},[7962],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7749,"description":7754},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[215,7973,7974],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7977,"title":7978,"body":7979,"category":215,"cover":216,"description":7983,"extension":217,"meta":8161,"navigation":108,"path":8162,"pinned":220,"publishedAt":221,"seo":8163,"slug":8164,"stem":8165,"summary":8166,"tags":8167,"updatedAt":221,"visible":108,"__hash__":8170},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7980,"toc":8151},[7981,7984,7986,7989,7991,7997,8000,8002,8013,8015,8017,8084,8086,8092,8094,8096,8115,8117,8125,8127,8142,8144,8146,8149],[10,7982,7983],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7985,16],{"id":16},[10,7987,7988],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7990,22],{"id":22},[10,7992,7993],{},[26,7994],{"alt":7995,"src":7996},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7998,7999],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8001,35],{"id":35},[37,8003,8004,8007,8010],{},[40,8005,8006],{},"封装让对象通过方法维护自己的有效状态。",[40,8008,8009],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8011,8012],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8014,70],{"id":70},[10,8016,73],{},[75,8018,8020],{"className":77,"code":8019,"language":79,"meta":80,"style":80},"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",[43,8021,8022,8027,8032,8037,8041,8046,8051,8056,8060,8065,8070,8074,8079],{"__ignoreMap":80},[84,8023,8024],{"class":86,"line":87},[84,8025,8026],{},"class Storage:\n",[84,8028,8029],{"class":86,"line":93},[84,8030,8031],{},"    def save(self, text):\n",[84,8033,8034],{"class":86,"line":99},[84,8035,8036],{},"        print(\"保存：\", text)\n",[84,8038,8039],{"class":86,"line":105},[84,8040,109],{"emptyLinePlaceholder":108},[84,8042,8043],{"class":86,"line":112},[84,8044,8045],{},"class LearningService:\n",[84,8047,8048],{"class":86,"line":118},[84,8049,8050],{},"    def __init__(self, storage):\n",[84,8052,8053],{"class":86,"line":124},[84,8054,8055],{},"        self.storage = storage\n",[84,8057,8058],{"class":86,"line":130},[84,8059,109],{"emptyLinePlaceholder":108},[84,8061,8062],{"class":86,"line":3898},[84,8063,8064],{},"    def finish_lesson(self, title):\n",[84,8066,8067],{"class":86,"line":4110},[84,8068,8069],{},"        self.storage.save(title)\n",[84,8071,8072],{"class":86,"line":5775},[84,8073,109],{"emptyLinePlaceholder":108},[84,8075,8076],{"class":86,"line":5780},[84,8077,8078],{},"service = LearningService(Storage())\n",[84,8080,8081],{"class":86,"line":7385},[84,8082,8083],{},"service.finish_lesson(\"异常处理\")\n",[10,8085,136],{},[75,8087,8090],{"className":8088,"code":8089,"language":142,"meta":80},[140],"保存： 异常处理\n",[43,8091,8089],{"__ignoreMap":80},[10,8093,147],{},[14,8095,150],{"id":150},[152,8097,8098,8108],{},[40,8099,8100,8103,8104,8107],{},[43,8101,8102],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[43,8105,8106],{},"save()"," 的协作对象。",[40,8109,8110,8111,8114],{},"调用业务方法时，服务把保存动作委托给 ",[43,8112,8113],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8116,168],{"id":168},[37,8118,8119,8122],{},[40,8120,8121],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8123,8124],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8126,183],{"id":183},[152,8128,8129,8139],{},[40,8130,8131,8132,8135,8136,177],{},"用组合让 ",[43,8133,8134],{},"OrderService"," 使用一个 ",[43,8137,8138],{},"Notifier",[40,8140,8141],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8143,194],{},[14,8145,197],{"id":197},[10,8147,8148],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,8150,204],{},{"title":80,"searchDepth":93,"depth":93,"links":8152},[8153,8154,8155,8156,8157,8158,8159,8160],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7978,"description":7983},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[215,8168,8169],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8172,"title":8173,"body":8174,"category":215,"cover":216,"description":8178,"extension":217,"meta":8381,"navigation":108,"path":8382,"pinned":220,"publishedAt":221,"seo":8383,"slug":8384,"stem":8385,"summary":8386,"tags":8387,"updatedAt":221,"visible":108,"__hash__":8390},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8175,"toc":8369},[8176,8179,8181,8184,8186,8192,8199,8201,8226,8228,8230,8282,8284,8290,8292,8294,8315,8317,8323,8329,8335,8337,8345,8347,8360,8362,8364,8367],[10,8177,8178],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8180,16],{"id":16},[10,8182,8183],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8185,22],{"id":22},[10,8187,8188],{},[26,8189],{"alt":8190,"src":8191},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8193,8194,8195,8198],{},"生成器运行到 ",[43,8196,8197],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8200,35],{"id":35},[37,8202,8203,8213,8223],{},[40,8204,8205,8208,8209,8212],{},[43,8206,8207],{},"iter()"," 从可迭代对象取得迭代器，",[43,8210,8211],{},"next()"," 请求下一个值。",[40,8214,8215,8216,8219,8220,8222],{},"没有更多值时迭代器抛出 ",[43,8217,8218],{},"StopIteration","，",[43,8221,4284],{}," 会自动处理。",[40,8224,8225],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8227,70],{"id":70},[10,8229,73],{},[75,8231,8233],{"className":77,"code":8232,"language":79,"meta":80,"style":80},"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",[43,8234,8235,8240,8245,8250,8255,8260,8264,8269,8274,8278],{"__ignoreMap":80},[84,8236,8237],{"class":86,"line":87},[84,8238,8239],{},"def countdown(start):\n",[84,8241,8242],{"class":86,"line":93},[84,8243,8244],{},"    current = start\n",[84,8246,8247],{"class":86,"line":99},[84,8248,8249],{},"    while current > 0:\n",[84,8251,8252],{"class":86,"line":105},[84,8253,8254],{},"        yield current\n",[84,8256,8257],{"class":86,"line":112},[84,8258,8259],{},"        current = current - 1\n",[84,8261,8262],{"class":86,"line":118},[84,8263,109],{"emptyLinePlaceholder":108},[84,8265,8266],{"class":86,"line":124},[84,8267,8268],{},"iterator = countdown(3)\n",[84,8270,8271],{"class":86,"line":130},[84,8272,8273],{},"print(next(iterator))\n",[84,8275,8276],{"class":86,"line":3898},[84,8277,8273],{},[84,8279,8280],{"class":86,"line":4110},[84,8281,8273],{},[10,8283,136],{},[75,8285,8288],{"className":8286,"code":8287,"language":142,"meta":80},[140],"3\n2\n1\n",[43,8289,8287],{"__ignoreMap":80},[10,8291,147],{},[14,8293,150],{"id":150},[152,8295,8296,8302],{},[40,8297,7878,8298,8301],{},[43,8299,8300],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8303,8304,8305,8307,8308,8310,8311,8314],{},"每次 ",[43,8306,8211],{}," 运行到下一个 ",[43,8309,8197],{}," 并暂停，局部变量 ",[43,8312,8313],{},"current"," 和执行位置被保留。",[318,8316,2642],{"id":2642},[10,8318,8319,8320,8322],{},"生成器的暂停位置可以展开成多次 ",[43,8321,8211],{}," 的时间线。",[10,8324,8325],{},[26,8326],{"alt":8327,"src":8328},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8330,8331,8332,8334],{},"每次请求只推进到下一个 ",[43,8333,8197],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8336,168],{"id":168},[37,8338,8339,8342],{},[40,8340,8341],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8343,8344],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8346,183],{"id":183},[152,8348,8349,8352],{},[40,8350,8351],{},"编写产生 1 到指定上限偶数的生成器。",[40,8353,3956,8354,8356,8357,8359],{},[43,8355,4284],{}," 遍历生成器，比较手动 ",[43,8358,8211],{}," 的差异。",[10,8361,194],{},[14,8363,197],{"id":197},[10,8365,8366],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,8368,204],{},{"title":80,"searchDepth":93,"depth":93,"links":8370},[8371,8372,8373,8374,8375,8378,8379,8380],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":8376},[8377],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8173,"description":8178},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[215,8388,8389],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8392,"title":8393,"body":8394,"category":215,"cover":216,"description":8398,"extension":217,"meta":8622,"navigation":108,"path":8623,"pinned":220,"publishedAt":221,"seo":8624,"slug":8625,"stem":8626,"summary":8627,"tags":8628,"updatedAt":221,"visible":108,"__hash__":8630},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8395,"toc":8610},[8396,8399,8401,8404,8406,8412,8415,8417,8437,8439,8441,8523,8525,8531,8533,8535,8557,8559,8562,8568,8575,8577,8587,8589,8601,8603,8605,8608],[10,8397,8398],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8400,16],{"id":16},[10,8402,8403],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8405,22],{"id":22},[10,8407,8408],{},[26,8409],{"alt":8410,"src":8411},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8413,8414],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8416,35],{"id":35},[37,8418,8419,8428,8431],{},[40,8420,8421,8424,8425,177],{},[43,8422,8423],{},"@trace"," 等价于 ",[43,8426,8427],{},"add = trace(add)",[40,8429,8430],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8432,8433,8436],{},[43,8434,8435],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8438,70],{"id":70},[10,8440,73],{},[75,8442,8444],{"className":77,"code":8443,"language":79,"meta":80,"style":80},"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",[43,8445,8446,8451,8455,8460,8465,8470,8475,8480,8485,8490,8495,8499,8504,8508,8512,8517],{"__ignoreMap":80},[84,8447,8448],{"class":86,"line":87},[84,8449,8450],{},"from functools import wraps\n",[84,8452,8453],{"class":86,"line":93},[84,8454,109],{"emptyLinePlaceholder":108},[84,8456,8457],{"class":86,"line":99},[84,8458,8459],{},"def trace(function):\n",[84,8461,8462],{"class":86,"line":105},[84,8463,8464],{},"    @wraps(function)\n",[84,8466,8467],{"class":86,"line":112},[84,8468,8469],{},"    def wrapper(*args, **kwargs):\n",[84,8471,8472],{"class":86,"line":118},[84,8473,8474],{},"        print(\"开始：\", function.__name__)\n",[84,8476,8477],{"class":86,"line":124},[84,8478,8479],{},"        result = function(*args, **kwargs)\n",[84,8481,8482],{"class":86,"line":130},[84,8483,8484],{},"        print(\"结束：\", function.__name__)\n",[84,8486,8487],{"class":86,"line":3898},[84,8488,8489],{},"        return result\n",[84,8491,8492],{"class":86,"line":4110},[84,8493,8494],{},"    return wrapper\n",[84,8496,8497],{"class":86,"line":5775},[84,8498,109],{"emptyLinePlaceholder":108},[84,8500,8501],{"class":86,"line":5780},[84,8502,8503],{},"@trace\n",[84,8505,8506],{"class":86,"line":7385},[84,8507,6128],{},[84,8509,8510],{"class":86,"line":7391},[84,8511,6133],{},[84,8513,8515],{"class":86,"line":8514},15,[84,8516,109],{"emptyLinePlaceholder":108},[84,8518,8520],{"class":86,"line":8519},16,[84,8521,8522],{},"print(add(2, 3))\n",[10,8524,136],{},[75,8526,8529],{"className":8527,"code":8528,"language":142,"meta":80},[140],"开始： add\n结束： add\n5\n",[43,8530,8528],{"__ignoreMap":80},[10,8532,147],{},[14,8534,150],{"id":150},[152,8536,8537,8554],{},[40,8538,8539,8540,8543,8544,8547,8548,8551,8552,177],{},"解释器执行定义时，把原 ",[43,8541,8542],{},"add"," 函数交给 ",[43,8545,8546],{},"trace","，返回的 ",[43,8549,8550],{},"wrapper"," 重新绑定到名字 ",[43,8553,8542],{},[40,8555,8556],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[318,8558,2642],{"id":2642},[10,8560,8561],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8563,8564],{},[26,8565],{"alt":8566,"src":8567},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8569,8570,8572,8573,177],{},[43,8571,8423],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[43,8574,8427],{},[14,8576,168],{"id":168},[37,8578,8579,8584],{},[40,8580,8581,8582,177],{},"包装函数忘记返回原函数结果，调用方得到 ",[43,8583,5326],{},[40,8585,8586],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8588,183],{"id":183},[152,8590,8591,8594],{},[40,8592,8593],{},"编写只记录调用次数的简单装饰器。",[40,8595,8596,8597,8600],{},"删除包装函数的 ",[43,8598,8599],{},"return result","，观察调用方得到什么。",[10,8602,194],{},[14,8604,197],{"id":197},[10,8606,8607],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,8609,204],{},{"title":80,"searchDepth":93,"depth":93,"links":8611},[8612,8613,8614,8615,8616,8619,8620,8621],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":8617},[8618],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8393,"description":8398},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[215,8629,5277],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8632,"title":8633,"body":8634,"category":215,"cover":216,"description":8638,"extension":217,"meta":8825,"navigation":108,"path":8826,"pinned":220,"publishedAt":221,"seo":8827,"slug":8828,"stem":8829,"summary":8830,"tags":8831,"updatedAt":221,"visible":108,"__hash__":8834},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8635,"toc":8813},[8636,8639,8641,8644,8646,8652,8655,8657,8668,8670,8672,8747,8749,8755,8757,8759,8770,8772,8775,8781,8784,8786,8794,8796,8804,8806,8808,8811],[10,8637,8638],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8640,16],{"id":16},[10,8642,8643],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8645,22],{"id":22},[10,8647,8648],{},[26,8649],{"alt":8650,"src":8651},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8653,8654],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8656,35],{"id":35},[37,8658,8659,8662,8665],{},[40,8660,8661],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8663,8664],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8666,8667],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8669,70],{"id":70},[10,8671,73],{},[75,8673,8675],{"className":77,"code":8674,"language":79,"meta":80,"style":80},"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",[43,8676,8677,8682,8687,8691,8696,8700,8705,8710,8715,8719,8724,8729,8734,8738,8742],{"__ignoreMap":80},[84,8678,8679],{"class":86,"line":87},[84,8680,8681],{},"import logging\n",[84,8683,8684],{"class":86,"line":93},[84,8685,8686],{},"import unittest\n",[84,8688,8689],{"class":86,"line":99},[84,8690,109],{"emptyLinePlaceholder":108},[84,8692,8693],{"class":86,"line":105},[84,8694,8695],{},"logging.basicConfig(level=logging.INFO)\n",[84,8697,8698],{"class":86,"line":112},[84,8699,109],{"emptyLinePlaceholder":108},[84,8701,8702],{"class":86,"line":118},[84,8703,8704],{},"def clamp_progress(value):\n",[84,8706,8707],{"class":86,"line":124},[84,8708,8709],{},"    logging.info(\"检查进度：%s\", value)\n",[84,8711,8712],{"class":86,"line":130},[84,8713,8714],{},"    return max(0, min(100, value))\n",[84,8716,8717],{"class":86,"line":3898},[84,8718,109],{"emptyLinePlaceholder":108},[84,8720,8721],{"class":86,"line":4110},[84,8722,8723],{},"class ProgressTest(unittest.TestCase):\n",[84,8725,8726],{"class":86,"line":5775},[84,8727,8728],{},"    def test_upper_limit(self):\n",[84,8730,8731],{"class":86,"line":5780},[84,8732,8733],{},"        self.assertEqual(clamp_progress(120), 100)\n",[84,8735,8736],{"class":86,"line":7385},[84,8737,109],{"emptyLinePlaceholder":108},[84,8739,8740],{"class":86,"line":7391},[84,8741,6142],{},[84,8743,8744],{"class":86,"line":8514},[84,8745,8746],{},"    unittest.main()\n",[10,8748,136],{},[75,8750,8753],{"className":8751,"code":8752,"language":142,"meta":80},[140],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[43,8754,8752],{"__ignoreMap":80},[10,8756,147],{},[14,8758,150],{"id":150},[152,8760,8761,8767],{},[40,8762,8763,8766],{},[43,8764,8765],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8768,8769],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[318,8771,2642],{"id":2642},[10,8773,8774],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8776,8777],{},[26,8778],{"alt":8779,"src":8780},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8782,8783],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8785,168],{"id":168},[37,8787,8788,8791],{},[40,8789,8790],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8792,8793],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8795,183],{"id":183},[152,8797,8798,8801],{},[40,8799,8800],{},"为负数进度增加测试。",[40,8802,8803],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8805,194],{},[14,8807,197],{"id":197},[10,8809,8810],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,8812,204],{},{"title":80,"searchDepth":93,"depth":93,"links":8814},[8815,8816,8817,8818,8819,8822,8823,8824],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":8820},[8821],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8633,"description":8638},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[215,8832,8833],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8836,"title":8837,"body":8838,"category":215,"cover":216,"description":8842,"extension":217,"meta":9142,"navigation":108,"path":9143,"pinned":220,"publishedAt":221,"seo":9144,"slug":9145,"stem":9146,"summary":9147,"tags":9148,"updatedAt":221,"visible":108,"__hash__":9151},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8839,"toc":9129},[8840,8843,8845,8848,8850,8856,8859,8861,8876,8878,8880,9027,9029,9035,9037,9039,9052,9054,9057,9063,9066,9068,9071,9077,9084,9086,9097,9099,9120,9122,9124,9127],[10,8841,8842],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8844,16],{"id":16},[10,8846,8847],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8849,22],{"id":22},[10,8851,8852],{},[26,8853],{"alt":8854,"src":8855},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8857,8858],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8860,35],{"id":35},[37,8862,8863,8866,8869],{},[40,8864,8865],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8867,8868],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8870,8871,8872,8875],{},"实际扩展前先为 ",[43,8873,8874],{},"add()"," 和存储边界补充测试。",[14,8877,70],{"id":70},[10,8879,73],{},[75,8881,8883],{"className":77,"code":8882,"language":79,"meta":80,"style":80},"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",[43,8884,8885,8889,8893,8897,8902,8907,8912,8917,8921,8926,8931,8936,8941,8946,8950,8955,8960,8966,8971,8977,8982,8987,8993,8999,9005,9010,9016,9021],{"__ignoreMap":80},[84,8886,8887],{"class":86,"line":87},[84,8888,6940],{},[84,8890,8891],{"class":86,"line":93},[84,8892,6549],{},[84,8894,8895],{"class":86,"line":99},[84,8896,109],{"emptyLinePlaceholder":108},[84,8898,8899],{"class":86,"line":105},[84,8900,8901],{},"class LearningRecords:\n",[84,8903,8904],{"class":86,"line":112},[84,8905,8906],{},"    def __init__(self, file_path):\n",[84,8908,8909],{"class":86,"line":118},[84,8910,8911],{},"        self.file_path = Path(file_path)\n",[84,8913,8914],{"class":86,"line":124},[84,8915,8916],{},"        self.items = []\n",[84,8918,8919],{"class":86,"line":130},[84,8920,109],{"emptyLinePlaceholder":108},[84,8922,8923],{"class":86,"line":3898},[84,8924,8925],{},"    def add(self, title):\n",[84,8927,8928],{"class":86,"line":4110},[84,8929,8930],{},"        title = title.strip()\n",[84,8932,8933],{"class":86,"line":5775},[84,8934,8935],{},"        if not title:\n",[84,8937,8938],{"class":86,"line":5780},[84,8939,8940],{},"            raise ValueError(\"课程名称不能为空\")\n",[84,8942,8943],{"class":86,"line":7385},[84,8944,8945],{},"        self.items.append({\"title\": title, \"done\": False})\n",[84,8947,8948],{"class":86,"line":7391},[84,8949,109],{"emptyLinePlaceholder":108},[84,8951,8952],{"class":86,"line":8514},[84,8953,8954],{},"    def save(self):\n",[84,8956,8957],{"class":86,"line":8519},[84,8958,8959],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[84,8961,8963],{"class":86,"line":8962},17,[84,8964,8965],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[84,8967,8969],{"class":86,"line":8968},18,[84,8970,109],{"emptyLinePlaceholder":108},[84,8972,8974],{"class":86,"line":8973},19,[84,8975,8976],{},"records = LearningRecords(\"learning-records.json\")\n",[84,8978,8980],{"class":86,"line":8979},20,[84,8981,109],{"emptyLinePlaceholder":108},[84,8983,8985],{"class":86,"line":8984},21,[84,8986,7358],{},[84,8988,8990],{"class":86,"line":8989},22,[84,8991,8992],{},"    title = input(\"输入已学习课程：\")\n",[84,8994,8996],{"class":86,"line":8995},23,[84,8997,8998],{},"    records.add(title)\n",[84,9000,9002],{"class":86,"line":9001},24,[84,9003,9004],{},"    records.save()\n",[84,9006,9008],{"class":86,"line":9007},25,[84,9009,7368],{},[84,9011,9013],{"class":86,"line":9012},26,[84,9014,9015],{},"    print(\"无法保存：\", error)\n",[84,9017,9019],{"class":86,"line":9018},27,[84,9020,1135],{},[84,9022,9024],{"class":86,"line":9023},28,[84,9025,9026],{},"    print(\"已保存 1 条学习记录\")\n",[10,9028,136],{},[75,9030,9033],{"className":9031,"code":9032,"language":142,"meta":80},[140],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[43,9034,9032],{"__ignoreMap":80},[10,9036,147],{},[14,9038,150],{"id":150},[152,9040,9041,9047],{},[40,9042,9043,9044,9046],{},"输入层取得课程名后，",[43,9045,8874],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9048,9049,9051],{},[43,9050,8106],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[318,9053,2642],{"id":2642},[10,9055,9056],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9058,9059],{},[26,9060],{"alt":9061,"src":9062},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9064,9065],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[318,9067,2642],{"id":4165},[10,9069,9070],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9072,9073],{},[26,9074],{"alt":9075,"src":9076},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9078,9079,9080,9083],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[43,9081,9082],{},"load()"," 把文件状态恢复到内存。",[14,9085,168],{"id":168},[37,9087,9088,9091],{},[40,9089,9090],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9092,9093,9094,9096],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[43,9095,9082],{}," 是下一项必要扩展。",[14,9098,183],{"id":183},[152,9100,9101,9107,9110],{},[40,9102,9103,9104,9106],{},"增加 ",[43,9105,9082],{},"，文件不存在时从空列表开始。",[40,9108,9109],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9111,9112,9113,9116,9117,9119],{},"把输入循环放进 ",[43,9114,9115],{},"main()","，通过 ",[43,9118,6084],{}," 控制程序入口。",[10,9121,194],{},[14,9123,197],{"id":197},[10,9125,9126],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[202,9128,204],{},{"title":80,"searchDepth":93,"depth":93,"links":9130},[9131,9132,9133,9134,9135,9139,9140,9141],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":9136},[9137,9138],{"id":2642,"depth":99,"text":2642},{"id":4165,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8837,"description":8842},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[215,9149,9150],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9153,9256,9375,9506,9649,9774,9911,10048,10189,10358,10495,10628,10751,10880,11007,11170,11346,11487,11616,11765,11908,12029,12152,12301,12454,12619,12746,12927,13070,13227,13378,13525,13680,13898,14053,14228,14379,14546,14733,14896,15138,15378],{"id":1382,"title":1383,"body":9154,"category":215,"cover":216,"description":1388,"extension":217,"meta":9253,"navigation":108,"path":1507,"pinned":220,"publishedAt":221,"seo":9254,"slug":1509,"stem":1510,"summary":1511,"tags":9255,"updatedAt":221,"visible":108,"__hash__":1514},{"type":7,"value":9155,"toc":9243},[9156,9158,9160,9162,9164,9168,9172,9174,9184,9186,9188,9196,9198,9203,9205,9207,9217,9219,9227,9229,9235,9237,9239,9241],[10,9157,1388],{},[14,9159,16],{"id":16},[10,9161,1393],{},[14,9163,22],{"id":22},[10,9165,9166],{},[26,9167],{"alt":1400,"src":1401},[10,9169,9170,1406],{},[43,9171,1160],{},[14,9173,35],{"id":35},[37,9175,9176,9180,9182],{},[40,9177,1413,9178,1416],{},[43,9179,1160],{},[40,9181,1419],{},[40,9183,1422],{},[14,9185,70],{"id":70},[10,9187,73],{},[75,9189,9190],{"className":77,"code":1429,"language":79,"meta":80,"style":80},[43,9191,9192],{"__ignoreMap":80},[84,9193,9194],{"class":86,"line":87},[84,9195,1429],{},[10,9197,136],{},[75,9199,9201],{"className":9200,"code":1441,"language":142,"meta":80},[140],[43,9202,1441],{"__ignoreMap":80},[10,9204,147],{},[14,9206,150],{"id":150},[152,9208,9209,9213],{},[40,9210,1452,9211,1456],{},[43,9212,1455],{},[40,9214,1459,9215,1463],{},[43,9216,1462],{},[14,9218,168],{"id":168},[37,9220,9221,9223],{},[40,9222,1470],{},[40,9224,1473,9225,1476],{},[43,9226,1160],{},[14,9228,183],{"id":183},[152,9230,9231,9233],{},[40,9232,1483],{},[40,9234,1486],{},[10,9236,194],{},[14,9238,197],{"id":197},[10,9240,1493],{},[202,9242,204],{},{"title":80,"searchDepth":93,"depth":93,"links":9244},[9245,9246,9247,9248,9249,9250,9251,9252],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":1383,"description":1388},[215,1378,1513],{"id":1516,"title":1517,"body":9257,"category":215,"cover":216,"description":1522,"extension":217,"meta":9372,"navigation":108,"path":1659,"pinned":220,"publishedAt":221,"seo":9373,"slug":1661,"stem":1662,"summary":1663,"tags":9374,"updatedAt":221,"visible":108,"__hash__":1666},{"type":7,"value":9258,"toc":9362},[9259,9261,9263,9265,9267,9271,9275,9277,9287,9289,9291,9311,9313,9318,9320,9322,9332,9334,9344,9346,9354,9356,9358,9360],[10,9260,1522],{},[14,9262,16],{"id":16},[10,9264,1527],{},[14,9266,22],{"id":22},[10,9268,9269],{},[26,9270],{"alt":1534,"src":1535},[10,9272,1538,9273,1541],{},[43,9274,680],{},[14,9276,35],{"id":35},[37,9278,9279,9281,9283],{},[40,9280,1548],{},[40,9282,1551],{},[40,9284,1554,9285,1558],{},[43,9286,1557],{},[14,9288,70],{"id":70},[10,9290,1563],{},[75,9292,9293],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,9294,9295,9301],{"__ignoreMap":80},[84,9296,9297,9299],{"class":86,"line":87},[84,9298,680],{"class":589},[84,9300,593],{"class":592},[84,9302,9303,9305,9307,9309],{"class":86,"line":93},[84,9304,680],{"class":589},[84,9306,622],{"class":592},[84,9308,626],{"class":625},[84,9310,593],{"class":592},[10,9312,136],{},[75,9314,9316],{"className":9315,"code":1589,"language":142,"meta":80},[140],[43,9317,1589],{"__ignoreMap":80},[10,9319,147],{},[14,9321,150],{"id":150},[152,9323,9324,9328],{},[40,9325,9326,1603],{},[43,9327,1602],{},[40,9329,9330,1608],{},[43,9331,688],{},[14,9333,168],{"id":168},[37,9335,9336,9340],{},[40,9337,1615,9338,1618],{},[43,9339,680],{},[40,9341,1621,9342,1624],{},[43,9343,680],{},[14,9345,183],{"id":183},[152,9347,9348,9352],{},[40,9349,927,9350,1634],{},[43,9351,1633],{},[40,9353,1637],{},[10,9355,194],{},[14,9357,197],{"id":197},[10,9359,1644],{},[202,9361,1647],{},{"title":80,"searchDepth":93,"depth":93,"links":9363},[9364,9365,9366,9367,9368,9369,9370,9371],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":1517,"description":1522},[215,1665,1041],{"id":1668,"title":1669,"body":9376,"category":215,"cover":216,"description":1835,"extension":217,"meta":9503,"navigation":108,"path":1837,"pinned":220,"publishedAt":221,"seo":9504,"slug":1839,"stem":1840,"summary":1841,"tags":9505,"updatedAt":221,"visible":108,"__hash__":1845},{"type":7,"value":9377,"toc":9493},[9378,9382,9384,9386,9388,9392,9394,9396,9412,9414,9416,9436,9438,9443,9445,9447,9459,9461,9471,9473,9483,9485,9487,9491],[10,9379,1674,9380,1677],{},[43,9381,1160],{},[14,9383,16],{"id":16},[10,9385,1682],{},[14,9387,22],{"id":22},[10,9389,9390],{},[26,9391],{"alt":1689,"src":1690},[10,9393,1693],{},[14,9395,35],{"id":35},[37,9397,9398,9404,9408],{},[40,9399,1700,9400,1703,9402,177],{},[43,9401,680],{},[43,9403,1706],{},[40,9405,1709,9406,1713],{},[43,9407,1712],{},[40,9409,1716,9410,1719],{},[43,9411,1160],{},[14,9413,70],{"id":70},[10,9415,73],{},[75,9417,9418],{"className":1726,"code":1727,"language":1728,"meta":80,"style":80},[43,9419,9420,9424,9428,9432],{"__ignoreMap":80},[84,9421,9422],{"class":86,"line":87},[84,9423,1735],{},[84,9425,9426],{"class":86,"line":93},[84,9427,1740],{},[84,9429,9430],{"class":86,"line":99},[84,9431,1745],{},[84,9433,9434],{"class":86,"line":105},[84,9435,1750],{},[10,9437,136],{},[75,9439,9441],{"className":9440,"code":1756,"language":142,"meta":80},[140],[43,9442,1756],{"__ignoreMap":80},[10,9444,147],{},[14,9446,150],{"id":150},[152,9448,9449,9455],{},[40,9450,1767,9451,1771,9453,177],{},[43,9452,1770],{},[43,9454,1774],{},[40,9456,1777,9457,1780],{},[43,9458,1462],{},[14,9460,168],{"id":168},[37,9462,9463,9469],{},[40,9464,1787,9465,1790,9467,1793],{},[43,9466,1706],{},[43,9468,1160],{},[40,9470,1796],{},[14,9472,183],{"id":183},[152,9474,9475,9479],{},[40,9476,1803,9477,177],{},[43,9478,1806],{},[40,9480,1809,9481,1812],{},[43,9482,1462],{},[10,9484,194],{},[14,9486,197],{"id":197},[10,9488,1819,9489,1822],{},[43,9490,1160],{},[202,9492,204],{},{"title":80,"searchDepth":93,"depth":93,"links":9494},[9495,9496,9497,9498,9499,9500,9501,9502],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":1669,"description":1835},[215,1843,1844],{"id":1847,"title":1848,"body":9507,"category":215,"cover":216,"description":1853,"extension":217,"meta":9646,"navigation":108,"path":2025,"pinned":220,"publishedAt":221,"seo":9647,"slug":2027,"stem":2028,"summary":2029,"tags":9648,"updatedAt":221,"visible":108,"__hash__":2033},{"type":7,"value":9508,"toc":9636},[9509,9511,9513,9515,9517,9521,9525,9527,9539,9541,9543,9579,9581,9586,9588,9590,9606,9608,9618,9620,9628,9630,9632,9634],[10,9510,1853],{},[14,9512,16],{"id":16},[10,9514,1858],{},[14,9516,22],{"id":22},[10,9518,9519],{},[26,9520],{"alt":1865,"src":1866},[10,9522,9523,1872],{},[43,9524,1871],{},[14,9526,35],{"id":35},[37,9528,9529,9531,9537],{},[40,9530,1879],{},[40,9532,9533,1885,9535,1889],{},[43,9534,1884],{},[43,9536,1888],{},[40,9538,1892],{},[14,9540,70],{"id":70},[10,9542,1563],{},[75,9544,9545],{"className":580,"code":1899,"language":582,"meta":80,"style":80},[43,9546,9547,9553,9559,9563,9573],{"__ignoreMap":80},[84,9548,9549,9551],{"class":86,"line":87},[84,9550,1906],{"class":589},[84,9552,1909],{"class":625},[84,9554,9555,9557],{"class":86,"line":93},[84,9556,1914],{"class":592},[84,9558,1909],{"class":625},[84,9560,9561],{"class":86,"line":99},[84,9562,1921],{"class":592},[84,9564,9565,9567,9569,9571],{"class":86,"line":105},[84,9566,1926],{"class":592},[84,9568,1929],{"class":625},[84,9570,1933],{"class":1932},[84,9572,1204],{"class":625},[84,9574,9575,9577],{"class":86,"line":112},[84,9576,680],{"class":589},[84,9578,1204],{"class":625},[10,9580,136],{},[75,9582,9584],{"className":9583,"code":1947,"language":142,"meta":80},[140],[43,9585,1947],{"__ignoreMap":80},[10,9587,147],{},[14,9589,150],{"id":150},[152,9591,9592,9600],{},[40,9593,9594,1960,9596,1963,9598,1966],{},[43,9595,1906],{},[43,9597,1914],{},[43,9599,1884],{},[40,9601,9602,1971,9604,1975],{},[43,9603,1871],{},[43,9605,1974],{},[14,9607,168],{"id":168},[37,9609,9610,9616],{},[40,9611,1982,9612,1146,9614,177],{},[43,9613,1884],{},[43,9615,1888],{},[40,9617,1989],{},[14,9619,183],{"id":183},[152,9621,9622,9626],{},[40,9623,1996,9624,2000],{},[43,9625,1999],{},[40,9627,2003],{},[10,9629,194],{},[14,9631,197],{"id":197},[10,9633,2010],{},[202,9635,2013],{},{"title":80,"searchDepth":93,"depth":93,"links":9637},[9638,9639,9640,9641,9642,9643,9644,9645],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":1848,"description":1853},[215,2031,2032],{"id":2035,"title":2036,"body":9650,"category":215,"cover":216,"description":2041,"extension":217,"meta":9771,"navigation":108,"path":2190,"pinned":220,"publishedAt":221,"seo":9772,"slug":2192,"stem":2193,"summary":2194,"tags":9773,"updatedAt":221,"visible":108,"__hash__":2198},{"type":7,"value":9651,"toc":9761},[9652,9654,9656,9658,9660,9664,9672,9674,9688,9690,9692,9708,9710,9715,9717,9719,9733,9735,9741,9743,9753,9755,9757,9759],[10,9653,2041],{},[14,9655,16],{"id":16},[10,9657,2046],{},[14,9659,22],{"id":22},[10,9661,9662],{},[26,9663],{"alt":2053,"src":2054},[10,9665,2057,9666,177,9668,2063,9670,177],{},[43,9667,1462],{},[43,9669,2062],{},[43,9671,1770],{},[14,9673,35],{"id":35},[37,9675,9676,9680,9686],{},[40,9677,9678,2075],{},[43,9679,2074],{},[40,9681,9682,2081,9684,177],{},[43,9683,2080],{},[43,9685,2084],{},[40,9687,2087],{},[14,9689,70],{"id":70},[10,9691,73],{},[75,9693,9694],{"className":77,"code":2094,"language":79,"meta":80,"style":80},[43,9695,9696,9700,9704],{"__ignoreMap":80},[84,9697,9698],{"class":86,"line":87},[84,9699,2101],{},[84,9701,9702],{"class":86,"line":93},[84,9703,2106],{},[84,9705,9706],{"class":86,"line":99},[84,9707,2111],{},[10,9709,136],{},[75,9711,9713],{"className":9712,"code":2117,"language":142,"meta":80},[140],[43,9714,2117],{"__ignoreMap":80},[10,9716,147],{},[14,9718,150],{"id":150},[152,9720,9721,9727],{},[40,9722,9723,2131,9725,177],{},[43,9724,2130],{},[43,9726,2084],{},[40,9728,9729,2138,9731,2142],{},[43,9730,1462],{},[43,9732,2141],{},[14,9734,168],{"id":168},[37,9736,9737,9739],{},[40,9738,2149],{},[40,9740,2152],{},[14,9742,183],{"id":183},[152,9744,9745,9747],{},[40,9746,2159],{},[40,9748,2162,9749,2165,9751,2169],{},[43,9750,2062],{},[43,9752,2168],{},[10,9754,194],{},[14,9756,197],{"id":197},[10,9758,2176],{},[202,9760,204],{},{"title":80,"searchDepth":93,"depth":93,"links":9762},[9763,9764,9765,9766,9767,9768,9769,9770],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":2036,"description":2041},[215,2196,2197],{"id":2200,"title":2201,"body":9775,"category":215,"cover":216,"description":2206,"extension":217,"meta":9908,"navigation":108,"path":2374,"pinned":220,"publishedAt":221,"seo":9909,"slug":2376,"stem":2377,"summary":2378,"tags":9910,"updatedAt":221,"visible":108,"__hash__":2382},{"type":7,"value":9776,"toc":9898},[9777,9779,9781,9783,9785,9789,9791,9793,9809,9811,9813,9837,9839,9844,9846,9848,9864,9866,9878,9880,9890,9892,9894,9896],[10,9778,2206],{},[14,9780,16],{"id":16},[10,9782,2211],{},[14,9784,22],{"id":22},[10,9786,9787],{},[26,9788],{"alt":2218,"src":2219},[10,9790,2222],{},[14,9792,35],{"id":35},[37,9794,9795,9797,9803],{},[40,9796,2229],{},[40,9798,2232,9799,2165,9801,2239],{},[43,9800,2235],{},[43,9802,2238],{},[40,9804,2242,9805,2246,9807,2250],{},[43,9806,2245],{},[43,9808,2249],{},[14,9810,70],{"id":70},[10,9812,73],{},[75,9814,9815],{"className":77,"code":2257,"language":79,"meta":80,"style":80},[43,9816,9817,9821,9825,9829,9833],{"__ignoreMap":80},[84,9818,9819],{"class":86,"line":87},[84,9820,2264],{},[84,9822,9823],{"class":86,"line":93},[84,9824,2269],{},[84,9826,9827],{"class":86,"line":99},[84,9828,109],{"emptyLinePlaceholder":108},[84,9830,9831],{"class":86,"line":105},[84,9832,2278],{},[84,9834,9835],{"class":86,"line":112},[84,9836,2269],{},[10,9838,136],{},[75,9840,9842],{"className":9841,"code":2288,"language":142,"meta":80},[140],[43,9843,2288],{"__ignoreMap":80},[10,9845,147],{},[14,9847,150],{"id":150},[152,9849,9850,9856],{},[40,9851,927,9852,2302,9854,2305],{},[43,9853,2301],{},[43,9855,2235],{},[40,9857,927,9858,2311,9860,2315,9862,177],{},[43,9859,2310],{},[43,9861,2314],{},[43,9863,2318],{},[14,9865,168],{"id":168},[37,9867,9868,9870],{},[40,9869,2325],{},[40,9871,2328,9872,2246,9874,2246,9876,2336],{},[43,9873,2245],{},[43,9875,2249],{},[43,9877,2335],{},[14,9879,183],{"id":183},[152,9881,9882,9888],{},[40,9883,2343,9884,1146,9886,2350],{},[43,9885,2346],{},[43,9887,2349],{},[40,9889,2353],{},[10,9891,194],{},[14,9893,197],{"id":197},[10,9895,2360],{},[202,9897,204],{},{"title":80,"searchDepth":93,"depth":93,"links":9899},[9900,9901,9902,9903,9904,9905,9906,9907],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":2201,"description":2206},[215,2380,2381],{"id":4,"title":5,"body":9912,"category":215,"cover":216,"description":12,"extension":217,"meta":10045,"navigation":108,"path":219,"pinned":220,"publishedAt":221,"seo":10046,"slug":223,"stem":224,"summary":225,"tags":10047,"updatedAt":221,"visible":108,"__hash__":229},{"type":7,"value":9913,"toc":10035},[9914,9916,9918,9920,9922,9926,9928,9930,9948,9950,9952,9988,9990,9995,9997,9999,10009,10011,10019,10021,10027,10029,10031,10033],[10,9915,12],{},[14,9917,16],{"id":16},[10,9919,19],{},[14,9921,22],{"id":22},[10,9923,9924],{},[26,9925],{"alt":28,"src":29},[10,9927,32],{},[14,9929,35],{"id":35},[37,9931,9932,9938,9946],{},[40,9933,9934,46,9936,50],{},[43,9935,45],{},[43,9937,49],{},[40,9939,9940,56,9942,60,9944,64],{},[43,9941,55],{},[43,9943,59],{},[43,9945,63],{},[40,9947,67],{},[14,9949,70],{"id":70},[10,9951,73],{},[75,9953,9954],{"className":77,"code":78,"language":79,"meta":80,"style":80},[43,9955,9956,9960,9964,9968,9972,9976,9980,9984],{"__ignoreMap":80},[84,9957,9958],{"class":86,"line":87},[84,9959,90],{},[84,9961,9962],{"class":86,"line":93},[84,9963,96],{},[84,9965,9966],{"class":86,"line":99},[84,9967,102],{},[84,9969,9970],{"class":86,"line":105},[84,9971,109],{"emptyLinePlaceholder":108},[84,9973,9974],{"class":86,"line":112},[84,9975,115],{},[84,9977,9978],{"class":86,"line":118},[84,9979,121],{},[84,9981,9982],{"class":86,"line":124},[84,9983,127],{},[84,9985,9986],{"class":86,"line":130},[84,9987,133],{},[10,9989,136],{},[75,9991,9993],{"className":9992,"code":141,"language":142,"meta":80},[140],[43,9994,141],{"__ignoreMap":80},[10,9996,147],{},[14,9998,150],{"id":150},[152,10000,10001,10005],{},[40,10002,10003,159],{},[43,10004,158],{},[40,10006,10007,165],{},[43,10008,164],{},[14,10010,168],{"id":168},[37,10012,10013,10017],{},[40,10014,173,10015,177],{},[43,10016,176],{},[40,10018,180],{},[14,10020,183],{"id":183},[152,10022,10023,10025],{},[40,10024,188],{},[40,10026,191],{},[10,10028,194],{},[14,10030,197],{"id":197},[10,10032,200],{},[202,10034,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10036},[10037,10038,10039,10040,10041,10042,10043,10044],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5,"description":12},[215,227,228],{"id":2521,"title":2522,"body":10049,"category":215,"cover":216,"description":2527,"extension":217,"meta":10186,"navigation":108,"path":2704,"pinned":220,"publishedAt":221,"seo":10187,"slug":2706,"stem":2707,"summary":2708,"tags":10188,"updatedAt":221,"visible":108,"__hash__":2712},{"type":7,"value":10050,"toc":10174},[10051,10053,10055,10057,10059,10063,10069,10071,10079,10081,10083,10107,10109,10114,10116,10118,10136,10138,10140,10144,10146,10148,10154,10156,10166,10168,10170,10172],[10,10052,2527],{},[14,10054,16],{"id":16},[10,10056,2532],{},[14,10058,22],{"id":22},[10,10060,10061],{},[26,10062],{"alt":2539,"src":2540},[10,10064,2543,10065,2547,10067,177],{},[43,10066,2546],{},[43,10068,2550],{},[14,10070,35],{"id":35},[37,10072,10073,10075,10077],{},[40,10074,2557],{},[40,10076,2560],{},[40,10078,2563],{},[14,10080,70],{"id":70},[10,10082,73],{},[75,10084,10085],{"className":77,"code":2570,"language":79,"meta":80,"style":80},[43,10086,10087,10091,10095,10099,10103],{"__ignoreMap":80},[84,10088,10089],{"class":86,"line":87},[84,10090,2577],{},[84,10092,10093],{"class":86,"line":93},[84,10094,2582],{},[84,10096,10097],{"class":86,"line":99},[84,10098,2587],{},[84,10100,10101],{"class":86,"line":105},[84,10102,2592],{},[84,10104,10105],{"class":86,"line":112},[84,10106,2597],{},[10,10108,136],{},[75,10110,10112],{"className":10111,"code":2603,"language":142,"meta":80},[140],[43,10113,2603],{"__ignoreMap":80},[10,10115,147],{},[14,10117,150],{"id":150},[152,10119,10120,10128],{},[40,10121,2614,10122,2617,10124,2621,10126,2625],{},[43,10123,215],{},[43,10125,2620],{},[43,10127,2624],{},[40,10129,10130,2631,10132,2635,10134,2639],{},[43,10131,2630],{},[43,10133,2634],{},[43,10135,2638],{},[318,10137,2642],{"id":2642},[10,10139,2645],{},[10,10141,10142],{},[26,10143],{"alt":2650,"src":2651},[10,10145,2654],{},[14,10147,168],{"id":168},[37,10149,10150,10152],{},[40,10151,2661],{},[40,10153,2664],{},[14,10155,183],{"id":183},[152,10157,10158,10164],{},[40,10159,2671,10160,2675,10162,177],{},[43,10161,2674],{},[43,10163,2678],{},[40,10165,2681],{},[10,10167,194],{},[14,10169,197],{"id":197},[10,10171,2688],{},[202,10173,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10175},[10176,10177,10178,10179,10180,10183,10184,10185],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":10181},[10182],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":2522,"description":2527},[215,2710,2711],{"id":2714,"title":2715,"body":10190,"category":215,"cover":216,"description":2720,"extension":217,"meta":10355,"navigation":108,"path":2935,"pinned":220,"publishedAt":221,"seo":10356,"slug":2937,"stem":2938,"summary":2939,"tags":10357,"updatedAt":221,"visible":108,"__hash__":2943},{"type":7,"value":10191,"toc":10343},[10192,10194,10196,10198,10200,10204,10210,10212,10232,10234,10236,10272,10274,10279,10281,10283,10297,10299,10301,10305,10311,10313,10323,10325,10335,10337,10339,10341],[10,10193,2720],{},[14,10195,16],{"id":16},[10,10197,2725],{},[14,10199,22],{"id":22},[10,10201,10202],{},[26,10203],{"alt":2732,"src":2733},[10,10205,2736,10206,998,10208,2743],{},[43,10207,2739],{},[43,10209,2742],{},[14,10211,35],{"id":35},[37,10213,10214,10222,10230],{},[40,10215,10216,2753,10218,2757,10220,2761],{},[43,10217,2752],{},[43,10219,2756],{},[43,10221,2760],{},[40,10223,10224,2767,10226,2771,10228,2775],{},[43,10225,2766],{},[43,10227,2770],{},[43,10229,2774],{},[40,10231,2778],{},[14,10233,70],{"id":70},[10,10235,73],{},[75,10237,10238],{"className":77,"code":2785,"language":79,"meta":80,"style":80},[43,10239,10240,10244,10248,10252,10256,10260,10264,10268],{"__ignoreMap":80},[84,10241,10242],{"class":86,"line":87},[84,10243,2792],{},[84,10245,10246],{"class":86,"line":93},[84,10247,2797],{},[84,10249,10250],{"class":86,"line":99},[84,10251,109],{"emptyLinePlaceholder":108},[84,10253,10254],{"class":86,"line":105},[84,10255,2806],{},[84,10257,10258],{"class":86,"line":112},[84,10259,2811],{},[84,10261,10262],{"class":86,"line":118},[84,10263,2816],{},[84,10265,10266],{"class":86,"line":124},[84,10267,2821],{},[84,10269,10270],{"class":86,"line":130},[84,10271,2826],{},[10,10273,136],{},[75,10275,10277],{"className":10276,"code":2832,"language":142,"meta":80},[140],[43,10278,2832],{"__ignoreMap":80},[10,10280,147],{},[14,10282,150],{"id":150},[152,10284,10285,10291],{},[40,10286,10287,2846,10289,2850],{},[43,10288,2845],{},[43,10290,2849],{},[40,10292,10293,2856,10295,2859],{},[43,10294,2855],{},[43,10296,2774],{},[318,10298,2642],{"id":2642},[10,10300,2864],{},[10,10302,10303],{},[26,10304],{"alt":2869,"src":2870},[10,10306,10307,2875,10309,2878],{},[43,10308,2766],{},[43,10310,2770],{},[14,10312,168],{"id":168},[37,10314,10315,10321],{},[40,10316,2885,10317,2888,10319,2891],{},[43,10318,2760],{},[43,10320,2752],{},[40,10322,2894],{},[14,10324,183],{"id":183},[152,10326,10327,10331],{},[40,10328,2901,10329,2905],{},[43,10330,2904],{},[40,10332,2908,10333,2912],{},[43,10334,2911],{},[10,10336,194],{},[14,10338,197],{"id":197},[10,10340,2919],{},[202,10342,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10344},[10345,10346,10347,10348,10349,10352,10353,10354],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":10350},[10351],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":2715,"description":2720},[215,2941,2942],{"id":2945,"title":2946,"body":10359,"category":215,"cover":216,"description":2951,"extension":217,"meta":10492,"navigation":108,"path":3120,"pinned":220,"publishedAt":221,"seo":10493,"slug":3122,"stem":3123,"summary":3124,"tags":10494,"updatedAt":221,"visible":108,"__hash__":3127},{"type":7,"value":10360,"toc":10482},[10361,10363,10365,10367,10369,10373,10383,10385,10395,10397,10399,10427,10429,10434,10436,10438,10452,10454,10462,10464,10474,10476,10478,10480],[10,10362,2951],{},[14,10364,16],{"id":16},[10,10366,2956],{},[14,10368,22],{"id":22},[10,10370,10371],{},[26,10372],{"alt":2963,"src":2964},[10,10374,10375,2970,10377,2974,10379,2978,10381,2982],{},[43,10376,2969],{},[43,10378,2973],{},[43,10380,2977],{},[43,10382,2981],{},[14,10384,35],{"id":35},[37,10386,10387,10389,10393],{},[40,10388,2989],{},[40,10390,10391,2994],{},[43,10392,2981],{},[40,10394,2997],{},[14,10396,70],{"id":70},[10,10398,73],{},[75,10400,10401],{"className":77,"code":3004,"language":79,"meta":80,"style":80},[43,10402,10403,10407,10411,10415,10419,10423],{"__ignoreMap":80},[84,10404,10405],{"class":86,"line":87},[84,10406,3011],{},[84,10408,10409],{"class":86,"line":93},[84,10410,3016],{},[84,10412,10413],{"class":86,"line":99},[84,10414,3021],{},[84,10416,10417],{"class":86,"line":105},[84,10418,109],{"emptyLinePlaceholder":108},[84,10420,10421],{"class":86,"line":112},[84,10422,3030],{},[84,10424,10425],{"class":86,"line":118},[84,10426,3035],{},[10,10428,136],{},[75,10430,10432],{"className":10431,"code":3041,"language":142,"meta":80},[140],[43,10433,3041],{"__ignoreMap":80},[10,10435,147],{},[14,10437,150],{"id":150},[152,10439,10440,10446],{},[40,10441,3052,10442,3055,10444,3059],{},[43,10443,2969],{},[43,10445,3058],{},[40,10447,10448,3065,10450,3069],{},[43,10449,3064],{},[43,10451,3068],{},[14,10453,168],{"id":168},[37,10455,10456,10460],{},[40,10457,3076,10458,3080],{},[43,10459,3079],{},[40,10461,3083],{},[14,10463,183],{"id":183},[152,10465,10466,10468],{},[40,10467,3090],{},[40,10469,1709,10470,3096,10472,3099],{},[43,10471,3095],{},[43,10473,2981],{},[10,10475,194],{},[14,10477,197],{"id":197},[10,10479,3106],{},[202,10481,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10483},[10484,10485,10486,10487,10488,10489,10490,10491],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":2946,"description":2951},[215,2335,3126],{"id":3129,"title":3130,"body":10496,"category":215,"cover":216,"description":3135,"extension":217,"meta":10625,"navigation":108,"path":3296,"pinned":220,"publishedAt":221,"seo":10626,"slug":3298,"stem":3299,"summary":3300,"tags":10627,"updatedAt":221,"visible":108,"__hash__":3304},{"type":7,"value":10497,"toc":10615},[10498,10500,10502,10504,10506,10510,10514,10516,10526,10528,10530,10562,10564,10569,10571,10573,10585,10587,10597,10599,10607,10609,10611,10613],[10,10499,3135],{},[14,10501,16],{"id":16},[10,10503,3140],{},[14,10505,22],{"id":22},[10,10507,10508],{},[26,10509],{"alt":3147,"src":3148},[10,10511,3151,10512,3155],{},[43,10513,3154],{},[14,10515,35],{"id":35},[37,10517,10518,10520,10522],{},[40,10519,3162],{},[40,10521,3165],{},[40,10523,3168,10524,177],{},[43,10525,3171],{},[14,10527,70],{"id":70},[10,10529,73],{},[75,10531,10532],{"className":77,"code":3178,"language":79,"meta":80,"style":80},[43,10533,10534,10538,10542,10546,10550,10554,10558],{"__ignoreMap":80},[84,10535,10536],{"class":86,"line":87},[84,10537,3185],{},[84,10539,10540],{"class":86,"line":93},[84,10541,3190],{},[84,10543,10544],{"class":86,"line":99},[84,10545,109],{"emptyLinePlaceholder":108},[84,10547,10548],{"class":86,"line":105},[84,10549,3199],{},[84,10551,10552],{"class":86,"line":112},[84,10553,3204],{},[84,10555,10556],{"class":86,"line":118},[84,10557,3209],{},[84,10559,10560],{"class":86,"line":124},[84,10561,3214],{},[10,10563,136],{},[75,10565,10567],{"className":10566,"code":3220,"language":142,"meta":80},[140],[43,10568,3220],{"__ignoreMap":80},[10,10570,147],{},[14,10572,150],{"id":150},[152,10574,10575,10577],{},[40,10576,3231],{},[40,10578,10579,3237,10581,3241,10583,3245],{},[43,10580,3236],{},[43,10582,3240],{},[43,10584,3244],{},[14,10586,168],{"id":168},[37,10588,10589,10595],{},[40,10590,3252,10591,3256,10593,177],{},[43,10592,3255],{},[43,10594,3259],{},[40,10596,3262],{},[14,10598,183],{"id":183},[152,10600,10601,10603],{},[40,10602,3269],{},[40,10604,3272,10605,3275],{},[43,10606,3244],{},[10,10608,194],{},[14,10610,197],{"id":197},[10,10612,3282],{},[202,10614,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10616},[10617,10618,10619,10620,10621,10622,10623,10624],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":3130,"description":3135},[215,3302,3303],{"id":3306,"title":3307,"body":10629,"category":215,"cover":216,"description":3312,"extension":217,"meta":10748,"navigation":108,"path":3454,"pinned":220,"publishedAt":221,"seo":10749,"slug":3456,"stem":3457,"summary":3458,"tags":10750,"updatedAt":221,"visible":108,"__hash__":3461},{"type":7,"value":10630,"toc":10738},[10631,10633,10635,10637,10639,10643,10645,10647,10655,10657,10659,10687,10689,10694,10696,10698,10708,10710,10718,10720,10730,10732,10734,10736],[10,10632,3312],{},[14,10634,16],{"id":16},[10,10636,3317],{},[14,10638,22],{"id":22},[10,10640,10641],{},[26,10642],{"alt":3324,"src":3325},[10,10644,3328],{},[14,10646,35],{"id":35},[37,10648,10649,10651,10653],{},[40,10650,3335],{},[40,10652,3338],{},[40,10654,3341],{},[14,10656,70],{"id":70},[10,10658,73],{},[75,10660,10661],{"className":77,"code":3348,"language":79,"meta":80,"style":80},[43,10662,10663,10667,10671,10675,10679,10683],{"__ignoreMap":80},[84,10664,10665],{"class":86,"line":87},[84,10666,3355],{},[84,10668,10669],{"class":86,"line":93},[84,10670,3360],{},[84,10672,10673],{"class":86,"line":99},[84,10674,3365],{},[84,10676,10677],{"class":86,"line":105},[84,10678,109],{"emptyLinePlaceholder":108},[84,10680,10681],{"class":86,"line":112},[84,10682,3374],{},[84,10684,10685],{"class":86,"line":118},[84,10686,3379],{},[10,10688,136],{},[75,10690,10692],{"className":10691,"code":3385,"language":142,"meta":80},[140],[43,10693,3385],{"__ignoreMap":80},[10,10695,147],{},[14,10697,150],{"id":150},[152,10699,10700,10704],{},[40,10701,10702,3399],{},[43,10703,3398],{},[40,10705,10706,3405],{},[43,10707,3404],{},[14,10709,168],{"id":168},[37,10711,10712,10716],{},[40,10713,3412,10714,3416],{},[43,10715,3415],{},[40,10717,3419],{},[14,10719,183],{"id":183},[152,10721,10722,10724],{},[40,10723,3426],{},[40,10725,2162,10726,2165,10728,3433],{},[43,10727,3415],{},[43,10729,3404],{},[10,10731,194],{},[14,10733,197],{"id":197},[10,10735,3440],{},[202,10737,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10739},[10740,10741,10742,10743,10744,10745,10746,10747],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":3307,"description":3312},[215,3460,3303],{"id":3463,"title":3464,"body":10752,"category":215,"cover":216,"description":3469,"extension":217,"meta":10877,"navigation":108,"path":3625,"pinned":220,"publishedAt":221,"seo":10878,"slug":3627,"stem":3628,"summary":3629,"tags":10879,"updatedAt":221,"visible":108,"__hash__":3632},{"type":7,"value":10753,"toc":10867},[10754,10756,10758,10760,10762,10766,10772,10774,10784,10786,10788,10816,10818,10823,10825,10827,10837,10839,10851,10853,10859,10861,10863,10865],[10,10755,3469],{},[14,10757,16],{"id":16},[10,10759,3474],{},[14,10761,22],{"id":22},[10,10763,10764],{},[26,10765],{"alt":3481,"src":3482},[10,10767,3485,10768,3489,10770,3492],{},[43,10769,3488],{},[43,10771,2235],{},[14,10773,35],{"id":35},[37,10775,10776,10778,10782],{},[40,10777,3499],{},[40,10779,2328,10780,3505],{},[43,10781,3504],{},[40,10783,3508],{},[14,10785,70],{"id":70},[10,10787,73],{},[75,10789,10790],{"className":77,"code":3515,"language":79,"meta":80,"style":80},[43,10791,10792,10796,10800,10804,10808,10812],{"__ignoreMap":80},[84,10793,10794],{"class":86,"line":87},[84,10795,3522],{},[84,10797,10798],{"class":86,"line":93},[84,10799,3527],{},[84,10801,10802],{"class":86,"line":99},[84,10803,109],{"emptyLinePlaceholder":108},[84,10805,10806],{"class":86,"line":105},[84,10807,3536],{},[84,10809,10810],{"class":86,"line":112},[84,10811,3541],{},[84,10813,10814],{"class":86,"line":118},[84,10815,3546],{},[10,10817,136],{},[75,10819,10821],{"className":10820,"code":3552,"language":142,"meta":80},[140],[43,10822,3552],{"__ignoreMap":80},[10,10824,147],{},[14,10826,150],{"id":150},[152,10828,10829,10831],{},[40,10830,3563],{},[40,10832,3566,10833,3569,10835,3573],{},[43,10834,2235],{},[43,10836,3572],{},[14,10838,168],{"id":168},[37,10840,10841,10845],{},[40,10842,3580,10843,3584],{},[43,10844,3583],{},[40,10846,3587,10847,3591,10849,177],{},[43,10848,3590],{},[43,10850,3594],{},[14,10852,183],{"id":183},[152,10854,10855,10857],{},[40,10856,3601],{},[40,10858,3604],{},[10,10860,194],{},[14,10862,197],{"id":197},[10,10864,3611],{},[202,10866,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10868},[10869,10870,10871,10872,10873,10874,10875,10876],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":3464,"description":3469},[215,3631,3303],{"id":3634,"title":3635,"body":10881,"category":215,"cover":216,"description":3640,"extension":217,"meta":11004,"navigation":108,"path":3790,"pinned":220,"publishedAt":221,"seo":11005,"slug":3792,"stem":3793,"summary":3794,"tags":11006,"updatedAt":221,"visible":108,"__hash__":3797},{"type":7,"value":10882,"toc":10994},[10883,10885,10887,10889,10891,10895,10897,10899,10911,10913,10915,10943,10945,10950,10952,10954,10964,10966,10976,10978,10986,10988,10990,10992],[10,10884,3640],{},[14,10886,16],{"id":16},[10,10888,3645],{},[14,10890,22],{"id":22},[10,10892,10893],{},[26,10894],{"alt":3652,"src":3653},[10,10896,3656],{},[14,10898,35],{"id":35},[37,10900,10901,10903,10905],{},[40,10902,3663],{},[40,10904,3666],{},[40,10906,3669,10907,3673,10909,3677],{},[43,10908,3672],{},[43,10910,3676],{},[14,10912,70],{"id":70},[10,10914,73],{},[75,10916,10917],{"className":77,"code":3684,"language":79,"meta":80,"style":80},[43,10918,10919,10923,10927,10931,10935,10939],{"__ignoreMap":80},[84,10920,10921],{"class":86,"line":87},[84,10922,3691],{},[84,10924,10925],{"class":86,"line":93},[84,10926,3696],{},[84,10928,10929],{"class":86,"line":99},[84,10930,109],{"emptyLinePlaceholder":108},[84,10932,10933],{"class":86,"line":105},[84,10934,3705],{},[84,10936,10937],{"class":86,"line":112},[84,10938,3710],{},[84,10940,10941],{"class":86,"line":118},[84,10942,3715],{},[10,10944,136],{},[75,10946,10948],{"className":10947,"code":3721,"language":142,"meta":80},[140],[43,10949,3721],{"__ignoreMap":80},[10,10951,147],{},[14,10953,150],{"id":150},[152,10955,10956,10958],{},[40,10957,3732],{},[40,10959,10960,3738,10962,3742],{},[43,10961,3737],{},[43,10963,3741],{},[14,10965,168],{"id":168},[37,10967,10968,10974],{},[40,10969,2328,10970,3751,10972,177],{},[43,10971,3676],{},[43,10973,3672],{},[40,10975,3756],{},[14,10977,183],{"id":183},[152,10979,10980,10984],{},[40,10981,3763,10982,3766],{},[43,10983,3672],{},[40,10985,3769],{},[10,10987,194],{},[14,10989,197],{"id":197},[10,10991,3776],{},[202,10993,204],{},{"title":80,"searchDepth":93,"depth":93,"links":10995},[10996,10997,10998,10999,11000,11001,11002,11003],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":3635,"description":3640},[215,3796,3303],{"id":3799,"title":3800,"body":11008,"category":215,"cover":216,"description":3805,"extension":217,"meta":11167,"navigation":108,"path":4004,"pinned":220,"publishedAt":221,"seo":11168,"slug":4006,"stem":4007,"summary":4008,"tags":11169,"updatedAt":221,"visible":108,"__hash__":4012},{"type":7,"value":11009,"toc":11155},[11010,11012,11014,11016,11018,11022,11028,11030,11042,11044,11046,11086,11088,11093,11095,11097,11111,11113,11115,11119,11121,11123,11133,11135,11147,11149,11151,11153],[10,11011,3805],{},[14,11013,16],{"id":16},[10,11015,3810],{},[14,11017,22],{"id":22},[10,11019,11020],{},[26,11021],{"alt":3817,"src":3818},[10,11023,11024,3824,11026,3828],{},[43,11025,3823],{},[43,11027,3827],{},[14,11029,35],{"id":35},[37,11031,11032,11038,11040],{},[40,11033,11034,3837,11036,3841],{},[43,11035,2752],{},[43,11037,3840],{},[40,11039,3844],{},[40,11041,3847],{},[14,11043,70],{"id":70},[10,11045,73],{},[75,11047,11048],{"className":77,"code":3854,"language":79,"meta":80,"style":80},[43,11049,11050,11054,11058,11062,11066,11070,11074,11078,11082],{"__ignoreMap":80},[84,11051,11052],{"class":86,"line":87},[84,11053,3861],{},[84,11055,11056],{"class":86,"line":93},[84,11057,3866],{},[84,11059,11060],{"class":86,"line":99},[84,11061,3871],{},[84,11063,11064],{"class":86,"line":105},[84,11065,109],{"emptyLinePlaceholder":108},[84,11067,11068],{"class":86,"line":112},[84,11069,3880],{},[84,11071,11072],{"class":86,"line":118},[84,11073,3885],{},[84,11075,11076],{"class":86,"line":124},[84,11077,3890],{},[84,11079,11080],{"class":86,"line":130},[84,11081,3895],{},[84,11083,11084],{"class":86,"line":3898},[84,11085,3901],{},[10,11087,136],{},[75,11089,11091],{"className":11090,"code":3907,"language":142,"meta":80},[140],[43,11092,3907],{"__ignoreMap":80},[10,11094,147],{},[14,11096,150],{"id":150},[152,11098,11099,11103],{},[40,11100,11101,3921],{},[43,11102,3920],{},[40,11104,11105,3927,11107,3931,11109,3935],{},[43,11106,3926],{},[43,11108,3930],{},[43,11110,3934],{},[318,11112,2642],{"id":2642},[10,11114,3940],{},[10,11116,11117],{},[26,11118],{"alt":3945,"src":3946},[10,11120,3949],{},[14,11122,168],{"id":168},[37,11124,11125,11131],{},[40,11126,3956,11127,3959,11129,177],{},[43,11128,2752],{},[43,11130,3840],{},[40,11132,3964],{},[14,11134,183],{"id":183},[152,11136,11137,11139],{},[40,11138,3971],{},[40,11140,2328,11141,3977,11143,1146,11145,177],{},[43,11142,3976],{},[43,11144,3840],{},[43,11146,2752],{},[10,11148,194],{},[14,11150,197],{"id":197},[10,11152,3988],{},[202,11154,204],{},{"title":80,"searchDepth":93,"depth":93,"links":11156},[11157,11158,11159,11160,11161,11164,11165,11166],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":11162},[11163],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":3800,"description":3805},[215,4010,4011],{"id":4014,"title":4015,"body":11171,"category":215,"cover":216,"description":4020,"extension":217,"meta":11343,"navigation":108,"path":4234,"pinned":220,"publishedAt":221,"seo":11344,"slug":4236,"stem":4237,"summary":4238,"tags":11345,"updatedAt":221,"visible":108,"__hash__":4241},{"type":7,"value":11172,"toc":11330},[11173,11175,11177,11179,11181,11185,11193,11195,11203,11205,11207,11251,11253,11258,11260,11262,11274,11276,11278,11282,11288,11290,11292,11296,11300,11302,11314,11316,11322,11324,11326,11328],[10,11174,4020],{},[14,11176,16],{"id":16},[10,11178,4025],{},[14,11180,22],{"id":22},[10,11182,11183],{},[26,11184],{"alt":4032,"src":4033},[10,11186,11187,2246,11189,2246,11191,4043],{},[43,11188,1145],{},[43,11190,4040],{},[43,11192,1149],{},[14,11194,35],{"id":35},[37,11196,11197,11199,11201],{},[40,11198,4050],{},[40,11200,4053],{},[40,11202,4056],{},[14,11204,70],{"id":70},[10,11206,73],{},[75,11208,11209],{"className":77,"code":4063,"language":79,"meta":80,"style":80},[43,11210,11211,11215,11219,11223,11227,11231,11235,11239,11243,11247],{"__ignoreMap":80},[84,11212,11213],{"class":86,"line":87},[84,11214,4070],{},[84,11216,11217],{"class":86,"line":93},[84,11218,109],{"emptyLinePlaceholder":108},[84,11220,11221],{"class":86,"line":99},[84,11222,4079],{},[84,11224,11225],{"class":86,"line":105},[84,11226,4084],{},[84,11228,11229],{"class":86,"line":112},[84,11230,4089],{},[84,11232,11233],{"class":86,"line":118},[84,11234,4094],{},[84,11236,11237],{"class":86,"line":124},[84,11238,1135],{},[84,11240,11241],{"class":86,"line":130},[84,11242,4103],{},[84,11244,11245],{"class":86,"line":3898},[84,11246,109],{"emptyLinePlaceholder":108},[84,11248,11249],{"class":86,"line":4110},[84,11250,4113],{},[10,11252,136],{},[75,11254,11256],{"className":11255,"code":4119,"language":142,"meta":80},[140],[43,11257,4119],{"__ignoreMap":80},[10,11259,147],{},[14,11261,150],{"id":150},[152,11263,11264,11268],{},[40,11265,4130,11266,4134],{},[43,11267,4133],{},[40,11269,11270,4140,11272,4143],{},[43,11271,4139],{},[43,11273,1149],{},[318,11275,2642],{"id":2642},[10,11277,4148],{},[10,11279,11280],{},[26,11281],{"alt":4153,"src":4154},[10,11283,11284,4159,11286,4162],{},[43,11285,4133],{},[43,11287,4139],{},[318,11289,2642],{"id":4165},[10,11291,4168],{},[10,11293,11294],{},[26,11295],{"alt":4173,"src":4174},[10,11297,4177,11298,4180],{},[43,11299,1145],{},[14,11301,168],{"id":168},[37,11303,11304,11308],{},[40,11305,4187,11306,4190],{},[43,11307,4139],{},[40,11309,4193,11310,4196,11312,4200],{},[43,11311,1145],{},[43,11313,4199],{},[14,11315,183],{"id":183},[152,11317,11318,11320],{},[40,11319,4207],{},[40,11321,4210],{},[10,11323,194],{},[14,11325,197],{"id":197},[10,11327,4217],{},[202,11329,204],{},{"title":80,"searchDepth":93,"depth":93,"links":11331},[11332,11333,11334,11335,11336,11340,11341,11342],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":11337},[11338,11339],{"id":2642,"depth":99,"text":2642},{"id":4165,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":4015,"description":4020},[215,1145,4240],{"id":4243,"title":4244,"body":11347,"category":215,"cover":216,"description":4249,"extension":217,"meta":11484,"navigation":108,"path":4416,"pinned":220,"publishedAt":221,"seo":11485,"slug":4418,"stem":4419,"summary":4420,"tags":11486,"updatedAt":221,"visible":108,"__hash__":4423},{"type":7,"value":11348,"toc":11472},[11349,11351,11353,11355,11357,11361,11365,11367,11377,11379,11381,11413,11415,11420,11422,11424,11434,11436,11438,11442,11446,11448,11454,11456,11464,11466,11468,11470],[10,11350,4249],{},[14,11352,16],{"id":16},[10,11354,4254],{},[14,11356,22],{"id":22},[10,11358,11359],{},[26,11360],{"alt":4261,"src":4262},[10,11362,11363,4268],{},[43,11364,4267],{},[14,11366,35],{"id":35},[37,11368,11369,11371,11373],{},[40,11370,4275],{},[40,11372,4278],{},[40,11374,4281,11375,4285],{},[43,11376,4284],{},[14,11378,70],{"id":70},[10,11380,73],{},[75,11382,11383],{"className":77,"code":4292,"language":79,"meta":80,"style":80},[43,11384,11385,11389,11393,11397,11401,11405,11409],{"__ignoreMap":80},[84,11386,11387],{"class":86,"line":87},[84,11388,4299],{},[84,11390,11391],{"class":86,"line":93},[84,11392,109],{"emptyLinePlaceholder":108},[84,11394,11395],{"class":86,"line":99},[84,11396,4308],{},[84,11398,11399],{"class":86,"line":105},[84,11400,4313],{},[84,11402,11403],{"class":86,"line":112},[84,11404,4318],{},[84,11406,11407],{"class":86,"line":118},[84,11408,109],{"emptyLinePlaceholder":108},[84,11410,11411],{"class":86,"line":124},[84,11412,4327],{},[10,11414,136],{},[75,11416,11418],{"className":11417,"code":4333,"language":142,"meta":80},[140],[43,11419,4333],{"__ignoreMap":80},[10,11421,147],{},[14,11423,150],{"id":150},[152,11425,11426,11430],{},[40,11427,4344,11428,4348],{},[43,11429,4347],{},[40,11431,4351,11432,4354],{},[43,11433,4347],{},[318,11435,2642],{"id":2642},[10,11437,4359],{},[10,11439,11440],{},[26,11441],{"alt":4364,"src":4365},[10,11443,4368,11444,4371],{},[43,11445,4347],{},[14,11447,168],{"id":168},[37,11449,11450,11452],{},[40,11451,4378],{},[40,11453,4381],{},[14,11455,183],{"id":183},[152,11457,11458,11462],{},[40,11459,2328,11460,4390],{},[43,11461,4267],{},[40,11463,4393],{},[10,11465,194],{},[14,11467,197],{"id":197},[10,11469,4400],{},[202,11471,204],{},{"title":80,"searchDepth":93,"depth":93,"links":11473},[11474,11475,11476,11477,11478,11481,11482,11483],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":11479},[11480],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":4244,"description":4249},[215,4267,4422],{"id":4425,"title":4426,"body":11488,"category":215,"cover":216,"description":4431,"extension":217,"meta":11613,"navigation":108,"path":4580,"pinned":220,"publishedAt":221,"seo":11614,"slug":4582,"stem":4583,"summary":4584,"tags":11615,"updatedAt":221,"visible":108,"__hash__":4587},{"type":7,"value":11489,"toc":11603},[11490,11492,11494,11496,11498,11502,11506,11508,11518,11520,11522,11554,11556,11561,11563,11565,11577,11579,11585,11587,11595,11597,11599,11601],[10,11491,4431],{},[14,11493,16],{"id":16},[10,11495,4436],{},[14,11497,22],{"id":22},[10,11499,11500],{},[26,11501],{"alt":4443,"src":4444},[10,11503,11504,4449],{},[43,11505,4284],{},[14,11507,35],{"id":35},[37,11509,11510,11514,11516],{},[40,11511,11512,4459],{},[43,11513,4458],{},[40,11515,4462],{},[40,11517,4465],{},[14,11519,70],{"id":70},[10,11521,73],{},[75,11523,11524],{"className":77,"code":4472,"language":79,"meta":80,"style":80},[43,11525,11526,11530,11534,11538,11542,11546,11550],{"__ignoreMap":80},[84,11527,11528],{"class":86,"line":87},[84,11529,4479],{},[84,11531,11532],{"class":86,"line":93},[84,11533,109],{"emptyLinePlaceholder":108},[84,11535,11536],{"class":86,"line":99},[84,11537,4488],{},[84,11539,11540],{"class":86,"line":105},[84,11541,4493],{},[84,11543,11544],{"class":86,"line":112},[84,11545,109],{"emptyLinePlaceholder":108},[84,11547,11548],{"class":86,"line":118},[84,11549,4502],{},[84,11551,11552],{"class":86,"line":124},[84,11553,4507],{},[10,11555,136],{},[75,11557,11559],{"className":11558,"code":4513,"language":142,"meta":80},[140],[43,11560,4513],{"__ignoreMap":80},[10,11562,147],{},[14,11564,150],{"id":150},[152,11566,11567,11573],{},[40,11568,4524,11569,4527,11571,4531],{},[43,11570,4284],{},[43,11572,4530],{},[40,11574,11575,4536],{},[43,11576,4458],{},[14,11578,168],{"id":168},[37,11580,11581,11583],{},[40,11582,4543],{},[40,11584,4546],{},[14,11586,183],{"id":183},[152,11588,11589,11591],{},[40,11590,4553],{},[40,11592,2328,11593,4559],{},[43,11594,4558],{},[10,11596,194],{},[14,11598,197],{"id":197},[10,11600,4566],{},[202,11602,204],{},{"title":80,"searchDepth":93,"depth":93,"links":11604},[11605,11606,11607,11608,11609,11610,11611,11612],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":4426,"description":4431},[215,4284,4586],{"id":4589,"title":4590,"body":11617,"category":215,"cover":216,"description":4595,"extension":217,"meta":11762,"navigation":108,"path":4770,"pinned":220,"publishedAt":221,"seo":11763,"slug":4772,"stem":4773,"summary":4774,"tags":11764,"updatedAt":221,"visible":108,"__hash__":4776},{"type":7,"value":11618,"toc":11752},[11619,11621,11623,11625,11627,11631,11637,11639,11653,11655,11657,11701,11703,11708,11710,11712,11722,11724,11736,11738,11744,11746,11748,11750],[10,11620,4595],{},[14,11622,16],{"id":16},[10,11624,4600],{},[14,11626,22],{"id":22},[10,11628,11629],{},[26,11630],{"alt":4607,"src":4608},[10,11632,11633,4614,11635,4618],{},[43,11634,4613],{},[43,11636,4617],{},[14,11638,35],{"id":35},[37,11640,11641,11643,11649],{},[40,11642,4625],{},[40,11644,11645,4630,11647,4633],{},[43,11646,4613],{},[43,11648,4267],{},[40,11650,4636,11651,4639],{},[43,11652,4617],{},[14,11654,70],{"id":70},[10,11656,73],{},[75,11658,11659],{"className":77,"code":4646,"language":79,"meta":80,"style":80},[43,11660,11661,11665,11669,11673,11677,11681,11685,11689,11693,11697],{"__ignoreMap":80},[84,11662,11663],{"class":86,"line":87},[84,11664,4653],{},[84,11666,11667],{"class":86,"line":93},[84,11668,109],{"emptyLinePlaceholder":108},[84,11670,11671],{"class":86,"line":99},[84,11672,4662],{},[84,11674,11675],{"class":86,"line":105},[84,11676,4667],{},[84,11678,11679],{"class":86,"line":112},[84,11680,4672],{},[84,11682,11683],{"class":86,"line":118},[84,11684,4677],{},[84,11686,11687],{"class":86,"line":124},[84,11688,4682],{},[84,11690,11691],{"class":86,"line":130},[84,11692,4507],{},[84,11694,11695],{"class":86,"line":3898},[84,11696,109],{"emptyLinePlaceholder":108},[84,11698,11699],{"class":86,"line":4110},[84,11700,4695],{},[10,11702,136],{},[75,11704,11706],{"className":11705,"code":4701,"language":142,"meta":80},[140],[43,11707,4701],{"__ignoreMap":80},[10,11709,147],{},[14,11711,150],{"id":150},[152,11713,11714,11718],{},[40,11715,4712,11716,4715],{},[43,11717,4613],{},[40,11719,4718,11720,4721],{},[43,11721,4617],{},[14,11723,168],{"id":168},[37,11725,11726,11730],{},[40,11727,3412,11728,4730],{},[43,11729,4613],{},[40,11731,4733,11732,4736,11734,4739],{},[43,11733,4267],{},[43,11735,4613],{},[14,11737,183],{"id":183},[152,11739,11740,11742],{},[40,11741,4746],{},[40,11743,4749],{},[10,11745,194],{},[14,11747,197],{"id":197},[10,11749,4756],{},[202,11751,204],{},{"title":80,"searchDepth":93,"depth":93,"links":11753},[11754,11755,11756,11757,11758,11759,11760,11761],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":4590,"description":4595},[215,4617,4613],{"id":4778,"title":4779,"body":11766,"category":215,"cover":216,"description":4784,"extension":217,"meta":11905,"navigation":108,"path":4956,"pinned":220,"publishedAt":221,"seo":11906,"slug":4958,"stem":4959,"summary":4960,"tags":11907,"updatedAt":221,"visible":108,"__hash__":4964},{"type":7,"value":11767,"toc":11893},[11768,11770,11772,11774,11776,11780,11782,11784,11800,11802,11804,11832,11834,11839,11841,11843,11855,11857,11859,11863,11865,11867,11877,11879,11885,11887,11889,11891],[10,11769,4784],{},[14,11771,16],{"id":16},[10,11773,4789],{},[14,11775,22],{"id":22},[10,11777,11778],{},[26,11779],{"alt":4796,"src":4797},[10,11781,4800],{},[14,11783,35],{"id":35},[37,11785,11786,11788,11790],{},[40,11787,4807],{},[40,11789,4810],{},[40,11791,4813,11792,2246,11794,4820,11796,2246,11798,177],{},[43,11793,4816],{},[43,11795,4819],{},[43,11797,4823],{},[43,11799,4826],{},[14,11801,70],{"id":70},[10,11803,73],{},[75,11805,11806],{"className":77,"code":4833,"language":79,"meta":80,"style":80},[43,11807,11808,11812,11816,11820,11824,11828],{"__ignoreMap":80},[84,11809,11810],{"class":86,"line":87},[84,11811,4840],{},[84,11813,11814],{"class":86,"line":93},[84,11815,109],{"emptyLinePlaceholder":108},[84,11817,11818],{"class":86,"line":99},[84,11819,4849],{},[84,11821,11822],{"class":86,"line":105},[84,11823,4854],{},[84,11825,11826],{"class":86,"line":112},[84,11827,4859],{},[84,11829,11830],{"class":86,"line":118},[84,11831,4864],{},[10,11833,136],{},[75,11835,11837],{"className":11836,"code":4870,"language":142,"meta":80},[140],[43,11838,4870],{"__ignoreMap":80},[10,11840,147],{},[14,11842,150],{"id":150},[152,11844,11845,11853],{},[40,11846,4881,11847,4884,11849,1146,11851,177],{},[43,11848,4816],{},[43,11850,4887],{},[43,11852,4890],{},[40,11854,4893],{},[318,11856,2642],{"id":2642},[10,11858,4898],{},[10,11860,11861],{},[26,11862],{"alt":4903,"src":4904},[10,11864,4907],{},[14,11866,168],{"id":168},[37,11868,11869,11875],{},[40,11870,4914,11871,998,11873,4920],{},[43,11872,4917],{},[43,11874,4823],{},[40,11876,4923],{},[14,11878,183],{"id":183},[152,11880,11881,11883],{},[40,11882,4930],{},[40,11884,4933],{},[10,11886,194],{},[14,11888,197],{"id":197},[10,11890,4940],{},[202,11892,204],{},{"title":80,"searchDepth":93,"depth":93,"links":11894},[11895,11896,11897,11898,11899,11902,11903,11904],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":11900},[11901],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":4779,"description":4784},[215,4962,4963],{"id":4966,"title":4967,"body":11909,"category":215,"cover":216,"description":4972,"extension":217,"meta":12026,"navigation":108,"path":5111,"pinned":220,"publishedAt":221,"seo":12027,"slug":5113,"stem":5114,"summary":5115,"tags":12028,"updatedAt":221,"visible":108,"__hash__":5119},{"type":7,"value":11910,"toc":12016},[11911,11913,11915,11917,11919,11923,11925,11927,11935,11937,11939,11971,11973,11978,11980,11982,11990,11992,12000,12002,12008,12010,12012,12014],[10,11912,4972],{},[14,11914,16],{"id":16},[10,11916,4977],{},[14,11918,22],{"id":22},[10,11920,11921],{},[26,11922],{"alt":4984,"src":4985},[10,11924,4988],{},[14,11926,35],{"id":35},[37,11928,11929,11931,11933],{},[40,11930,4995],{},[40,11932,4998],{},[40,11934,5001],{},[14,11936,70],{"id":70},[10,11938,73],{},[75,11940,11941],{"className":77,"code":5008,"language":79,"meta":80,"style":80},[43,11942,11943,11947,11951,11955,11959,11963,11967],{"__ignoreMap":80},[84,11944,11945],{"class":86,"line":87},[84,11946,5015],{},[84,11948,11949],{"class":86,"line":93},[84,11950,109],{"emptyLinePlaceholder":108},[84,11952,11953],{"class":86,"line":99},[84,11954,5024],{},[84,11956,11957],{"class":86,"line":105},[84,11958,5029],{},[84,11960,11961],{"class":86,"line":112},[84,11962,109],{"emptyLinePlaceholder":108},[84,11964,11965],{"class":86,"line":118},[84,11966,5038],{},[84,11968,11969],{"class":86,"line":124},[84,11970,5043],{},[10,11972,136],{},[75,11974,11976],{"className":11975,"code":5049,"language":142,"meta":80},[140],[43,11977,5049],{"__ignoreMap":80},[10,11979,147],{},[14,11981,150],{"id":150},[152,11983,11984,11986],{},[40,11985,5060],{},[40,11987,5063,11988,5067],{},[43,11989,5066],{},[14,11991,168],{"id":168},[37,11993,11994,11998],{},[40,11995,5074,11996,5077],{},[43,11997,4284],{},[40,11999,5080],{},[14,12001,183],{"id":183},[152,12003,12004,12006],{},[40,12005,5087],{},[40,12007,5090],{},[10,12009,194],{},[14,12011,197],{"id":197},[10,12013,5097],{},[202,12015,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12017},[12018,12019,12020,12021,12022,12023,12024,12025],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":4967,"description":4972},[215,5117,5118],{"id":5121,"title":5122,"body":12030,"category":215,"cover":216,"description":5127,"extension":217,"meta":12149,"navigation":108,"path":5271,"pinned":220,"publishedAt":221,"seo":12150,"slug":5273,"stem":5274,"summary":5275,"tags":12151,"updatedAt":221,"visible":108,"__hash__":5279},{"type":7,"value":12031,"toc":12139},[12032,12034,12036,12038,12040,12044,12046,12048,12056,12058,12060,12092,12094,12099,12101,12103,12113,12115,12121,12123,12131,12133,12135,12137],[10,12033,5127],{},[14,12035,16],{"id":16},[10,12037,5132],{},[14,12039,22],{"id":22},[10,12041,12042],{},[26,12043],{"alt":5139,"src":5140},[10,12045,5143],{},[14,12047,35],{"id":35},[37,12049,12050,12052,12054],{},[40,12051,5150],{},[40,12053,5153],{},[40,12055,5156],{},[14,12057,70],{"id":70},[10,12059,73],{},[75,12061,12062],{"className":77,"code":5163,"language":79,"meta":80,"style":80},[43,12063,12064,12068,12072,12076,12080,12084,12088],{"__ignoreMap":80},[84,12065,12066],{"class":86,"line":87},[84,12067,5170],{},[84,12069,12070],{"class":86,"line":93},[84,12071,5175],{},[84,12073,12074],{"class":86,"line":99},[84,12075,5180],{},[84,12077,12078],{"class":86,"line":105},[84,12079,109],{"emptyLinePlaceholder":108},[84,12081,12082],{"class":86,"line":112},[84,12083,5189],{},[84,12085,12086],{"class":86,"line":118},[84,12087,5194],{},[84,12089,12090],{"class":86,"line":124},[84,12091,5199],{},[10,12093,136],{},[75,12095,12097],{"className":12096,"code":5205,"language":142,"meta":80},[140],[43,12098,5205],{"__ignoreMap":80},[10,12100,147],{},[14,12102,150],{"id":150},[152,12104,12105,12109],{},[40,12106,927,12107,5219],{},[43,12108,5218],{},[40,12110,5222,12111,5226],{},[43,12112,5225],{},[14,12114,168],{"id":168},[37,12116,12117,12119],{},[40,12118,5233],{},[40,12120,5236],{},[14,12122,183],{"id":183},[152,12124,12125,12129],{},[40,12126,5243,12127,5247],{},[43,12128,5246],{},[40,12130,5250],{},[10,12132,194],{},[14,12134,197],{"id":197},[10,12136,5257],{},[202,12138,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12140},[12141,12142,12143,12144,12145,12146,12147,12148],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5122,"description":5127},[215,5277,5278],{"id":5281,"title":5282,"body":12153,"category":215,"cover":216,"description":5287,"extension":217,"meta":12298,"navigation":108,"path":5468,"pinned":220,"publishedAt":221,"seo":12299,"slug":5470,"stem":5471,"summary":5472,"tags":12300,"updatedAt":221,"visible":108,"__hash__":5476},{"type":7,"value":12154,"toc":12286},[12155,12157,12159,12161,12163,12167,12171,12173,12185,12187,12189,12217,12219,12224,12226,12228,12242,12244,12246,12250,12258,12260,12270,12272,12278,12280,12282,12284],[10,12156,5287],{},[14,12158,16],{"id":16},[10,12160,5292],{},[14,12162,22],{"id":22},[10,12164,12165],{},[26,12166],{"alt":5299,"src":5300},[10,12168,5303,12169,5307],{},[43,12170,5306],{},[14,12172,35],{"id":35},[37,12174,12175,12177,12179],{},[40,12176,5314],{},[40,12178,5317],{},[40,12180,5320,12181,5323,12183,177],{},[43,12182,5306],{},[43,12184,5326],{},[14,12186,70],{"id":70},[10,12188,73],{},[75,12190,12191],{"className":77,"code":5333,"language":79,"meta":80,"style":80},[43,12192,12193,12197,12201,12205,12209,12213],{"__ignoreMap":80},[84,12194,12195],{"class":86,"line":87},[84,12196,5340],{},[84,12198,12199],{"class":86,"line":93},[84,12200,5345],{},[84,12202,12203],{"class":86,"line":99},[84,12204,5350],{},[84,12206,12207],{"class":86,"line":105},[84,12208,109],{"emptyLinePlaceholder":108},[84,12210,12211],{"class":86,"line":112},[84,12212,5359],{},[84,12214,12215],{"class":86,"line":118},[84,12216,5364],{},[10,12218,136],{},[75,12220,12222],{"className":12221,"code":5370,"language":142,"meta":80},[140],[43,12223,5370],{"__ignoreMap":80},[10,12225,147],{},[14,12227,150],{"id":150},[152,12229,12230,12236],{},[40,12231,5381,12232,2246,12234,5387],{},[43,12233,5384],{},[43,12235,4347],{},[40,12237,12238,5393,12240,5397],{},[43,12239,5392],{},[43,12241,5396],{},[318,12243,2642],{"id":2642},[10,12245,5402],{},[10,12247,12248],{},[26,12249],{"alt":5407,"src":5408},[10,12251,12252,2246,12254,1146,12256,5418],{},[43,12253,5384],{},[43,12255,4347],{},[43,12257,5417],{},[14,12259,168],{"id":168},[37,12261,12262,12266],{},[40,12263,5425,12264,5429],{},[43,12265,5428],{},[40,12267,5432,12268,5435],{},[43,12269,5417],{},[14,12271,183],{"id":183},[152,12273,12274,12276],{},[40,12275,5442],{},[40,12277,5445],{},[10,12279,194],{},[14,12281,197],{"id":197},[10,12283,5452],{},[202,12285,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12287},[12288,12289,12290,12291,12292,12295,12296,12297],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":12293},[12294],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5282,"description":5287},[215,5474,5475],{"id":5478,"title":5479,"body":12302,"category":215,"cover":216,"description":5484,"extension":217,"meta":12451,"navigation":108,"path":5665,"pinned":220,"publishedAt":221,"seo":12452,"slug":5667,"stem":5668,"summary":5669,"tags":12453,"updatedAt":221,"visible":108,"__hash__":5673},{"type":7,"value":12303,"toc":12439},[12304,12306,12308,12310,12312,12316,12318,12320,12332,12334,12336,12380,12382,12387,12389,12391,12403,12405,12407,12411,12413,12415,12423,12425,12431,12433,12435,12437],[10,12305,5484],{},[14,12307,16],{"id":16},[10,12309,5489],{},[14,12311,22],{"id":22},[10,12313,12314],{},[26,12315],{"alt":5496,"src":5497},[10,12317,5500],{},[14,12319,35],{"id":35},[37,12321,12322,12324,12328],{},[40,12323,5507],{},[40,12325,12326,5513],{},[43,12327,5512],{},[40,12329,12330,5519],{},[43,12331,5518],{},[14,12333,70],{"id":70},[10,12335,73],{},[75,12337,12338],{"className":77,"code":5526,"language":79,"meta":80,"style":80},[43,12339,12340,12344,12348,12352,12356,12360,12364,12368,12372,12376],{"__ignoreMap":80},[84,12341,12342],{"class":86,"line":87},[84,12343,5533],{},[84,12345,12346],{"class":86,"line":93},[84,12347,5538],{},[84,12349,12350],{"class":86,"line":99},[84,12351,109],{"emptyLinePlaceholder":108},[84,12353,12354],{"class":86,"line":105},[84,12355,5547],{},[84,12357,12358],{"class":86,"line":112},[84,12359,5552],{},[84,12361,12362],{"class":86,"line":118},[84,12363,109],{"emptyLinePlaceholder":108},[84,12365,12366],{"class":86,"line":124},[84,12367,5561],{},[84,12369,12370],{"class":86,"line":130},[84,12371,5566],{},[84,12373,12374],{"class":86,"line":3898},[84,12375,109],{"emptyLinePlaceholder":108},[84,12377,12378],{"class":86,"line":4110},[84,12379,5575],{},[10,12381,136],{},[75,12383,12385],{"className":12384,"code":5581,"language":142,"meta":80},[140],[43,12386,5581],{"__ignoreMap":80},[10,12388,147],{},[14,12390,150],{"id":150},[152,12392,12393,12397],{},[40,12394,5592,12395,5596],{},[43,12396,5595],{},[40,12398,12399,5602,12401,177],{},[43,12400,5601],{},[43,12402,5605],{},[318,12404,2642],{"id":2642},[10,12406,5610],{},[10,12408,12409],{},[26,12410],{"alt":5615,"src":5616},[10,12412,5619],{},[14,12414,168],{"id":168},[37,12416,12417,12421],{},[40,12418,5626,12419,5629],{},[43,12420,5326],{},[40,12422,5632],{},[14,12424,183],{"id":183},[152,12426,12427,12429],{},[40,12428,5639],{},[40,12430,5642],{},[10,12432,194],{},[14,12434,197],{"id":197},[10,12436,5649],{},[202,12438,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12440},[12441,12442,12443,12444,12445,12448,12449,12450],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":12446},[12447],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5479,"description":5484},[215,5671,5672],{"id":5675,"title":5676,"body":12455,"category":215,"cover":216,"description":5681,"extension":217,"meta":12616,"navigation":108,"path":5879,"pinned":220,"publishedAt":221,"seo":12617,"slug":5881,"stem":5882,"summary":5883,"tags":12618,"updatedAt":221,"visible":108,"__hash__":5887},{"type":7,"value":12456,"toc":12604},[12457,12459,12461,12463,12465,12469,12471,12473,12485,12487,12489,12541,12543,12548,12550,12552,12570,12572,12574,12578,12580,12582,12588,12590,12596,12598,12600,12602],[10,12458,5681],{},[14,12460,16],{"id":16},[10,12462,5686],{},[14,12464,22],{"id":22},[10,12466,12467],{},[26,12468],{"alt":5693,"src":5694},[10,12470,5697],{},[14,12472,35],{"id":35},[37,12474,12475,12477,12479],{},[40,12476,5704],{},[40,12478,5707],{},[40,12480,12481,2165,12483,5716],{},[43,12482,5712],{},[43,12484,5715],{},[14,12486,70],{"id":70},[10,12488,73],{},[75,12490,12491],{"className":77,"code":5723,"language":79,"meta":80,"style":80},[43,12492,12493,12497,12501,12505,12509,12513,12517,12521,12525,12529,12533,12537],{"__ignoreMap":80},[84,12494,12495],{"class":86,"line":87},[84,12496,5730],{},[84,12498,12499],{"class":86,"line":93},[84,12500,109],{"emptyLinePlaceholder":108},[84,12502,12503],{"class":86,"line":99},[84,12504,5739],{},[84,12506,12507],{"class":86,"line":105},[84,12508,5744],{},[84,12510,12511],{"class":86,"line":112},[84,12512,109],{"emptyLinePlaceholder":108},[84,12514,12515],{"class":86,"line":118},[84,12516,5753],{},[84,12518,12519],{"class":86,"line":124},[84,12520,5758],{},[84,12522,12523],{"class":86,"line":130},[84,12524,5763],{},[84,12526,12527],{"class":86,"line":3898},[84,12528,109],{"emptyLinePlaceholder":108},[84,12530,12531],{"class":86,"line":4110},[84,12532,5772],{},[84,12534,12535],{"class":86,"line":5775},[84,12536,109],{"emptyLinePlaceholder":108},[84,12538,12539],{"class":86,"line":5780},[84,12540,5783],{},[10,12542,136],{},[75,12544,12546],{"className":12545,"code":5789,"language":142,"meta":80},[140],[43,12547,5789],{"__ignoreMap":80},[10,12549,147],{},[14,12551,150],{"id":150},[152,12553,12554,12564],{},[40,12555,12556,5803,12558,5807,12560,5810,12562,5814],{},[43,12557,5802],{},[43,12559,5806],{},[43,12561,5595],{},[43,12563,5813],{},[40,12565,12566,5819,12568,5822],{},[43,12567,4530],{},[43,12569,2197],{},[318,12571,2642],{"id":2642},[10,12573,5827],{},[10,12575,12576],{},[26,12577],{"alt":5832,"src":5833},[10,12579,5836],{},[14,12581,168],{"id":168},[37,12583,12584,12586],{},[40,12585,5843],{},[40,12587,5846],{},[14,12589,183],{"id":183},[152,12591,12592,12594],{},[40,12593,5853],{},[40,12595,5856],{},[10,12597,194],{},[14,12599,197],{"id":197},[10,12601,5863],{},[202,12603,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12605},[12606,12607,12608,12609,12610,12613,12614,12615],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":12611},[12612],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5676,"description":5681},[215,5885,5886],{"id":5889,"title":5890,"body":12620,"category":215,"cover":216,"description":5895,"extension":217,"meta":12743,"navigation":108,"path":6046,"pinned":220,"publishedAt":221,"seo":12744,"slug":6048,"stem":6049,"summary":6050,"tags":12745,"updatedAt":221,"visible":108,"__hash__":6054},{"type":7,"value":12621,"toc":12733},[12622,12624,12626,12628,12630,12634,12636,12638,12652,12654,12656,12684,12686,12691,12693,12695,12705,12707,12715,12717,12725,12727,12729,12731],[10,12623,5895],{},[14,12625,16],{"id":16},[10,12627,5900],{},[14,12629,22],{"id":22},[10,12631,12632],{},[26,12633],{"alt":5907,"src":5908},[10,12635,5911],{},[14,12637,35],{"id":35},[37,12639,12640,12642,12644],{},[40,12641,5918],{},[40,12643,5921],{},[40,12645,5924,12646,2246,12648,2246,12650,5932],{},[43,12647,2249],{},[43,12649,45],{},[43,12651,5931],{},[14,12653,70],{"id":70},[10,12655,73],{},[75,12657,12658],{"className":77,"code":5939,"language":79,"meta":80,"style":80},[43,12659,12660,12664,12668,12672,12676,12680],{"__ignoreMap":80},[84,12661,12662],{"class":86,"line":87},[84,12663,5946],{},[84,12665,12666],{"class":86,"line":93},[84,12667,5951],{},[84,12669,12670],{"class":86,"line":99},[84,12671,5956],{},[84,12673,12674],{"class":86,"line":105},[84,12675,109],{"emptyLinePlaceholder":108},[84,12677,12678],{"class":86,"line":112},[84,12679,5965],{},[84,12681,12682],{"class":86,"line":118},[84,12683,5970],{},[10,12685,136],{},[75,12687,12689],{"className":12688,"code":5976,"language":142,"meta":80},[140],[43,12690,5976],{"__ignoreMap":80},[10,12692,147],{},[14,12694,150],{"id":150},[152,12696,12697,12703],{},[40,12698,5987,12699,5991,12701,5994],{},[43,12700,5990],{},[43,12702,2235],{},[40,12704,5997],{},[14,12706,168],{"id":168},[37,12708,12709,12713],{},[40,12710,6004,12711,6008],{},[43,12712,6007],{},[40,12714,6011],{},[14,12716,183],{"id":183},[152,12718,12719,12721],{},[40,12720,6018],{},[40,12722,6021,12723,6025],{},[43,12724,6024],{},[10,12726,194],{},[14,12728,197],{"id":197},[10,12730,6032],{},[202,12732,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12734},[12735,12736,12737,12738,12739,12740,12741,12742],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":5890,"description":5895},[215,6052,6053],{"id":6056,"title":6057,"body":12747,"category":215,"cover":216,"description":6062,"extension":217,"meta":12924,"navigation":108,"path":6290,"pinned":220,"publishedAt":221,"seo":12925,"slug":6292,"stem":6293,"summary":6294,"tags":12926,"updatedAt":221,"visible":108,"__hash__":6298},{"type":7,"value":12748,"toc":12912},[12749,12751,12753,12757,12759,12763,12769,12771,12783,12785,12789,12813,12817,12833,12839,12841,12846,12848,12850,12866,12868,12870,12874,12878,12880,12892,12894,12904,12906,12908,12910],[10,12750,6062],{},[14,12752,16],{"id":16},[10,12754,6067,12755,6070],{},[284,12756,5990],{},[14,12758,22],{"id":22},[10,12760,12761],{},[26,12762],{"alt":6077,"src":6078},[10,12764,6081,12765,6085,12767,6089],{},[43,12766,6084],{},[43,12768,6088],{},[14,12770,35],{"id":35},[37,12772,12773,12777,12779],{},[40,12774,6096,12775,6099],{},[43,12776,1160],{},[40,12778,6102],{},[40,12780,6105,12781,6109],{},[43,12782,6108],{},[14,12784,70],{"id":70},[10,12786,6114,12787,6118],{},[43,12788,6117],{},[75,12790,12791],{"className":77,"code":6121,"language":79,"meta":80,"style":80},[43,12792,12793,12797,12801,12805,12809],{"__ignoreMap":80},[84,12794,12795],{"class":86,"line":87},[84,12796,6128],{},[84,12798,12799],{"class":86,"line":93},[84,12800,6133],{},[84,12802,12803],{"class":86,"line":99},[84,12804,109],{"emptyLinePlaceholder":108},[84,12806,12807],{"class":86,"line":105},[84,12808,6142],{},[84,12810,12811],{"class":86,"line":112},[84,12812,6147],{},[10,12814,6150,12815,6154],{},[43,12816,6153],{},[75,12818,12819],{"className":77,"code":6157,"language":79,"meta":80,"style":80},[43,12820,12821,12825,12829],{"__ignoreMap":80},[84,12822,12823],{"class":86,"line":87},[84,12824,6164],{},[84,12826,12827],{"class":86,"line":93},[84,12828,109],{"emptyLinePlaceholder":108},[84,12830,12831],{"class":86,"line":99},[84,12832,6173],{},[10,12834,6176,12835,1146,12837,177],{},[43,12836,6179],{},[43,12838,6182],{},[10,12840,136],{},[75,12842,12844],{"className":12843,"code":6188,"language":142,"meta":80},[140],[43,12845,6188],{"__ignoreMap":80},[10,12847,147],{},[14,12849,150],{"id":150},[152,12851,12852,12858],{},[40,12853,6199,12854,6202,12856,6206],{},[43,12855,6117],{},[43,12857,6205],{},[40,12859,12860,6211,12862,6214,12864,6217],{},[43,12861,6153],{},[43,12863,6117],{},[43,12865,6153],{},[318,12867,2642],{"id":2642},[10,12869,6222],{},[10,12871,12872],{},[26,12873],{"alt":6227,"src":6228},[10,12875,6231,12876,6234],{},[43,12877,6205],{},[14,12879,168],{"id":168},[37,12881,12882,12888],{},[40,12883,6241,12884,1146,12886,177],{},[43,12885,6117],{},[43,12887,6153],{},[40,12889,6248,12890,6252],{},[43,12891,6251],{},[14,12893,183],{"id":183},[152,12895,12896,12900],{},[40,12897,2343,12898,6262],{},[43,12899,6261],{},[40,12901,6265,12902,177],{},[43,12903,6084],{},[10,12905,194],{},[14,12907,197],{"id":197},[10,12909,6274],{},[202,12911,204],{},{"title":80,"searchDepth":93,"depth":93,"links":12913},[12914,12915,12916,12917,12918,12921,12922,12923],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":12919},[12920],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":6057,"description":6062},[215,6296,6297],{"id":6300,"title":6301,"body":12928,"category":215,"cover":216,"description":6306,"extension":217,"meta":13067,"navigation":108,"path":6472,"pinned":220,"publishedAt":221,"seo":13068,"slug":6474,"stem":6475,"summary":6476,"tags":13069,"updatedAt":221,"visible":108,"__hash__":6479},{"type":7,"value":12929,"toc":13057},[12930,12932,12934,12936,12938,12942,12944,12946,12956,12958,12960,13000,13002,13007,13009,13011,13029,13031,13039,13041,13049,13051,13053,13055],[10,12931,6306],{},[14,12933,16],{"id":16},[10,12935,6311],{},[14,12937,22],{"id":22},[10,12939,12940],{},[26,12941],{"alt":6318,"src":6319},[10,12943,6322],{},[14,12945,35],{"id":35},[37,12947,12948,12952,12954],{},[40,12949,12950,6332],{},[43,12951,6331],{},[40,12953,6335],{},[40,12955,6338],{},[14,12957,70],{"id":70},[10,12959,1563],{},[75,12961,12962],{"className":580,"code":6345,"language":582,"meta":80,"style":80},[43,12963,12964,12974,12980,12986,12996],{"__ignoreMap":80},[84,12965,12966,12968,12970,12972],{"class":86,"line":87},[84,12967,680],{"class":589},[84,12969,622],{"class":592},[84,12971,6356],{"class":625},[84,12973,6359],{"class":625},[84,12975,12976,12978],{"class":86,"line":93},[84,12977,6364],{"class":592},[84,12979,6367],{"class":625},[84,12981,12982,12984],{"class":86,"line":99},[84,12983,79],{"class":589},[84,12985,593],{"class":592},[84,12987,12988,12990,12992,12994],{"class":86,"line":105},[84,12989,79],{"class":589},[84,12991,622],{"class":592},[84,12993,626],{"class":625},[84,12995,593],{"class":592},[84,12997,12998],{"class":86,"line":112},[84,12999,6388],{"class":589},[10,13001,136],{},[75,13003,13005],{"className":13004,"code":6394,"language":142,"meta":80},[140],[43,13006,6394],{"__ignoreMap":80},[10,13008,147],{},[14,13010,150],{"id":150},[152,13012,13013,13019],{},[40,13014,13015,6408,13017,6411],{},[43,13016,6407],{},[43,13018,680],{},[40,13020,6414,13021,2165,13023,6420,13025,3673,13027,6426],{},[43,13022,79],{},[43,13024,6419],{},[43,13026,6331],{},[43,13028,6425],{},[14,13030,168],{"id":168},[37,13032,13033,13035],{},[40,13034,6433],{},[40,13036,3412,13037,6438],{},[43,13038,6331],{},[14,13040,183],{"id":183},[152,13042,13043,13047],{},[40,13044,6445,13045,177],{},[43,13046,6448],{},[40,13048,6451],{},[10,13050,194],{},[14,13052,197],{"id":197},[10,13054,6458],{},[202,13056,1647],{},{"title":80,"searchDepth":93,"depth":93,"links":13058},[13059,13060,13061,13062,13063,13064,13065,13066],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":6301,"description":6306},[215,6478,250],{"id":6481,"title":6482,"body":13071,"category":215,"cover":216,"description":6487,"extension":217,"meta":13224,"navigation":108,"path":6676,"pinned":220,"publishedAt":221,"seo":13225,"slug":6678,"stem":6679,"summary":6680,"tags":13226,"updatedAt":221,"visible":108,"__hash__":6684},{"type":7,"value":13072,"toc":13214},[13073,13075,13077,13079,13081,13085,13091,13093,13109,13111,13113,13157,13159,13164,13166,13168,13180,13182,13196,13198,13206,13208,13210,13212],[10,13074,6487],{},[14,13076,16],{"id":16},[10,13078,6492],{},[14,13080,22],{"id":22},[10,13082,13083],{},[26,13084],{"alt":6499,"src":6500},[10,13086,13087,6506,13089,6509],{},[43,13088,6505],{},[43,13090,55],{},[14,13092,35],{"id":35},[37,13094,13095,13097,13105],{},[40,13096,6516],{},[40,13098,13099,2246,13101,2246,13103,6528],{},[43,13100,6521],{},[43,13102,6524],{},[43,13104,6527],{},[40,13106,6531,13107,6535],{},[43,13108,6534],{},[14,13110,70],{"id":70},[10,13112,73],{},[75,13114,13115],{"className":77,"code":6542,"language":79,"meta":80,"style":80},[43,13116,13117,13121,13125,13129,13133,13137,13141,13145,13149,13153],{"__ignoreMap":80},[84,13118,13119],{"class":86,"line":87},[84,13120,6549],{},[84,13122,13123],{"class":86,"line":93},[84,13124,109],{"emptyLinePlaceholder":108},[84,13126,13127],{"class":86,"line":99},[84,13128,6558],{},[84,13130,13131],{"class":86,"line":105},[84,13132,6563],{},[84,13134,13135],{"class":86,"line":112},[84,13136,6568],{},[84,13138,13139],{"class":86,"line":118},[84,13140,109],{"emptyLinePlaceholder":108},[84,13142,13143],{"class":86,"line":124},[84,13144,6577],{},[84,13146,13147],{"class":86,"line":130},[84,13148,6582],{},[84,13150,13151],{"class":86,"line":3898},[84,13152,6587],{},[84,13154,13155],{"class":86,"line":4110},[84,13156,6592],{},[10,13158,136],{},[75,13160,13162],{"className":13161,"code":6598,"language":142,"meta":80},[140],[43,13163,6598],{"__ignoreMap":80},[10,13165,147],{},[14,13167,150],{"id":150},[152,13169,13170,13174],{},[40,13171,13172,6612],{},[43,13173,6611],{},[40,13175,2328,13176,6617,13178,6620],{},[43,13177,55],{},[43,13179,6505],{},[14,13181,168],{"id":168},[37,13183,13184,13190],{},[40,13185,3412,13186,6629,13188,6632],{},[43,13187,6505],{},[43,13189,6521],{},[40,13191,6635,13192,998,13194,6641],{},[43,13193,55],{},[43,13195,6640],{},[14,13197,183],{"id":183},[152,13199,13200,13204],{},[40,13201,6648,13202,6652],{},[43,13203,6651],{},[40,13205,6655],{},[10,13207,194],{},[14,13209,197],{"id":197},[10,13211,6662],{},[202,13213,204],{},{"title":80,"searchDepth":93,"depth":93,"links":13215},[13216,13217,13218,13219,13220,13221,13222,13223],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":6482,"description":6487},[215,6682,6683],{"id":6686,"title":6687,"body":13228,"category":215,"cover":216,"description":6692,"extension":217,"meta":13375,"navigation":108,"path":6871,"pinned":220,"publishedAt":221,"seo":13376,"slug":6873,"stem":6874,"summary":6875,"tags":13377,"updatedAt":221,"visible":108,"__hash__":6879},{"type":7,"value":13229,"toc":13365},[13230,13232,13234,13236,13238,13242,13244,13246,13264,13266,13268,13316,13318,13323,13325,13327,13335,13337,13347,13349,13357,13359,13361,13363],[10,13231,6692],{},[14,13233,16],{"id":16},[10,13235,6697],{},[14,13237,22],{"id":22},[10,13239,13240],{},[26,13241],{"alt":6704,"src":6705},[10,13243,6708],{},[14,13245,35],{"id":35},[37,13247,13248,13252,13258],{},[40,13249,13250,6718],{},[43,13251,6717],{},[40,13253,13254,6724,13256,177],{},[43,13255,6723],{},[43,13257,6727],{},[40,13259,6730,13260,6734,13262,6738],{},[43,13261,6733],{},[43,13263,6737],{},[14,13265,70],{"id":70},[10,13267,73],{},[75,13269,13270],{"className":77,"code":6745,"language":79,"meta":80,"style":80},[43,13271,13272,13276,13280,13284,13288,13292,13296,13300,13304,13308,13312],{"__ignoreMap":80},[84,13273,13274],{"class":86,"line":87},[84,13275,6549],{},[84,13277,13278],{"class":86,"line":93},[84,13279,109],{"emptyLinePlaceholder":108},[84,13281,13282],{"class":86,"line":99},[84,13283,6760],{},[84,13285,13286],{"class":86,"line":105},[84,13287,6765],{},[84,13289,13290],{"class":86,"line":112},[84,13291,6770],{},[84,13293,13294],{"class":86,"line":118},[84,13295,6775],{},[84,13297,13298],{"class":86,"line":124},[84,13299,109],{"emptyLinePlaceholder":108},[84,13301,13302],{"class":86,"line":130},[84,13303,6784],{},[84,13305,13306],{"class":86,"line":3898},[84,13307,6789],{},[84,13309,13310],{"class":86,"line":4110},[84,13311,6794],{},[84,13313,13314],{"class":86,"line":5775},[84,13315,6799],{},[10,13317,136],{},[75,13319,13321],{"className":13320,"code":6805,"language":142,"meta":80},[140],[43,13322,6805],{"__ignoreMap":80},[10,13324,147],{},[14,13326,150],{"id":150},[152,13328,13329,13333],{},[40,13330,6816,13331,6819],{},[43,13332,6733],{},[40,13334,6822],{},[14,13336,168],{"id":168},[37,13338,13339,13343],{},[40,13340,2328,13341,6831],{},[43,13342,6717],{},[40,13344,6834,13345,177],{},[43,13346,6837],{},[14,13348,183],{"id":183},[152,13350,13351,13353],{},[40,13352,6844],{},[40,13354,6847,13355,6850],{},[43,13356,326],{},[10,13358,194],{},[14,13360,197],{"id":197},[10,13362,6857],{},[202,13364,204],{},{"title":80,"searchDepth":93,"depth":93,"links":13366},[13367,13368,13369,13370,13371,13372,13373,13374],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":6687,"description":6692},[215,6877,6878],{"id":6881,"title":6882,"body":13379,"category":215,"cover":216,"description":6887,"extension":217,"meta":13522,"navigation":108,"path":7055,"pinned":220,"publishedAt":221,"seo":13523,"slug":7057,"stem":7058,"summary":7059,"tags":13524,"updatedAt":221,"visible":108,"__hash__":7063},{"type":7,"value":13380,"toc":13512},[13381,13383,13385,13387,13389,13393,13399,13401,13411,13413,13415,13467,13469,13474,13476,13478,13488,13490,13496,13498,13504,13506,13508,13510],[10,13382,6887],{},[14,13384,16],{"id":16},[10,13386,6892],{},[14,13388,22],{"id":22},[10,13390,13391],{},[26,13392],{"alt":6899,"src":6900},[10,13394,13395,6906,13397,6910],{},[43,13396,6905],{},[43,13398,6909],{},[14,13400,35],{"id":35},[37,13402,13403,13405,13409],{},[40,13404,6917],{},[40,13406,13407,6923],{},[43,13408,6922],{},[40,13410,6926],{},[14,13412,70],{"id":70},[10,13414,73],{},[75,13416,13417],{"className":77,"code":6933,"language":79,"meta":80,"style":80},[43,13418,13419,13423,13427,13431,13435,13439,13443,13447,13451,13455,13459,13463],{"__ignoreMap":80},[84,13420,13421],{"class":86,"line":87},[84,13422,6940],{},[84,13424,13425],{"class":86,"line":93},[84,13426,109],{"emptyLinePlaceholder":108},[84,13428,13429],{"class":86,"line":99},[84,13430,6949],{},[84,13432,13433],{"class":86,"line":105},[84,13434,109],{"emptyLinePlaceholder":108},[84,13436,13437],{"class":86,"line":112},[84,13438,6958],{},[84,13440,13441],{"class":86,"line":118},[84,13442,6963],{},[84,13444,13445],{"class":86,"line":124},[84,13446,6775],{},[84,13448,13449],{"class":86,"line":130},[84,13450,109],{"emptyLinePlaceholder":108},[84,13452,13453],{"class":86,"line":3898},[84,13454,6976],{},[84,13456,13457],{"class":86,"line":4110},[84,13458,6981],{},[84,13460,13461],{"class":86,"line":5775},[84,13462,6794],{},[84,13464,13465],{"class":86,"line":5780},[84,13466,6990],{},[10,13468,136],{},[75,13470,13472],{"className":13471,"code":6996,"language":142,"meta":80},[140],[43,13473,6996],{"__ignoreMap":80},[10,13475,147],{},[14,13477,150],{"id":150},[152,13479,13480,13484],{},[40,13481,13482,7009],{},[43,13483,6905],{},[40,13485,13486,7014],{},[43,13487,6909],{},[14,13489,168],{"id":168},[37,13491,13492,13494],{},[40,13493,7021],{},[40,13495,7024],{},[14,13497,183],{"id":183},[152,13499,13500,13502],{},[40,13501,7031],{},[40,13503,7034],{},[10,13505,194],{},[14,13507,197],{"id":197},[10,13509,7041],{},[202,13511,204],{},{"title":80,"searchDepth":93,"depth":93,"links":13513},[13514,13515,13516,13517,13518,13519,13520,13521],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":6882,"description":6887},[215,7061,7062],{"id":7065,"title":7066,"body":13526,"category":215,"cover":216,"description":7071,"extension":217,"meta":13677,"navigation":108,"path":7256,"pinned":220,"publishedAt":221,"seo":13678,"slug":7258,"stem":7259,"summary":7260,"tags":13679,"updatedAt":221,"visible":108,"__hash__":7264},{"type":7,"value":13527,"toc":13667},[13528,13530,13532,13534,13536,13540,13544,13546,13560,13562,13564,13616,13618,13623,13625,13627,13639,13641,13651,13653,13659,13661,13663,13665],[10,13529,7071],{},[14,13531,16],{"id":16},[10,13533,7076],{},[14,13535,22],{"id":22},[10,13537,13538],{},[26,13539],{"alt":7083,"src":7084},[10,13541,13542,7090],{},[43,13543,7089],{},[14,13545,35],{"id":35},[37,13547,13548,13554,13558],{},[40,13549,2328,13550,7100,13552,7104],{},[43,13551,7099],{},[43,13553,7103],{},[40,13555,7107,13556,7111],{},[43,13557,7110],{},[40,13559,7114],{},[14,13561,70],{"id":70},[10,13563,73],{},[75,13565,13566],{"className":77,"code":7121,"language":79,"meta":80,"style":80},[43,13567,13568,13572,13576,13580,13584,13588,13592,13596,13600,13604,13608,13612],{"__ignoreMap":80},[84,13569,13570],{"class":86,"line":87},[84,13571,7128],{},[84,13573,13574],{"class":86,"line":93},[84,13575,109],{"emptyLinePlaceholder":108},[84,13577,13578],{"class":86,"line":99},[84,13579,7137],{},[84,13581,13582],{"class":86,"line":105},[84,13583,7142],{},[84,13585,13586],{"class":86,"line":112},[84,13587,7147],{},[84,13589,13590],{"class":86,"line":118},[84,13591,7152],{},[84,13593,13594],{"class":86,"line":124},[84,13595,7157],{},[84,13597,13598],{"class":86,"line":130},[84,13599,109],{"emptyLinePlaceholder":108},[84,13601,13602],{"class":86,"line":3898},[84,13603,7166],{},[84,13605,13606],{"class":86,"line":4110},[84,13607,7171],{},[84,13609,13610],{"class":86,"line":5775},[84,13611,7176],{},[84,13613,13614],{"class":86,"line":5780},[84,13615,7181],{},[10,13617,136],{},[75,13619,13621],{"className":13620,"code":7187,"language":142,"meta":80},[140],[43,13622,7187],{"__ignoreMap":80},[10,13624,147],{},[14,13626,150],{"id":150},[152,13628,13629,13635],{},[40,13630,13631,7201,13633,7204],{},[43,13632,7200],{},[43,13634,7110],{},[40,13636,13637,7209],{},[43,13638,7089],{},[14,13640,168],{"id":168},[37,13642,13643,13645],{},[40,13644,7216],{},[40,13646,7219,13647,7222,13649,7225],{},[43,13648,7099],{},[43,13650,7103],{},[14,13652,183],{"id":183},[152,13654,13655,13657],{},[40,13656,7232],{},[40,13658,7235],{},[10,13660,194],{},[14,13662,197],{"id":197},[10,13664,7242],{},[202,13666,204],{},{"title":80,"searchDepth":93,"depth":93,"links":13668},[13669,13670,13671,13672,13673,13674,13675,13676],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":7066,"description":7071},[215,7262,7263],{"id":7266,"title":7267,"body":13681,"category":215,"cover":216,"description":7272,"extension":217,"meta":13895,"navigation":108,"path":7546,"pinned":220,"publishedAt":221,"seo":13896,"slug":7548,"stem":7549,"summary":7550,"tags":13897,"updatedAt":221,"visible":108,"__hash__":7554},{"type":7,"value":13682,"toc":13882},[13683,13685,13687,13689,13691,13695,13701,13703,13715,13717,13719,13779,13781,13786,13788,13790,13808,13810,13818,13822,13830,13832,13836,13840,13846,13848,13858,13860,13874,13876,13878,13880],[10,13684,7272],{},[14,13686,16],{"id":16},[10,13688,7277],{},[14,13690,22],{"id":22},[10,13692,13693],{},[26,13694],{"alt":7284,"src":7285},[10,13696,7288,13697,7292,13699,7296],{},[43,13698,7291],{},[43,13700,7295],{},[14,13702,35],{"id":35},[37,13704,13705,13709,13713],{},[40,13706,7303,13707,7306],{},[43,13708,7291],{},[40,13710,13711,7312],{},[43,13712,7311],{},[40,13714,7315],{},[14,13716,70],{"id":70},[10,13718,73],{},[75,13720,13721],{"className":77,"code":7322,"language":79,"meta":80,"style":80},[43,13722,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775],{"__ignoreMap":80},[84,13724,13725],{"class":86,"line":87},[84,13726,7329],{},[84,13728,13729],{"class":86,"line":93},[84,13730,7334],{},[84,13732,13733],{"class":86,"line":99},[84,13734,7339],{},[84,13736,13737],{"class":86,"line":105},[84,13738,7344],{},[84,13740,13741],{"class":86,"line":112},[84,13742,7349],{},[84,13744,13745],{"class":86,"line":118},[84,13746,109],{"emptyLinePlaceholder":108},[84,13748,13749],{"class":86,"line":124},[84,13750,7358],{},[84,13752,13753],{"class":86,"line":130},[84,13754,7363],{},[84,13756,13757],{"class":86,"line":3898},[84,13758,7368],{},[84,13760,13761],{"class":86,"line":4110},[84,13762,7373],{},[84,13764,13765],{"class":86,"line":5775},[84,13766,1135],{},[84,13768,13769],{"class":86,"line":5780},[84,13770,7382],{},[84,13772,13773],{"class":86,"line":7385},[84,13774,7388],{},[84,13776,13777],{"class":86,"line":7391},[84,13778,7394],{},[10,13780,136],{},[75,13782,13784],{"className":13783,"code":7400,"language":142,"meta":80},[140],[43,13785,7400],{"__ignoreMap":80},[10,13787,147],{},[14,13789,150],{"id":150},[152,13791,13792,13800],{},[40,13793,13794,7413,13796,7416,13798,7420],{},[43,13795,2981],{},[43,13797,7311],{},[43,13799,7419],{},[40,13801,7423,13802,7426,13804,7429,13806,177],{},[43,13803,7291],{},[43,13805,1149],{},[43,13807,7295],{},[318,13809,2642],{"id":2642},[10,13811,13812,2246,13814,1146,13816,7442],{},[43,13813,7291],{},[43,13815,1149],{},[43,13817,7295],{},[10,13819,13820],{},[26,13821],{"alt":7447,"src":7448},[10,13823,13824,7453,13826,7456,13828,7459],{},[43,13825,7291],{},[43,13827,1149],{},[43,13829,7295],{},[318,13831,2642],{"id":4165},[10,13833,13834,7467],{},[43,13835,7466],{},[10,13837,13838],{},[26,13839],{"alt":7472,"src":7473},[10,13841,7476,13842,7479,13844,7482],{},[43,13843,7466],{},[43,13845,1149],{},[14,13847,168],{"id":168},[37,13849,13850,13854],{},[40,13851,7489,13852,7493],{},[43,13853,7492],{},[40,13855,7496,13856,7499],{},[43,13857,7466],{},[14,13859,183],{"id":183},[152,13861,13862,13870],{},[40,13863,7506,13864,7510,13866,1146,13868,177],{},[43,13865,7509],{},[43,13867,7513],{},[43,13869,7516],{},[40,13871,7519,13872,7522],{},[43,13873,6727],{},[10,13875,194],{},[14,13877,197],{"id":197},[10,13879,7529],{},[202,13881,204],{},{"title":80,"searchDepth":93,"depth":93,"links":13883},[13884,13885,13886,13887,13888,13892,13893,13894],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":13889},[13890,13891],{"id":2642,"depth":99,"text":2642},{"id":4165,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":7267,"description":7272},[215,7552,7553],{"id":7556,"title":7557,"body":13899,"category":215,"cover":216,"description":7562,"extension":217,"meta":14050,"navigation":108,"path":7739,"pinned":220,"publishedAt":221,"seo":14051,"slug":7741,"stem":7742,"summary":7743,"tags":14052,"updatedAt":221,"visible":108,"__hash__":7746},{"type":7,"value":13900,"toc":14040},[13901,13903,13905,13907,13909,13913,13917,13919,13931,13933,13935,13983,13985,13990,13992,13994,14004,14006,14016,14018,14032,14034,14036,14038],[10,13902,7562],{},[14,13904,16],{"id":16},[10,13906,7567],{},[14,13908,22],{"id":22},[10,13910,13911],{},[26,13912],{"alt":7574,"src":7575},[10,13914,7578,13915,7581],{},[43,13916,6737],{},[14,13918,35],{"id":35},[37,13920,13921,13925,13929],{},[40,13922,13923,7590],{},[43,13924,6737],{},[40,13926,13927,7596],{},[43,13928,7595],{},[40,13930,7599],{},[14,13932,70],{"id":70},[10,13934,73],{},[75,13936,13937],{"className":77,"code":7606,"language":79,"meta":80,"style":80},[43,13938,13939,13943,13947,13951,13955,13959,13963,13967,13971,13975,13979],{"__ignoreMap":80},[84,13940,13941],{"class":86,"line":87},[84,13942,6549],{},[84,13944,13945],{"class":86,"line":93},[84,13946,109],{"emptyLinePlaceholder":108},[84,13948,13949],{"class":86,"line":99},[84,13950,6760],{},[84,13952,13953],{"class":86,"line":105},[84,13954,109],{"emptyLinePlaceholder":108},[84,13956,13957],{"class":86,"line":112},[84,13958,7629],{},[84,13960,13961],{"class":86,"line":118},[84,13962,7634],{},[84,13964,13965],{"class":86,"line":124},[84,13966,109],{"emptyLinePlaceholder":108},[84,13968,13969],{"class":86,"line":130},[84,13970,7643],{},[84,13972,13973],{"class":86,"line":3898},[84,13974,7648],{},[84,13976,13977],{"class":86,"line":4110},[84,13978,109],{"emptyLinePlaceholder":108},[84,13980,13981],{"class":86,"line":5775},[84,13982,7657],{},[10,13984,136],{},[75,13986,13988],{"className":13987,"code":7663,"language":142,"meta":80},[140],[43,13989,7663],{"__ignoreMap":80},[10,13991,147],{},[14,13993,150],{"id":150},[152,13995,13996,14002],{},[40,13997,7578,13998,7676,14000,177],{},[43,13999,6737],{},[43,14001,7679],{},[40,14003,7682],{},[14,14005,168],{"id":168},[37,14007,14008,14012],{},[40,14009,4733,14010,7691],{},[43,14011,6737],{},[40,14013,7694,14014,7697],{},[43,14015,6737],{},[14,14017,183],{"id":183},[152,14019,14020,14026],{},[40,14021,7704,14022,7708,14024,177],{},[43,14023,7707],{},[43,14025,6737],{},[40,14027,4733,14028,7715,14030,177],{},[43,14029,6737],{},[43,14031,7718],{},[10,14033,194],{},[14,14035,197],{"id":197},[10,14037,7725],{},[202,14039,204],{},{"title":80,"searchDepth":93,"depth":93,"links":14041},[14042,14043,14044,14045,14046,14047,14048,14049],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":7557,"description":7562},[215,6737,7745],{"id":7748,"title":7749,"body":14054,"category":215,"cover":216,"description":7754,"extension":217,"meta":14225,"navigation":108,"path":7967,"pinned":220,"publishedAt":221,"seo":14226,"slug":7969,"stem":7970,"summary":7971,"tags":14227,"updatedAt":221,"visible":108,"__hash__":7975},{"type":7,"value":14055,"toc":14213},[14056,14058,14060,14062,14064,14068,14070,14072,14084,14086,14088,14144,14146,14151,14153,14155,14171,14173,14175,14179,14185,14187,14195,14197,14205,14207,14209,14211],[10,14057,7754],{},[14,14059,16],{"id":16},[10,14061,7759],{},[14,14063,22],{"id":22},[10,14065,14066],{},[26,14067],{"alt":7766,"src":7767},[10,14069,7770],{},[14,14071,35],{"id":35},[37,14073,14074,14078,14082],{},[40,14075,14076,7780],{},[43,14077,7779],{},[40,14079,14080,7786],{},[43,14081,7785],{},[40,14083,7789],{},[14,14085,70],{"id":70},[10,14087,73],{},[75,14089,14090],{"className":77,"code":7796,"language":79,"meta":80,"style":80},[43,14091,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140],{"__ignoreMap":80},[84,14093,14094],{"class":86,"line":87},[84,14095,7803],{},[84,14097,14098],{"class":86,"line":93},[84,14099,7808],{},[84,14101,14102],{"class":86,"line":99},[84,14103,7813],{},[84,14105,14106],{"class":86,"line":105},[84,14107,7818],{},[84,14109,14110],{"class":86,"line":112},[84,14111,109],{"emptyLinePlaceholder":108},[84,14113,14114],{"class":86,"line":118},[84,14115,7827],{},[84,14117,14118],{"class":86,"line":124},[84,14119,7832],{},[84,14121,14122],{"class":86,"line":130},[84,14123,7837],{},[84,14125,14126],{"class":86,"line":3898},[84,14127,7842],{},[84,14129,14130],{"class":86,"line":4110},[84,14131,109],{"emptyLinePlaceholder":108},[84,14133,14134],{"class":86,"line":5775},[84,14135,7851],{},[84,14137,14138],{"class":86,"line":5780},[84,14139,7856],{},[84,14141,14142],{"class":86,"line":7385},[84,14143,7861],{},[10,14145,136],{},[75,14147,14149],{"className":14148,"code":7867,"language":142,"meta":80},[140],[43,14150,7867],{"__ignoreMap":80},[10,14152,147],{},[14,14154,150],{"id":150},[152,14156,14157,14163],{},[40,14158,7878,14159,7882,14161,7885],{},[43,14160,7881],{},[43,14162,7785],{},[40,14164,14165,7891,14167,7895,14169,7898],{},[43,14166,7890],{},[43,14168,7894],{},[43,14170,7779],{},[318,14172,2642],{"id":2642},[10,14174,7903],{},[10,14176,14177],{},[26,14178],{"alt":7908,"src":7909},[10,14180,7912,14181,1146,14183,7918],{},[43,14182,4530],{},[43,14184,7917],{},[14,14186,168],{"id":168},[37,14188,14189,14193],{},[40,14190,7925,14191,7928],{},[43,14192,7779],{},[40,14194,7931],{},[14,14196,183],{"id":183},[152,14198,14199,14203],{},[40,14200,5243,14201,7941],{},[43,14202,7940],{},[40,14204,7944],{},[10,14206,194],{},[14,14208,197],{"id":197},[10,14210,7951],{},[202,14212,204],{},{"title":80,"searchDepth":93,"depth":93,"links":14214},[14215,14216,14217,14218,14219,14222,14223,14224],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":14220},[14221],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":7749,"description":7754},[215,7973,7974],{"id":7977,"title":7978,"body":14229,"category":215,"cover":216,"description":7983,"extension":217,"meta":14376,"navigation":108,"path":8162,"pinned":220,"publishedAt":221,"seo":14377,"slug":8164,"stem":8165,"summary":8166,"tags":14378,"updatedAt":221,"visible":108,"__hash__":8170},{"type":7,"value":14230,"toc":14366},[14231,14233,14235,14237,14239,14243,14245,14247,14255,14257,14259,14315,14317,14322,14324,14326,14338,14340,14346,14348,14358,14360,14362,14364],[10,14232,7983],{},[14,14234,16],{"id":16},[10,14236,7988],{},[14,14238,22],{"id":22},[10,14240,14241],{},[26,14242],{"alt":7995,"src":7996},[10,14244,7999],{},[14,14246,35],{"id":35},[37,14248,14249,14251,14253],{},[40,14250,8006],{},[40,14252,8009],{},[40,14254,8012],{},[14,14256,70],{"id":70},[10,14258,73],{},[75,14260,14261],{"className":77,"code":8019,"language":79,"meta":80,"style":80},[43,14262,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311],{"__ignoreMap":80},[84,14264,14265],{"class":86,"line":87},[84,14266,8026],{},[84,14268,14269],{"class":86,"line":93},[84,14270,8031],{},[84,14272,14273],{"class":86,"line":99},[84,14274,8036],{},[84,14276,14277],{"class":86,"line":105},[84,14278,109],{"emptyLinePlaceholder":108},[84,14280,14281],{"class":86,"line":112},[84,14282,8045],{},[84,14284,14285],{"class":86,"line":118},[84,14286,8050],{},[84,14288,14289],{"class":86,"line":124},[84,14290,8055],{},[84,14292,14293],{"class":86,"line":130},[84,14294,109],{"emptyLinePlaceholder":108},[84,14296,14297],{"class":86,"line":3898},[84,14298,8064],{},[84,14300,14301],{"class":86,"line":4110},[84,14302,8069],{},[84,14304,14305],{"class":86,"line":5775},[84,14306,109],{"emptyLinePlaceholder":108},[84,14308,14309],{"class":86,"line":5780},[84,14310,8078],{},[84,14312,14313],{"class":86,"line":7385},[84,14314,8083],{},[10,14316,136],{},[75,14318,14320],{"className":14319,"code":8089,"language":142,"meta":80},[140],[43,14321,8089],{"__ignoreMap":80},[10,14323,147],{},[14,14325,150],{"id":150},[152,14327,14328,14334],{},[40,14329,14330,8103,14332,8107],{},[43,14331,8102],{},[43,14333,8106],{},[40,14335,8110,14336,8114],{},[43,14337,8113],{},[14,14339,168],{"id":168},[37,14341,14342,14344],{},[40,14343,8121],{},[40,14345,8124],{},[14,14347,183],{"id":183},[152,14349,14350,14356],{},[40,14351,8131,14352,8135,14354,177],{},[43,14353,8134],{},[43,14355,8138],{},[40,14357,8141],{},[10,14359,194],{},[14,14361,197],{"id":197},[10,14363,8148],{},[202,14365,204],{},{"title":80,"searchDepth":93,"depth":93,"links":14367},[14368,14369,14370,14371,14372,14373,14374,14375],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":7978,"description":7983},[215,8168,8169],{"id":8172,"title":8173,"body":14380,"category":215,"cover":216,"description":8178,"extension":217,"meta":14543,"navigation":108,"path":8382,"pinned":220,"publishedAt":221,"seo":14544,"slug":8384,"stem":8385,"summary":8386,"tags":14545,"updatedAt":221,"visible":108,"__hash__":8390},{"type":7,"value":14381,"toc":14531},[14382,14384,14386,14388,14390,14394,14398,14400,14416,14418,14420,14464,14466,14471,14473,14475,14489,14491,14495,14499,14503,14505,14511,14513,14523,14525,14527,14529],[10,14383,8178],{},[14,14385,16],{"id":16},[10,14387,8183],{},[14,14389,22],{"id":22},[10,14391,14392],{},[26,14393],{"alt":8190,"src":8191},[10,14395,8194,14396,8198],{},[43,14397,8197],{},[14,14399,35],{"id":35},[37,14401,14402,14408,14414],{},[40,14403,14404,8208,14406,8212],{},[43,14405,8207],{},[43,14407,8211],{},[40,14409,8215,14410,8219,14412,8222],{},[43,14411,8218],{},[43,14413,4284],{},[40,14415,8225],{},[14,14417,70],{"id":70},[10,14419,73],{},[75,14421,14422],{"className":77,"code":8232,"language":79,"meta":80,"style":80},[43,14423,14424,14428,14432,14436,14440,14444,14448,14452,14456,14460],{"__ignoreMap":80},[84,14425,14426],{"class":86,"line":87},[84,14427,8239],{},[84,14429,14430],{"class":86,"line":93},[84,14431,8244],{},[84,14433,14434],{"class":86,"line":99},[84,14435,8249],{},[84,14437,14438],{"class":86,"line":105},[84,14439,8254],{},[84,14441,14442],{"class":86,"line":112},[84,14443,8259],{},[84,14445,14446],{"class":86,"line":118},[84,14447,109],{"emptyLinePlaceholder":108},[84,14449,14450],{"class":86,"line":124},[84,14451,8268],{},[84,14453,14454],{"class":86,"line":130},[84,14455,8273],{},[84,14457,14458],{"class":86,"line":3898},[84,14459,8273],{},[84,14461,14462],{"class":86,"line":4110},[84,14463,8273],{},[10,14465,136],{},[75,14467,14469],{"className":14468,"code":8287,"language":142,"meta":80},[140],[43,14470,8287],{"__ignoreMap":80},[10,14472,147],{},[14,14474,150],{"id":150},[152,14476,14477,14481],{},[40,14478,7878,14479,8301],{},[43,14480,8300],{},[40,14482,8304,14483,8307,14485,8310,14487,8314],{},[43,14484,8211],{},[43,14486,8197],{},[43,14488,8313],{},[318,14490,2642],{"id":2642},[10,14492,8319,14493,8322],{},[43,14494,8211],{},[10,14496,14497],{},[26,14498],{"alt":8327,"src":8328},[10,14500,8331,14501,8334],{},[43,14502,8197],{},[14,14504,168],{"id":168},[37,14506,14507,14509],{},[40,14508,8341],{},[40,14510,8344],{},[14,14512,183],{"id":183},[152,14514,14515,14517],{},[40,14516,8351],{},[40,14518,3956,14519,8356,14521,8359],{},[43,14520,4284],{},[43,14522,8211],{},[10,14524,194],{},[14,14526,197],{"id":197},[10,14528,8366],{},[202,14530,204],{},{"title":80,"searchDepth":93,"depth":93,"links":14532},[14533,14534,14535,14536,14537,14540,14541,14542],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":14538},[14539],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":8173,"description":8178},[215,8388,8389],{"id":8392,"title":8393,"body":14547,"category":215,"cover":216,"description":8398,"extension":217,"meta":14730,"navigation":108,"path":8623,"pinned":220,"publishedAt":221,"seo":14731,"slug":8625,"stem":8626,"summary":8627,"tags":14732,"updatedAt":221,"visible":108,"__hash__":8630},{"type":7,"value":14548,"toc":14718},[14549,14551,14553,14555,14557,14561,14563,14565,14579,14581,14583,14651,14653,14658,14660,14662,14676,14678,14680,14684,14690,14692,14700,14702,14710,14712,14714,14716],[10,14550,8398],{},[14,14552,16],{"id":16},[10,14554,8403],{},[14,14556,22],{"id":22},[10,14558,14559],{},[26,14560],{"alt":8410,"src":8411},[10,14562,8414],{},[14,14564,35],{"id":35},[37,14566,14567,14573,14575],{},[40,14568,14569,8424,14571,177],{},[43,14570,8423],{},[43,14572,8427],{},[40,14574,8430],{},[40,14576,14577,8436],{},[43,14578,8435],{},[14,14580,70],{"id":70},[10,14582,73],{},[75,14584,14585],{"className":77,"code":8443,"language":79,"meta":80,"style":80},[43,14586,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647],{"__ignoreMap":80},[84,14588,14589],{"class":86,"line":87},[84,14590,8450],{},[84,14592,14593],{"class":86,"line":93},[84,14594,109],{"emptyLinePlaceholder":108},[84,14596,14597],{"class":86,"line":99},[84,14598,8459],{},[84,14600,14601],{"class":86,"line":105},[84,14602,8464],{},[84,14604,14605],{"class":86,"line":112},[84,14606,8469],{},[84,14608,14609],{"class":86,"line":118},[84,14610,8474],{},[84,14612,14613],{"class":86,"line":124},[84,14614,8479],{},[84,14616,14617],{"class":86,"line":130},[84,14618,8484],{},[84,14620,14621],{"class":86,"line":3898},[84,14622,8489],{},[84,14624,14625],{"class":86,"line":4110},[84,14626,8494],{},[84,14628,14629],{"class":86,"line":5775},[84,14630,109],{"emptyLinePlaceholder":108},[84,14632,14633],{"class":86,"line":5780},[84,14634,8503],{},[84,14636,14637],{"class":86,"line":7385},[84,14638,6128],{},[84,14640,14641],{"class":86,"line":7391},[84,14642,6133],{},[84,14644,14645],{"class":86,"line":8514},[84,14646,109],{"emptyLinePlaceholder":108},[84,14648,14649],{"class":86,"line":8519},[84,14650,8522],{},[10,14652,136],{},[75,14654,14656],{"className":14655,"code":8528,"language":142,"meta":80},[140],[43,14657,8528],{"__ignoreMap":80},[10,14659,147],{},[14,14661,150],{"id":150},[152,14663,14664,14674],{},[40,14665,8539,14666,8543,14668,8547,14670,8551,14672,177],{},[43,14667,8542],{},[43,14669,8546],{},[43,14671,8550],{},[43,14673,8542],{},[40,14675,8556],{},[318,14677,2642],{"id":2642},[10,14679,8561],{},[10,14681,14682],{},[26,14683],{"alt":8566,"src":8567},[10,14685,14686,8572,14688,177],{},[43,14687,8423],{},[43,14689,8427],{},[14,14691,168],{"id":168},[37,14693,14694,14698],{},[40,14695,8581,14696,177],{},[43,14697,5326],{},[40,14699,8586],{},[14,14701,183],{"id":183},[152,14703,14704,14706],{},[40,14705,8593],{},[40,14707,8596,14708,8600],{},[43,14709,8599],{},[10,14711,194],{},[14,14713,197],{"id":197},[10,14715,8607],{},[202,14717,204],{},{"title":80,"searchDepth":93,"depth":93,"links":14719},[14720,14721,14722,14723,14724,14727,14728,14729],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":14725},[14726],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":8393,"description":8398},[215,8629,5277],{"id":8632,"title":8633,"body":14734,"category":215,"cover":216,"description":8638,"extension":217,"meta":14893,"navigation":108,"path":8826,"pinned":220,"publishedAt":221,"seo":14894,"slug":8828,"stem":8829,"summary":8830,"tags":14895,"updatedAt":221,"visible":108,"__hash__":8834},{"type":7,"value":14735,"toc":14881},[14736,14738,14740,14742,14744,14748,14750,14752,14760,14762,14764,14828,14830,14835,14837,14839,14847,14849,14851,14855,14857,14859,14865,14867,14873,14875,14877,14879],[10,14737,8638],{},[14,14739,16],{"id":16},[10,14741,8643],{},[14,14743,22],{"id":22},[10,14745,14746],{},[26,14747],{"alt":8650,"src":8651},[10,14749,8654],{},[14,14751,35],{"id":35},[37,14753,14754,14756,14758],{},[40,14755,8661],{},[40,14757,8664],{},[40,14759,8667],{},[14,14761,70],{"id":70},[10,14763,73],{},[75,14765,14766],{"className":77,"code":8674,"language":79,"meta":80,"style":80},[43,14767,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824],{"__ignoreMap":80},[84,14769,14770],{"class":86,"line":87},[84,14771,8681],{},[84,14773,14774],{"class":86,"line":93},[84,14775,8686],{},[84,14777,14778],{"class":86,"line":99},[84,14779,109],{"emptyLinePlaceholder":108},[84,14781,14782],{"class":86,"line":105},[84,14783,8695],{},[84,14785,14786],{"class":86,"line":112},[84,14787,109],{"emptyLinePlaceholder":108},[84,14789,14790],{"class":86,"line":118},[84,14791,8704],{},[84,14793,14794],{"class":86,"line":124},[84,14795,8709],{},[84,14797,14798],{"class":86,"line":130},[84,14799,8714],{},[84,14801,14802],{"class":86,"line":3898},[84,14803,109],{"emptyLinePlaceholder":108},[84,14805,14806],{"class":86,"line":4110},[84,14807,8723],{},[84,14809,14810],{"class":86,"line":5775},[84,14811,8728],{},[84,14813,14814],{"class":86,"line":5780},[84,14815,8733],{},[84,14817,14818],{"class":86,"line":7385},[84,14819,109],{"emptyLinePlaceholder":108},[84,14821,14822],{"class":86,"line":7391},[84,14823,6142],{},[84,14825,14826],{"class":86,"line":8514},[84,14827,8746],{},[10,14829,136],{},[75,14831,14833],{"className":14832,"code":8752,"language":142,"meta":80},[140],[43,14834,8752],{"__ignoreMap":80},[10,14836,147],{},[14,14838,150],{"id":150},[152,14840,14841,14845],{},[40,14842,14843,8766],{},[43,14844,8765],{},[40,14846,8769],{},[318,14848,2642],{"id":2642},[10,14850,8774],{},[10,14852,14853],{},[26,14854],{"alt":8779,"src":8780},[10,14856,8783],{},[14,14858,168],{"id":168},[37,14860,14861,14863],{},[40,14862,8790],{},[40,14864,8793],{},[14,14866,183],{"id":183},[152,14868,14869,14871],{},[40,14870,8800],{},[40,14872,8803],{},[10,14874,194],{},[14,14876,197],{"id":197},[10,14878,8810],{},[202,14880,204],{},{"title":80,"searchDepth":93,"depth":93,"links":14882},[14883,14884,14885,14886,14887,14890,14891,14892],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":14888},[14889],{"id":2642,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":8633,"description":8638},[215,8832,8833],{"id":8836,"title":8837,"body":14897,"category":215,"cover":216,"description":8842,"extension":217,"meta":15135,"navigation":108,"path":9143,"pinned":220,"publishedAt":221,"seo":15136,"slug":9145,"stem":9146,"summary":9147,"tags":15137,"updatedAt":221,"visible":108,"__hash__":9151},{"type":7,"value":14898,"toc":15122},[14899,14901,14903,14905,14907,14911,14913,14915,14925,14927,14929,15045,15047,15052,15054,15056,15066,15068,15070,15074,15076,15078,15080,15084,15088,15090,15098,15100,15114,15116,15118,15120],[10,14900,8842],{},[14,14902,16],{"id":16},[10,14904,8847],{},[14,14906,22],{"id":22},[10,14908,14909],{},[26,14910],{"alt":8854,"src":8855},[10,14912,8858],{},[14,14914,35],{"id":35},[37,14916,14917,14919,14921],{},[40,14918,8865],{},[40,14920,8868],{},[40,14922,8871,14923,8875],{},[43,14924,8874],{},[14,14926,70],{"id":70},[10,14928,73],{},[75,14930,14931],{"className":77,"code":8882,"language":79,"meta":80,"style":80},[43,14932,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041],{"__ignoreMap":80},[84,14934,14935],{"class":86,"line":87},[84,14936,6940],{},[84,14938,14939],{"class":86,"line":93},[84,14940,6549],{},[84,14942,14943],{"class":86,"line":99},[84,14944,109],{"emptyLinePlaceholder":108},[84,14946,14947],{"class":86,"line":105},[84,14948,8901],{},[84,14950,14951],{"class":86,"line":112},[84,14952,8906],{},[84,14954,14955],{"class":86,"line":118},[84,14956,8911],{},[84,14958,14959],{"class":86,"line":124},[84,14960,8916],{},[84,14962,14963],{"class":86,"line":130},[84,14964,109],{"emptyLinePlaceholder":108},[84,14966,14967],{"class":86,"line":3898},[84,14968,8925],{},[84,14970,14971],{"class":86,"line":4110},[84,14972,8930],{},[84,14974,14975],{"class":86,"line":5775},[84,14976,8935],{},[84,14978,14979],{"class":86,"line":5780},[84,14980,8940],{},[84,14982,14983],{"class":86,"line":7385},[84,14984,8945],{},[84,14986,14987],{"class":86,"line":7391},[84,14988,109],{"emptyLinePlaceholder":108},[84,14990,14991],{"class":86,"line":8514},[84,14992,8954],{},[84,14994,14995],{"class":86,"line":8519},[84,14996,8959],{},[84,14998,14999],{"class":86,"line":8962},[84,15000,8965],{},[84,15002,15003],{"class":86,"line":8968},[84,15004,109],{"emptyLinePlaceholder":108},[84,15006,15007],{"class":86,"line":8973},[84,15008,8976],{},[84,15010,15011],{"class":86,"line":8979},[84,15012,109],{"emptyLinePlaceholder":108},[84,15014,15015],{"class":86,"line":8984},[84,15016,7358],{},[84,15018,15019],{"class":86,"line":8989},[84,15020,8992],{},[84,15022,15023],{"class":86,"line":8995},[84,15024,8998],{},[84,15026,15027],{"class":86,"line":9001},[84,15028,9004],{},[84,15030,15031],{"class":86,"line":9007},[84,15032,7368],{},[84,15034,15035],{"class":86,"line":9012},[84,15036,9015],{},[84,15038,15039],{"class":86,"line":9018},[84,15040,1135],{},[84,15042,15043],{"class":86,"line":9023},[84,15044,9026],{},[10,15046,136],{},[75,15048,15050],{"className":15049,"code":9032,"language":142,"meta":80},[140],[43,15051,9032],{"__ignoreMap":80},[10,15053,147],{},[14,15055,150],{"id":150},[152,15057,15058,15062],{},[40,15059,9043,15060,9046],{},[43,15061,8874],{},[40,15063,15064,9051],{},[43,15065,8106],{},[318,15067,2642],{"id":2642},[10,15069,9056],{},[10,15071,15072],{},[26,15073],{"alt":9061,"src":9062},[10,15075,9065],{},[318,15077,2642],{"id":4165},[10,15079,9070],{},[10,15081,15082],{},[26,15083],{"alt":9075,"src":9076},[10,15085,9079,15086,9083],{},[43,15087,9082],{},[14,15089,168],{"id":168},[37,15091,15092,15094],{},[40,15093,9090],{},[40,15095,9093,15096,9096],{},[43,15097,9082],{},[14,15099,183],{"id":183},[152,15101,15102,15106,15108],{},[40,15103,9103,15104,9106],{},[43,15105,9082],{},[40,15107,9109],{},[40,15109,9112,15110,9116,15112,9119],{},[43,15111,9115],{},[43,15113,6084],{},[10,15115,194],{},[14,15117,197],{"id":197},[10,15119,9126],{},[202,15121,204],{},{"title":80,"searchDepth":93,"depth":93,"links":15123},[15124,15125,15126,15127,15128,15132,15133,15134],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":150,"depth":93,"text":150,"children":15129},[15130,15131],{"id":2642,"depth":99,"text":2642},{"id":4165,"depth":99,"text":2642},{"id":168,"depth":93,"text":168},{"id":183,"depth":93,"text":183},{"id":197,"depth":93,"text":197},{},{"title":8837,"description":8842},[215,9149,9150],{"id":1045,"title":1046,"body":15139,"category":215,"cover":1054,"description":80,"extension":217,"meta":15375,"navigation":108,"path":1371,"pinned":220,"publishedAt":1372,"seo":15376,"slug":1374,"stem":1375,"summary":1376,"tags":15377,"updatedAt":1372,"visible":108,"__hash__":1380},{"type":7,"value":15140,"toc":15360},[15141,15145,15147,15149,15151,15153,15173,15175,15180,15182,15184,15212,15218,15220,15224,15226,15246,15248,15258,15260,15262,15264,15266,15268,15270,15272,15274,15276,15296,15298,15300,15304,15306,15308,15310,15312,15316,15318,15336,15338,15340,15342,15344,15346,15348,15350,15352,15354,15356,15358],[10,15142,15143],{},[26,15144],{"alt":1053,"src":1054},[10,15146,1057],{},[10,15148,1060],{},[14,15150,1064],{"id":1063},[10,15152,1067],{},[75,15154,15155],{"className":77,"code":1070,"language":79,"meta":80,"style":80},[43,15156,15157,15161,15165,15169],{"__ignoreMap":80},[84,15158,15159],{"class":86,"line":87},[84,15160,1077],{},[84,15162,15163],{"class":86,"line":93},[84,15164,1082],{},[84,15166,15167],{"class":86,"line":99},[84,15168,109],{"emptyLinePlaceholder":108},[84,15170,15171],{"class":86,"line":105},[84,15172,1091],{},[10,15174,1094],{},[75,15176,15178],{"className":15177,"code":1098,"language":142,"meta":80},[140],[43,15179,1098],{"__ignoreMap":80},[10,15181,1103],{},[10,15183,1106],{},[75,15185,15186],{"className":77,"code":1109,"language":79,"meta":80,"style":80},[43,15187,15188,15192,15196,15200,15204,15208],{"__ignoreMap":80},[84,15189,15190],{"class":86,"line":87},[84,15191,1116],{},[84,15193,15194],{"class":86,"line":93},[84,15195,109],{"emptyLinePlaceholder":108},[84,15197,15198],{"class":86,"line":99},[84,15199,1125],{},[84,15201,15202],{"class":86,"line":105},[84,15203,1130],{},[84,15205,15206],{"class":86,"line":112},[84,15207,1135],{},[84,15209,15210],{"class":86,"line":118},[84,15211,1140],{},[10,15213,15214,1146,15216,1150],{},[43,15215,1145],{},[43,15217,1149],{},[14,15219,1154],{"id":1153},[10,15221,1157,15222,1161],{},[43,15223,1160],{},[10,15225,1164],{},[75,15227,15228],{"className":77,"code":1167,"language":79,"meta":80,"style":80},[43,15229,15230,15234,15238,15242],{"__ignoreMap":80},[84,15231,15232],{"class":86,"line":87},[84,15233,1174],{},[84,15235,15236],{"class":86,"line":93},[84,15237,1179],{},[84,15239,15240],{"class":86,"line":99},[84,15241,1184],{},[84,15243,15244],{"class":86,"line":105},[84,15245,1189],{},[10,15247,1192],{},[75,15249,15250],{"className":580,"code":1195,"language":582,"meta":80,"style":80},[43,15251,15252],{"__ignoreMap":80},[84,15253,15254,15256],{"class":86,"line":87},[84,15255,680],{"class":589},[84,15257,1204],{"class":625},[10,15259,1207],{},[14,15261,1211],{"id":1210},[318,15263,1214],{"id":1214},[10,15265,1217],{},[318,15267,1220],{"id":1220},[10,15269,1223],{},[318,15271,1226],{"id":1226},[10,15273,1229],{},[10,15275,1232],{},[75,15277,15278],{"className":77,"code":1235,"language":79,"meta":80,"style":80},[43,15279,15280,15284,15288,15292],{"__ignoreMap":80},[84,15281,15282],{"class":86,"line":87},[84,15283,1242],{},[84,15285,15286],{"class":86,"line":93},[84,15287,109],{"emptyLinePlaceholder":108},[84,15289,15290],{"class":86,"line":99},[84,15291,1251],{},[84,15293,15294],{"class":86,"line":105},[84,15295,1256],{},[10,15297,1259],{},[318,15299,1262],{"id":1262},[10,15301,1265,15302,1268],{},[43,15303,250],{},[10,15305,1271],{},[318,15307,1274],{"id":1274},[10,15309,1277],{},[14,15311,1281],{"id":1280},[10,15313,15314],{},[26,15315],{"alt":1286,"src":1287},[10,15317,1290],{},[37,15319,15320,15322,15324,15326,15328,15330,15332,15334],{},[40,15321,1295],{},[40,15323,1298],{},[40,15325,1301],{},[40,15327,1304],{},[40,15329,1307],{},[40,15331,1310],{},[40,15333,1313],{},[40,15335,1316],{},[10,15337,1319],{},[14,15339,1323],{"id":1322},[10,15341,1326],{},[10,15343,1329],{},[14,15345,1333],{"id":1332},[10,15347,1336],{},[10,15349,1339],{},[10,15351,1342],{},[14,15353,1345],{"id":1345},[10,15355,1348],{},[10,15357,1351],{},[202,15359,1354],{},{"title":80,"searchDepth":93,"depth":93,"links":15361},[15362,15363,15364,15371,15372,15373,15374],{"id":1063,"depth":93,"text":1064},{"id":1153,"depth":93,"text":1154},{"id":1210,"depth":93,"text":1211,"children":15365},[15366,15367,15368,15369,15370],{"id":1214,"depth":99,"text":1214},{"id":1220,"depth":99,"text":1220},{"id":1226,"depth":99,"text":1226},{"id":1262,"depth":99,"text":1262},{"id":1274,"depth":99,"text":1274},{"id":1280,"depth":93,"text":1281},{"id":1322,"depth":93,"text":1323},{"id":1332,"depth":93,"text":1333},{"id":1345,"depth":93,"text":1345},{},{"title":1046,"description":80},[215,1378,1379],{"id":232,"title":233,"body":15379,"category":215,"cover":216,"description":80,"extension":217,"meta":15958,"navigation":108,"path":1034,"pinned":220,"publishedAt":1035,"seo":15959,"slug":1037,"stem":1038,"summary":1039,"tags":15960,"updatedAt":1035,"visible":108,"__hash__":1043},{"type":7,"value":15380,"toc":15934},[15381,15383,15385,15387,15391,15393,15395,15419,15431,15433,15435,15440,15444,15448,15460,15464,15468,15472,15474,15508,15510,15514,15518,15520,15542,15572,15584,15594,15602,15604,15610,15620,15622,15627,15631,15633,15647,15653,15673,15675,15677,15679,15689,15693,15695,15704,15708,15710,15712,15732,15736,15738,15740,15742,15744,15764,15766,15768,15770,15796,15798,15814,15816,15832,15836,15838,15840,15860,15862,15864,15866,15870,15880,15882,15884,15886,15896,15904,15906,15908,15922,15932],[14,15382,238],{"id":238},[10,15384,241],{},[10,15386,244],{},[10,15388,247,15389,251],{},[43,15390,250],{},[14,15392,254],{"id":254},[10,15394,257],{},[259,15396,15397,15399],{},[10,15398,263],{},[259,15400,15401,15407,15409,15413,15415],{},[10,15402,268,15403,272,15405,276],{},[43,15404,271],{},[43,15406,275],{},[10,15408,279],{},[10,15410,282,15411,287],{},[284,15412,286],{},[10,15414,290],{},[10,15416,15417],{},[26,15418],{"alt":295,"src":296},[259,15420,15421,15423],{},[10,15422,301],{},[259,15424,15425,15427],{},[10,15426,306],{},[10,15428,15429],{},[26,15430],{"alt":311,"src":312},[14,15432,316],{"id":315},[318,15434,321],{"id":320},[10,15436,324,15437,332],{},[326,15438,331],{"href":328,"rel":15439},[330],[259,15441,15442],{},[10,15443,337],{},[10,15445,15446],{},[26,15447],{"alt":342,"src":343},[37,15449,15450,15454,15458],{},[40,15451,348,15452,177],{},[284,15453,351],{},[40,15455,354,15456,177],{},[284,15457,357],{},[40,15459,360],{},[10,15461,15462],{},[26,15463],{"alt":365,"src":366},[259,15465,15466],{},[10,15467,371],{},[10,15469,15470],{},[26,15471],{"alt":376,"src":377},[318,15473,381],{"id":380},[259,15475,15476,15480,15484,15504],{},[259,15477,15478],{},[10,15479,388],{},[10,15481,391,15482,395],{},[284,15483,394],{},[75,15485,15486],{"className":77,"code":398,"language":79,"meta":80,"style":80},[43,15487,15488,15492,15496,15500],{"__ignoreMap":80},[84,15489,15490],{"class":86,"line":87},[84,15491,405],{},[84,15493,15494],{"class":86,"line":93},[84,15495,410],{},[84,15497,15498],{"class":86,"line":99},[84,15499,415],{},[84,15501,15502],{"class":86,"line":105},[84,15503,420],{},[10,15505,423,15506,427],{},[284,15507,426],{},[10,15509,430],{},[10,15511,433,15512,436],{},[43,15513,79],{},[10,15515,15516],{},[26,15517],{"alt":441,"src":442},[10,15519,445],{},[259,15521,15522,15524,15528],{},[10,15523,450],{},[10,15525,15526],{},[284,15527,455],{},[259,15529,15530,15534,15538],{},[10,15531,460,15532,463],{},[43,15533,79],{},[10,15535,466,15536,469],{},[43,15537,79],{},[10,15539,472,15540,476],{},[284,15541,475],{},[259,15543,15544,15546,15550],{},[10,15545,481],{},[10,15547,15548],{},[284,15549,486],{},[259,15551,15552,15558,15566,15568],{},[10,15553,15554,494,15556,498],{},[43,15555,493],{},[43,15557,497],{},[10,15559,501,15560,504,15562,508,15564,512],{},[43,15561,493],{},[284,15563,507],{},[284,15565,511],{},[10,15567,515],{},[10,15569,15570,521],{},[284,15571,520],{},[259,15573,15574,15576],{},[10,15575,526],{},[259,15577,15578,15582],{},[10,15579,531,15580,535],{},[284,15581,534],{},[10,15583,538],{},[259,15585,15586,15590],{},[10,15587,543,15588],{},[284,15589,546],{},[10,15591,15592],{},[26,15593],{"alt":551,"src":552},[259,15595,15596,15598],{},[10,15597,557],{},[10,15599,15600],{},[26,15601],{"alt":551,"src":562},[318,15603,566],{"id":565},[10,15605,569,15606,573,15608,577],{},[43,15607,572],{},[43,15609,576],{},[75,15611,15612],{"className":580,"code":581,"language":582,"meta":80,"style":80},[43,15613,15614],{"__ignoreMap":80},[84,15615,15616,15618],{"class":86,"line":87},[84,15617,79],{"class":589},[84,15619,593],{"class":592},[10,15621,596],{},[75,15623,15625],{"className":15624,"code":600,"language":142,"meta":80},[140],[43,15626,600],{"__ignoreMap":80},[10,15628,15629],{},[26,15630],{"alt":551,"src":607},[10,15632,610],{},[75,15634,15635],{"className":580,"code":613,"language":582,"meta":80,"style":80},[43,15636,15637],{"__ignoreMap":80},[84,15638,15639,15641,15643,15645],{"class":86,"line":87},[84,15640,79],{"class":589},[84,15642,622],{"class":592},[84,15644,626],{"class":625},[84,15646,593],{"class":592},[10,15648,631,15649,634,15651,638],{},[43,15650,79],{},[43,15652,637],{},[75,15654,15655],{"className":580,"code":641,"language":582,"meta":80,"style":80},[43,15656,15657,15663],{"__ignoreMap":80},[84,15658,15659,15661],{"class":86,"line":87},[84,15660,497],{"class":589},[84,15662,593],{"class":592},[84,15664,15665,15667,15669,15671],{"class":86,"line":93},[84,15666,497],{"class":589},[84,15668,622],{"class":592},[84,15670,626],{"class":625},[84,15672,593],{"class":592},[14,15674,663],{"id":662},[318,15676,667],{"id":666},[10,15678,670],{},[75,15680,15681],{"className":580,"code":673,"language":582,"meta":80,"style":80},[43,15682,15683],{"__ignoreMap":80},[84,15684,15685,15687],{"class":86,"line":87},[84,15686,680],{"class":589},[84,15688,593],{"class":592},[10,15690,685,15691,689],{},[43,15692,688],{},[318,15694,693],{"id":692},[10,15696,324,15697,701,15700,177,15702,708],{},[326,15698,700],{"href":698,"rel":15699},[330],[284,15701,704],{},[43,15703,707],{},[10,15705,711,15706,715],{},[43,15707,714],{},[318,15709,719],{"id":718},[10,15711,722],{},[75,15713,15714],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,15715,15716,15722],{"__ignoreMap":80},[84,15717,15718,15720],{"class":86,"line":87},[84,15719,680],{"class":589},[84,15721,593],{"class":592},[84,15723,15724,15726,15728,15730],{"class":86,"line":93},[84,15725,680],{"class":589},[84,15727,622],{"class":592},[84,15729,626],{"class":625},[84,15731,593],{"class":592},[10,15733,746,15734,749],{},[43,15735,680],{},[14,15737,753],{"id":752},[10,15739,756],{},[318,15741,760],{"id":759},[10,15743,763],{},[75,15745,15746],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,15747,15748,15754],{"__ignoreMap":80},[84,15749,15750,15752],{"class":86,"line":87},[84,15751,680],{"class":589},[84,15753,593],{"class":592},[84,15755,15756,15758,15760,15762],{"class":86,"line":93},[84,15757,680],{"class":589},[84,15759,622],{"class":592},[84,15761,626],{"class":625},[84,15763,593],{"class":592},[10,15765,786],{},[318,15767,790],{"id":789},[10,15769,793],{},[75,15771,15772],{"className":580,"code":796,"language":582,"meta":80,"style":80},[43,15773,15774,15782],{"__ignoreMap":80},[84,15775,15776,15778,15780],{"class":86,"line":87},[84,15777,803],{"class":589},[84,15779,806],{"class":625},[84,15781,809],{"class":625},[84,15783,15784,15786,15788,15790,15792,15794],{"class":86,"line":93},[84,15785,803],{"class":589},[84,15787,806],{"class":625},[84,15789,818],{"class":625},[84,15791,821],{"class":625},[84,15793,824],{"class":625},[84,15795,827],{"class":625},[10,15797,830],{},[75,15799,15800],{"className":580,"code":833,"language":582,"meta":80,"style":80},[43,15801,15802],{"__ignoreMap":80},[84,15803,15804,15806,15808,15810,15812],{"class":86,"line":87},[84,15805,803],{"class":589},[84,15807,842],{"class":625},[84,15809,818],{"class":625},[84,15811,821],{"class":625},[84,15813,849],{"class":625},[10,15815,852],{},[75,15817,15818],{"className":580,"code":855,"language":582,"meta":80,"style":80},[43,15819,15820],{"__ignoreMap":80},[84,15821,15822,15824,15826,15828,15830],{"class":86,"line":87},[84,15823,803],{"class":589},[84,15825,864],{"class":625},[84,15827,867],{"class":592},[84,15829,870],{"class":625},[84,15831,873],{"class":625},[10,15833,15834,878],{},[43,15835,803],{},[318,15837,882],{"id":881},[10,15839,885],{},[75,15841,15842],{"className":580,"code":725,"language":582,"meta":80,"style":80},[43,15843,15844,15850],{"__ignoreMap":80},[84,15845,15846,15848],{"class":86,"line":87},[84,15847,680],{"class":589},[84,15849,593],{"class":592},[84,15851,15852,15854,15856,15858],{"class":86,"line":93},[84,15853,680],{"class":589},[84,15855,622],{"class":592},[84,15857,626],{"class":625},[84,15859,593],{"class":592},[10,15861,908],{},[14,15863,911],{"id":911},[318,15865,915],{"id":914},[10,15867,918,15868,922],{},[43,15869,921],{},[152,15871,15872,15876,15878],{},[40,15873,927,15874,930],{},[43,15875,637],{},[40,15877,933],{},[40,15879,936],{},[10,15881,939],{},[318,15883,943],{"id":942},[10,15885,946],{},[75,15887,15888],{"className":580,"code":673,"language":582,"meta":80,"style":80},[43,15889,15890],{"__ignoreMap":80},[84,15891,15892,15894],{"class":86,"line":87},[84,15893,680],{"class":589},[84,15895,593],{"class":592},[10,15897,959,15898,962,15900,965,15902,177],{},[43,15899,680],{},[43,15901,79],{},[43,15903,680],{},[318,15905,971],{"id":970},[10,15907,974],{},[75,15909,15910],{"className":580,"code":977,"language":582,"meta":80,"style":80},[43,15911,15912],{"__ignoreMap":80},[84,15913,15914,15916,15918,15920],{"class":86,"line":87},[84,15915,680],{"class":589},[84,15917,622],{"class":592},[84,15919,626],{"class":625},[84,15921,593],{"class":592},[10,15923,992,15924,995,15926,998,15928,1001,15930,1005],{},[43,15925,680],{},[43,15927,79],{},[43,15929,497],{},[43,15931,1004],{},[202,15933,1008],{},{"title":80,"searchDepth":93,"depth":93,"links":15935},[15936,15937,15938,15943,15948,15953],{"id":238,"depth":93,"text":238},{"id":254,"depth":93,"text":254},{"id":315,"depth":93,"text":316,"children":15939},[15940,15941,15942],{"id":320,"depth":99,"text":321},{"id":380,"depth":99,"text":381},{"id":565,"depth":99,"text":566},{"id":662,"depth":93,"text":663,"children":15944},[15945,15946,15947],{"id":666,"depth":99,"text":667},{"id":692,"depth":99,"text":693},{"id":718,"depth":99,"text":719},{"id":752,"depth":93,"text":753,"children":15949},[15950,15951,15952],{"id":759,"depth":99,"text":760},{"id":789,"depth":99,"text":790},{"id":881,"depth":99,"text":882},{"id":911,"depth":93,"text":911,"children":15954},[15955,15956,15957],{"id":914,"depth":99,"text":915},{"id":942,"depth":99,"text":943},{"id":970,"depth":99,"text":971},{},{"title":233,"description":80},[215,1041,1042],1786973364179]