[{"data":1,"prerenderedAt":15951},["ShallowReactive",2],{"post-python-docstrings-type-hints":3,"sidebar-posts":217,"post-related-source":9142},{"id":4,"title":5,"body":6,"category":202,"cover":203,"description":12,"extension":204,"meta":205,"navigation":101,"path":206,"pinned":207,"publishedAt":208,"seo":209,"slug":210,"stem":211,"summary":212,"tags":213,"updatedAt":208,"visible":101,"__hash__":216},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":8,"toc":192},"minimark",[9,13,17,20,23,30,33,36,61,64,67,115,118,126,129,132,149,152,164,167,179,182,185,188],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[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\u002F26-type-hints.svg",[10,31,32],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"文档字符串紧跟在函数定义后的第一条语句。",[40,44,45],{},"注解表达接口意图，不代替输入校验和测试。",[40,47,48,49,53,54,53,57,60],{},"基础注解优先使用 ",[50,51,52],"code",{},"str","、",[50,55,56],{},"int",[50,58,59],{},"list[str]"," 等直接写法。",[14,62,63],{"id":63},"跟着示例运行",[10,65,66],{},"把下面代码保存到本课脚本并运行：",[68,69,74],"pre",{"className":70,"code":71,"language":72,"meta":73,"style":73},"language-python shiki shiki-themes github-dark","def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n","python","",[50,75,76,84,90,96,103,109],{"__ignoreMap":73},[77,78,81],"span",{"class":79,"line":80},"line",1,[77,82,83],{},"def format_score(name: str, score: int) -> str:\n",[77,85,87],{"class":79,"line":86},2,[77,88,89],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[77,91,93],{"class":79,"line":92},3,[77,94,95],{},"    return name + \"：\" + str(score)\n",[77,97,99],{"class":79,"line":98},4,[77,100,102],{"emptyLinePlaceholder":101},true,"\n",[77,104,106],{"class":79,"line":105},5,[77,107,108],{},"print(format_score(\"小郑\", 95))\n",[77,110,112],{"class":79,"line":111},6,[77,113,114],{},"print(format_score.__doc__)\n",[10,116,117],{},"预期结果：",[68,119,124],{"className":120,"code":122,"language":123,"meta":73},[121],"language-text","小郑：95\n返回带姓名的分数文本。\n","text",[50,125,122],{"__ignoreMap":73},[10,127,128],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,130,131],{"id":131},"按执行顺序拆开看",[133,134,135,146],"ol",{},[40,136,137,138,141,142,145],{},"函数签名说明 ",[50,139,140],{},"name"," 预期为字符串、",[50,143,144],{},"score"," 预期为整数，返回值预期为字符串。",[40,147,148],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,150,151],{"id":151},"初学者容易混淆的地方",[37,153,154,161],{},[40,155,156,157,160],{},"认为加了 ",[50,158,159],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,162,163],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,165,166],{"id":166},"练习",[133,168,169,172],{},[40,170,171],{},"为面积函数补充参数和返回值注解。",[40,173,174,175,178],{},"通过 ",[50,176,177],{},"函数名.__doc__"," 查看文档字符串。",[10,180,181],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,183,184],{"id":184},"本篇边界",[10,186,187],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,190,191],"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":73,"searchDepth":86,"depth":86,"links":193},[194,195,196,197,198,199,200,201],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",false,"2026-08-17",{"title":5,"description":12},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[202,214,215],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",[218,1032,1369,1503,1655,1834,2022,2187,2368,2550,2743,2974,3158,3335,3492,3663,3828,4043,4272,4454,4618,4807,4995,5150,5310,5507,5704,5918,6045,6289,6470,6675,6870,7054,7255,7545,7737,7966,8161,8381,8621,8825],{"id":219,"title":220,"body":221,"category":202,"cover":203,"description":73,"extension":204,"meta":1021,"navigation":101,"path":1022,"pinned":207,"publishedAt":1023,"seo":1024,"slug":1025,"stem":1026,"summary":1027,"tags":1028,"updatedAt":1023,"visible":101,"__hash__":1031},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":222,"toc":997},[223,226,229,232,239,242,245,284,300,304,309,320,325,331,349,355,360,366,370,416,419,425,431,434,465,510,527,541,551,555,566,582,585,591,596,599,617,627,648,652,656,659,671,678,682,697,704,708,711,732,738,742,745,749,752,772,775,779,782,816,819,838,841,862,867,871,874,894,897,900,904,911,925,928,932,935,945,956,960,963,978,994],[14,224,225],{"id":225},"引言",[10,227,228],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,230,231],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,233,234,235,238],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[50,236,237],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,240,241],{"id":241},"扫盲",[10,243,244],{},"那么这里有几个概念：",[246,247,248,251],"blockquote",{},[10,249,250],{},"为什么需要安装python解释器？",[246,252,253,264,267,275,278],{},[10,254,255,256,259,260,263],{},"我们写的代码，电脑其实看不懂，电脑只认识",[50,257,258],{},"0","和",[50,261,262],{},"1","组成的机器指令。",[10,265,266],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,268,269,270,274],{},"这样，我们就能用",[271,272,273],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,276,277],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,279,280],{},[26,281],{"alt":282,"src":283},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[246,285,286,289],{},[10,287,288],{},"pip又是什么？",[246,290,291,294],{},[10,292,293],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,295,296],{},[26,297],{"alt":298,"src":299},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,301,303],{"id":302},"windows-安装","Windows 安装",[305,306,308],"h3",{"id":307},"_1-下载官方安装程序","1. 下载官方安装程序",[10,310,311,312,319],{},"打开 ",[313,314,318],"a",{"href":315,"rel":316},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[317],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[246,321,322],{},[10,323,324],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,326,327],{},[26,328],{"alt":329,"src":330},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,332,333,340,346],{},[40,334,335,336,339],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[271,337,338],{},"Windows installer (64-bit)","。",[40,341,342,343,339],{},"搭载 ARM 处理器的 Windows 设备选择 ",[271,344,345],{},"Windows installer (ARM64)",[40,347,348],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,350,351],{},[26,352],{"alt":353,"src":354},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[246,356,357],{},[10,358,359],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,361,362],{},[26,363],{"alt":364,"src":365},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[305,367,369],{"id":368},"_2-安装并加入-path","2. 安装并加入 PATH",[246,371,372,377,384,409],{},[246,373,374],{},[10,375,376],{},"PATH 环境变量",[10,378,379,380,383],{},"Windows 有一个特殊的变量叫 ",[271,381,382],{},"PATH","，它里面存了一串文件夹路径，比如：",[68,385,387],{"className":70,"code":386,"language":72,"meta":73,"style":73},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[50,388,389,394,399,404],{"__ignoreMap":73},[77,390,391],{"class":79,"line":80},[77,392,393],{},"D:\\Python313\\\n",[77,395,396],{"class":79,"line":86},[77,397,398],{},"D:\\Python313\\Scripts\\\n",[77,400,401],{"class":79,"line":92},[77,402,403],{},"C:\\Windows\\System32\\\n",[77,405,406],{"class":79,"line":98},[77,407,408],{},"...\n",[10,410,411,412,415],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[271,413,414],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,417,418],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,420,421,422,424],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[50,423,72],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,426,427],{},[26,428],{"alt":429,"src":430},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,432,433],{},"对安装界面最底部的两个勾选项分别解释 :",[246,435,436,439,444],{},[10,437,438],{},"Add python.exe to PATH",[10,440,441],{},[271,442,443],{},"把 Python 添加到系统环境变量",[246,445,446,452,458],{},[10,447,448,449,451],{},"勾选后，你可以在命令行任意位置直接输入 ",[50,450,72],{}," 就能运行",[10,453,454,455,457],{},"不勾选的话，命令行输入 ",[50,456,72],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,459,460,461,464],{},"必须",[271,462,463],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[246,466,467,470,475],{},[10,468,469],{},"Use admin privileges when installing py.exe",[10,471,472],{},[271,473,474],{},"使用管理员权限安装 py.exe（Python 启动器）",[246,476,477,487,501,504],{},[10,478,479,482,483,486],{},[50,480,481],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[50,484,485],{},"py"," 来启动 Python。",[10,488,489,490,492,493,496,497,500],{},"勾选后，",[50,491,481],{}," 会安装到",[271,494,495],{},"系统级目录","，电脑上",[271,498,499],{},"所有用户账户","都能用",[10,502,503],{},"不勾选，只有当前用户能用",[10,505,506,509],{},[271,507,508],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[246,511,512,515],{},[10,513,514],{},"操作建议",[246,516,517,524],{},[10,518,519,520,523],{},"两个都勾上之后，再点 ",[271,521,522],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,525,526],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[246,528,529,535],{},[10,530,531,532],{},"Python 安装的",[271,533,534],{},"可选功能页",[10,536,537],{},[26,538],{"alt":539,"src":540},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[246,542,543,546],{},[10,544,545],{},"高级选项页",[10,547,548],{},[26,549],{"alt":539,"src":550},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[305,552,554],{"id":553},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,556,557,558,561,562,565],{},"按 ",[50,559,560],{},"Win + R","，输入 ",[50,563,564],{},"cmd"," 并回车，然后执行：",[68,567,571],{"className":568,"code":569,"language":570,"meta":73,"style":73},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[50,572,573],{"__ignoreMap":73},[77,574,575,578],{"class":79,"line":80},[77,576,72],{"class":577},"svObZ",[77,579,581],{"class":580},"sDLfK"," --version\n",[10,583,584],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[68,586,589],{"className":587,"code":588,"language":123,"meta":73},[121],"Python 3.x.x\n",[50,590,588],{"__ignoreMap":73},[10,592,593],{},[26,594],{"alt":539,"src":595},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,597,598],{},"继续检查 pip：",[68,600,602],{"className":568,"code":601,"language":570,"meta":73,"style":73},"python -m pip --version\n",[50,603,604],{"__ignoreMap":73},[77,605,606,608,611,615],{"class":79,"line":80},[77,607,72],{"class":577},[77,609,610],{"class":580}," -m",[77,612,614],{"class":613},"sU2Wk"," pip",[77,616,581],{"class":580},[10,618,619,620,622,623,626],{},"如果 ",[50,621,72],{}," 无法识别，但 ",[50,624,625],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[68,628,630],{"className":568,"code":629,"language":570,"meta":73,"style":73},"py --version\npy -m pip --version\n",[50,631,632,638],{"__ignoreMap":73},[77,633,634,636],{"class":79,"line":80},[77,635,485],{"class":577},[77,637,581],{"class":580},[77,639,640,642,644,646],{"class":79,"line":86},[77,641,485],{"class":577},[77,643,610],{"class":580},[77,645,614],{"class":613},[77,647,581],{"class":580},[14,649,651],{"id":650},"macos-安装","macOS 安装",[305,653,655],{"id":654},"_1-先检查现有环境","1. 先检查现有环境",[10,657,658],{},"打开“终端”应用，执行：",[68,660,662],{"className":568,"code":661,"language":570,"meta":73,"style":73},"python3 --version\n",[50,663,664],{"__ignoreMap":73},[77,665,666,669],{"class":79,"line":80},[77,667,668],{"class":577},"python3",[77,670,581],{"class":580},[10,672,673,674,677],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[50,675,676],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[305,679,681],{"id":680},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,683,311,684,689,690,339,693,696],{},[313,685,688],{"href":686,"rel":687},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[317],"Python macOS 下载页","，下载当前稳定版的 ",[271,691,692],{},"macOS 64-bit universal2 installer",[50,694,695],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,698,699,700,703],{},"下载完成后打开 ",[50,701,702],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[305,705,707],{"id":706},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,709,710],{},"安装完成后重新打开终端，执行：",[68,712,714],{"className":568,"code":713,"language":570,"meta":73,"style":73},"python3 --version\npython3 -m pip --version\n",[50,715,716,722],{"__ignoreMap":73},[77,717,718,720],{"class":79,"line":80},[77,719,668],{"class":577},[77,721,581],{"class":580},[77,723,724,726,728,730],{"class":79,"line":86},[77,725,668],{"class":577},[77,727,610],{"class":580},[77,729,614],{"class":613},[77,731,581],{"class":580},[10,733,734,735,737],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[50,736,668],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,739,741],{"id":740},"linux-安装","Linux 安装",[10,743,744],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[305,746,748],{"id":747},"_1-检查是否已经安装","1. 检查是否已经安装",[10,750,751],{},"打开终端，执行：",[68,753,754],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,755,756,762],{"__ignoreMap":73},[77,757,758,760],{"class":79,"line":80},[77,759,668],{"class":577},[77,761,581],{"class":580},[77,763,764,766,768,770],{"class":79,"line":86},[77,765,668],{"class":577},[77,767,610],{"class":580},[77,769,614],{"class":613},[77,771,581],{"class":580},[10,773,774],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[305,776,778],{"id":777},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,780,781],{},"Ubuntu 或 Debian：",[68,783,785],{"className":568,"code":784,"language":570,"meta":73,"style":73},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[50,786,787,798],{"__ignoreMap":73},[77,788,789,792,795],{"class":79,"line":80},[77,790,791],{"class":577},"sudo",[77,793,794],{"class":613}," apt",[77,796,797],{"class":613}," update\n",[77,799,800,802,804,807,810,813],{"class":79,"line":86},[77,801,791],{"class":577},[77,803,794],{"class":613},[77,805,806],{"class":613}," install",[77,808,809],{"class":613}," python3",[77,811,812],{"class":613}," python3-pip",[77,814,815],{"class":613}," python3-venv\n",[10,817,818],{},"Fedora：",[68,820,822],{"className":568,"code":821,"language":570,"meta":73,"style":73},"sudo dnf install python3 python3-pip\n",[50,823,824],{"__ignoreMap":73},[77,825,826,828,831,833,835],{"class":79,"line":80},[77,827,791],{"class":577},[77,829,830],{"class":613}," dnf",[77,832,806],{"class":613},[77,834,809],{"class":613},[77,836,837],{"class":613}," python3-pip\n",[10,839,840],{},"Arch Linux：",[68,842,844],{"className":568,"code":843,"language":570,"meta":73,"style":73},"sudo pacman -S python python-pip\n",[50,845,846],{"__ignoreMap":73},[77,847,848,850,853,856,859],{"class":79,"line":80},[77,849,791],{"class":577},[77,851,852],{"class":613}," pacman",[77,854,855],{"class":580}," -S",[77,857,858],{"class":613}," python",[77,860,861],{"class":613}," python-pip\n",[10,863,864,866],{},[50,865,791],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[305,868,870],{"id":869},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,872,873],{},"安装结束后执行：",[68,875,876],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,877,878,884],{"__ignoreMap":73},[77,879,880,882],{"class":79,"line":80},[77,881,668],{"class":577},[77,883,581],{"class":580},[77,885,886,888,890,892],{"class":79,"line":86},[77,887,668],{"class":577},[77,889,610],{"class":580},[77,891,614],{"class":613},[77,893,581],{"class":580},[10,895,896],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,898,899],{"id":899},"常见问题",[305,901,903],{"id":902},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,905,906,907,910],{},"先关闭当前命令提示符并重新打开，再执行 ",[50,908,909],{},"python --version","。如果仍然失败，按下面的顺序检查：",[133,912,913,919,922],{},[40,914,915,916,918],{},"执行 ",[50,917,625],{},"，确认 Python Launcher 是否可用。",[40,920,921],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,923,924],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,926,927],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[305,929,931],{"id":930},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,933,934],{},"先尝试：",[68,936,937],{"className":568,"code":661,"language":570,"meta":73,"style":73},[50,938,939],{"__ignoreMap":73},[77,940,941,943],{"class":79,"line":80},[77,942,668],{"class":577},[77,944,581],{"class":580},[10,946,947,948,950,951,953,954,339],{},"在这两个系统中，只有 ",[50,949,668],{}," 命令而没有 ",[50,952,72],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[50,955,668],{},[305,957,959],{"id":958},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,961,962],{},"先使用模块方式检查：",[68,964,966],{"className":568,"code":965,"language":570,"meta":73,"style":73},"python3 -m pip --version\n",[50,967,968],{"__ignoreMap":73},[77,969,970,972,974,976],{"class":79,"line":80},[77,971,668],{"class":577},[77,973,610],{"class":580},[77,975,614],{"class":613},[77,977,581],{"class":580},[10,979,980,981,983,984,986,987,989,990,993],{},"Windows 用户将命令中的 ",[50,982,668],{}," 换成 ",[50,985,72],{}," 或 ",[50,988,485],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[50,991,992],{},"python3-pip","；不要直接使用其他系统的安装命令。",[189,995,996],{},"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":73,"searchDepth":86,"depth":86,"links":998},[999,1000,1001,1006,1011,1016],{"id":225,"depth":86,"text":225},{"id":241,"depth":86,"text":241},{"id":302,"depth":86,"text":303,"children":1002},[1003,1004,1005],{"id":307,"depth":92,"text":308},{"id":368,"depth":92,"text":369},{"id":553,"depth":92,"text":554},{"id":650,"depth":86,"text":651,"children":1007},[1008,1009,1010],{"id":654,"depth":92,"text":655},{"id":680,"depth":92,"text":681},{"id":706,"depth":92,"text":707},{"id":740,"depth":86,"text":741,"children":1012},[1013,1014,1015],{"id":747,"depth":92,"text":748},{"id":777,"depth":92,"text":778},{"id":869,"depth":92,"text":870},{"id":899,"depth":86,"text":899,"children":1017},[1018,1019,1020],{"id":902,"depth":92,"text":903},{"id":930,"depth":92,"text":931},{"id":958,"depth":92,"text":959},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":220,"description":73},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[202,1029,1030],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1033,"title":1034,"body":1035,"category":202,"cover":1042,"description":73,"extension":204,"meta":1358,"navigation":101,"path":1359,"pinned":207,"publishedAt":1360,"seo":1361,"slug":1362,"stem":1363,"summary":1364,"tags":1365,"updatedAt":1360,"visible":101,"__hash__":1368},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1036,"toc":1343},[1037,1043,1046,1049,1053,1056,1080,1083,1089,1092,1095,1129,1139,1143,1150,1153,1178,1181,1193,1196,1200,1203,1206,1209,1212,1215,1218,1221,1245,1248,1251,1257,1260,1263,1266,1270,1276,1279,1305,1308,1312,1315,1318,1322,1325,1328,1331,1334,1337,1340],[10,1038,1039],{},[26,1040],{"alt":1041,"src":1042},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1044,1045],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1047,1048],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1050,1052],{"id":1051},"python-代码是什么样的","Python 代码是什么样的",[10,1054,1055],{},"下面是一段简单的 Python 代码：",[68,1057,1059],{"className":70,"code":1058,"language":72,"meta":73,"style":73},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[50,1060,1061,1066,1071,1075],{"__ignoreMap":73},[77,1062,1063],{"class":79,"line":80},[77,1064,1065],{},"name = \"Python\"\n",[77,1067,1068],{"class":79,"line":86},[77,1069,1070],{},"year = 2026\n",[77,1072,1073],{"class":79,"line":92},[77,1074,102],{"emptyLinePlaceholder":101},[77,1076,1077],{"class":79,"line":98},[77,1078,1079],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1081,1082],{},"运行结果：",[68,1084,1087],{"className":1085,"code":1086,"language":123,"meta":73},[121],"正在学习 Python，当前年份是 2026\n",[50,1088,1086],{"__ignoreMap":73},[10,1090,1091],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1093,1094],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[68,1096,1098],{"className":70,"code":1097,"language":72,"meta":73,"style":73},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[50,1099,1100,1105,1109,1114,1119,1124],{"__ignoreMap":73},[77,1101,1102],{"class":79,"line":80},[77,1103,1104],{},"score = 85\n",[77,1106,1107],{"class":79,"line":86},[77,1108,102],{"emptyLinePlaceholder":101},[77,1110,1111],{"class":79,"line":92},[77,1112,1113],{},"if score >= 60:\n",[77,1115,1116],{"class":79,"line":98},[77,1117,1118],{},"    print(\"成绩合格\")\n",[77,1120,1121],{"class":79,"line":105},[77,1122,1123],{},"else:\n",[77,1125,1126],{"class":79,"line":111},[77,1127,1128],{},"    print(\"需要继续学习\")\n",[10,1130,1131,1134,1135,1138],{},[50,1132,1133],{},"if"," 和 ",[50,1136,1137],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1140,1142],{"id":1141},"python-如何运行代码","Python 如何运行代码",[10,1144,1145,1146,1149],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[50,1147,1148],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1151,1152],{},"交互式环境适合快速验证一个表达式：",[68,1154,1156],{"className":70,"code":1155,"language":72,"meta":73,"style":73},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[50,1157,1158,1163,1168,1173],{"__ignoreMap":73},[77,1159,1160],{"class":79,"line":80},[77,1161,1162],{},">>> 10 + 20\n",[77,1164,1165],{"class":79,"line":86},[77,1166,1167],{},"30\n",[77,1169,1170],{"class":79,"line":92},[77,1171,1172],{},">>> \"Python\".lower()\n",[77,1174,1175],{"class":79,"line":98},[77,1176,1177],{},"'python'\n",[10,1179,1180],{},"需要保存和重复运行的程序，则可以写入文件：",[68,1182,1184],{"className":568,"code":1183,"language":570,"meta":73,"style":73},"python3 hello.py\n",[50,1185,1186],{"__ignoreMap":73},[77,1187,1188,1190],{"class":79,"line":80},[77,1189,668],{"class":577},[77,1191,1192],{"class":613}," hello.py\n",[10,1194,1195],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1197,1199],{"id":1198},"python-的特点","Python 的特点",[305,1201,1202],{"id":1202},"语法相对简洁",[10,1204,1205],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[305,1207,1208],{"id":1208},"支持多种编程方式",[10,1210,1211],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[305,1213,1214],{"id":1214},"标准库比较完整",[10,1216,1217],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1219,1220],{},"例如，获取当前时间：",[68,1222,1224],{"className":70,"code":1223,"language":72,"meta":73,"style":73},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[50,1225,1226,1231,1235,1240],{"__ignoreMap":73},[77,1227,1228],{"class":79,"line":80},[77,1229,1230],{},"from datetime import datetime\n",[77,1232,1233],{"class":79,"line":86},[77,1234,102],{"emptyLinePlaceholder":101},[77,1236,1237],{"class":79,"line":92},[77,1238,1239],{},"now = datetime.now()\n",[77,1241,1242],{"class":79,"line":98},[77,1243,1244],{},"print(now)\n",[10,1246,1247],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[305,1249,1250],{"id":1250},"第三方工具丰富",[10,1252,1253,1254,1256],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[50,1255,237],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1258,1259],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[305,1261,1262],{"id":1262},"支持多个操作系统",[10,1264,1265],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1267,1269],{"id":1268},"python-可以做什么","Python 可以做什么",[10,1271,1272],{},[26,1273],{"alt":1274,"src":1275},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1277,1278],{},"Python 的应用范围比较广，常见方向包括：",[37,1280,1281,1284,1287,1290,1293,1296,1299,1302],{},[40,1282,1283],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1285,1286],{},"开发网站后端和 API 服务；",[40,1288,1289],{},"进行数据清洗、统计分析和图表展示；",[40,1291,1292],{},"编写网络爬虫和信息采集工具；",[40,1294,1295],{},"开发自动化测试程序；",[40,1297,1298],{},"进行机器学习和人工智能开发；",[40,1300,1301],{},"编写运维、监控和辅助开发工具；",[40,1303,1304],{},"开发部分桌面应用和插件。",[10,1306,1307],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1309,1311],{"id":1310},"python-的发展","Python 的发展",[10,1313,1314],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1316,1317],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1319,1321],{"id":1320},"python-也有局限","Python 也有局限",[10,1323,1324],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1326,1327],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1329,1330],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1332,1333],{"id":1333},"写在最后",[10,1335,1336],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1338,1339],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[189,1341,1342],{},"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":73,"searchDepth":86,"depth":86,"links":1344},[1345,1346,1347,1354,1355,1356,1357],{"id":1051,"depth":86,"text":1052},{"id":1141,"depth":86,"text":1142},{"id":1198,"depth":86,"text":1199,"children":1348},[1349,1350,1351,1352,1353],{"id":1202,"depth":92,"text":1202},{"id":1208,"depth":92,"text":1208},{"id":1214,"depth":92,"text":1214},{"id":1250,"depth":92,"text":1250},{"id":1262,"depth":92,"text":1262},{"id":1268,"depth":86,"text":1269},{"id":1310,"depth":86,"text":1311},{"id":1320,"depth":86,"text":1321},{"id":1333,"depth":86,"text":1333},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1034,"description":73},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[202,1366,1367],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1370,"title":1371,"body":1372,"category":202,"cover":203,"description":1376,"extension":204,"meta":1494,"navigation":101,"path":1495,"pinned":207,"publishedAt":208,"seo":1496,"slug":1497,"stem":1498,"summary":1499,"tags":1500,"updatedAt":208,"visible":101,"__hash__":1502},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1373,"toc":1484},[1374,1377,1379,1382,1384,1390,1395,1397,1411,1413,1415,1424,1426,1432,1434,1436,1452,1454,1465,1467,1475,1477,1479,1482],[10,1375,1376],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1378,16],{"id":16},[10,1380,1381],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1383,22],{"id":22},[10,1385,1386],{},[26,1387],{"alt":1388,"src":1389},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1391,1392,1394],{},[50,1393,1148],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1396,35],{"id":35},[37,1398,1399,1405,1408],{},[40,1400,1401,1402,1404],{},"源代码是人编写的文本，通常保存在 ",[50,1403,1148],{}," 文件中。",[40,1406,1407],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1409,1410],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1412,63],{"id":63},[10,1414,66],{},[68,1416,1418],{"className":70,"code":1417,"language":72,"meta":73,"style":73},"print(\"你好，Python\")\n",[50,1419,1420],{"__ignoreMap":73},[77,1421,1422],{"class":79,"line":80},[77,1423,1417],{},[10,1425,117],{},[68,1427,1430],{"className":1428,"code":1429,"language":123,"meta":73},[121],"你好，Python\n",[50,1431,1429],{"__ignoreMap":73},[10,1433,128],{},[14,1435,131],{"id":131},[133,1437,1438,1445],{},[40,1439,1440,1441,1444],{},"终端启动解释器后，解释器读取 ",[50,1442,1443],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1446,1447,1448,1451],{},"字符串对象先准备好，再交给 ",[50,1449,1450],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1453,151],{"id":151},[37,1455,1456,1459],{},[40,1457,1458],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1460,1461,1462,1464],{},"认为 ",[50,1463,1148],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1466,166],{"id":166},[133,1468,1469,1472],{},[40,1470,1471],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1473,1474],{},"把示例文字改成自己的学习目标并重新运行。",[10,1476,181],{},[14,1478,184],{"id":184},[10,1480,1481],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,1483,191],{},{"title":73,"searchDepth":86,"depth":86,"links":1485},[1486,1487,1488,1489,1490,1491,1492,1493],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1371,"description":1376},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[202,1366,1501],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1504,"title":1505,"body":1506,"category":202,"cover":203,"description":1510,"extension":204,"meta":1646,"navigation":101,"path":1647,"pinned":207,"publishedAt":208,"seo":1648,"slug":1649,"stem":1650,"summary":1651,"tags":1652,"updatedAt":208,"visible":101,"__hash__":1654},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1507,"toc":1636},[1508,1511,1513,1516,1518,1524,1530,1532,1547,1549,1552,1572,1574,1580,1582,1584,1597,1599,1613,1615,1626,1628,1630,1633],[10,1509,1510],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1512,16],{"id":16},[10,1514,1515],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1517,22],{"id":22},[10,1519,1520],{},[26,1521],{"alt":1522,"src":1523},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1525,1526,1527,1529],{},"终端收到 ",[50,1528,668],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1531,35],{"id":35},[37,1533,1534,1537,1540],{},[40,1535,1536],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1538,1539],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1541,1542,1543,1546],{},"检查 pip 时使用 ",[50,1544,1545],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1548,63],{"id":63},[10,1550,1551],{},"在 macOS 终端执行：",[68,1553,1554],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,1555,1556,1562],{"__ignoreMap":73},[77,1557,1558,1560],{"class":79,"line":80},[77,1559,668],{"class":577},[77,1561,581],{"class":580},[77,1563,1564,1566,1568,1570],{"class":79,"line":86},[77,1565,668],{"class":577},[77,1567,610],{"class":580},[77,1569,614],{"class":613},[77,1571,581],{"class":580},[10,1573,117],{},[68,1575,1578],{"className":1576,"code":1577,"language":123,"meta":73},[121],"Python 3.14.x\npip 版本信息与安装路径\n",[50,1579,1577],{"__ignoreMap":73},[10,1581,128],{},[14,1583,131],{"id":131},[133,1585,1586,1592],{},[40,1587,1588,1591],{},[50,1589,1590],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1593,1594,1596],{},[50,1595,676],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1598,151],{"id":151},[37,1600,1601,1607],{},[40,1602,1603,1604,1606],{},"看到系统已有 ",[50,1605,668],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1608,1609,1610,1612],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[50,1611,668],{},"，不修改系统自带工具。",[14,1614,166],{"id":166},[133,1616,1617,1623],{},[40,1618,915,1619,1622],{},[50,1620,1621],{},"which python3","，记录当前解释器路径。",[40,1624,1625],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1627,181],{},[14,1629,184],{"id":184},[10,1631,1632],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,1634,1635],{},"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":73,"searchDepth":86,"depth":86,"links":1637},[1638,1639,1640,1641,1642,1643,1644,1645],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1505,"description":1510},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[202,1653,1029],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1656,"title":1657,"body":1658,"category":202,"cover":203,"description":1823,"extension":204,"meta":1824,"navigation":101,"path":1825,"pinned":207,"publishedAt":208,"seo":1826,"slug":1827,"stem":1828,"summary":1829,"tags":1830,"updatedAt":208,"visible":101,"__hash__":1833},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1659,"toc":1813},[1660,1666,1668,1671,1673,1679,1682,1684,1708,1710,1712,1739,1741,1747,1749,1751,1769,1771,1785,1787,1801,1803,1805,1811],[10,1661,1662,1663,1665],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[50,1664,1148],{}," 脚本。",[14,1667,16],{"id":16},[10,1669,1670],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1672,22],{"id":22},[10,1674,1675],{},[26,1676],{"alt":1677,"src":1678},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1680,1681],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1683,35],{"id":35},[37,1685,1686,1695,1702],{},[40,1687,1688,1689,1691,1692,339],{},"在终端输入 ",[50,1690,668],{}," 进入 REPL，提示符通常是 ",[50,1693,1694],{},">>>",[40,1696,1697,1698,1701],{},"输入 ",[50,1699,1700],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1703,1704,1705,1707],{},"需要保存、复查或多次运行的代码应写入 ",[50,1706,1148],{}," 文件。",[14,1709,63],{"id":63},[10,1711,66],{},[68,1713,1717],{"className":1714,"code":1715,"language":1716,"meta":73,"style":73},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[50,1718,1719,1724,1729,1734],{"__ignoreMap":73},[77,1720,1721],{"class":79,"line":80},[77,1722,1723],{},">>> 2 + 3\n",[77,1725,1726],{"class":79,"line":86},[77,1727,1728],{},"5\n",[77,1730,1731],{"class":79,"line":92},[77,1732,1733],{},">>> \"python\".upper()\n",[77,1735,1736],{"class":79,"line":98},[77,1737,1738],{},"'PYTHON'\n",[10,1740,117],{},[68,1742,1745],{"className":1743,"code":1744,"language":123,"meta":73},[121],"REPL 会直接显示表达式结果\n",[50,1746,1744],{"__ignoreMap":73},[10,1748,128],{},[14,1750,131],{"id":131},[133,1752,1753,1763],{},[40,1754,1755,1756,1759,1760,339],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[50,1757,1758],{},"2 + 3"," 能直接看到 ",[50,1761,1762],{},"5",[40,1764,1765,1766,1768],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[50,1767,1450],{}," 才会写到标准输出。",[14,1770,151],{"id":151},[37,1772,1773,1782],{},[40,1774,1775,1776,1778,1779,1781],{},"把提示符 ",[50,1777,1694],{}," 复制进 ",[50,1780,1148],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1783,1784],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1786,166],{"id":166},[133,1788,1789,1795],{},[40,1790,1791,1792,339],{},"在 REPL 计算 ",[50,1793,1794],{},"12 * 8",[40,1796,1797,1798,1800],{},"把同一表达式写入脚本；观察脚本中不调用 ",[50,1799,1450],{}," 时是否显示结果。",[10,1802,181],{},[14,1804,184],{"id":184},[10,1806,1807,1808,1810],{},"本篇目标是根据任务选择 REPL 或 ",[50,1809,1148],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,1812,191],{},{"title":73,"searchDepth":86,"depth":86,"links":1814},[1815,1816,1817,1818,1819,1820,1821,1822],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1657,"description":1823},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[202,1831,1832],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1835,"title":1836,"body":1837,"category":202,"cover":203,"description":1841,"extension":204,"meta":2012,"navigation":101,"path":2013,"pinned":207,"publishedAt":208,"seo":2014,"slug":2015,"stem":2016,"summary":2017,"tags":2018,"updatedAt":208,"visible":101,"__hash__":2021},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1838,"toc":2002},[1839,1842,1844,1847,1849,1855,1861,1863,1881,1883,1885,1930,1932,1938,1940,1942,1964,1966,1978,1980,1992,1994,1996,1999],[10,1840,1841],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1843,16],{"id":16},[10,1845,1846],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1848,22],{"id":22},[10,1850,1851],{},[26,1852],{"alt":1853,"src":1854},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1856,1857,1860],{},[50,1858,1859],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1862,35],{"id":35},[37,1864,1865,1868,1878],{},[40,1866,1867],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1869,1870,1873,1874,1877],{},[50,1871,1872],{},"pwd"," 显示当前目录，",[50,1875,1876],{},"ls"," 显示目录里的文件。",[40,1879,1880],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1882,63],{"id":63},[10,1884,1551],{},[68,1886,1888],{"className":568,"code":1887,"language":570,"meta":73,"style":73},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[50,1889,1890,1898,1905,1910,1924],{"__ignoreMap":73},[77,1891,1892,1895],{"class":79,"line":80},[77,1893,1894],{"class":577},"mkdir",[77,1896,1897],{"class":613}," python-study\n",[77,1899,1900,1903],{"class":79,"line":86},[77,1901,1902],{"class":580},"cd",[77,1904,1897],{"class":613},[77,1906,1907],{"class":79,"line":92},[77,1908,1909],{"class":580},"pwd\n",[77,1911,1912,1915,1918,1922],{"class":79,"line":98},[77,1913,1914],{"class":580},"printf",[77,1916,1917],{"class":613}," 'print(\"项目已经运行\")\\n'",[77,1919,1921],{"class":1920},"snl16"," >",[77,1923,1192],{"class":613},[77,1925,1926,1928],{"class":79,"line":105},[77,1927,668],{"class":577},[77,1929,1192],{"class":613},[10,1931,117],{},[68,1933,1936],{"className":1934,"code":1935,"language":123,"meta":73},[121],"项目已经运行\n",[50,1937,1935],{"__ignoreMap":73},[10,1939,128],{},[14,1941,131],{"id":131},[133,1943,1944,1955],{},[40,1945,1946,1948,1949,1951,1952,1954],{},[50,1947,1894],{}," 创建目录，",[50,1950,1902],{}," 改变终端当前目录，",[50,1953,1872],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1956,1957,1959,1960,1963],{},[50,1958,1859],{}," 会在当前目录寻找 ",[50,1961,1962],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1965,151],{"id":151},[37,1967,1968,1975],{},[40,1969,1970,1971,1134,1973,339],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[50,1972,1872],{},[50,1974,1876],{},[40,1976,1977],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1979,166],{"id":166},[133,1981,1982,1989],{},[40,1983,1984,1985,1988],{},"新建 ",[50,1986,1987],{},"lesson01.py"," 并输出课程编号。",[40,1990,1991],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1993,181],{},[14,1995,184],{"id":184},[10,1997,1998],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,2000,2001],{},"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":73,"searchDepth":86,"depth":86,"links":2003},[2004,2005,2006,2007,2008,2009,2010,2011],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1836,"description":1841},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[202,2019,2020],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2023,"title":2024,"body":2025,"category":202,"cover":203,"description":2029,"extension":204,"meta":2177,"navigation":101,"path":2178,"pinned":207,"publishedAt":208,"seo":2179,"slug":2180,"stem":2181,"summary":2182,"tags":2183,"updatedAt":208,"visible":101,"__hash__":2186},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2026,"toc":2167},[2027,2030,2032,2035,2037,2043,2054,2056,2076,2078,2080,2100,2102,2108,2110,2112,2131,2133,2141,2143,2158,2160,2162,2165],[10,2028,2029],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2031,16],{"id":16},[10,2033,2034],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2036,22],{"id":22},[10,2038,2039],{},[26,2040],{"alt":2041,"src":2042},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2044,2045,2046,339,2048,2051,2052,339],{},"Python 先计算表达式，再把得到的对象交给 ",[50,2047,1450],{},[50,2049,2050],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[50,2053,1758],{},[14,2055,35],{"id":35},[37,2057,2058,2064,2073],{},[40,2059,2060,2063],{},[50,2061,2062],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2065,2066,2069,2070,339],{},[50,2067,2068],{},"7 + 5"," 是表达式，运行时先求值得到 ",[50,2071,2072],{},"12",[40,2074,2075],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2077,63],{"id":63},[10,2079,66],{},[68,2081,2083],{"className":70,"code":2082,"language":72,"meta":73,"style":73},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[50,2084,2085,2090,2095],{"__ignoreMap":73},[77,2086,2087],{"class":79,"line":80},[77,2088,2089],{},"print(42)\n",[77,2091,2092],{"class":79,"line":86},[77,2093,2094],{},"print(7 + 5)\n",[77,2096,2097],{"class":79,"line":92},[77,2098,2099],{},"print(\"Python 基础课\")\n",[10,2101,117],{},[68,2103,2106],{"className":2104,"code":2105,"language":123,"meta":73},[121],"42\n12\nPython 基础课\n",[50,2107,2105],{"__ignoreMap":73},[10,2109,128],{},[14,2111,131],{"id":131},[133,2113,2114,2122],{},[40,2115,2116,2119,2120,339],{},[50,2117,2118],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[50,2121,2072],{},[40,2123,2124,2126,2127,2130],{},[50,2125,1450],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[50,2128,2129],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2132,151],{"id":151},[37,2134,2135,2138],{},[40,2136,2137],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2139,2140],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2142,166],{"id":166},[133,2144,2145,2148],{},[40,2146,2147],{},"分别输出一个整数、一个小数和一段文本。",[40,2149,2150,2151,2153,2154,2157],{},"比较 ",[50,2152,2050],{}," 与 ",[50,2155,2156],{},"print(\"2 + 3\")"," 的结果。",[10,2159,181],{},[14,2161,184],{"id":184},[10,2163,2164],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,2166,191],{},{"title":73,"searchDepth":86,"depth":86,"links":2168},[2169,2170,2171,2172,2173,2174,2175,2176],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2024,"description":2029},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[202,2184,2185],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2188,"title":2189,"body":2190,"category":202,"cover":203,"description":2194,"extension":204,"meta":2358,"navigation":101,"path":2359,"pinned":207,"publishedAt":208,"seo":2360,"slug":2361,"stem":2362,"summary":2363,"tags":2364,"updatedAt":208,"visible":101,"__hash__":2367},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2191,"toc":2348},[2192,2195,2197,2200,2202,2208,2211,2213,2236,2238,2240,2268,2270,2276,2278,2280,2304,2306,2322,2324,2339,2341,2343,2346],[10,2193,2194],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2196,16],{"id":16},[10,2198,2199],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2201,22],{"id":22},[10,2203,2204],{},[26,2205],{"alt":2206,"src":2207},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2209,2210],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2212,35],{"id":35},[37,2214,2215,2218,2227],{},[40,2216,2217],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2219,2220,2221,2153,2223,2226],{},"变量名区分大小写，",[50,2222,144],{},[50,2224,2225],{},"Score"," 是两个名字。",[40,2228,2229,2230,53,2233,2235],{},"使用能表达含义的名称；不要用 ",[50,2231,2232],{},"list",[50,2234,52],{}," 等内置名称作为普通变量名。",[14,2237,63],{"id":63},[10,2239,66],{},[68,2241,2243],{"className":70,"code":2242,"language":72,"meta":73,"style":73},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[50,2244,2245,2250,2255,2259,2264],{"__ignoreMap":73},[77,2246,2247],{"class":79,"line":80},[77,2248,2249],{},"score = 90\n",[77,2251,2252],{"class":79,"line":86},[77,2253,2254],{},"print(score)\n",[77,2256,2257],{"class":79,"line":92},[77,2258,102],{"emptyLinePlaceholder":101},[77,2260,2261],{"class":79,"line":98},[77,2262,2263],{},"score = 95\n",[77,2265,2266],{"class":79,"line":105},[77,2267,2254],{},[10,2269,117],{},[68,2271,2274],{"className":2272,"code":2273,"language":123,"meta":73},[121],"90\n95\n",[50,2275,2273],{"__ignoreMap":73},[10,2277,128],{},[14,2279,131],{"id":131},[133,2281,2282,2291],{},[40,2283,915,2284,2287,2288,2290],{},[50,2285,2286],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[50,2289,144],{}," 再绑定到它。",[40,2292,915,2293,2296,2297,2300,2301,339],{},[50,2294,2295],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[50,2298,2299],{},"90"," 没有被改造成 ",[50,2302,2303],{},"95",[14,2305,151],{"id":151},[37,2307,2308,2311],{},[40,2309,2310],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2312,2313,2314,53,2316,53,2318,2321],{},"使用 ",[50,2315,2232],{},[50,2317,52],{},[50,2319,2320],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2323,166],{"id":166},[133,2325,2326,2336],{},[40,2327,2328,2329,1134,2332,2335],{},"创建 ",[50,2330,2331],{},"course_name",[50,2333,2334],{},"lesson_count"," 两个变量并输出。",[40,2337,2338],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2340,181],{},[14,2342,184],{"id":184},[10,2344,2345],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,2347,191],{},{"title":73,"searchDepth":86,"depth":86,"links":2349},[2350,2351,2352,2353,2354,2355,2356,2357],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2189,"description":2194},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[202,2365,2366],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2369,"title":2370,"body":2371,"category":202,"cover":203,"description":2375,"extension":204,"meta":2540,"navigation":101,"path":2541,"pinned":207,"publishedAt":208,"seo":2542,"slug":2543,"stem":2544,"summary":2545,"tags":2546,"updatedAt":208,"visible":101,"__hash__":2549},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2372,"toc":2530},[2373,2376,2378,2381,2383,2389,2392,2394,2422,2424,2426,2472,2474,2480,2482,2484,2498,2500,2511,2513,2521,2523,2525,2528],[10,2374,2375],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2377,16],{"id":16},[10,2379,2380],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2382,22],{"id":22},[10,2384,2385],{},[26,2386],{"alt":2387,"src":2388},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2390,2391],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2393,35],{"id":35},[37,2395,2396,2405,2419],{},[40,2397,2398,2400,2401,2404],{},[50,2399,56],{}," 表示整数，",[50,2402,2403],{},"float"," 表示浮点数。",[40,2406,2407,2410,2411,2414,2415,2418],{},[50,2408,2409],{},"\u002F"," 总是进行真除法；",[50,2412,2413],{},"\u002F\u002F"," 是向下取整除法，",[50,2416,2417],{},"%"," 得到余数。",[40,2420,2421],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2423,63],{"id":63},[10,2425,66],{},[68,2427,2429],{"className":70,"code":2428,"language":72,"meta":73,"style":73},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[50,2430,2431,2436,2441,2446,2450,2455,2460,2466],{"__ignoreMap":73},[77,2432,2433],{"class":79,"line":80},[77,2434,2435],{},"price = 25\n",[77,2437,2438],{"class":79,"line":86},[77,2439,2440],{},"count = 4\n",[77,2442,2443],{"class":79,"line":92},[77,2444,2445],{},"discount = 0.9\n",[77,2447,2448],{"class":79,"line":98},[77,2449,102],{"emptyLinePlaceholder":101},[77,2451,2452],{"class":79,"line":105},[77,2453,2454],{},"total = price * count * discount\n",[77,2456,2457],{"class":79,"line":111},[77,2458,2459],{},"average = total \u002F count\n",[77,2461,2463],{"class":79,"line":2462},7,[77,2464,2465],{},"print(total)\n",[77,2467,2469],{"class":79,"line":2468},8,[77,2470,2471],{},"print(average)\n",[10,2473,117],{},[68,2475,2478],{"className":2476,"code":2477,"language":123,"meta":73},[121],"90.0\n22.5\n",[50,2479,2477],{"__ignoreMap":73},[10,2481,128],{},[14,2483,131],{"id":131},[133,2485,2486,2492],{},[40,2487,2488,2491],{},[50,2489,2490],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2493,2494,2497],{},[50,2495,2496],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2499,151],{"id":151},[37,2501,2502,2508],{},[40,2503,2504,2505,339],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[50,2506,2507],{},"decimal.Decimal",[40,2509,2510],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2512,166],{"id":166},[133,2514,2515,2518],{},[40,2516,2517],{},"计算 137 除以 10 的商和余数。",[40,2519,2520],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2522,181],{},[14,2524,184],{"id":184},[10,2526,2527],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,2529,191],{},{"title":73,"searchDepth":86,"depth":86,"links":2531},[2532,2533,2534,2535,2536,2537,2538,2539],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2370,"description":2375},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[202,2547,2548],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2551,"title":2552,"body":2553,"category":202,"cover":203,"description":2557,"extension":204,"meta":2733,"navigation":101,"path":2734,"pinned":207,"publishedAt":208,"seo":2735,"slug":2736,"stem":2737,"summary":2738,"tags":2739,"updatedAt":208,"visible":101,"__hash__":2742},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2554,"toc":2721},[2555,2558,2560,2563,2565,2571,2581,2583,2594,2596,2598,2628,2630,2636,2638,2640,2670,2673,2676,2682,2685,2687,2695,2697,2712,2714,2716,2719],[10,2556,2557],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2559,16],{"id":16},[10,2561,2562],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2564,22],{"id":22},[10,2566,2567],{},[26,2568],{"alt":2569,"src":2570},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2572,2573,2574,2577,2578,339],{},"切片 ",[50,2575,2576],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[50,2579,2580],{},"stop - start",[14,2582,35],{"id":35},[37,2584,2585,2588,2591],{},[40,2586,2587],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2589,2590],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2592,2593],{},"切片会创建新的字符串，不会修改原字符串。",[14,2595,63],{"id":63},[10,2597,66],{},[68,2599,2601],{"className":70,"code":2600,"language":72,"meta":73,"style":73},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[50,2602,2603,2608,2613,2618,2623],{"__ignoreMap":73},[77,2604,2605],{"class":79,"line":80},[77,2606,2607],{},"language = \"Python\"\n",[77,2609,2610],{"class":79,"line":86},[77,2611,2612],{},"print(language[0])\n",[77,2614,2615],{"class":79,"line":92},[77,2616,2617],{},"print(language[-1])\n",[77,2619,2620],{"class":79,"line":98},[77,2621,2622],{},"print(language[0:3])\n",[77,2624,2625],{"class":79,"line":105},[77,2626,2627],{},"print(language + \" 3.14\")\n",[10,2629,117],{},[68,2631,2634],{"className":2632,"code":2633,"language":123,"meta":73},[121],"P\nn\nPyt\nPython 3.14\n",[50,2635,2633],{"__ignoreMap":73},[10,2637,128],{},[14,2639,131],{"id":131},[133,2641,2642,2656],{},[40,2643,2644,2645,2647,2648,2651,2652,2655],{},"字符串 ",[50,2646,202],{}," 的正索引从 ",[50,2649,2650],{},"P"," 的 0 开始，负索引从末尾 ",[50,2653,2654],{},"n"," 的 -1 开始。",[40,2657,2658,2661,2662,2665,2666,2669],{},[50,2659,2660],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[50,2663,2664],{},"Pyt","；索引 3 的 ",[50,2667,2668],{},"h"," 不在结果中。",[305,2671,2672],{"id":2672},"再看一个具体细节",[10,2674,2675],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2677,2678],{},[26,2679],{"alt":2680,"src":2681},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2683,2684],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2686,151],{"id":151},[37,2688,2689,2692],{},[40,2690,2691],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2693,2694],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2696,166],{"id":166},[133,2698,2699,2709],{},[40,2700,2701,2702,2705,2706,339],{},"从 ",[50,2703,2704],{},"\"programming\""," 中切出 ",[50,2707,2708],{},"\"gram\"",[40,2710,2711],{},"使用负索引取得字符串倒数第二个字符。",[10,2713,181],{},[14,2715,184],{"id":184},[10,2717,2718],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,2720,191],{},{"title":73,"searchDepth":86,"depth":86,"links":2722},[2723,2724,2725,2726,2727,2730,2731,2732],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":2728},[2729],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2552,"description":2557},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[202,2740,2741],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2744,"title":2745,"body":2746,"category":202,"cover":203,"description":2750,"extension":204,"meta":2964,"navigation":101,"path":2965,"pinned":207,"publishedAt":208,"seo":2966,"slug":2967,"stem":2968,"summary":2969,"tags":2970,"updatedAt":208,"visible":101,"__hash__":2973},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2747,"toc":2952},[2748,2751,2753,2756,2758,2764,2774,2776,2809,2811,2813,2857,2859,2865,2867,2869,2890,2892,2895,2901,2909,2911,2925,2927,2943,2945,2947,2950],[10,2749,2750],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2752,16],{"id":16},[10,2754,2755],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2757,22],{"id":22},[10,2759,2760],{},[26,2761],{"alt":2762,"src":2763},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2765,2766,2767,986,2770,2773],{},"比较表达式先产生 ",[50,2768,2769],{},"True",[50,2771,2772],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2775,35],{"id":35},[37,2777,2778,2792,2806],{},[40,2779,2780,2783,2784,2787,2788,2791],{},[50,2781,2782],{},"=="," 判断是否相等，",[50,2785,2786],{},"!="," 判断是否不等；单个 ",[50,2789,2790],{},"="," 是赋值。",[40,2793,2794,2797,2798,2801,2802,2805],{},[50,2795,2796],{},"and"," 要求两侧都为真，",[50,2799,2800],{},"or"," 只需一侧为真，",[50,2803,2804],{},"not"," 取反。",[40,2807,2808],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2810,63],{"id":63},[10,2812,66],{},[68,2814,2816],{"className":70,"code":2815,"language":72,"meta":73,"style":73},"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",[50,2817,2818,2823,2828,2832,2837,2842,2847,2852],{"__ignoreMap":73},[77,2819,2820],{"class":79,"line":80},[77,2821,2822],{},"age = 20\n",[77,2824,2825],{"class":79,"line":86},[77,2826,2827],{},"has_ticket = True\n",[77,2829,2830],{"class":79,"line":92},[77,2831,102],{"emptyLinePlaceholder":101},[77,2833,2834],{"class":79,"line":98},[77,2835,2836],{},"is_adult = age >= 18\n",[77,2838,2839],{"class":79,"line":105},[77,2840,2841],{},"can_enter = is_adult and has_ticket\n",[77,2843,2844],{"class":79,"line":111},[77,2845,2846],{},"print(is_adult)\n",[77,2848,2849],{"class":79,"line":2462},[77,2850,2851],{},"print(can_enter)\n",[77,2853,2854],{"class":79,"line":2468},[77,2855,2856],{},"print(not has_ticket)\n",[10,2858,117],{},[68,2860,2863],{"className":2861,"code":2862,"language":123,"meta":73},[121],"True\nTrue\nFalse\n",[50,2864,2862],{"__ignoreMap":73},[10,2866,128],{},[14,2868,131],{"id":131},[133,2870,2871,2881],{},[40,2872,2873,2876,2877,2880],{},[50,2874,2875],{},"age >= 18"," 先产生布尔值并绑定给 ",[50,2878,2879],{},"is_adult","，这一步没有任何分支跳转。",[40,2882,2883,2886,2887,2889],{},[50,2884,2885],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[50,2888,2804],{}," 只对紧随其后的值取反。",[305,2891,2672],{"id":2672},[10,2893,2894],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2896,2897],{},[26,2898],{"alt":2899,"src":2900},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2902,2903,2905,2906,2908],{},[50,2904,2796],{}," 只有“真、真”得到真；",[50,2907,2800],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2910,151],{"id":151},[37,2912,2913,2922],{},[40,2914,2915,2916,2918,2919,2921],{},"用单个等号判断相等。",[50,2917,2790],{}," 是赋值，",[50,2920,2782],{}," 才是相等比较。",[40,2923,2924],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2926,166],{"id":166},[133,2928,2929,2936],{},[40,2930,2931,2932,2935],{},"判断数字 ",[50,2933,2934],{},"15"," 是否同时大于 10 且小于 20。",[40,2937,2938,2939,2942],{},"分别修改年龄和票据状态，记录 ",[50,2940,2941],{},"can_enter"," 的四种组合结果。",[10,2944,181],{},[14,2946,184],{"id":184},[10,2948,2949],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,2951,191],{},{"title":73,"searchDepth":86,"depth":86,"links":2953},[2954,2955,2956,2957,2958,2961,2962,2963],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":2959},[2960],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2745,"description":2750},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[202,2971,2972],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2975,"title":2976,"body":2977,"category":202,"cover":203,"description":2981,"extension":204,"meta":3149,"navigation":101,"path":3150,"pinned":207,"publishedAt":208,"seo":3151,"slug":3152,"stem":3153,"summary":3154,"tags":3155,"updatedAt":208,"visible":101,"__hash__":3157},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2978,"toc":3139},[2979,2982,2984,2987,2989,2995,3013,3015,3028,3030,3032,3066,3068,3074,3076,3078,3100,3102,3114,3116,3130,3132,3134,3137],[10,2980,2981],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2983,16],{"id":16},[10,2985,2986],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2988,22],{"id":22},[10,2990,2991],{},[26,2992],{"alt":2993,"src":2994},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2996,2997,3000,3001,3004,3005,3008,3009,3012],{},[50,2998,2999],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[50,3002,3003],{},"18","，程序首先得到的也是 ",[50,3006,3007],{},"\"18\"","，需要 ",[50,3010,3011],{},"int()"," 后才能按整数参与计算。",[14,3014,35],{"id":35},[37,3016,3017,3020,3025],{},[40,3018,3019],{},"提示文字应告诉用户需要输入什么。",[40,3021,3022,3024],{},[50,3023,3011],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3026,3027],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3029,63],{"id":63},[10,3031,66],{},[68,3033,3035],{"className":70,"code":3034,"language":72,"meta":73,"style":73},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[50,3036,3037,3042,3047,3052,3056,3061],{"__ignoreMap":73},[77,3038,3039],{"class":79,"line":80},[77,3040,3041],{},"name = input(\"请输入姓名：\")\n",[77,3043,3044],{"class":79,"line":86},[77,3045,3046],{},"age_text = input(\"请输入年龄：\")\n",[77,3048,3049],{"class":79,"line":92},[77,3050,3051],{},"age = int(age_text)\n",[77,3053,3054],{"class":79,"line":98},[77,3055,102],{"emptyLinePlaceholder":101},[77,3057,3058],{"class":79,"line":105},[77,3059,3060],{},"print(\"你好，\" + name)\n",[77,3062,3063],{"class":79,"line":111},[77,3064,3065],{},"print(age + 1)\n",[10,3067,117],{},[68,3069,3072],{"className":3070,"code":3071,"language":123,"meta":73},[121],"根据输入显示姓名，并输出下一年的年龄\n",[50,3073,3071],{"__ignoreMap":73},[10,3075,128],{},[14,3077,131],{"id":131},[133,3079,3080,3090],{},[40,3081,3082,3083,3085,3086,3089],{},"两次 ",[50,3084,2999],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[50,3087,3088],{},"age_text"," 用来提醒这仍是文本。",[40,3091,3092,3095,3096,3099],{},[50,3093,3094],{},"int(age_text)"," 创建整数对象，后面的 ",[50,3097,3098],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3101,151],{"id":151},[37,3103,3104,3111],{},[40,3105,3106,3107,3110],{},"直接计算 ",[50,3108,3109],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3112,3113],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3115,166],{"id":166},[133,3117,3118,3121],{},[40,3119,3120],{},"接收两个整数并输出它们的和。",[40,3122,1697,3123,3126,3127,3129],{},[50,3124,3125],{},"18.5"," 给 ",[50,3128,3011],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3131,181],{},[14,3133,184],{"id":184},[10,3135,3136],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,3138,191],{},{"title":73,"searchDepth":86,"depth":86,"links":3140},[3141,3142,3143,3144,3145,3146,3147,3148],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2976,"description":2981},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[202,2320,3156],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3159,"title":3160,"body":3161,"category":202,"cover":203,"description":3165,"extension":204,"meta":3325,"navigation":101,"path":3326,"pinned":207,"publishedAt":208,"seo":3327,"slug":3328,"stem":3329,"summary":3330,"tags":3331,"updatedAt":208,"visible":101,"__hash__":3334},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3162,"toc":3315},[3163,3166,3168,3171,3173,3179,3186,3188,3202,3204,3206,3245,3247,3253,3255,3257,3276,3278,3293,3295,3306,3308,3310,3313],[10,3164,3165],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3167,16],{"id":16},[10,3169,3170],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3172,22],{"id":22},[10,3174,3175],{},[26,3176],{"alt":3177,"src":3178},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3180,3181,3182,3185],{},"列表为元素维护从 0 开始的位置索引。修改 ",[50,3183,3184],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3187,35],{"id":35},[37,3189,3190,3193,3196],{},[40,3191,3192],{},"列表使用方括号，元素之间用逗号分隔。",[40,3194,3195],{},"列表可变，可以替换、追加和删除元素。",[40,3197,3198,3199,339],{},"访问不存在的索引会产生 ",[50,3200,3201],{},"IndexError",[14,3203,63],{"id":63},[10,3205,66],{},[68,3207,3209],{"className":70,"code":3208,"language":72,"meta":73,"style":73},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[50,3210,3211,3216,3221,3225,3230,3235,3240],{"__ignoreMap":73},[77,3212,3213],{"class":79,"line":80},[77,3214,3215],{},"scores = [82, 90, 76]\n",[77,3217,3218],{"class":79,"line":86},[77,3219,3220],{},"print(scores[0])\n",[77,3222,3223],{"class":79,"line":92},[77,3224,102],{"emptyLinePlaceholder":101},[77,3226,3227],{"class":79,"line":98},[77,3228,3229],{},"scores[1] = 95\n",[77,3231,3232],{"class":79,"line":105},[77,3233,3234],{},"scores.append(88)\n",[77,3236,3237],{"class":79,"line":111},[77,3238,3239],{},"print(scores)\n",[77,3241,3242],{"class":79,"line":2462},[77,3243,3244],{},"print(len(scores))\n",[10,3246,117],{},[68,3248,3251],{"className":3249,"code":3250,"language":123,"meta":73},[121],"82\n[82, 95, 76, 88]\n4\n",[50,3252,3250],{"__ignoreMap":73},[10,3254,128],{},[14,3256,131],{"id":131},[133,3258,3259,3262],{},[40,3260,3261],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3263,3264,3267,3268,3271,3272,3275],{},[50,3265,3266],{},"scores[1] = 95"," 替换第二个位置，",[50,3269,3270],{},"append(88)"," 在末尾增加新位置，",[50,3273,3274],{},"len()"," 因而从 3 变为 4。",[14,3277,151],{"id":151},[37,3279,3280,3290],{},[40,3281,3282,3283,3286,3287,339],{},"访问 ",[50,3284,3285],{},"scores[len(scores)]","。最后一个合法正索引是 ",[50,3288,3289],{},"len(scores) - 1",[40,3291,3292],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3294,166],{"id":166},[133,3296,3297,3300],{},[40,3298,3299],{},"建立三项学习任务列表，再追加第四项。",[40,3301,3302,3303,3305],{},"修改第二项，并用 ",[50,3304,3274],{}," 检查元素数量。",[10,3307,181],{},[14,3309,184],{"id":184},[10,3311,3312],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,3314,191],{},{"title":73,"searchDepth":86,"depth":86,"links":3316},[3317,3318,3319,3320,3321,3322,3323,3324],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3160,"description":3165},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[202,3332,3333],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3336,"title":3337,"body":3338,"category":202,"cover":203,"description":3342,"extension":204,"meta":3483,"navigation":101,"path":3484,"pinned":207,"publishedAt":208,"seo":3485,"slug":3486,"stem":3487,"summary":3488,"tags":3489,"updatedAt":208,"visible":101,"__hash__":3491},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3339,"toc":3473},[3340,3343,3345,3348,3350,3356,3359,3361,3372,3374,3376,3410,3412,3418,3420,3422,3436,3438,3450,3452,3464,3466,3468,3471],[10,3341,3342],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3344,16],{"id":16},[10,3346,3347],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3349,22],{"id":22},[10,3351,3352],{},[26,3353],{"alt":3354,"src":3355},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3357,3358],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3360,35],{"id":35},[37,3362,3363,3366,3369],{},[40,3364,3365],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3367,3368],{},"只有一个元素的元组必须保留尾随逗号。",[40,3370,3371],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3373,63],{"id":63},[10,3375,66],{},[68,3377,3379],{"className":70,"code":3378,"language":72,"meta":73,"style":73},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[50,3380,3381,3386,3391,3396,3400,3405],{"__ignoreMap":73},[77,3382,3383],{"class":79,"line":80},[77,3384,3385],{},"point = (120, 80)\n",[77,3387,3388],{"class":79,"line":86},[77,3389,3390],{},"print(point[0])\n",[77,3392,3393],{"class":79,"line":92},[77,3394,3395],{},"print(point[1])\n",[77,3397,3398],{"class":79,"line":98},[77,3399,102],{"emptyLinePlaceholder":101},[77,3401,3402],{"class":79,"line":105},[77,3403,3404],{},"single = (5,)\n",[77,3406,3407],{"class":79,"line":111},[77,3408,3409],{},"print(single)\n",[10,3411,117],{},[68,3413,3416],{"className":3414,"code":3415,"language":123,"meta":73},[121],"120\n80\n(5,)\n",[50,3417,3415],{"__ignoreMap":73},[10,3419,128],{},[14,3421,131],{"id":131},[133,3423,3424,3430],{},[40,3425,3426,3429],{},[50,3427,3428],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3431,3432,3435],{},[50,3433,3434],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3437,151],{"id":151},[37,3439,3440,3447],{},[40,3441,3442,3443,3446],{},"把 ",[50,3444,3445],{},"(5)"," 当作元组，实际它仍是整数。",[40,3448,3449],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3451,166],{"id":166},[133,3453,3454,3457],{},[40,3455,3456],{},"用元组表示宽度和高度。",[40,3458,2150,3459,2153,3461,3463],{},[50,3460,3445],{},[50,3462,3434],{}," 的类型。",[10,3465,181],{},[14,3467,184],{"id":184},[10,3469,3470],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,3472,191],{},{"title":73,"searchDepth":86,"depth":86,"links":3474},[3475,3476,3477,3478,3479,3480,3481,3482],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3337,"description":3342},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[202,3490,3333],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3493,"title":3494,"body":3495,"category":202,"cover":203,"description":3499,"extension":204,"meta":3654,"navigation":101,"path":3655,"pinned":207,"publishedAt":208,"seo":3656,"slug":3657,"stem":3658,"summary":3659,"tags":3660,"updatedAt":208,"visible":101,"__hash__":3662},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3496,"toc":3644},[3497,3500,3502,3505,3507,3513,3523,3525,3539,3541,3543,3577,3579,3585,3587,3589,3604,3606,3625,3627,3635,3637,3639,3642],[10,3498,3499],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3501,16],{"id":16},[10,3503,3504],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3506,22],{"id":22},[10,3508,3509],{},[26,3510],{"alt":3511,"src":3512},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3514,3515,3516,3519,3520,3522],{},"字典通过键定位值，不使用连续位置表达含义。",[50,3517,3518],{},"student[\"score\"]"," 读取的是键 ",[50,3521,144],{}," 对应的值，而不是“第几个元素”。",[14,3524,35],{"id":35},[37,3526,3527,3530,3536],{},[40,3528,3529],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3531,2313,3532,3535],{},[50,3533,3534],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3537,3538],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3540,63],{"id":63},[10,3542,66],{},[68,3544,3546],{"className":70,"code":3545,"language":72,"meta":73,"style":73},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[50,3547,3548,3553,3558,3562,3567,3572],{"__ignoreMap":73},[77,3549,3550],{"class":79,"line":80},[77,3551,3552],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[77,3554,3555],{"class":79,"line":86},[77,3556,3557],{},"print(student[\"name\"])\n",[77,3559,3560],{"class":79,"line":92},[77,3561,102],{"emptyLinePlaceholder":101},[77,3563,3564],{"class":79,"line":98},[77,3565,3566],{},"student[\"score\"] = 95\n",[77,3568,3569],{"class":79,"line":105},[77,3570,3571],{},"student[\"city\"] = \"郑州\"\n",[77,3573,3574],{"class":79,"line":111},[77,3575,3576],{},"print(student)\n",[10,3578,117],{},[68,3580,3583],{"className":3581,"code":3582,"language":123,"meta":73},[121],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[50,3584,3582],{"__ignoreMap":73},[10,3586,128],{},[14,3588,131],{"id":131},[133,3590,3591,3594],{},[40,3592,3593],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3595,3596,3597,3599,3600,3603],{},"给已有键 ",[50,3598,144],{}," 赋值会更新映射，给新键 ",[50,3601,3602],{},"city"," 赋值会增加映射。",[14,3605,151],{"id":151},[37,3607,3608,3615],{},[40,3609,3610,3611,3614],{},"按位置理解字典并尝试 ",[50,3612,3613],{},"student[0]","，而实际键是字符串。",[40,3616,3617,3618,3621,3622,339],{},"直接读取不确定存在的键并忽略 ",[50,3619,3620],{},"KeyError","；后续可根据场景使用成员检查或 ",[50,3623,3624],{},"get()",[14,3626,166],{"id":166},[133,3628,3629,3632],{},[40,3630,3631],{},"建立一本书的标题、作者和页数字典。",[40,3633,3634],{},"添加分类键，再修改页数。",[10,3636,181],{},[14,3638,184],{"id":184},[10,3640,3641],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,3643,191],{},{"title":73,"searchDepth":86,"depth":86,"links":3645},[3646,3647,3648,3649,3650,3651,3652,3653],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3494,"description":3499},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[202,3661,3333],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3664,"title":3665,"body":3666,"category":202,"cover":203,"description":3670,"extension":204,"meta":3819,"navigation":101,"path":3820,"pinned":207,"publishedAt":208,"seo":3821,"slug":3822,"stem":3823,"summary":3824,"tags":3825,"updatedAt":208,"visible":101,"__hash__":3827},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3667,"toc":3809},[3668,3671,3673,3676,3678,3684,3687,3689,3708,3710,3712,3746,3748,3754,3756,3758,3773,3775,3787,3789,3800,3802,3804,3807],[10,3669,3670],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3672,16],{"id":16},[10,3674,3675],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3677,22],{"id":22},[10,3679,3680],{},[26,3681],{"alt":3682,"src":3683},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3685,3686],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3688,35],{"id":35},[37,3690,3691,3694,3697],{},[40,3692,3693],{},"集合中的元素不重复。",[40,3695,3696],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3698,3699,3700,3703,3704,3707],{},"创建空集合必须写 ",[50,3701,3702],{},"set()","；",[50,3705,3706],{},"{}"," 创建的是空字典。",[14,3709,63],{"id":63},[10,3711,66],{},[68,3713,3715],{"className":70,"code":3714,"language":72,"meta":73,"style":73},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[50,3716,3717,3722,3727,3731,3736,3741],{"__ignoreMap":73},[77,3718,3719],{"class":79,"line":80},[77,3720,3721],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[77,3723,3724],{"class":79,"line":86},[77,3725,3726],{},"right = {\"Python\", \"Docker\"}\n",[77,3728,3729],{"class":79,"line":92},[77,3730,102],{"emptyLinePlaceholder":101},[77,3732,3733],{"class":79,"line":98},[77,3734,3735],{},"print(left & right)\n",[77,3737,3738],{"class":79,"line":105},[77,3739,3740],{},"print(left | right)\n",[77,3742,3743],{"class":79,"line":111},[77,3744,3745],{},"print(\"Git\" in left)\n",[10,3747,117],{},[68,3749,3752],{"className":3750,"code":3751,"language":123,"meta":73},[121],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[50,3753,3751],{"__ignoreMap":73},[10,3755,128],{},[14,3757,131],{"id":131},[133,3759,3760,3763],{},[40,3761,3762],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3764,3765,3768,3769,3772],{},[50,3766,3767],{},"&"," 计算交集，",[50,3770,3771],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3774,151],{"id":151},[37,3776,3777,3784],{},[40,3778,2313,3779,3781,3782,339],{},[50,3780,3706],{}," 创建空集合，实际得到空字典；空集合应写 ",[50,3783,3702],{},[40,3785,3786],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3788,166],{"id":166},[133,3790,3791,3797],{},[40,3792,3793,3794,3796],{},"把包含重复标签的列表交给 ",[50,3795,3702],{}," 去重。",[40,3798,3799],{},"计算两组课程标签的交集和差集。",[10,3801,181],{},[14,3803,184],{"id":184},[10,3805,3806],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,3808,191],{},{"title":73,"searchDepth":86,"depth":86,"links":3810},[3811,3812,3813,3814,3815,3816,3817,3818],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3665,"description":3670},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[202,3826,3333],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3829,"title":3830,"body":3831,"category":202,"cover":203,"description":3835,"extension":204,"meta":4033,"navigation":101,"path":4034,"pinned":207,"publishedAt":208,"seo":4035,"slug":4036,"stem":4037,"summary":4038,"tags":4039,"updatedAt":208,"visible":101,"__hash__":4042},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3832,"toc":4021},[3833,3836,3838,3841,3843,3849,3859,3861,3878,3880,3882,3932,3934,3940,3942,3944,3966,3968,3971,3977,3980,3982,3995,3997,4012,4014,4016,4019],[10,3834,3835],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3837,16],{"id":16},[10,3839,3840],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3842,22],{"id":22},[10,3844,3845],{},[26,3846],{"alt":3847,"src":3848},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3850,3851,3854,3855,3858],{},[50,3852,3853],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[50,3856,3857],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3860,35],{"id":35},[37,3862,3863,3872,3875],{},[40,3864,3865,3867,3868,3871],{},[50,3866,2782],{}," 比较内容是否相等，",[50,3869,3870],{},"is"," 比较是否为同一个对象。",[40,3873,3874],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3876,3877],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3879,63],{"id":63},[10,3881,66],{},[68,3883,3885],{"className":70,"code":3884,"language":72,"meta":73,"style":73},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[50,3886,3887,3892,3897,3902,3906,3911,3916,3921,3926],{"__ignoreMap":73},[77,3888,3889],{"class":79,"line":80},[77,3890,3891],{},"tasks = [\"变量\", \"字符串\"]\n",[77,3893,3894],{"class":79,"line":86},[77,3895,3896],{},"shared = tasks\n",[77,3898,3899],{"class":79,"line":92},[77,3900,3901],{},"backup = tasks.copy()\n",[77,3903,3904],{"class":79,"line":98},[77,3905,102],{"emptyLinePlaceholder":101},[77,3907,3908],{"class":79,"line":105},[77,3909,3910],{},"tasks.append(\"列表\")\n",[77,3912,3913],{"class":79,"line":111},[77,3914,3915],{},"print(shared)\n",[77,3917,3918],{"class":79,"line":2462},[77,3919,3920],{},"print(backup)\n",[77,3922,3923],{"class":79,"line":2468},[77,3924,3925],{},"print(tasks is shared)\n",[77,3927,3929],{"class":79,"line":3928},9,[77,3930,3931],{},"print(tasks is backup)\n",[10,3933,117],{},[68,3935,3938],{"className":3936,"code":3937,"language":123,"meta":73},[121],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[50,3939,3937],{"__ignoreMap":73},[10,3941,128],{},[14,3943,131],{"id":131},[133,3945,3946,3952],{},[40,3947,3948,3951],{},[50,3949,3950],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3953,3954,3957,3958,3961,3962,3965],{},[50,3955,3956],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[50,3959,3960],{},"shared"," 能观察到变化，",[50,3963,3964],{},"backup"," 不会。",[305,3967,2672],{"id":2672},[10,3969,3970],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3972,3973],{},[26,3974],{"alt":3975,"src":3976},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3978,3979],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3981,151],{"id":151},[37,3983,3984,3992],{},[40,3985,3986,3987,3989,3990,339],{},"用 ",[50,3988,2782],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[50,3991,3870],{},[40,3993,3994],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3996,166],{"id":166},[133,3998,3999,4002],{},[40,4000,4001],{},"让两个变量引用同一个字典并修改其中一个。",[40,4003,2313,4004,4007,4008,1134,4010,339],{},[50,4005,4006],{},"copy()"," 创建外层副本，再比较 ",[50,4009,3870],{},[50,4011,2782],{},[10,4013,181],{},[14,4015,184],{"id":184},[10,4017,4018],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,4020,191],{},{"title":73,"searchDepth":86,"depth":86,"links":4022},[4023,4024,4025,4026,4027,4030,4031,4032],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4028},[4029],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3830,"description":3835},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[202,4040,4041],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4044,"title":4045,"body":4046,"category":202,"cover":203,"description":4050,"extension":204,"meta":4263,"navigation":101,"path":4264,"pinned":207,"publishedAt":208,"seo":4265,"slug":4266,"stem":4267,"summary":4268,"tags":4269,"updatedAt":208,"visible":101,"__hash__":4271},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4047,"toc":4250},[4048,4051,4053,4056,4058,4064,4074,4076,4087,4089,4091,4144,4146,4152,4154,4156,4174,4176,4179,4185,4193,4196,4199,4205,4211,4213,4231,4233,4241,4243,4245,4248],[10,4049,4050],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4052,16],{"id":16},[10,4054,4055],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4057,22],{"id":22},[10,4059,4060],{},[26,4061],{"alt":4062,"src":4063},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4065,4066,53,4068,53,4071,4073],{},[50,4067,1133],{},[50,4069,4070],{},"elif",[50,4072,1137],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4075,35],{"id":35},[37,4077,4078,4081,4084],{},[40,4079,4080],{},"冒号表示接下来开始一个代码块。",[40,4082,4083],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4085,4086],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4088,63],{"id":63},[10,4090,66],{},[68,4092,4094],{"className":70,"code":4093,"language":72,"meta":73,"style":73},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[50,4095,4096,4101,4105,4110,4115,4120,4125,4129,4134,4138],{"__ignoreMap":73},[77,4097,4098],{"class":79,"line":80},[77,4099,4100],{},"score = int(input(\"请输入分数：\"))\n",[77,4102,4103],{"class":79,"line":86},[77,4104,102],{"emptyLinePlaceholder":101},[77,4106,4107],{"class":79,"line":92},[77,4108,4109],{},"if score >= 90:\n",[77,4111,4112],{"class":79,"line":98},[77,4113,4114],{},"    level = \"优秀\"\n",[77,4116,4117],{"class":79,"line":105},[77,4118,4119],{},"elif score >= 60:\n",[77,4121,4122],{"class":79,"line":111},[77,4123,4124],{},"    level = \"合格\"\n",[77,4126,4127],{"class":79,"line":2462},[77,4128,1123],{},[77,4130,4131],{"class":79,"line":2468},[77,4132,4133],{},"    level = \"需要继续学习\"\n",[77,4135,4136],{"class":79,"line":3928},[77,4137,102],{"emptyLinePlaceholder":101},[77,4139,4141],{"class":79,"line":4140},10,[77,4142,4143],{},"print(level)\n",[10,4145,117],{},[68,4147,4150],{"className":4148,"code":4149,"language":123,"meta":73},[121],"输入 85 时输出：合格\n",[50,4151,4149],{"__ignoreMap":73},[10,4153,128],{},[14,4155,131],{"id":131},[133,4157,4158,4165],{},[40,4159,4160,4161,4164],{},"输入先转换为整数，程序从 ",[50,4162,4163],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4166,4167,4170,4171,4173],{},[50,4168,4169],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[50,4172,1137],{}," 被跳过；最终三个分支只会选择一个。",[305,4175,2672],{"id":2672},[10,4177,4178],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4180,4181],{},[26,4182],{"alt":4183,"src":4184},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4186,4187,4189,4190,4192],{},[50,4188,4163],{}," 必须放在 ",[50,4191,4169],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[305,4194,2672],{"id":4195},"再看一个具体细节-1",[10,4197,4198],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4200,4201],{},[26,4202],{"alt":4203,"src":4204},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4206,4207,4208,4210],{},"同一缩进层级属于同一个代码块；回到 ",[50,4209,1133],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4212,151],{"id":151},[37,4214,4215,4221],{},[40,4216,4217,4218,4220],{},"先写 ",[50,4219,4169],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4222,4223,4224,4226,4227,4230],{},"混用多个独立 ",[50,4225,1133],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[50,4228,4229],{},"if\u002Felif\u002Felse"," 链。",[14,4232,166],{"id":166},[133,4234,4235,4238],{},[40,4236,4237],{},"根据温度输出“冷、适中、热”三个等级。",[40,4239,4240],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4242,181],{},[14,4244,184],{"id":184},[10,4246,4247],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,4249,191],{},{"title":73,"searchDepth":86,"depth":86,"links":4251},[4252,4253,4254,4255,4256,4260,4261,4262],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4257},[4258,4259],{"id":2672,"depth":92,"text":2672},{"id":4195,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4045,"description":4050},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[202,1133,4270],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4273,"title":4274,"body":4275,"category":202,"cover":203,"description":4279,"extension":204,"meta":4445,"navigation":101,"path":4446,"pinned":207,"publishedAt":208,"seo":4447,"slug":4448,"stem":4449,"summary":4450,"tags":4451,"updatedAt":208,"visible":101,"__hash__":4453},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4276,"toc":4433},[4277,4280,4282,4285,4287,4293,4299,4301,4316,4318,4320,4358,4360,4366,4368,4370,4385,4387,4390,4396,4402,4404,4412,4414,4424,4426,4428,4431],[10,4278,4279],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4281,16],{"id":16},[10,4283,4284],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4286,22],{"id":22},[10,4288,4289],{},[26,4290],{"alt":4291,"src":4292},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4294,4295,4298],{},[50,4296,4297],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4300,35],{"id":35},[37,4302,4303,4306,4309],{},[40,4304,4305],{},"进入循环前先准备参与条件判断的状态。",[40,4307,4308],{},"循环体中必须有机会让条件变为假。",[40,4310,4311,4312,4315],{},"能够预先确定遍历对象时，后续介绍的 ",[50,4313,4314],{},"for"," 通常更直接。",[14,4317,63],{"id":63},[10,4319,66],{},[68,4321,4323],{"className":70,"code":4322,"language":72,"meta":73,"style":73},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[50,4324,4325,4330,4334,4339,4344,4349,4353],{"__ignoreMap":73},[77,4326,4327],{"class":79,"line":80},[77,4328,4329],{},"count = 1\n",[77,4331,4332],{"class":79,"line":86},[77,4333,102],{"emptyLinePlaceholder":101},[77,4335,4336],{"class":79,"line":92},[77,4337,4338],{},"while count \u003C= 3:\n",[77,4340,4341],{"class":79,"line":98},[77,4342,4343],{},"    print(\"第\", count, \"次练习\")\n",[77,4345,4346],{"class":79,"line":105},[77,4347,4348],{},"    count = count + 1\n",[77,4350,4351],{"class":79,"line":111},[77,4352,102],{"emptyLinePlaceholder":101},[77,4354,4355],{"class":79,"line":2462},[77,4356,4357],{},"print(\"练习结束\")\n",[10,4359,117],{},[68,4361,4364],{"className":4362,"code":4363,"language":123,"meta":73},[121],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[50,4365,4363],{"__ignoreMap":73},[10,4367,128],{},[14,4369,131],{"id":131},[133,4371,4372,4379],{},[40,4373,4374,4375,4378],{},"进入循环前 ",[50,4376,4377],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4380,4381,4382,4384],{},"循环体末尾把 ",[50,4383,4377],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[305,4386,2672],{"id":2672},[10,4388,4389],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4391,4392],{},[26,4393],{"alt":4394,"src":4395},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4397,4398,4399,4401],{},"第4次检查时 ",[50,4400,4377],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4403,151],{"id":151},[37,4405,4406,4409],{},[40,4407,4408],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4410,4411],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4413,166],{"id":166},[133,4415,4416,4421],{},[40,4417,2313,4418,4420],{},[50,4419,4297],{}," 输出 1 到 5。",[40,4422,4423],{},"计算 1 到 10 的累加和。",[10,4425,181],{},[14,4427,184],{"id":184},[10,4429,4430],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,4432,191],{},{"title":73,"searchDepth":86,"depth":86,"links":4434},[4435,4436,4437,4438,4439,4442,4443,4444],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4440},[4441],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4274,"description":4279},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[202,4297,4452],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4455,"title":4456,"body":4457,"category":202,"cover":203,"description":4461,"extension":204,"meta":4609,"navigation":101,"path":4610,"pinned":207,"publishedAt":208,"seo":4611,"slug":4612,"stem":4613,"summary":4614,"tags":4615,"updatedAt":208,"visible":101,"__hash__":4617},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4458,"toc":4599},[4459,4462,4464,4467,4469,4475,4480,4482,4496,4498,4500,4538,4540,4546,4548,4550,4567,4569,4577,4579,4590,4592,4594,4597],[10,4460,4461],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4463,16],{"id":16},[10,4465,4466],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4468,22],{"id":22},[10,4470,4471],{},[26,4472],{"alt":4473,"src":4474},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4476,4477,4479],{},[50,4478,4314],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4481,35],{"id":35},[37,4483,4484,4490,4493],{},[40,4485,4486,4489],{},[50,4487,4488],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4491,4492],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4494,4495],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4497,63],{"id":63},[10,4499,66],{},[68,4501,4503],{"className":70,"code":4502,"language":72,"meta":73,"style":73},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[50,4504,4505,4510,4514,4519,4524,4528,4533],{"__ignoreMap":73},[77,4506,4507],{"class":79,"line":80},[77,4508,4509],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[77,4511,4512],{"class":79,"line":86},[77,4513,102],{"emptyLinePlaceholder":101},[77,4515,4516],{"class":79,"line":92},[77,4517,4518],{},"for course in courses:\n",[77,4520,4521],{"class":79,"line":98},[77,4522,4523],{},"    print(course)\n",[77,4525,4526],{"class":79,"line":105},[77,4527,102],{"emptyLinePlaceholder":101},[77,4529,4530],{"class":79,"line":111},[77,4531,4532],{},"for number in range(1, 4):\n",[77,4534,4535],{"class":79,"line":2462},[77,4536,4537],{},"    print(number)\n",[10,4539,117],{},[68,4541,4544],{"className":4542,"code":4543,"language":123,"meta":73},[121],"变量\n字符串\n列表\n1\n2\n3\n",[50,4545,4543],{"__ignoreMap":73},[10,4547,128],{},[14,4549,131],{"id":131},[133,4551,4552,4562],{},[40,4553,4554,4555,4557,4558,4561],{},"第一个 ",[50,4556,4314],{}," 依次从列表取得字符串，循环变量 ",[50,4559,4560],{},"course"," 每轮重新绑定。",[40,4563,4564,4566],{},[50,4565,4488],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4568,151],{"id":151},[37,4570,4571,4574],{},[40,4572,4573],{},"只需要元素却手工维护索引，增加越界风险。",[40,4575,4576],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4578,166],{"id":166},[133,4580,4581,4584],{},[40,4582,4583],{},"逐项输出一个字符串中的字符。",[40,4585,2313,4586,4589],{},[50,4587,4588],{},"range()"," 输出 2、4、6、8。",[10,4591,181],{},[14,4593,184],{"id":184},[10,4595,4596],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,4598,191],{},{"title":73,"searchDepth":86,"depth":86,"links":4600},[4601,4602,4603,4604,4605,4606,4607,4608],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4456,"description":4461},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[202,4314,4616],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4619,"title":4620,"body":4621,"category":202,"cover":203,"description":4625,"extension":204,"meta":4799,"navigation":101,"path":4800,"pinned":207,"publishedAt":208,"seo":4801,"slug":4802,"stem":4803,"summary":4804,"tags":4805,"updatedAt":208,"visible":101,"__hash__":4806},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4622,"toc":4789},[4623,4626,4628,4631,4633,4639,4649,4651,4670,4672,4674,4726,4728,4734,4736,4738,4752,4754,4770,4772,4780,4782,4784,4787],[10,4624,4625],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4627,16],{"id":16},[10,4629,4630],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4632,22],{"id":22},[10,4634,4635],{},[26,4636],{"alt":4637,"src":4638},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4640,4641,4644,4645,4648],{},[50,4642,4643],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[50,4646,4647],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4650,35],{"id":35},[37,4652,4653,4656,4664],{},[40,4654,4655],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4657,4658,4660,4661,4663],{},[50,4659,4643],{}," 前要确认不会跳过 ",[50,4662,4297],{}," 循环中的状态更新。",[40,4665,4666,4667,4669],{},"多层嵌套中 ",[50,4668,4647],{}," 只结束它所在的最内层循环。",[14,4671,63],{"id":63},[10,4673,66],{},[68,4675,4677],{"className":70,"code":4676,"language":72,"meta":73,"style":73},"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",[50,4678,4679,4684,4688,4693,4698,4703,4708,4713,4717,4721],{"__ignoreMap":73},[77,4680,4681],{"class":79,"line":80},[77,4682,4683],{},"numbers = [3, -1, 0, 8, 12]\n",[77,4685,4686],{"class":79,"line":86},[77,4687,102],{"emptyLinePlaceholder":101},[77,4689,4690],{"class":79,"line":92},[77,4691,4692],{},"for number in numbers:\n",[77,4694,4695],{"class":79,"line":98},[77,4696,4697],{},"    if number \u003C 0:\n",[77,4699,4700],{"class":79,"line":105},[77,4701,4702],{},"        continue\n",[77,4704,4705],{"class":79,"line":111},[77,4706,4707],{},"    if number == 0:\n",[77,4709,4710],{"class":79,"line":2462},[77,4711,4712],{},"        break\n",[77,4714,4715],{"class":79,"line":2468},[77,4716,4537],{},[77,4718,4719],{"class":79,"line":3928},[77,4720,102],{"emptyLinePlaceholder":101},[77,4722,4723],{"class":79,"line":4140},[77,4724,4725],{},"print(\"循环结束\")\n",[10,4727,117],{},[68,4729,4732],{"className":4730,"code":4731,"language":123,"meta":73},[121],"3\n循环结束\n",[50,4733,4731],{"__ignoreMap":73},[10,4735,128],{},[14,4737,131],{"id":131},[133,4739,4740,4746],{},[40,4741,4742,4743,4745],{},"遇到 -1 时 ",[50,4744,4643],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4747,4748,4749,4751],{},"遇到 0 时 ",[50,4750,4647],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4753,151],{"id":151},[37,4755,4756,4761],{},[40,4757,3442,4758,4760],{},[50,4759,4643],{}," 当作结束循环，实际它只跳到下一轮。",[40,4762,4763,4764,4766,4767,4769],{},"在 ",[50,4765,4297],{}," 中把状态更新放在可能被 ",[50,4768,4643],{}," 跳过的位置，造成无限循环。",[14,4771,166],{"id":166},[133,4773,4774,4777],{},[40,4775,4776],{},"跳过列表中的空字符串并输出其他内容。",[40,4778,4779],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4781,181],{},[14,4783,184],{"id":184},[10,4785,4786],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,4788,191],{},{"title":73,"searchDepth":86,"depth":86,"links":4790},[4791,4792,4793,4794,4795,4796,4797,4798],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4620,"description":4625},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[202,4647,4643],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4808,"title":4809,"body":4810,"category":202,"cover":203,"description":4814,"extension":204,"meta":4985,"navigation":101,"path":4986,"pinned":207,"publishedAt":208,"seo":4987,"slug":4988,"stem":4989,"summary":4990,"tags":4991,"updatedAt":208,"visible":101,"__hash__":4994},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4811,"toc":4973},[4812,4815,4817,4820,4822,4828,4831,4833,4857,4859,4861,4895,4897,4903,4905,4907,4924,4926,4929,4935,4938,4940,4954,4956,4964,4966,4968,4971],[10,4813,4814],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4816,16],{"id":16},[10,4818,4819],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4821,22],{"id":22},[10,4823,4824],{},[26,4825],{"alt":4826,"src":4827},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4829,4830],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4832,35],{"id":35},[37,4834,4835,4838,4841],{},[40,4836,4837],{},"每增加一层嵌套，阅读成本都会上升。",[40,4839,4840],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4842,4843,4844,53,4847,4850,4851,53,4854,339],{},"变量名使用 ",[50,4845,4846],{},"row",[50,4848,4849],{},"cell"," 等层级含义，避免全部写成 ",[50,4852,4853],{},"i",[50,4855,4856],{},"j",[14,4858,63],{"id":63},[10,4860,66],{},[68,4862,4864],{"className":70,"code":4863,"language":72,"meta":73,"style":73},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[50,4865,4866,4871,4875,4880,4885,4890],{"__ignoreMap":73},[77,4867,4868],{"class":79,"line":80},[77,4869,4870],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[77,4872,4873],{"class":79,"line":86},[77,4874,102],{"emptyLinePlaceholder":101},[77,4876,4877],{"class":79,"line":92},[77,4878,4879],{},"for row in table:\n",[77,4881,4882],{"class":79,"line":98},[77,4883,4884],{},"    for cell in row:\n",[77,4886,4887],{"class":79,"line":105},[77,4888,4889],{},"        print(cell)\n",[77,4891,4892],{"class":79,"line":111},[77,4893,4894],{},"    print(\"一行结束\")\n",[10,4896,117],{},[68,4898,4901],{"className":4899,"code":4900,"language":123,"meta":73},[121],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[50,4902,4900],{"__ignoreMap":73},[10,4904,128],{},[14,4906,131],{"id":131},[133,4908,4909,4921],{},[40,4910,4911,4912,4914,4915,1134,4918,339],{},"外层变量 ",[50,4913,4846],{}," 先引用第一行列表，内层才依次处理 ",[50,4916,4917],{},"A1",[50,4919,4920],{},"A2",[40,4922,4923],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[305,4925,2672],{"id":2672},[10,4927,4928],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4930,4931],{},[26,4932],{"alt":4933,"src":4934},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4936,4937],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4939,151],{"id":151},[37,4941,4942,4951],{},[40,4943,4944,4945,986,4948,4950],{},"把两层循环变量都叫 ",[50,4946,4947],{},"item",[50,4949,4853],{},"，难以确认当前层级。",[40,4952,4953],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4955,166],{"id":166},[133,4957,4958,4961],{},[40,4959,4960],{},"打印一个 2×3 数字表。",[40,4962,4963],{},"在内层增加条件，只输出大于 3 的元素。",[10,4965,181],{},[14,4967,184],{"id":184},[10,4969,4970],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,4972,191],{},{"title":73,"searchDepth":86,"depth":86,"links":4974},[4975,4976,4977,4978,4979,4982,4983,4984],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4980},[4981],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4809,"description":4814},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[202,4992,4993],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4996,"title":4997,"body":4998,"category":202,"cover":203,"description":5002,"extension":204,"meta":5140,"navigation":101,"path":5141,"pinned":207,"publishedAt":208,"seo":5142,"slug":5143,"stem":5144,"summary":5145,"tags":5146,"updatedAt":208,"visible":101,"__hash__":5149},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4999,"toc":5130},[5000,5003,5005,5008,5010,5016,5019,5021,5032,5034,5036,5074,5076,5082,5084,5086,5098,5100,5111,5113,5121,5123,5125,5128],[10,5001,5002],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5004,16],{"id":16},[10,5006,5007],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5009,22],{"id":22},[10,5011,5012],{},[26,5013],{"alt":5014,"src":5015},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5017,5018],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5020,35],{"id":35},[37,5022,5023,5026,5029],{},[40,5024,5025],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5027,5028],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5030,5031],{},"推导式创建新列表，不修改输入列表。",[14,5033,63],{"id":63},[10,5035,66],{},[68,5037,5039],{"className":70,"code":5038,"language":72,"meta":73,"style":73},"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",[50,5040,5041,5046,5050,5055,5060,5064,5069],{"__ignoreMap":73},[77,5042,5043],{"class":79,"line":80},[77,5044,5045],{},"numbers = [1, 2, 3, 4, 5]\n",[77,5047,5048],{"class":79,"line":86},[77,5049,102],{"emptyLinePlaceholder":101},[77,5051,5052],{"class":79,"line":92},[77,5053,5054],{},"squares = [number * number for number in numbers]\n",[77,5056,5057],{"class":79,"line":98},[77,5058,5059],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[77,5061,5062],{"class":79,"line":105},[77,5063,102],{"emptyLinePlaceholder":101},[77,5065,5066],{"class":79,"line":111},[77,5067,5068],{},"print(squares)\n",[77,5070,5071],{"class":79,"line":2462},[77,5072,5073],{},"print(even_squares)\n",[10,5075,117],{},[68,5077,5080],{"className":5078,"code":5079,"language":123,"meta":73},[121],"[1, 4, 9, 16, 25]\n[4, 16]\n",[50,5081,5079],{"__ignoreMap":73},[10,5083,128],{},[14,5085,131],{"id":131},[133,5087,5088,5091],{},[40,5089,5090],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5092,5093,5094,5097],{},"第二条先用 ",[50,5095,5096],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5099,151],{"id":151},[37,5101,5102,5108],{},[40,5103,5104,5105,5107],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[50,5106,4314],{}," 开始找输入。",[40,5109,5110],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5112,166],{"id":166},[133,5114,5115,5118],{},[40,5116,5117],{},"把字符串列表转换为长度列表。",[40,5119,5120],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5122,181],{},[14,5124,184],{"id":184},[10,5126,5127],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,5129,191],{},{"title":73,"searchDepth":86,"depth":86,"links":5131},[5132,5133,5134,5135,5136,5137,5138,5139],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4997,"description":5002},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[202,5147,5148],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5151,"title":5152,"body":5153,"category":202,"cover":203,"description":5157,"extension":204,"meta":5300,"navigation":101,"path":5301,"pinned":207,"publishedAt":208,"seo":5302,"slug":5303,"stem":5304,"summary":5305,"tags":5306,"updatedAt":208,"visible":101,"__hash__":5309},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5154,"toc":5290},[5155,5158,5160,5163,5165,5171,5174,5176,5187,5189,5191,5230,5232,5238,5240,5242,5257,5259,5267,5269,5281,5283,5285,5288],[10,5156,5157],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5159,16],{"id":16},[10,5161,5162],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5164,22],{"id":22},[10,5166,5167],{},[26,5168],{"alt":5169,"src":5170},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5172,5173],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5175,35],{"id":35},[37,5177,5178,5181,5184],{},[40,5179,5180],{},"函数名描述动作，使用小写字母和下划线。",[40,5182,5183],{},"函数定义要先执行，之后才能调用。",[40,5185,5186],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5188,63],{"id":63},[10,5190,66],{},[68,5192,5194],{"className":70,"code":5193,"language":72,"meta":73,"style":73},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[50,5195,5196,5201,5206,5211,5215,5220,5225],{"__ignoreMap":73},[77,5197,5198],{"class":79,"line":80},[77,5199,5200],{},"def show_progress():\n",[77,5202,5203],{"class":79,"line":86},[77,5204,5205],{},"    print(\"正在学习函数\")\n",[77,5207,5208],{"class":79,"line":92},[77,5209,5210],{},"    print(\"本节完成 50%\")\n",[77,5212,5213],{"class":79,"line":98},[77,5214,102],{"emptyLinePlaceholder":101},[77,5216,5217],{"class":79,"line":105},[77,5218,5219],{},"print(\"调用前\")\n",[77,5221,5222],{"class":79,"line":111},[77,5223,5224],{},"show_progress()\n",[77,5226,5227],{"class":79,"line":2462},[77,5228,5229],{},"print(\"调用后\")\n",[10,5231,117],{},[68,5233,5236],{"className":5234,"code":5235,"language":123,"meta":73},[121],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[50,5237,5235],{"__ignoreMap":73},[10,5239,128],{},[14,5241,131],{"id":131},[133,5243,5244,5250],{},[40,5245,915,5246,5249],{},[50,5247,5248],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5251,5252,5253,5256],{},"运行到 ",[50,5254,5255],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5258,151],{"id":151},[37,5260,5261,5264],{},[40,5262,5263],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5265,5266],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5268,166],{"id":166},[133,5270,5271,5278],{},[40,5272,5273,5274,5277],{},"定义 ",[50,5275,5276],{},"show_plan()"," 输出两行学习计划。",[40,5279,5280],{},"连续调用同一个函数两次，观察执行顺序。",[10,5282,181],{},[14,5284,184],{"id":184},[10,5286,5287],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,5289,191],{},{"title":73,"searchDepth":86,"depth":86,"links":5291},[5292,5293,5294,5295,5296,5297,5298,5299],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5152,"description":5157},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[202,5307,5308],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5311,"title":5312,"body":5313,"category":202,"cover":203,"description":5317,"extension":204,"meta":5497,"navigation":101,"path":5498,"pinned":207,"publishedAt":208,"seo":5499,"slug":5500,"stem":5501,"summary":5502,"tags":5503,"updatedAt":208,"visible":101,"__hash__":5506},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5314,"toc":5485},[5315,5318,5320,5323,5325,5331,5338,5340,5357,5359,5361,5395,5397,5403,5405,5407,5428,5430,5433,5439,5449,5451,5466,5468,5476,5478,5480,5483],[10,5316,5317],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5319,16],{"id":16},[10,5321,5322],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5324,22],{"id":22},[10,5326,5327],{},[26,5328],{"alt":5329,"src":5330},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5332,5333,5334,5337],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[50,5335,5336],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5339,35],{"id":35},[37,5341,5342,5345,5348],{},[40,5343,5344],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5346,5347],{},"局部变量默认只在函数内部可见。",[40,5349,5350,5351,5353,5354,339],{},"没有显式 ",[50,5352,5336],{}," 的函数会返回 ",[50,5355,5356],{},"None",[14,5358,63],{"id":63},[10,5360,66],{},[68,5362,5364],{"className":70,"code":5363,"language":72,"meta":73,"style":73},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[50,5365,5366,5371,5376,5381,5385,5390],{"__ignoreMap":73},[77,5367,5368],{"class":79,"line":80},[77,5369,5370],{},"def calculate_total(price, count):\n",[77,5372,5373],{"class":79,"line":86},[77,5374,5375],{},"    total = price * count\n",[77,5377,5378],{"class":79,"line":92},[77,5379,5380],{},"    return total\n",[77,5382,5383],{"class":79,"line":98},[77,5384,102],{"emptyLinePlaceholder":101},[77,5386,5387],{"class":79,"line":105},[77,5388,5389],{},"result = calculate_total(25, 4)\n",[77,5391,5392],{"class":79,"line":111},[77,5393,5394],{},"print(result)\n",[10,5396,117],{},[68,5398,5401],{"className":5399,"code":5400,"language":123,"meta":73},[121],"100\n",[50,5402,5400],{"__ignoreMap":73},[10,5404,128],{},[14,5406,131],{"id":131},[133,5408,5409,5418],{},[40,5410,5411,5412,53,5415,5417],{},"调用时 25 和 4 分别绑定到 ",[50,5413,5414],{},"price",[50,5416,4377],{},"，它们只在本次函数调用的局部范围中使用。",[40,5419,5420,5423,5424,5427],{},[50,5421,5422],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[50,5425,5426],{},"result"," 并输出。",[305,5429,2672],{"id":2672},[10,5431,5432],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5434,5435],{},[26,5436],{"alt":5437,"src":5438},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5440,5441,53,5443,1134,5445,5448],{},[50,5442,5414],{},[50,5444,4377],{},[50,5446,5447],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5450,151],{"id":151},[37,5452,5453,5460],{},[40,5454,5455,5456,5459],{},"在函数内部只 ",[50,5457,5458],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5461,5462,5463,5465],{},"试图在函数外直接访问局部变量 ",[50,5464,5447],{},"，它的名字只在调用期间的局部作用域存在。",[14,5467,166],{"id":166},[133,5469,5470,5473],{},[40,5471,5472],{},"编写计算长方形面积的函数。",[40,5474,5475],{},"让函数返回结果后在调用方加上单位再输出。",[10,5477,181],{},[14,5479,184],{"id":184},[10,5481,5482],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,5484,191],{},{"title":73,"searchDepth":86,"depth":86,"links":5486},[5487,5488,5489,5490,5491,5494,5495,5496],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5492},[5493],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5312,"description":5317},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[202,5504,5505],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5508,"title":5509,"body":5510,"category":202,"cover":203,"description":5514,"extension":204,"meta":5694,"navigation":101,"path":5695,"pinned":207,"publishedAt":208,"seo":5696,"slug":5697,"stem":5698,"summary":5699,"tags":5700,"updatedAt":208,"visible":101,"__hash__":5703},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5511,"toc":5682},[5512,5515,5517,5520,5522,5528,5531,5533,5550,5552,5554,5606,5608,5614,5616,5618,5636,5638,5641,5647,5650,5652,5663,5665,5673,5675,5677,5680],[10,5513,5514],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5516,16],{"id":16},[10,5518,5519],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5521,22],{"id":22},[10,5523,5524],{},[26,5525],{"alt":5526,"src":5527},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5529,5530],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5532,35],{"id":35},[37,5534,5535,5538,5544],{},[40,5536,5537],{},"必需参数应放在有默认值的参数之前。",[40,5539,5540,5543],{},[50,5541,5542],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5545,5546,5549],{},[50,5547,5548],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5551,63],{"id":63},[10,5553,66],{},[68,5555,5557],{"className":70,"code":5556,"language":72,"meta":73,"style":73},"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",[50,5558,5559,5564,5569,5573,5578,5583,5587,5592,5597,5601],{"__ignoreMap":73},[77,5560,5561],{"class":79,"line":80},[77,5562,5563],{},"def build_title(name, level=\"基础\"):\n",[77,5565,5566],{"class":79,"line":86},[77,5567,5568],{},"    return name + \"｜\" + level\n",[77,5570,5571],{"class":79,"line":92},[77,5572,102],{"emptyLinePlaceholder":101},[77,5574,5575],{"class":79,"line":98},[77,5576,5577],{},"print(build_title(\"Python\"))\n",[77,5579,5580],{"class":79,"line":105},[77,5581,5582],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[77,5584,5585],{"class":79,"line":111},[77,5586,102],{"emptyLinePlaceholder":101},[77,5588,5589],{"class":79,"line":2462},[77,5590,5591],{},"def total(*numbers):\n",[77,5593,5594],{"class":79,"line":2468},[77,5595,5596],{},"    return sum(numbers)\n",[77,5598,5599],{"class":79,"line":3928},[77,5600,102],{"emptyLinePlaceholder":101},[77,5602,5603],{"class":79,"line":4140},[77,5604,5605],{},"print(total(10, 20, 30))\n",[10,5607,117],{},[68,5609,5612],{"className":5610,"code":5611,"language":123,"meta":73},[121],"Python｜基础\n异常处理｜进阶\n60\n",[50,5613,5611],{"__ignoreMap":73},[10,5615,128],{},[14,5617,131],{"id":131},[133,5619,5620,5627],{},[40,5621,5622,5623,5626],{},"第一次调用只提供必需参数，",[50,5624,5625],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5628,5629,5632,5633,339],{},[50,5630,5631],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[50,5634,5635],{},"sum()",[305,5637,2672],{"id":2672},[10,5639,5640],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5642,5643],{},[26,5644],{"alt":5645,"src":5646},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5648,5649],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5651,151],{"id":151},[37,5653,5654,5660],{},[40,5655,5656,5657,5659],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[50,5658,5356],{}," 再在函数内创建。",[40,5661,5662],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5664,166],{"id":166},[133,5666,5667,5670],{},[40,5668,5669],{},"给问候函数增加默认称呼。",[40,5671,5672],{},"编写接收任意数量分数并返回总分的函数。",[10,5674,181],{},[14,5676,184],{"id":184},[10,5678,5679],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,5681,191],{},{"title":73,"searchDepth":86,"depth":86,"links":5683},[5684,5685,5686,5687,5688,5691,5692,5693],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5689},[5690],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5509,"description":5514},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[202,5701,5702],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5705,"title":5706,"body":5707,"category":202,"cover":203,"description":5711,"extension":204,"meta":5908,"navigation":101,"path":5909,"pinned":207,"publishedAt":208,"seo":5910,"slug":5911,"stem":5912,"summary":5913,"tags":5914,"updatedAt":208,"visible":101,"__hash__":5917},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5708,"toc":5896},[5709,5712,5714,5717,5719,5725,5728,5730,5747,5749,5751,5814,5816,5822,5824,5826,5853,5855,5858,5864,5867,5869,5877,5879,5887,5889,5891,5894],[10,5710,5711],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5713,16],{"id":16},[10,5715,5716],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5718,22],{"id":22},[10,5720,5721],{},[26,5722],{"alt":5723,"src":5724},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5726,5727],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5729,35],{"id":35},[37,5731,5732,5735,5738],{},[40,5733,5734],{},"函数内部赋值默认创建局部变量。",[40,5736,5737],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5739,5740,2153,5743,5746],{},[50,5741,5742],{},"global",[50,5744,5745],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5748,63],{"id":63},[10,5750,66],{},[68,5752,5754],{"className":70,"code":5753,"language":72,"meta":73,"style":73},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[50,5755,5756,5761,5765,5770,5775,5779,5784,5789,5794,5798,5803,5808],{"__ignoreMap":73},[77,5757,5758],{"class":79,"line":80},[77,5759,5760],{},"course = \"Python\"\n",[77,5762,5763],{"class":79,"line":86},[77,5764,102],{"emptyLinePlaceholder":101},[77,5766,5767],{"class":79,"line":92},[77,5768,5769],{},"def outer():\n",[77,5771,5772],{"class":79,"line":98},[77,5773,5774],{},"    level = \"基础\"\n",[77,5776,5777],{"class":79,"line":105},[77,5778,102],{"emptyLinePlaceholder":101},[77,5780,5781],{"class":79,"line":111},[77,5782,5783],{},"    def show():\n",[77,5785,5786],{"class":79,"line":2462},[77,5787,5788],{},"        lesson = \"作用域\"\n",[77,5790,5791],{"class":79,"line":2468},[77,5792,5793],{},"        print(course, level, lesson)\n",[77,5795,5796],{"class":79,"line":3928},[77,5797,102],{"emptyLinePlaceholder":101},[77,5799,5800],{"class":79,"line":4140},[77,5801,5802],{},"    show()\n",[77,5804,5806],{"class":79,"line":5805},11,[77,5807,102],{"emptyLinePlaceholder":101},[77,5809,5811],{"class":79,"line":5810},12,[77,5812,5813],{},"outer()\n",[10,5815,117],{},[68,5817,5820],{"className":5818,"code":5819,"language":123,"meta":73},[121],"Python 基础 作用域\n",[50,5821,5819],{"__ignoreMap":73},[10,5823,128],{},[14,5825,131],{"id":131},[133,5827,5828,5845],{},[40,5829,5830,5833,5834,5837,5838,5840,5841,5844],{},[50,5831,5832],{},"show()"," 中查找 ",[50,5835,5836],{},"lesson"," 时先在局部找到，查找 ",[50,5839,5625],{}," 时到外层 ",[50,5842,5843],{},"outer()"," 找到。",[40,5846,5847,5849,5850,5852],{},[50,5848,4560],{}," 在局部和外层都不存在，继续到模块全局找到；",[50,5851,2185],{}," 最后在内置作用域找到。",[305,5854,2672],{"id":2672},[10,5856,5857],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5859,5860],{},[26,5861],{"alt":5862,"src":5863},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5865,5866],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5868,151],{"id":151},[37,5870,5871,5874],{},[40,5872,5873],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5875,5876],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5878,166],{"id":166},[133,5880,5881,5884],{},[40,5882,5883],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5885,5886],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5888,181],{},[14,5890,184],{"id":184},[10,5892,5893],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,5895,191],{},{"title":73,"searchDepth":86,"depth":86,"links":5897},[5898,5899,5900,5901,5902,5905,5906,5907],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5903},[5904],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5706,"description":5711},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[202,5915,5916],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":4,"title":5,"body":5919,"category":202,"cover":203,"description":12,"extension":204,"meta":6042,"navigation":101,"path":206,"pinned":207,"publishedAt":208,"seo":6043,"slug":210,"stem":211,"summary":212,"tags":6044,"updatedAt":208,"visible":101,"__hash__":216},{"type":7,"value":5920,"toc":6032},[5921,5923,5925,5927,5929,5933,5935,5937,5951,5953,5955,5983,5985,5990,5992,5994,6004,6006,6014,6016,6024,6026,6028,6030],[10,5922,12],{},[14,5924,16],{"id":16},[10,5926,19],{},[14,5928,22],{"id":22},[10,5930,5931],{},[26,5932],{"alt":28,"src":29},[10,5934,32],{},[14,5936,35],{"id":35},[37,5938,5939,5941,5943],{},[40,5940,42],{},[40,5942,45],{},[40,5944,48,5945,53,5947,53,5949,60],{},[50,5946,52],{},[50,5948,56],{},[50,5950,59],{},[14,5952,63],{"id":63},[10,5954,66],{},[68,5956,5957],{"className":70,"code":71,"language":72,"meta":73,"style":73},[50,5958,5959,5963,5967,5971,5975,5979],{"__ignoreMap":73},[77,5960,5961],{"class":79,"line":80},[77,5962,83],{},[77,5964,5965],{"class":79,"line":86},[77,5966,89],{},[77,5968,5969],{"class":79,"line":92},[77,5970,95],{},[77,5972,5973],{"class":79,"line":98},[77,5974,102],{"emptyLinePlaceholder":101},[77,5976,5977],{"class":79,"line":105},[77,5978,108],{},[77,5980,5981],{"class":79,"line":111},[77,5982,114],{},[10,5984,117],{},[68,5986,5988],{"className":5987,"code":122,"language":123,"meta":73},[121],[50,5989,122],{"__ignoreMap":73},[10,5991,128],{},[14,5993,131],{"id":131},[133,5995,5996,6002],{},[40,5997,137,5998,141,6000,145],{},[50,5999,140],{},[50,6001,144],{},[40,6003,148],{},[14,6005,151],{"id":151},[37,6007,6008,6012],{},[40,6009,156,6010,160],{},[50,6011,159],{},[40,6013,163],{},[14,6015,166],{"id":166},[133,6017,6018,6020],{},[40,6019,171],{},[40,6021,174,6022,178],{},[50,6023,177],{},[10,6025,181],{},[14,6027,184],{"id":184},[10,6029,187],{},[189,6031,191],{},{"title":73,"searchDepth":86,"depth":86,"links":6033},[6034,6035,6036,6037,6038,6039,6040,6041],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":5,"description":12},[202,214,215],{"id":6046,"title":6047,"body":6048,"category":202,"cover":203,"description":6052,"extension":204,"meta":6279,"navigation":101,"path":6280,"pinned":207,"publishedAt":208,"seo":6281,"slug":6282,"stem":6283,"summary":6284,"tags":6285,"updatedAt":208,"visible":101,"__hash__":6288},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6049,"toc":6267},[6050,6053,6055,6061,6063,6069,6080,6082,6100,6102,6109,6138,6145,6164,6173,6175,6181,6183,6185,6208,6210,6213,6219,6225,6227,6243,6245,6258,6260,6262,6265],[10,6051,6052],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6054,16],{"id":16},[10,6056,6057,6058,6060],{},"本篇只处理“模块、import 与 ",[271,6059,140],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6062,22],{"id":22},[10,6064,6065],{},[26,6066],{"alt":6067,"src":6068},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6070,6071,6072,6075,6076,6079],{},"同一个文件直接运行时 ",[50,6073,6074],{},"__name__"," 等于 ",[50,6077,6078],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6081,35],{"id":35},[37,6083,6084,6090,6093],{},[40,6085,6086,6087,6089],{},"一个 ",[50,6088,1148],{}," 文件就是一个模块。",[40,6091,6092],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6094,6095,6096,6099],{},"避免使用 ",[50,6097,6098],{},"from module import *","，它会让名字来源不清楚。",[14,6101,63],{"id":63},[10,6103,6104,6105,6108],{},"先在同一个目录中创建两个文件。把函数放进 ",[50,6106,6107],{},"calculator.py","：",[68,6110,6112],{"className":70,"code":6111,"language":72,"meta":73,"style":73},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[50,6113,6114,6119,6124,6128,6133],{"__ignoreMap":73},[77,6115,6116],{"class":79,"line":80},[77,6117,6118],{},"def add(left, right):\n",[77,6120,6121],{"class":79,"line":86},[77,6122,6123],{},"    return left + right\n",[77,6125,6126],{"class":79,"line":92},[77,6127,102],{"emptyLinePlaceholder":101},[77,6129,6130],{"class":79,"line":98},[77,6131,6132],{},"if __name__ == \"__main__\":\n",[77,6134,6135],{"class":79,"line":105},[77,6136,6137],{},"    print(add(2, 3))\n",[10,6139,6140,6141,6144],{},"再创建 ",[50,6142,6143],{},"app.py","，从模块中导入函数：",[68,6146,6148],{"className":70,"code":6147,"language":72,"meta":73,"style":73},"from calculator import add\n\nprint(add(10, 20))\n",[50,6149,6150,6155,6159],{"__ignoreMap":73},[77,6151,6152],{"class":79,"line":80},[77,6153,6154],{},"from calculator import add\n",[77,6156,6157],{"class":79,"line":86},[77,6158,102],{"emptyLinePlaceholder":101},[77,6160,6161],{"class":79,"line":92},[77,6162,6163],{},"print(add(10, 20))\n",[10,6165,6166,6167,1134,6170,339],{},"分别执行 ",[50,6168,6169],{},"python3 calculator.py",[50,6171,6172],{},"python3 app.py",[10,6174,117],{},[68,6176,6179],{"className":6177,"code":6178,"language":123,"meta":73},[121],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[50,6180,6178],{"__ignoreMap":73},[10,6182,128],{},[14,6184,131],{"id":131},[133,6186,6187,6197],{},[40,6188,6189,6190,6192,6193,6196],{},"直接运行 ",[50,6191,6107],{}," 时，模块名是 ",[50,6194,6195],{},"__main__","，入口代码输出 5。",[40,6198,6199,6201,6202,6204,6205,6207],{},[50,6200,6143],{}," 导入模块时，",[50,6203,6107],{}," 的函数定义会执行，但入口判断为假；随后 ",[50,6206,6143],{}," 调用函数输出 30。",[305,6209,2672],{"id":2672},[10,6211,6212],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6214,6215],{},[26,6216],{"alt":6217,"src":6218},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6220,6221,6222,6224],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[50,6223,6195],{}," 保护下的演示代码。",[14,6226,151],{"id":151},[37,6228,6229,6236],{},[40,6230,6231,6232,1134,6234,339],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[50,6233,6107],{},[50,6235,6143],{},[40,6237,6238,6239,6242],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[50,6240,6241],{},"json.py","，导致导入目标被遮蔽。",[14,6244,166],{"id":166},[133,6246,6247,6253],{},[40,6248,2328,6249,6252],{},[50,6250,6251],{},"text_tools.py"," 并导出一个格式化函数。",[40,6254,6255,6256,339],{},"分别直接运行模块和从另一个脚本导入，输出 ",[50,6257,6074],{},[10,6259,181],{},[14,6261,184],{"id":184},[10,6263,6264],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,6266,191],{},{"title":73,"searchDepth":86,"depth":86,"links":6268},[6269,6270,6271,6272,6273,6276,6277,6278],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":6274},[6275],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6047,"description":6052},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[202,6286,6287],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6290,"title":6291,"body":6292,"category":202,"cover":203,"description":6296,"extension":204,"meta":6461,"navigation":101,"path":6462,"pinned":207,"publishedAt":208,"seo":6463,"slug":6464,"stem":6465,"summary":6466,"tags":6467,"updatedAt":208,"visible":101,"__hash__":6469},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6293,"toc":6451},[6294,6297,6299,6302,6304,6310,6313,6315,6329,6331,6333,6379,6381,6387,6389,6391,6417,6419,6429,6431,6442,6444,6446,6449],[10,6295,6296],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6298,16],{"id":16},[10,6300,6301],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6303,22],{"id":22},[10,6305,6306],{},[26,6307],{"alt":6308,"src":6309},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6311,6312],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6314,35],{"id":35},[37,6316,6317,6323,6326],{},[40,6318,6319,6322],{},[50,6320,6321],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6324,6325],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6327,6328],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6330,63],{"id":63},[10,6332,1551],{},[68,6334,6336],{"className":568,"code":6335,"language":570,"meta":73,"style":73},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[50,6337,6338,6350,6358,6364,6374],{"__ignoreMap":73},[77,6339,6340,6342,6344,6347],{"class":79,"line":80},[77,6341,668],{"class":577},[77,6343,610],{"class":580},[77,6345,6346],{"class":613}," venv",[77,6348,6349],{"class":613}," .venv\n",[77,6351,6352,6355],{"class":79,"line":86},[77,6353,6354],{"class":580},"source",[77,6356,6357],{"class":613}," .venv\u002Fbin\u002Factivate\n",[77,6359,6360,6362],{"class":79,"line":92},[77,6361,72],{"class":577},[77,6363,581],{"class":580},[77,6365,6366,6368,6370,6372],{"class":79,"line":98},[77,6367,72],{"class":577},[77,6369,610],{"class":580},[77,6371,614],{"class":613},[77,6373,581],{"class":580},[77,6375,6376],{"class":79,"line":105},[77,6377,6378],{"class":577},"deactivate\n",[10,6380,117],{},[68,6382,6385],{"className":6383,"code":6384,"language":123,"meta":73},[121],"Python 和 pip 的路径应指向当前项目的 .venv\n",[50,6386,6384],{"__ignoreMap":73},[10,6388,128],{},[14,6390,131],{"id":131},[133,6392,6393,6402],{},[40,6394,6395,6398,6399,6401],{},[50,6396,6397],{},"venv"," 根据当前 ",[50,6400,668],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6403,6404,6405,2153,6407,6410,6411,3703,6413,6416],{},"激活后 ",[50,6406,72],{},[50,6408,6409],{},"python -m pip"," 优先指向 ",[50,6412,6321],{},[50,6414,6415],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6418,151],{"id":151},[37,6420,6421,6424],{},[40,6422,6423],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6425,3442,6426,6428],{},[50,6427,6321],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6430,166],{"id":166},[133,6432,6433,6439],{},[40,6434,6435,6436,339],{},"创建虚拟环境并记录激活前后的 ",[50,6437,6438],{},"which python",[40,6440,6441],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6443,181],{},[14,6445,184],{"id":184},[10,6447,6448],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,6450,1635],{},{"title":73,"searchDepth":86,"depth":86,"links":6452},[6453,6454,6455,6456,6457,6458,6459,6460],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6291,"description":6296},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[202,6468,237],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6471,"title":6472,"body":6473,"category":202,"cover":203,"description":6477,"extension":204,"meta":6665,"navigation":101,"path":6666,"pinned":207,"publishedAt":208,"seo":6667,"slug":6668,"stem":6669,"summary":6670,"tags":6671,"updatedAt":208,"visible":101,"__hash__":6674},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6474,"toc":6655},[6475,6478,6480,6483,6485,6491,6500,6502,6526,6528,6530,6583,6585,6591,6593,6595,6611,6613,6632,6634,6646,6648,6650,6653],[10,6476,6477],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6479,16],{"id":16},[10,6481,6482],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6484,22],{"id":22},[10,6486,6487],{},[26,6488],{"alt":6489,"src":6490},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6492,6493,6496,6497,6499],{},[50,6494,6495],{},"Path"," 使用 ",[50,6498,2409],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6501,35],{"id":35},[37,6503,6504,6507,6519],{},[40,6505,6506],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6508,6509,53,6512,53,6515,6518],{},[50,6510,6511],{},"exists()",[50,6513,6514],{},"is_file()",[50,6516,6517],{},"is_dir()"," 检查真实文件系统状态。",[40,6520,6521,6522,6525],{},"创建目录前明确目标；",[50,6523,6524],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6527,63],{"id":63},[10,6529,66],{},[68,6531,6533],{"className":70,"code":6532,"language":72,"meta":73,"style":73},"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",[50,6534,6535,6540,6544,6549,6554,6559,6563,6568,6573,6578],{"__ignoreMap":73},[77,6536,6537],{"class":79,"line":80},[77,6538,6539],{},"from pathlib import Path\n",[77,6541,6542],{"class":79,"line":86},[77,6543,102],{"emptyLinePlaceholder":101},[77,6545,6546],{"class":79,"line":92},[77,6547,6548],{},"project = Path.cwd()\n",[77,6550,6551],{"class":79,"line":98},[77,6552,6553],{},"data_dir = project \u002F \"data\"\n",[77,6555,6556],{"class":79,"line":105},[77,6557,6558],{},"file_path = data_dir \u002F \"records.json\"\n",[77,6560,6561],{"class":79,"line":111},[77,6562,102],{"emptyLinePlaceholder":101},[77,6564,6565],{"class":79,"line":2462},[77,6566,6567],{},"print(project)\n",[77,6569,6570],{"class":79,"line":2468},[77,6571,6572],{},"print(file_path.name)\n",[77,6574,6575],{"class":79,"line":3928},[77,6576,6577],{},"print(file_path.suffix)\n",[77,6579,6580],{"class":79,"line":4140},[77,6581,6582],{},"print(file_path.exists())\n",[10,6584,117],{},[68,6586,6589],{"className":6587,"code":6588,"language":123,"meta":73},[121],"显示当前项目路径、records.json、.json 和存在状态\n",[50,6590,6588],{"__ignoreMap":73},[10,6592,128],{},[14,6594,131],{"id":131},[133,6596,6597,6603],{},[40,6598,6599,6602],{},[50,6600,6601],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6604,2313,6605,6607,6608,6610],{},[50,6606,2409],{}," 组合路径片段只创建新的 ",[50,6609,6495],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6612,151],{"id":151},[37,6614,6615,6623],{},[40,6616,3442,6617,6619,6620,6622],{},[50,6618,6495],{}," 对象存在当成真实文件存在，仍需调用 ",[50,6621,6511],{}," 等方法确认。",[40,6624,6625,6626,986,6628,6631],{},"手工拼接 ",[50,6627,2409],{},[50,6629,6630],{},"\\"," 分隔符，降低跨平台可读性。",[14,6633,166],{"id":166},[133,6635,6636,6643],{},[40,6637,6638,6639,6642],{},"组合 ",[50,6640,6641],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6644,6645],{},"输出路径的父目录、文件名和扩展名。",[10,6647,181],{},[14,6649,184],{"id":184},[10,6651,6652],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,6654,191],{},{"title":73,"searchDepth":86,"depth":86,"links":6656},[6657,6658,6659,6660,6661,6662,6663,6664],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6472,"description":6477},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[202,6672,6673],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6676,"title":6677,"body":6678,"category":202,"cover":203,"description":6682,"extension":204,"meta":6860,"navigation":101,"path":6861,"pinned":207,"publishedAt":208,"seo":6862,"slug":6863,"stem":6864,"summary":6865,"tags":6866,"updatedAt":208,"visible":101,"__hash__":6869},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6679,"toc":6850},[6680,6683,6685,6688,6690,6696,6699,6701,6729,6731,6733,6790,6792,6798,6800,6802,6813,6815,6828,6830,6841,6843,6845,6848],[10,6681,6682],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6684,16],{"id":16},[10,6686,6687],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6689,22],{"id":22},[10,6691,6692],{},[26,6693],{"alt":6694,"src":6695},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6697,6698],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6700,35],{"id":35},[37,6702,6703,6709,6718],{},[40,6704,6705,6708],{},[50,6706,6707],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6710,6711,6714,6715,339],{},[50,6712,6713],{},"r"," 模式读取不存在文件会产生 ",[50,6716,6717],{},"FileNotFoundError",[40,6719,6720,6721,6724,6725,6728],{},"本篇显式调用 ",[50,6722,6723],{},"close()","；第 34 篇会用 ",[50,6726,6727],{},"with"," 更可靠地管理关闭动作。",[14,6730,63],{"id":63},[10,6732,66],{},[68,6734,6736],{"className":70,"code":6735,"language":72,"meta":73,"style":73},"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",[50,6737,6738,6742,6746,6751,6756,6761,6766,6770,6775,6780,6785],{"__ignoreMap":73},[77,6739,6740],{"class":79,"line":80},[77,6741,6539],{},[77,6743,6744],{"class":79,"line":86},[77,6745,102],{"emptyLinePlaceholder":101},[77,6747,6748],{"class":79,"line":92},[77,6749,6750],{},"file_path = Path(\"notes.txt\")\n",[77,6752,6753],{"class":79,"line":98},[77,6754,6755],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[77,6757,6758],{"class":79,"line":105},[77,6759,6760],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[77,6762,6763],{"class":79,"line":111},[77,6764,6765],{},"writer.close()\n",[77,6767,6768],{"class":79,"line":2462},[77,6769,102],{"emptyLinePlaceholder":101},[77,6771,6772],{"class":79,"line":2468},[77,6773,6774],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[77,6776,6777],{"class":79,"line":3928},[77,6778,6779],{},"content = reader.read()\n",[77,6781,6782],{"class":79,"line":4140},[77,6783,6784],{},"reader.close()\n",[77,6786,6787],{"class":79,"line":5805},[77,6788,6789],{},"print(content)\n",[10,6791,117],{},[68,6793,6796],{"className":6794,"code":6795,"language":123,"meta":73},[121],"变量\n循环\n函数\n",[50,6797,6795],{"__ignoreMap":73},[10,6799,128],{},[14,6801,131],{"id":131},[133,6803,6804,6810],{},[40,6805,6806,6807,6809],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[50,6808,6723],{}," 确保缓冲内容交给文件系统。",[40,6811,6812],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6814,151],{"id":151},[37,6816,6817,6822],{},[40,6818,2313,6819,6821],{},[50,6820,6707],{}," 模式打开重要文件却未确认覆盖风险。",[40,6823,6824,6825,339],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[50,6826,6827],{},"encoding=\"utf-8\"",[14,6829,166],{"id":166},[133,6831,6832,6835],{},[40,6833,6834],{},"写入三行学习记录并读取。",[40,6836,6837,6838,6840],{},"改用 ",[50,6839,313],{}," 模式追加一行，确认原内容仍保留。",[10,6842,181],{},[14,6844,184],{"id":184},[10,6846,6847],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,6849,191],{},{"title":73,"searchDepth":86,"depth":86,"links":6851},[6852,6853,6854,6855,6856,6857,6858,6859],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6677,"description":6682},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[202,6867,6868],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6871,"title":6872,"body":6873,"category":202,"cover":203,"description":6877,"extension":204,"meta":7044,"navigation":101,"path":7045,"pinned":207,"publishedAt":208,"seo":7046,"slug":7047,"stem":7048,"summary":7049,"tags":7050,"updatedAt":208,"visible":101,"__hash__":7053},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6874,"toc":7034},[6875,6878,6880,6883,6885,6891,6901,6903,6917,6919,6921,6981,6983,6989,6991,6993,7005,7007,7015,7017,7025,7027,7029,7032],[10,6876,6877],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6879,16],{"id":16},[10,6881,6882],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6884,22],{"id":22},[10,6886,6887],{},[26,6888],{"alt":6889,"src":6890},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6892,6893,6896,6897,6900],{},[50,6894,6895],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[50,6898,6899],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6902,35],{"id":35},[37,6904,6905,6908,6914],{},[40,6906,6907],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6909,6910,6913],{},[50,6911,6912],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6915,6916],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6918,63],{"id":63},[10,6920,66],{},[68,6922,6924],{"className":70,"code":6923,"language":72,"meta":73,"style":73},"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",[50,6925,6926,6931,6935,6940,6944,6949,6954,6958,6962,6967,6972,6976],{"__ignoreMap":73},[77,6927,6928],{"class":79,"line":80},[77,6929,6930],{},"import json\n",[77,6932,6933],{"class":79,"line":86},[77,6934,102],{"emptyLinePlaceholder":101},[77,6936,6937],{"class":79,"line":92},[77,6938,6939],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[77,6941,6942],{"class":79,"line":98},[77,6943,102],{"emptyLinePlaceholder":101},[77,6945,6946],{"class":79,"line":105},[77,6947,6948],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[77,6950,6951],{"class":79,"line":111},[77,6952,6953],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[77,6955,6956],{"class":79,"line":2462},[77,6957,6765],{},[77,6959,6960],{"class":79,"line":2468},[77,6961,102],{"emptyLinePlaceholder":101},[77,6963,6964],{"class":79,"line":3928},[77,6965,6966],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[77,6968,6969],{"class":79,"line":4140},[77,6970,6971],{},"loaded = json.load(reader)\n",[77,6973,6974],{"class":79,"line":5805},[77,6975,6784],{},[77,6977,6978],{"class":79,"line":5810},[77,6979,6980],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6982,117],{},[68,6984,6987],{"className":6985,"code":6986,"language":123,"meta":73},[121],"Python 60\n",[50,6988,6986],{"__ignoreMap":73},[10,6990,128],{},[14,6992,131],{"id":131},[133,6994,6995,7000],{},[40,6996,6997,6999],{},[50,6998,6895],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7001,7002,7004],{},[50,7003,6899],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7006,151],{"id":151},[37,7008,7009,7012],{},[40,7010,7011],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7013,7014],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7016,166],{"id":166},[133,7018,7019,7022],{},[40,7020,7021],{},"保存包含两条学习记录的列表。",[40,7023,7024],{},"读取后修改进度，再重新写回文件。",[10,7026,181],{},[14,7028,184],{"id":184},[10,7030,7031],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,7033,191],{},{"title":73,"searchDepth":86,"depth":86,"links":7035},[7036,7037,7038,7039,7040,7041,7042,7043],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6872,"description":6877},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[202,7051,7052],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7055,"title":7056,"body":7057,"category":202,"cover":203,"description":7061,"extension":204,"meta":7245,"navigation":101,"path":7246,"pinned":207,"publishedAt":208,"seo":7247,"slug":7248,"stem":7249,"summary":7250,"tags":7251,"updatedAt":208,"visible":101,"__hash__":7254},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7058,"toc":7235},[7059,7062,7064,7067,7069,7075,7081,7083,7105,7107,7109,7172,7174,7180,7182,7184,7200,7202,7216,7218,7226,7228,7230,7233],[10,7060,7061],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7063,16],{"id":16},[10,7065,7066],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7068,22],{"id":22},[10,7070,7071],{},[26,7072],{"alt":7073,"src":7074},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7076,7077,7080],{},[50,7078,7079],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7082,35],{"id":35},[37,7084,7085,7095,7102],{},[40,7086,2313,7087,7090,7091,7094],{},[50,7088,7089],{},"newline=\"\""," 让 ",[50,7092,7093],{},"csv"," 模块正确处理换行。",[40,7096,7097,7098,7101],{},"字段顺序由 ",[50,7099,7100],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7103,7104],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7106,63],{"id":63},[10,7108,66],{},[68,7110,7112],{"className":70,"code":7111,"language":72,"meta":73,"style":73},"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",[50,7113,7114,7119,7123,7128,7133,7138,7143,7148,7152,7157,7162,7167],{"__ignoreMap":73},[77,7115,7116],{"class":79,"line":80},[77,7117,7118],{},"import csv\n",[77,7120,7121],{"class":79,"line":86},[77,7122,102],{"emptyLinePlaceholder":101},[77,7124,7125],{"class":79,"line":92},[77,7126,7127],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[77,7129,7130],{"class":79,"line":98},[77,7131,7132],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[77,7134,7135],{"class":79,"line":105},[77,7136,7137],{},"writer.writeheader()\n",[77,7139,7140],{"class":79,"line":111},[77,7141,7142],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[77,7144,7145],{"class":79,"line":2462},[77,7146,7147],{},"writer_file.close()\n",[77,7149,7150],{"class":79,"line":2468},[77,7151,102],{"emptyLinePlaceholder":101},[77,7153,7154],{"class":79,"line":3928},[77,7155,7156],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[77,7158,7159],{"class":79,"line":4140},[77,7160,7161],{},"for row in csv.DictReader(reader_file):\n",[77,7163,7164],{"class":79,"line":5805},[77,7165,7166],{},"    print(row[\"name\"], row[\"score\"])\n",[77,7168,7169],{"class":79,"line":5810},[77,7170,7171],{},"reader_file.close()\n",[10,7173,117],{},[68,7175,7178],{"className":7176,"code":7177,"language":123,"meta":73},[121],"小郑 95\n",[50,7179,7177],{"__ignoreMap":73},[10,7181,128],{},[14,7183,131],{"id":131},[133,7185,7186,7195],{},[40,7187,7188,7191,7192,7194],{},[50,7189,7190],{},"DictWriter"," 按 ",[50,7193,7100],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7196,7197,7199],{},[50,7198,7079],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7201,151],{"id":151},[37,7203,7204,7207],{},[40,7205,7206],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7208,7209,7210,7212,7213,7215],{},"在 macOS 以外环境忽略 ",[50,7211,7089],{}," 可能出现额外空行；统一交给 ",[50,7214,7093],{}," 模块管理换行。",[14,7217,166],{"id":166},[133,7219,7220,7223],{},[40,7221,7222],{},"写入三名学习者的课程和分数。",[40,7224,7225],{},"读取 CSV 后把分数字符串转换为整数。",[10,7227,181],{},[14,7229,184],{"id":184},[10,7231,7232],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,7234,191],{},{"title":73,"searchDepth":86,"depth":86,"links":7236},[7237,7238,7239,7240,7241,7242,7243,7244],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7056,"description":7061},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[202,7252,7253],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7256,"title":7257,"body":7258,"category":202,"cover":203,"description":7262,"extension":204,"meta":7535,"navigation":101,"path":7536,"pinned":207,"publishedAt":208,"seo":7537,"slug":7538,"stem":7539,"summary":7540,"tags":7541,"updatedAt":208,"visible":101,"__hash__":7544},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7259,"toc":7522},[7260,7263,7265,7268,7270,7276,7287,7289,7306,7308,7310,7385,7387,7393,7395,7397,7422,7424,7433,7439,7450,7452,7458,7464,7473,7475,7490,7492,7513,7515,7517,7520],[10,7261,7262],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7264,16],{"id":16},[10,7266,7267],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7269,22],{"id":22},[10,7271,7272],{},[26,7273],{"alt":7274,"src":7275},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7277,7278,7279,7282,7283,7286],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[50,7280,7281],{},"except","；无论是否异常，",[50,7284,7285],{},"finally"," 都会在离开结构前执行。",[14,7288,35],{"id":35},[37,7290,7291,7297,7303],{},[40,7292,7293,7294,7296],{},"只捕获能够处理的具体异常，不使用空的 ",[50,7295,7281],{}," 吞掉全部错误。",[40,7298,7299,7302],{},[50,7300,7301],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7304,7305],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7307,63],{"id":63},[10,7309,66],{},[68,7311,7313],{"className":70,"code":7312,"language":72,"meta":73,"style":73},"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",[50,7314,7315,7320,7325,7330,7335,7340,7344,7349,7354,7359,7364,7368,7373,7379],{"__ignoreMap":73},[77,7316,7317],{"class":79,"line":80},[77,7318,7319],{},"def parse_age(text):\n",[77,7321,7322],{"class":79,"line":86},[77,7323,7324],{},"    age = int(text)\n",[77,7326,7327],{"class":79,"line":92},[77,7328,7329],{},"    if age \u003C 0:\n",[77,7331,7332],{"class":79,"line":98},[77,7333,7334],{},"        raise ValueError(\"年龄不能为负数\")\n",[77,7336,7337],{"class":79,"line":105},[77,7338,7339],{},"    return age\n",[77,7341,7342],{"class":79,"line":111},[77,7343,102],{"emptyLinePlaceholder":101},[77,7345,7346],{"class":79,"line":2462},[77,7347,7348],{},"try:\n",[77,7350,7351],{"class":79,"line":2468},[77,7352,7353],{},"    age = parse_age(\"18\")\n",[77,7355,7356],{"class":79,"line":3928},[77,7357,7358],{},"except ValueError as error:\n",[77,7360,7361],{"class":79,"line":4140},[77,7362,7363],{},"    print(\"输入错误：\", error)\n",[77,7365,7366],{"class":79,"line":5805},[77,7367,1123],{},[77,7369,7370],{"class":79,"line":5810},[77,7371,7372],{},"    print(\"年龄：\", age)\n",[77,7374,7376],{"class":79,"line":7375},13,[77,7377,7378],{},"finally:\n",[77,7380,7382],{"class":79,"line":7381},14,[77,7383,7384],{},"    print(\"处理结束\")\n",[10,7386,117],{},[68,7388,7391],{"className":7389,"code":7390,"language":123,"meta":73},[121],"年龄： 18\n处理结束\n",[50,7392,7390],{"__ignoreMap":73},[10,7394,128],{},[14,7396,131],{"id":131},[133,7398,7399,7411],{},[40,7400,7401,7403,7404,7406,7407,7410],{},[50,7402,3011],{}," 或主动 ",[50,7405,7301],{}," 都可能产生 ",[50,7408,7409],{},"ValueError","，控制流立即离开当前正常路径。",[40,7412,7413,7414,7416,7417,7419,7420,339],{},"有异常时进入匹配的 ",[50,7415,7281],{},"；没有异常时执行 ",[50,7418,1137],{},"；两种情况最后都会执行 ",[50,7421,7285],{},[305,7423,2672],{"id":2672},[10,7425,7426,53,7428,1134,7430,7432],{},[50,7427,7281],{},[50,7429,1137],{},[50,7431,7285],{}," 的职责不同，不能只看它们出现的顺序。",[10,7434,7435],{},[26,7436],{"alt":7437,"src":7438},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7440,7441,7443,7444,7446,7447,7449],{},[50,7442,7281],{}," 处理匹配异常，",[50,7445,1137],{}," 只在无异常时运行，",[50,7448,7285],{}," 负责两条路径都需要的清理动作。",[305,7451,2672],{"id":4195},[10,7453,7454,7457],{},[50,7455,7456],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7459,7460],{},[26,7461],{"alt":7462,"src":7463},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7465,7466,7467,7469,7470,7472],{},"只把可能产生预期异常的操作放进 ",[50,7468,7456],{},"，后续正常业务放进 ",[50,7471,1137],{},"，错误边界会更清楚。",[14,7474,151],{"id":151},[37,7476,7477,7484],{},[40,7478,7479,7480,7483],{},"使用裸 ",[50,7481,7482],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7485,7486,7487,7489],{},"把整个程序包在一个巨大 ",[50,7488,7456],{}," 中，无法判断究竟哪一步允许失败。",[14,7491,166],{"id":166},[133,7493,7494,7507],{},[40,7495,7496,7497,7500,7501,1134,7504,339],{},"让 ",[50,7498,7499],{},"parse_age"," 分别处理 ",[50,7502,7503],{},"\"abc\"",[50,7505,7506],{},"\"-1\"",[40,7508,7509,7510,7512],{},"为文件读取捕获 ",[50,7511,6717],{}," 并给出清晰提示。",[10,7514,181],{},[14,7516,184],{"id":184},[10,7518,7519],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,7521,191],{},{"title":73,"searchDepth":86,"depth":86,"links":7523},[7524,7525,7526,7527,7528,7532,7533,7534],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":7529},[7530,7531],{"id":2672,"depth":92,"text":2672},{"id":4195,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7257,"description":7262},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[202,7542,7543],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7546,"title":7547,"body":7548,"category":202,"cover":203,"description":7552,"extension":204,"meta":7728,"navigation":101,"path":7729,"pinned":207,"publishedAt":208,"seo":7730,"slug":7731,"stem":7732,"summary":7733,"tags":7734,"updatedAt":208,"visible":101,"__hash__":7736},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7549,"toc":7718},[7550,7553,7555,7558,7560,7566,7572,7574,7590,7592,7594,7648,7650,7656,7658,7660,7673,7675,7688,7690,7709,7711,7713,7716],[10,7551,7552],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7554,16],{"id":16},[10,7556,7557],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7559,22],{"id":22},[10,7561,7562],{},[26,7563],{"alt":7564,"src":7565},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7567,7568,7569,7571],{},"进入 ",[50,7570,6727],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7573,35],{"id":35},[37,7575,7576,7581,7587],{},[40,7577,7578,7580],{},[50,7579,6727],{}," 把资源获取和释放配成一个清晰边界。",[40,7582,7583,7586],{},[50,7584,7585],{},"as file"," 得到的是上下文返回的资源对象。",[40,7588,7589],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7591,63],{"id":63},[10,7593,66],{},[68,7595,7597],{"className":70,"code":7596,"language":72,"meta":73,"style":73},"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",[50,7598,7599,7603,7607,7611,7615,7620,7625,7629,7634,7639,7643],{"__ignoreMap":73},[77,7600,7601],{"class":79,"line":80},[77,7602,6539],{},[77,7604,7605],{"class":79,"line":86},[77,7606,102],{"emptyLinePlaceholder":101},[77,7608,7609],{"class":79,"line":92},[77,7610,6750],{},[77,7612,7613],{"class":79,"line":98},[77,7614,102],{"emptyLinePlaceholder":101},[77,7616,7617],{"class":79,"line":105},[77,7618,7619],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[77,7621,7622],{"class":79,"line":111},[77,7623,7624],{},"    file.write(\"上下文管理器\\n\")\n",[77,7626,7627],{"class":79,"line":2462},[77,7628,102],{"emptyLinePlaceholder":101},[77,7630,7631],{"class":79,"line":2468},[77,7632,7633],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[77,7635,7636],{"class":79,"line":3928},[77,7637,7638],{},"    print(file.read())\n",[77,7640,7641],{"class":79,"line":4140},[77,7642,102],{"emptyLinePlaceholder":101},[77,7644,7645],{"class":79,"line":5805},[77,7646,7647],{},"print(file.closed)\n",[10,7649,117],{},[68,7651,7654],{"className":7652,"code":7653,"language":123,"meta":73},[121],"上下文管理器\n\nTrue\n",[50,7655,7653],{"__ignoreMap":73},[10,7657,128],{},[14,7659,131],{"id":131},[133,7661,7662,7670],{},[40,7663,7568,7664,7666,7667,339],{},[50,7665,6727],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[50,7668,7669],{},"file",[40,7671,7672],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7674,151],{"id":151},[37,7676,7677,7682],{},[40,7678,4763,7679,7681],{},[50,7680,6727],{}," 代码块外继续读写已经关闭的文件对象。",[40,7683,7684,7685,7687],{},"误以为 ",[50,7686,6727],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7689,166],{"id":166},[133,7691,7692,7701],{},[40,7693,7694,7695,7698,7699,339],{},"把第 30 篇的手动 ",[50,7696,7697],{},"open\u002Fclose"," 改写为 ",[50,7700,6727],{},[40,7702,4763,7703,7705,7706,339],{},[50,7704,6727],{}," 块后检查 ",[50,7707,7708],{},"file.closed",[10,7710,181],{},[14,7712,184],{"id":184},[10,7714,7715],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,7717,191],{},{"title":73,"searchDepth":86,"depth":86,"links":7719},[7720,7721,7722,7723,7724,7725,7726,7727],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7547,"description":7552},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[202,6727,7735],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7738,"title":7739,"body":7740,"category":202,"cover":203,"description":7744,"extension":204,"meta":7956,"navigation":101,"path":7957,"pinned":207,"publishedAt":208,"seo":7958,"slug":7959,"stem":7960,"summary":7961,"tags":7962,"updatedAt":208,"visible":101,"__hash__":7965},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7741,"toc":7944},[7742,7745,7747,7750,7752,7758,7761,7763,7780,7782,7784,7852,7854,7860,7862,7864,7889,7891,7894,7900,7909,7911,7922,7924,7935,7937,7939,7942],[10,7743,7744],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7746,16],{"id":16},[10,7748,7749],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7751,22],{"id":22},[10,7753,7754],{},[26,7755],{"alt":7756,"src":7757},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7759,7760],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7762,35],{"id":35},[37,7764,7765,7771,7777],{},[40,7766,7767,7770],{},[50,7768,7769],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7772,7773,7776],{},[50,7774,7775],{},"__init__"," 在实例创建过程中初始化属性。",[40,7778,7779],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7781,63],{"id":63},[10,7783,66],{},[68,7785,7787],{"className":70,"code":7786,"language":72,"meta":73,"style":73},"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",[50,7788,7789,7794,7799,7804,7809,7813,7818,7823,7828,7833,7837,7842,7847],{"__ignoreMap":73},[77,7790,7791],{"class":79,"line":80},[77,7792,7793],{},"class LearningRecord:\n",[77,7795,7796],{"class":79,"line":86},[77,7797,7798],{},"    def __init__(self, course, progress=0):\n",[77,7800,7801],{"class":79,"line":92},[77,7802,7803],{},"        self.course = course\n",[77,7805,7806],{"class":79,"line":98},[77,7807,7808],{},"        self.progress = progress\n",[77,7810,7811],{"class":79,"line":105},[77,7812,102],{"emptyLinePlaceholder":101},[77,7814,7815],{"class":79,"line":111},[77,7816,7817],{},"    def advance(self, amount):\n",[77,7819,7820],{"class":79,"line":2462},[77,7821,7822],{},"        self.progress = self.progress + amount\n",[77,7824,7825],{"class":79,"line":2468},[77,7826,7827],{},"        if self.progress > 100:\n",[77,7829,7830],{"class":79,"line":3928},[77,7831,7832],{},"            self.progress = 100\n",[77,7834,7835],{"class":79,"line":4140},[77,7836,102],{"emptyLinePlaceholder":101},[77,7838,7839],{"class":79,"line":5805},[77,7840,7841],{},"record = LearningRecord(\"Python\", 40)\n",[77,7843,7844],{"class":79,"line":5810},[77,7845,7846],{},"record.advance(15)\n",[77,7848,7849],{"class":79,"line":7375},[77,7850,7851],{},"print(record.course, record.progress)\n",[10,7853,117],{},[68,7855,7858],{"className":7856,"code":7857,"language":123,"meta":73},[121],"Python 55\n",[50,7859,7857],{"__ignoreMap":73},[10,7861,128],{},[14,7863,131],{"id":131},[133,7865,7866,7876],{},[40,7867,7868,7869,7872,7873,7875],{},"调用 ",[50,7870,7871],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[50,7874,7775],{}," 把课程和进度保存在该实例属性中。",[40,7877,7878,7881,7882,7885,7886,7888],{},[50,7879,7880],{},"record.advance(15)"," 自动把 ",[50,7883,7884],{},"record"," 作为 ",[50,7887,7769],{},"，方法更新同一实例的进度并限制上限。",[305,7890,2672],{"id":2672},[10,7892,7893],{},"类是共同定义，实例则各自保存状态。",[10,7895,7896],{},[26,7897],{"alt":7898,"src":7899},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7901,7902,7903,1134,7905,7908],{},"两个实例共享同一套方法定义，但 ",[50,7904,4560],{},[50,7906,7907],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7910,151],{"id":151},[37,7912,7913,7919],{},[40,7914,7915,7916,7918],{},"调用实例方法时手工再传一次 ",[50,7917,7769],{},"。通过实例调用时 Python 会自动绑定。",[40,7920,7921],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7923,166],{"id":166},[133,7925,7926,7932],{},[40,7927,5273,7928,7931],{},[50,7929,7930],{},"Book"," 类，保存标题和阅读页数。",[40,7933,7934],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7936,181],{},[14,7938,184],{"id":184},[10,7940,7941],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,7943,191],{},{"title":73,"searchDepth":86,"depth":86,"links":7945},[7946,7947,7948,7949,7950,7953,7954,7955],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":7951},[7952],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7739,"description":7744},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[202,7963,7964],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7967,"title":7968,"body":7969,"category":202,"cover":203,"description":7973,"extension":204,"meta":8151,"navigation":101,"path":8152,"pinned":207,"publishedAt":208,"seo":8153,"slug":8154,"stem":8155,"summary":8156,"tags":8157,"updatedAt":208,"visible":101,"__hash__":8160},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7970,"toc":8141},[7971,7974,7976,7979,7981,7987,7990,7992,8003,8005,8007,8074,8076,8082,8084,8086,8105,8107,8115,8117,8132,8134,8136,8139],[10,7972,7973],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7975,16],{"id":16},[10,7977,7978],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7980,22],{"id":22},[10,7982,7983],{},[26,7984],{"alt":7985,"src":7986},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7988,7989],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7991,35],{"id":35},[37,7993,7994,7997,8000],{},[40,7995,7996],{},"封装让对象通过方法维护自己的有效状态。",[40,7998,7999],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8001,8002],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8004,63],{"id":63},[10,8006,66],{},[68,8008,8010],{"className":70,"code":8009,"language":72,"meta":73,"style":73},"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",[50,8011,8012,8017,8022,8027,8031,8036,8041,8046,8050,8055,8060,8064,8069],{"__ignoreMap":73},[77,8013,8014],{"class":79,"line":80},[77,8015,8016],{},"class Storage:\n",[77,8018,8019],{"class":79,"line":86},[77,8020,8021],{},"    def save(self, text):\n",[77,8023,8024],{"class":79,"line":92},[77,8025,8026],{},"        print(\"保存：\", text)\n",[77,8028,8029],{"class":79,"line":98},[77,8030,102],{"emptyLinePlaceholder":101},[77,8032,8033],{"class":79,"line":105},[77,8034,8035],{},"class LearningService:\n",[77,8037,8038],{"class":79,"line":111},[77,8039,8040],{},"    def __init__(self, storage):\n",[77,8042,8043],{"class":79,"line":2462},[77,8044,8045],{},"        self.storage = storage\n",[77,8047,8048],{"class":79,"line":2468},[77,8049,102],{"emptyLinePlaceholder":101},[77,8051,8052],{"class":79,"line":3928},[77,8053,8054],{},"    def finish_lesson(self, title):\n",[77,8056,8057],{"class":79,"line":4140},[77,8058,8059],{},"        self.storage.save(title)\n",[77,8061,8062],{"class":79,"line":5805},[77,8063,102],{"emptyLinePlaceholder":101},[77,8065,8066],{"class":79,"line":5810},[77,8067,8068],{},"service = LearningService(Storage())\n",[77,8070,8071],{"class":79,"line":7375},[77,8072,8073],{},"service.finish_lesson(\"异常处理\")\n",[10,8075,117],{},[68,8077,8080],{"className":8078,"code":8079,"language":123,"meta":73},[121],"保存： 异常处理\n",[50,8081,8079],{"__ignoreMap":73},[10,8083,128],{},[14,8085,131],{"id":131},[133,8087,8088,8098],{},[40,8089,8090,8093,8094,8097],{},[50,8091,8092],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[50,8095,8096],{},"save()"," 的协作对象。",[40,8099,8100,8101,8104],{},"调用业务方法时，服务把保存动作委托给 ",[50,8102,8103],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8106,151],{"id":151},[37,8108,8109,8112],{},[40,8110,8111],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8113,8114],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8116,166],{"id":166},[133,8118,8119,8129],{},[40,8120,8121,8122,8125,8126,339],{},"用组合让 ",[50,8123,8124],{},"OrderService"," 使用一个 ",[50,8127,8128],{},"Notifier",[40,8130,8131],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8133,181],{},[14,8135,184],{"id":184},[10,8137,8138],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,8140,191],{},{"title":73,"searchDepth":86,"depth":86,"links":8142},[8143,8144,8145,8146,8147,8148,8149,8150],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7968,"description":7973},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[202,8158,8159],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8162,"title":8163,"body":8164,"category":202,"cover":203,"description":8168,"extension":204,"meta":8371,"navigation":101,"path":8372,"pinned":207,"publishedAt":208,"seo":8373,"slug":8374,"stem":8375,"summary":8376,"tags":8377,"updatedAt":208,"visible":101,"__hash__":8380},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8165,"toc":8359},[8166,8169,8171,8174,8176,8182,8189,8191,8216,8218,8220,8272,8274,8280,8282,8284,8305,8307,8313,8319,8325,8327,8335,8337,8350,8352,8354,8357],[10,8167,8168],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8170,16],{"id":16},[10,8172,8173],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8175,22],{"id":22},[10,8177,8178],{},[26,8179],{"alt":8180,"src":8181},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8183,8184,8185,8188],{},"生成器运行到 ",[50,8186,8187],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8190,35],{"id":35},[37,8192,8193,8203,8213],{},[40,8194,8195,8198,8199,8202],{},[50,8196,8197],{},"iter()"," 从可迭代对象取得迭代器，",[50,8200,8201],{},"next()"," 请求下一个值。",[40,8204,8205,8206,8209,8210,8212],{},"没有更多值时迭代器抛出 ",[50,8207,8208],{},"StopIteration","，",[50,8211,4314],{}," 会自动处理。",[40,8214,8215],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8217,63],{"id":63},[10,8219,66],{},[68,8221,8223],{"className":70,"code":8222,"language":72,"meta":73,"style":73},"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",[50,8224,8225,8230,8235,8240,8245,8250,8254,8259,8264,8268],{"__ignoreMap":73},[77,8226,8227],{"class":79,"line":80},[77,8228,8229],{},"def countdown(start):\n",[77,8231,8232],{"class":79,"line":86},[77,8233,8234],{},"    current = start\n",[77,8236,8237],{"class":79,"line":92},[77,8238,8239],{},"    while current > 0:\n",[77,8241,8242],{"class":79,"line":98},[77,8243,8244],{},"        yield current\n",[77,8246,8247],{"class":79,"line":105},[77,8248,8249],{},"        current = current - 1\n",[77,8251,8252],{"class":79,"line":111},[77,8253,102],{"emptyLinePlaceholder":101},[77,8255,8256],{"class":79,"line":2462},[77,8257,8258],{},"iterator = countdown(3)\n",[77,8260,8261],{"class":79,"line":2468},[77,8262,8263],{},"print(next(iterator))\n",[77,8265,8266],{"class":79,"line":3928},[77,8267,8263],{},[77,8269,8270],{"class":79,"line":4140},[77,8271,8263],{},[10,8273,117],{},[68,8275,8278],{"className":8276,"code":8277,"language":123,"meta":73},[121],"3\n2\n1\n",[50,8279,8277],{"__ignoreMap":73},[10,8281,128],{},[14,8283,131],{"id":131},[133,8285,8286,8292],{},[40,8287,7868,8288,8291],{},[50,8289,8290],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8293,8294,8295,8297,8298,8300,8301,8304],{},"每次 ",[50,8296,8201],{}," 运行到下一个 ",[50,8299,8187],{}," 并暂停，局部变量 ",[50,8302,8303],{},"current"," 和执行位置被保留。",[305,8306,2672],{"id":2672},[10,8308,8309,8310,8312],{},"生成器的暂停位置可以展开成多次 ",[50,8311,8201],{}," 的时间线。",[10,8314,8315],{},[26,8316],{"alt":8317,"src":8318},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8320,8321,8322,8324],{},"每次请求只推进到下一个 ",[50,8323,8187],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8326,151],{"id":151},[37,8328,8329,8332],{},[40,8330,8331],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8333,8334],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8336,166],{"id":166},[133,8338,8339,8342],{},[40,8340,8341],{},"编写产生 1 到指定上限偶数的生成器。",[40,8343,3986,8344,8346,8347,8349],{},[50,8345,4314],{}," 遍历生成器，比较手动 ",[50,8348,8201],{}," 的差异。",[10,8351,181],{},[14,8353,184],{"id":184},[10,8355,8356],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,8358,191],{},{"title":73,"searchDepth":86,"depth":86,"links":8360},[8361,8362,8363,8364,8365,8368,8369,8370],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":8366},[8367],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8163,"description":8168},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[202,8378,8379],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8382,"title":8383,"body":8384,"category":202,"cover":203,"description":8388,"extension":204,"meta":8612,"navigation":101,"path":8613,"pinned":207,"publishedAt":208,"seo":8614,"slug":8615,"stem":8616,"summary":8617,"tags":8618,"updatedAt":208,"visible":101,"__hash__":8620},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8385,"toc":8600},[8386,8389,8391,8394,8396,8402,8405,8407,8427,8429,8431,8513,8515,8521,8523,8525,8547,8549,8552,8558,8565,8567,8577,8579,8591,8593,8595,8598],[10,8387,8388],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8390,16],{"id":16},[10,8392,8393],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8395,22],{"id":22},[10,8397,8398],{},[26,8399],{"alt":8400,"src":8401},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8403,8404],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8406,35],{"id":35},[37,8408,8409,8418,8421],{},[40,8410,8411,8414,8415,339],{},[50,8412,8413],{},"@trace"," 等价于 ",[50,8416,8417],{},"add = trace(add)",[40,8419,8420],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8422,8423,8426],{},[50,8424,8425],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8428,63],{"id":63},[10,8430,66],{},[68,8432,8434],{"className":70,"code":8433,"language":72,"meta":73,"style":73},"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",[50,8435,8436,8441,8445,8450,8455,8460,8465,8470,8475,8480,8485,8489,8494,8498,8502,8507],{"__ignoreMap":73},[77,8437,8438],{"class":79,"line":80},[77,8439,8440],{},"from functools import wraps\n",[77,8442,8443],{"class":79,"line":86},[77,8444,102],{"emptyLinePlaceholder":101},[77,8446,8447],{"class":79,"line":92},[77,8448,8449],{},"def trace(function):\n",[77,8451,8452],{"class":79,"line":98},[77,8453,8454],{},"    @wraps(function)\n",[77,8456,8457],{"class":79,"line":105},[77,8458,8459],{},"    def wrapper(*args, **kwargs):\n",[77,8461,8462],{"class":79,"line":111},[77,8463,8464],{},"        print(\"开始：\", function.__name__)\n",[77,8466,8467],{"class":79,"line":2462},[77,8468,8469],{},"        result = function(*args, **kwargs)\n",[77,8471,8472],{"class":79,"line":2468},[77,8473,8474],{},"        print(\"结束：\", function.__name__)\n",[77,8476,8477],{"class":79,"line":3928},[77,8478,8479],{},"        return result\n",[77,8481,8482],{"class":79,"line":4140},[77,8483,8484],{},"    return wrapper\n",[77,8486,8487],{"class":79,"line":5805},[77,8488,102],{"emptyLinePlaceholder":101},[77,8490,8491],{"class":79,"line":5810},[77,8492,8493],{},"@trace\n",[77,8495,8496],{"class":79,"line":7375},[77,8497,6118],{},[77,8499,8500],{"class":79,"line":7381},[77,8501,6123],{},[77,8503,8505],{"class":79,"line":8504},15,[77,8506,102],{"emptyLinePlaceholder":101},[77,8508,8510],{"class":79,"line":8509},16,[77,8511,8512],{},"print(add(2, 3))\n",[10,8514,117],{},[68,8516,8519],{"className":8517,"code":8518,"language":123,"meta":73},[121],"开始： add\n结束： add\n5\n",[50,8520,8518],{"__ignoreMap":73},[10,8522,128],{},[14,8524,131],{"id":131},[133,8526,8527,8544],{},[40,8528,8529,8530,8533,8534,8537,8538,8541,8542,339],{},"解释器执行定义时，把原 ",[50,8531,8532],{},"add"," 函数交给 ",[50,8535,8536],{},"trace","，返回的 ",[50,8539,8540],{},"wrapper"," 重新绑定到名字 ",[50,8543,8532],{},[40,8545,8546],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[305,8548,2672],{"id":2672},[10,8550,8551],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8553,8554],{},[26,8555],{"alt":8556,"src":8557},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8559,8560,8562,8563,339],{},[50,8561,8413],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[50,8564,8417],{},[14,8566,151],{"id":151},[37,8568,8569,8574],{},[40,8570,8571,8572,339],{},"包装函数忘记返回原函数结果，调用方得到 ",[50,8573,5356],{},[40,8575,8576],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8578,166],{"id":166},[133,8580,8581,8584],{},[40,8582,8583],{},"编写只记录调用次数的简单装饰器。",[40,8585,8586,8587,8590],{},"删除包装函数的 ",[50,8588,8589],{},"return result","，观察调用方得到什么。",[10,8592,181],{},[14,8594,184],{"id":184},[10,8596,8597],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,8599,191],{},{"title":73,"searchDepth":86,"depth":86,"links":8601},[8602,8603,8604,8605,8606,8609,8610,8611],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":8607},[8608],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8383,"description":8388},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[202,8619,5307],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8622,"title":8623,"body":8624,"category":202,"cover":203,"description":8628,"extension":204,"meta":8815,"navigation":101,"path":8816,"pinned":207,"publishedAt":208,"seo":8817,"slug":8818,"stem":8819,"summary":8820,"tags":8821,"updatedAt":208,"visible":101,"__hash__":8824},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8625,"toc":8803},[8626,8629,8631,8634,8636,8642,8645,8647,8658,8660,8662,8737,8739,8745,8747,8749,8760,8762,8765,8771,8774,8776,8784,8786,8794,8796,8798,8801],[10,8627,8628],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8630,16],{"id":16},[10,8632,8633],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8635,22],{"id":22},[10,8637,8638],{},[26,8639],{"alt":8640,"src":8641},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8643,8644],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8646,35],{"id":35},[37,8648,8649,8652,8655],{},[40,8650,8651],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8653,8654],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8656,8657],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8659,63],{"id":63},[10,8661,66],{},[68,8663,8665],{"className":70,"code":8664,"language":72,"meta":73,"style":73},"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",[50,8666,8667,8672,8677,8681,8686,8690,8695,8700,8705,8709,8714,8719,8724,8728,8732],{"__ignoreMap":73},[77,8668,8669],{"class":79,"line":80},[77,8670,8671],{},"import logging\n",[77,8673,8674],{"class":79,"line":86},[77,8675,8676],{},"import unittest\n",[77,8678,8679],{"class":79,"line":92},[77,8680,102],{"emptyLinePlaceholder":101},[77,8682,8683],{"class":79,"line":98},[77,8684,8685],{},"logging.basicConfig(level=logging.INFO)\n",[77,8687,8688],{"class":79,"line":105},[77,8689,102],{"emptyLinePlaceholder":101},[77,8691,8692],{"class":79,"line":111},[77,8693,8694],{},"def clamp_progress(value):\n",[77,8696,8697],{"class":79,"line":2462},[77,8698,8699],{},"    logging.info(\"检查进度：%s\", value)\n",[77,8701,8702],{"class":79,"line":2468},[77,8703,8704],{},"    return max(0, min(100, value))\n",[77,8706,8707],{"class":79,"line":3928},[77,8708,102],{"emptyLinePlaceholder":101},[77,8710,8711],{"class":79,"line":4140},[77,8712,8713],{},"class ProgressTest(unittest.TestCase):\n",[77,8715,8716],{"class":79,"line":5805},[77,8717,8718],{},"    def test_upper_limit(self):\n",[77,8720,8721],{"class":79,"line":5810},[77,8722,8723],{},"        self.assertEqual(clamp_progress(120), 100)\n",[77,8725,8726],{"class":79,"line":7375},[77,8727,102],{"emptyLinePlaceholder":101},[77,8729,8730],{"class":79,"line":7381},[77,8731,6132],{},[77,8733,8734],{"class":79,"line":8504},[77,8735,8736],{},"    unittest.main()\n",[10,8738,117],{},[68,8740,8743],{"className":8741,"code":8742,"language":123,"meta":73},[121],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[50,8744,8742],{"__ignoreMap":73},[10,8746,128],{},[14,8748,131],{"id":131},[133,8750,8751,8757],{},[40,8752,8753,8756],{},[50,8754,8755],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8758,8759],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[305,8761,2672],{"id":2672},[10,8763,8764],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8766,8767],{},[26,8768],{"alt":8769,"src":8770},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8772,8773],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8775,151],{"id":151},[37,8777,8778,8781],{},[40,8779,8780],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8782,8783],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8785,166],{"id":166},[133,8787,8788,8791],{},[40,8789,8790],{},"为负数进度增加测试。",[40,8792,8793],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8795,181],{},[14,8797,184],{"id":184},[10,8799,8800],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,8802,191],{},{"title":73,"searchDepth":86,"depth":86,"links":8804},[8805,8806,8807,8808,8809,8812,8813,8814],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":8810},[8811],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8623,"description":8628},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[202,8822,8823],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8826,"title":8827,"body":8828,"category":202,"cover":203,"description":8832,"extension":204,"meta":9132,"navigation":101,"path":9133,"pinned":207,"publishedAt":208,"seo":9134,"slug":9135,"stem":9136,"summary":9137,"tags":9138,"updatedAt":208,"visible":101,"__hash__":9141},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8829,"toc":9119},[8830,8833,8835,8838,8840,8846,8849,8851,8866,8868,8870,9017,9019,9025,9027,9029,9042,9044,9047,9053,9056,9058,9061,9067,9074,9076,9087,9089,9110,9112,9114,9117],[10,8831,8832],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8834,16],{"id":16},[10,8836,8837],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8839,22],{"id":22},[10,8841,8842],{},[26,8843],{"alt":8844,"src":8845},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8847,8848],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8850,35],{"id":35},[37,8852,8853,8856,8859],{},[40,8854,8855],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8857,8858],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8860,8861,8862,8865],{},"实际扩展前先为 ",[50,8863,8864],{},"add()"," 和存储边界补充测试。",[14,8867,63],{"id":63},[10,8869,66],{},[68,8871,8873],{"className":70,"code":8872,"language":72,"meta":73,"style":73},"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",[50,8874,8875,8879,8883,8887,8892,8897,8902,8907,8911,8916,8921,8926,8931,8936,8940,8945,8950,8956,8961,8967,8972,8977,8983,8989,8995,9000,9006,9011],{"__ignoreMap":73},[77,8876,8877],{"class":79,"line":80},[77,8878,6930],{},[77,8880,8881],{"class":79,"line":86},[77,8882,6539],{},[77,8884,8885],{"class":79,"line":92},[77,8886,102],{"emptyLinePlaceholder":101},[77,8888,8889],{"class":79,"line":98},[77,8890,8891],{},"class LearningRecords:\n",[77,8893,8894],{"class":79,"line":105},[77,8895,8896],{},"    def __init__(self, file_path):\n",[77,8898,8899],{"class":79,"line":111},[77,8900,8901],{},"        self.file_path = Path(file_path)\n",[77,8903,8904],{"class":79,"line":2462},[77,8905,8906],{},"        self.items = []\n",[77,8908,8909],{"class":79,"line":2468},[77,8910,102],{"emptyLinePlaceholder":101},[77,8912,8913],{"class":79,"line":3928},[77,8914,8915],{},"    def add(self, title):\n",[77,8917,8918],{"class":79,"line":4140},[77,8919,8920],{},"        title = title.strip()\n",[77,8922,8923],{"class":79,"line":5805},[77,8924,8925],{},"        if not title:\n",[77,8927,8928],{"class":79,"line":5810},[77,8929,8930],{},"            raise ValueError(\"课程名称不能为空\")\n",[77,8932,8933],{"class":79,"line":7375},[77,8934,8935],{},"        self.items.append({\"title\": title, \"done\": False})\n",[77,8937,8938],{"class":79,"line":7381},[77,8939,102],{"emptyLinePlaceholder":101},[77,8941,8942],{"class":79,"line":8504},[77,8943,8944],{},"    def save(self):\n",[77,8946,8947],{"class":79,"line":8509},[77,8948,8949],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[77,8951,8953],{"class":79,"line":8952},17,[77,8954,8955],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[77,8957,8959],{"class":79,"line":8958},18,[77,8960,102],{"emptyLinePlaceholder":101},[77,8962,8964],{"class":79,"line":8963},19,[77,8965,8966],{},"records = LearningRecords(\"learning-records.json\")\n",[77,8968,8970],{"class":79,"line":8969},20,[77,8971,102],{"emptyLinePlaceholder":101},[77,8973,8975],{"class":79,"line":8974},21,[77,8976,7348],{},[77,8978,8980],{"class":79,"line":8979},22,[77,8981,8982],{},"    title = input(\"输入已学习课程：\")\n",[77,8984,8986],{"class":79,"line":8985},23,[77,8987,8988],{},"    records.add(title)\n",[77,8990,8992],{"class":79,"line":8991},24,[77,8993,8994],{},"    records.save()\n",[77,8996,8998],{"class":79,"line":8997},25,[77,8999,7358],{},[77,9001,9003],{"class":79,"line":9002},26,[77,9004,9005],{},"    print(\"无法保存：\", error)\n",[77,9007,9009],{"class":79,"line":9008},27,[77,9010,1123],{},[77,9012,9014],{"class":79,"line":9013},28,[77,9015,9016],{},"    print(\"已保存 1 条学习记录\")\n",[10,9018,117],{},[68,9020,9023],{"className":9021,"code":9022,"language":123,"meta":73},[121],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[50,9024,9022],{"__ignoreMap":73},[10,9026,128],{},[14,9028,131],{"id":131},[133,9030,9031,9037],{},[40,9032,9033,9034,9036],{},"输入层取得课程名后，",[50,9035,8864],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9038,9039,9041],{},[50,9040,8096],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[305,9043,2672],{"id":2672},[10,9045,9046],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9048,9049],{},[26,9050],{"alt":9051,"src":9052},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9054,9055],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[305,9057,2672],{"id":4195},[10,9059,9060],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9062,9063],{},[26,9064],{"alt":9065,"src":9066},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9068,9069,9070,9073],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[50,9071,9072],{},"load()"," 把文件状态恢复到内存。",[14,9075,151],{"id":151},[37,9077,9078,9081],{},[40,9079,9080],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9082,9083,9084,9086],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[50,9085,9072],{}," 是下一项必要扩展。",[14,9088,166],{"id":166},[133,9090,9091,9097,9100],{},[40,9092,9093,9094,9096],{},"增加 ",[50,9095,9072],{},"，文件不存在时从空列表开始。",[40,9098,9099],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9101,9102,9103,9106,9107,9109],{},"把输入循环放进 ",[50,9104,9105],{},"main()","，通过 ",[50,9108,6074],{}," 控制程序入口。",[10,9111,181],{},[14,9113,184],{"id":184},[10,9115,9116],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[189,9118,191],{},{"title":73,"searchDepth":86,"depth":86,"links":9120},[9121,9122,9123,9124,9125,9129,9130,9131],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":9126},[9127,9128],{"id":2672,"depth":92,"text":2672},{"id":4195,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8827,"description":8832},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[202,9139,9140],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9143,9246,9365,9496,9639,9764,9901,10038,10179,10348,10485,10618,10741,10870,10997,11160,11336,11477,11606,11755,11898,12019,12142,12291,12444,12609,12736,12917,13060,13217,13368,13515,13670,13888,14043,14218,14369,14536,14723,14886,15128,15368],{"id":1370,"title":1371,"body":9144,"category":202,"cover":203,"description":1376,"extension":204,"meta":9243,"navigation":101,"path":1495,"pinned":207,"publishedAt":208,"seo":9244,"slug":1497,"stem":1498,"summary":1499,"tags":9245,"updatedAt":208,"visible":101,"__hash__":1502},{"type":7,"value":9145,"toc":9233},[9146,9148,9150,9152,9154,9158,9162,9164,9174,9176,9178,9186,9188,9193,9195,9197,9207,9209,9217,9219,9225,9227,9229,9231],[10,9147,1376],{},[14,9149,16],{"id":16},[10,9151,1381],{},[14,9153,22],{"id":22},[10,9155,9156],{},[26,9157],{"alt":1388,"src":1389},[10,9159,9160,1394],{},[50,9161,1148],{},[14,9163,35],{"id":35},[37,9165,9166,9170,9172],{},[40,9167,1401,9168,1404],{},[50,9169,1148],{},[40,9171,1407],{},[40,9173,1410],{},[14,9175,63],{"id":63},[10,9177,66],{},[68,9179,9180],{"className":70,"code":1417,"language":72,"meta":73,"style":73},[50,9181,9182],{"__ignoreMap":73},[77,9183,9184],{"class":79,"line":80},[77,9185,1417],{},[10,9187,117],{},[68,9189,9191],{"className":9190,"code":1429,"language":123,"meta":73},[121],[50,9192,1429],{"__ignoreMap":73},[10,9194,128],{},[14,9196,131],{"id":131},[133,9198,9199,9203],{},[40,9200,1440,9201,1444],{},[50,9202,1443],{},[40,9204,1447,9205,1451],{},[50,9206,1450],{},[14,9208,151],{"id":151},[37,9210,9211,9213],{},[40,9212,1458],{},[40,9214,1461,9215,1464],{},[50,9216,1148],{},[14,9218,166],{"id":166},[133,9220,9221,9223],{},[40,9222,1471],{},[40,9224,1474],{},[10,9226,181],{},[14,9228,184],{"id":184},[10,9230,1481],{},[189,9232,191],{},{"title":73,"searchDepth":86,"depth":86,"links":9234},[9235,9236,9237,9238,9239,9240,9241,9242],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":1371,"description":1376},[202,1366,1501],{"id":1504,"title":1505,"body":9247,"category":202,"cover":203,"description":1510,"extension":204,"meta":9362,"navigation":101,"path":1647,"pinned":207,"publishedAt":208,"seo":9363,"slug":1649,"stem":1650,"summary":1651,"tags":9364,"updatedAt":208,"visible":101,"__hash__":1654},{"type":7,"value":9248,"toc":9352},[9249,9251,9253,9255,9257,9261,9265,9267,9277,9279,9281,9301,9303,9308,9310,9312,9322,9324,9334,9336,9344,9346,9348,9350],[10,9250,1510],{},[14,9252,16],{"id":16},[10,9254,1515],{},[14,9256,22],{"id":22},[10,9258,9259],{},[26,9260],{"alt":1522,"src":1523},[10,9262,1526,9263,1529],{},[50,9264,668],{},[14,9266,35],{"id":35},[37,9268,9269,9271,9273],{},[40,9270,1536],{},[40,9272,1539],{},[40,9274,1542,9275,1546],{},[50,9276,1545],{},[14,9278,63],{"id":63},[10,9280,1551],{},[68,9282,9283],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,9284,9285,9291],{"__ignoreMap":73},[77,9286,9287,9289],{"class":79,"line":80},[77,9288,668],{"class":577},[77,9290,581],{"class":580},[77,9292,9293,9295,9297,9299],{"class":79,"line":86},[77,9294,668],{"class":577},[77,9296,610],{"class":580},[77,9298,614],{"class":613},[77,9300,581],{"class":580},[10,9302,117],{},[68,9304,9306],{"className":9305,"code":1577,"language":123,"meta":73},[121],[50,9307,1577],{"__ignoreMap":73},[10,9309,128],{},[14,9311,131],{"id":131},[133,9313,9314,9318],{},[40,9315,9316,1591],{},[50,9317,1590],{},[40,9319,9320,1596],{},[50,9321,676],{},[14,9323,151],{"id":151},[37,9325,9326,9330],{},[40,9327,1603,9328,1606],{},[50,9329,668],{},[40,9331,1609,9332,1612],{},[50,9333,668],{},[14,9335,166],{"id":166},[133,9337,9338,9342],{},[40,9339,915,9340,1622],{},[50,9341,1621],{},[40,9343,1625],{},[10,9345,181],{},[14,9347,184],{"id":184},[10,9349,1632],{},[189,9351,1635],{},{"title":73,"searchDepth":86,"depth":86,"links":9353},[9354,9355,9356,9357,9358,9359,9360,9361],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":1505,"description":1510},[202,1653,1029],{"id":1656,"title":1657,"body":9366,"category":202,"cover":203,"description":1823,"extension":204,"meta":9493,"navigation":101,"path":1825,"pinned":207,"publishedAt":208,"seo":9494,"slug":1827,"stem":1828,"summary":1829,"tags":9495,"updatedAt":208,"visible":101,"__hash__":1833},{"type":7,"value":9367,"toc":9483},[9368,9372,9374,9376,9378,9382,9384,9386,9402,9404,9406,9426,9428,9433,9435,9437,9449,9451,9461,9463,9473,9475,9477,9481],[10,9369,1662,9370,1665],{},[50,9371,1148],{},[14,9373,16],{"id":16},[10,9375,1670],{},[14,9377,22],{"id":22},[10,9379,9380],{},[26,9381],{"alt":1677,"src":1678},[10,9383,1681],{},[14,9385,35],{"id":35},[37,9387,9388,9394,9398],{},[40,9389,1688,9390,1691,9392,339],{},[50,9391,668],{},[50,9393,1694],{},[40,9395,1697,9396,1701],{},[50,9397,1700],{},[40,9399,1704,9400,1707],{},[50,9401,1148],{},[14,9403,63],{"id":63},[10,9405,66],{},[68,9407,9408],{"className":1714,"code":1715,"language":1716,"meta":73,"style":73},[50,9409,9410,9414,9418,9422],{"__ignoreMap":73},[77,9411,9412],{"class":79,"line":80},[77,9413,1723],{},[77,9415,9416],{"class":79,"line":86},[77,9417,1728],{},[77,9419,9420],{"class":79,"line":92},[77,9421,1733],{},[77,9423,9424],{"class":79,"line":98},[77,9425,1738],{},[10,9427,117],{},[68,9429,9431],{"className":9430,"code":1744,"language":123,"meta":73},[121],[50,9432,1744],{"__ignoreMap":73},[10,9434,128],{},[14,9436,131],{"id":131},[133,9438,9439,9445],{},[40,9440,1755,9441,1759,9443,339],{},[50,9442,1758],{},[50,9444,1762],{},[40,9446,1765,9447,1768],{},[50,9448,1450],{},[14,9450,151],{"id":151},[37,9452,9453,9459],{},[40,9454,1775,9455,1778,9457,1781],{},[50,9456,1694],{},[50,9458,1148],{},[40,9460,1784],{},[14,9462,166],{"id":166},[133,9464,9465,9469],{},[40,9466,1791,9467,339],{},[50,9468,1794],{},[40,9470,1797,9471,1800],{},[50,9472,1450],{},[10,9474,181],{},[14,9476,184],{"id":184},[10,9478,1807,9479,1810],{},[50,9480,1148],{},[189,9482,191],{},{"title":73,"searchDepth":86,"depth":86,"links":9484},[9485,9486,9487,9488,9489,9490,9491,9492],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":1657,"description":1823},[202,1831,1832],{"id":1835,"title":1836,"body":9497,"category":202,"cover":203,"description":1841,"extension":204,"meta":9636,"navigation":101,"path":2013,"pinned":207,"publishedAt":208,"seo":9637,"slug":2015,"stem":2016,"summary":2017,"tags":9638,"updatedAt":208,"visible":101,"__hash__":2021},{"type":7,"value":9498,"toc":9626},[9499,9501,9503,9505,9507,9511,9515,9517,9529,9531,9533,9569,9571,9576,9578,9580,9596,9598,9608,9610,9618,9620,9622,9624],[10,9500,1841],{},[14,9502,16],{"id":16},[10,9504,1846],{},[14,9506,22],{"id":22},[10,9508,9509],{},[26,9510],{"alt":1853,"src":1854},[10,9512,9513,1860],{},[50,9514,1859],{},[14,9516,35],{"id":35},[37,9518,9519,9521,9527],{},[40,9520,1867],{},[40,9522,9523,1873,9525,1877],{},[50,9524,1872],{},[50,9526,1876],{},[40,9528,1880],{},[14,9530,63],{"id":63},[10,9532,1551],{},[68,9534,9535],{"className":568,"code":1887,"language":570,"meta":73,"style":73},[50,9536,9537,9543,9549,9553,9563],{"__ignoreMap":73},[77,9538,9539,9541],{"class":79,"line":80},[77,9540,1894],{"class":577},[77,9542,1897],{"class":613},[77,9544,9545,9547],{"class":79,"line":86},[77,9546,1902],{"class":580},[77,9548,1897],{"class":613},[77,9550,9551],{"class":79,"line":92},[77,9552,1909],{"class":580},[77,9554,9555,9557,9559,9561],{"class":79,"line":98},[77,9556,1914],{"class":580},[77,9558,1917],{"class":613},[77,9560,1921],{"class":1920},[77,9562,1192],{"class":613},[77,9564,9565,9567],{"class":79,"line":105},[77,9566,668],{"class":577},[77,9568,1192],{"class":613},[10,9570,117],{},[68,9572,9574],{"className":9573,"code":1935,"language":123,"meta":73},[121],[50,9575,1935],{"__ignoreMap":73},[10,9577,128],{},[14,9579,131],{"id":131},[133,9581,9582,9590],{},[40,9583,9584,1948,9586,1951,9588,1954],{},[50,9585,1894],{},[50,9587,1902],{},[50,9589,1872],{},[40,9591,9592,1959,9594,1963],{},[50,9593,1859],{},[50,9595,1962],{},[14,9597,151],{"id":151},[37,9599,9600,9606],{},[40,9601,1970,9602,1134,9604,339],{},[50,9603,1872],{},[50,9605,1876],{},[40,9607,1977],{},[14,9609,166],{"id":166},[133,9611,9612,9616],{},[40,9613,1984,9614,1988],{},[50,9615,1987],{},[40,9617,1991],{},[10,9619,181],{},[14,9621,184],{"id":184},[10,9623,1998],{},[189,9625,2001],{},{"title":73,"searchDepth":86,"depth":86,"links":9627},[9628,9629,9630,9631,9632,9633,9634,9635],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":1836,"description":1841},[202,2019,2020],{"id":2023,"title":2024,"body":9640,"category":202,"cover":203,"description":2029,"extension":204,"meta":9761,"navigation":101,"path":2178,"pinned":207,"publishedAt":208,"seo":9762,"slug":2180,"stem":2181,"summary":2182,"tags":9763,"updatedAt":208,"visible":101,"__hash__":2186},{"type":7,"value":9641,"toc":9751},[9642,9644,9646,9648,9650,9654,9662,9664,9678,9680,9682,9698,9700,9705,9707,9709,9723,9725,9731,9733,9743,9745,9747,9749],[10,9643,2029],{},[14,9645,16],{"id":16},[10,9647,2034],{},[14,9649,22],{"id":22},[10,9651,9652],{},[26,9653],{"alt":2041,"src":2042},[10,9655,2045,9656,339,9658,2051,9660,339],{},[50,9657,1450],{},[50,9659,2050],{},[50,9661,1758],{},[14,9663,35],{"id":35},[37,9665,9666,9670,9676],{},[40,9667,9668,2063],{},[50,9669,2062],{},[40,9671,9672,2069,9674,339],{},[50,9673,2068],{},[50,9675,2072],{},[40,9677,2075],{},[14,9679,63],{"id":63},[10,9681,66],{},[68,9683,9684],{"className":70,"code":2082,"language":72,"meta":73,"style":73},[50,9685,9686,9690,9694],{"__ignoreMap":73},[77,9687,9688],{"class":79,"line":80},[77,9689,2089],{},[77,9691,9692],{"class":79,"line":86},[77,9693,2094],{},[77,9695,9696],{"class":79,"line":92},[77,9697,2099],{},[10,9699,117],{},[68,9701,9703],{"className":9702,"code":2105,"language":123,"meta":73},[121],[50,9704,2105],{"__ignoreMap":73},[10,9706,128],{},[14,9708,131],{"id":131},[133,9710,9711,9717],{},[40,9712,9713,2119,9715,339],{},[50,9714,2118],{},[50,9716,2072],{},[40,9718,9719,2126,9721,2130],{},[50,9720,1450],{},[50,9722,2129],{},[14,9724,151],{"id":151},[37,9726,9727,9729],{},[40,9728,2137],{},[40,9730,2140],{},[14,9732,166],{"id":166},[133,9734,9735,9737],{},[40,9736,2147],{},[40,9738,2150,9739,2153,9741,2157],{},[50,9740,2050],{},[50,9742,2156],{},[10,9744,181],{},[14,9746,184],{"id":184},[10,9748,2164],{},[189,9750,191],{},{"title":73,"searchDepth":86,"depth":86,"links":9752},[9753,9754,9755,9756,9757,9758,9759,9760],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":2024,"description":2029},[202,2184,2185],{"id":2188,"title":2189,"body":9765,"category":202,"cover":203,"description":2194,"extension":204,"meta":9898,"navigation":101,"path":2359,"pinned":207,"publishedAt":208,"seo":9899,"slug":2361,"stem":2362,"summary":2363,"tags":9900,"updatedAt":208,"visible":101,"__hash__":2367},{"type":7,"value":9766,"toc":9888},[9767,9769,9771,9773,9775,9779,9781,9783,9799,9801,9803,9827,9829,9834,9836,9838,9854,9856,9868,9870,9880,9882,9884,9886],[10,9768,2194],{},[14,9770,16],{"id":16},[10,9772,2199],{},[14,9774,22],{"id":22},[10,9776,9777],{},[26,9778],{"alt":2206,"src":2207},[10,9780,2210],{},[14,9782,35],{"id":35},[37,9784,9785,9787,9793],{},[40,9786,2217],{},[40,9788,2220,9789,2153,9791,2226],{},[50,9790,144],{},[50,9792,2225],{},[40,9794,2229,9795,53,9797,2235],{},[50,9796,2232],{},[50,9798,52],{},[14,9800,63],{"id":63},[10,9802,66],{},[68,9804,9805],{"className":70,"code":2242,"language":72,"meta":73,"style":73},[50,9806,9807,9811,9815,9819,9823],{"__ignoreMap":73},[77,9808,9809],{"class":79,"line":80},[77,9810,2249],{},[77,9812,9813],{"class":79,"line":86},[77,9814,2254],{},[77,9816,9817],{"class":79,"line":92},[77,9818,102],{"emptyLinePlaceholder":101},[77,9820,9821],{"class":79,"line":98},[77,9822,2263],{},[77,9824,9825],{"class":79,"line":105},[77,9826,2254],{},[10,9828,117],{},[68,9830,9832],{"className":9831,"code":2273,"language":123,"meta":73},[121],[50,9833,2273],{"__ignoreMap":73},[10,9835,128],{},[14,9837,131],{"id":131},[133,9839,9840,9846],{},[40,9841,915,9842,2287,9844,2290],{},[50,9843,2286],{},[50,9845,144],{},[40,9847,915,9848,2296,9850,2300,9852,339],{},[50,9849,2295],{},[50,9851,2299],{},[50,9853,2303],{},[14,9855,151],{"id":151},[37,9857,9858,9860],{},[40,9859,2310],{},[40,9861,2313,9862,53,9864,53,9866,2321],{},[50,9863,2232],{},[50,9865,52],{},[50,9867,2320],{},[14,9869,166],{"id":166},[133,9871,9872,9878],{},[40,9873,2328,9874,1134,9876,2335],{},[50,9875,2331],{},[50,9877,2334],{},[40,9879,2338],{},[10,9881,181],{},[14,9883,184],{"id":184},[10,9885,2345],{},[189,9887,191],{},{"title":73,"searchDepth":86,"depth":86,"links":9889},[9890,9891,9892,9893,9894,9895,9896,9897],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":2189,"description":2194},[202,2365,2366],{"id":2369,"title":2370,"body":9902,"category":202,"cover":203,"description":2375,"extension":204,"meta":10035,"navigation":101,"path":2541,"pinned":207,"publishedAt":208,"seo":10036,"slug":2543,"stem":2544,"summary":2545,"tags":10037,"updatedAt":208,"visible":101,"__hash__":2549},{"type":7,"value":9903,"toc":10025},[9904,9906,9908,9910,9912,9916,9918,9920,9938,9940,9942,9978,9980,9985,9987,9989,9999,10001,10009,10011,10017,10019,10021,10023],[10,9905,2375],{},[14,9907,16],{"id":16},[10,9909,2380],{},[14,9911,22],{"id":22},[10,9913,9914],{},[26,9915],{"alt":2387,"src":2388},[10,9917,2391],{},[14,9919,35],{"id":35},[37,9921,9922,9928,9936],{},[40,9923,9924,2400,9926,2404],{},[50,9925,56],{},[50,9927,2403],{},[40,9929,9930,2410,9932,2414,9934,2418],{},[50,9931,2409],{},[50,9933,2413],{},[50,9935,2417],{},[40,9937,2421],{},[14,9939,63],{"id":63},[10,9941,66],{},[68,9943,9944],{"className":70,"code":2428,"language":72,"meta":73,"style":73},[50,9945,9946,9950,9954,9958,9962,9966,9970,9974],{"__ignoreMap":73},[77,9947,9948],{"class":79,"line":80},[77,9949,2435],{},[77,9951,9952],{"class":79,"line":86},[77,9953,2440],{},[77,9955,9956],{"class":79,"line":92},[77,9957,2445],{},[77,9959,9960],{"class":79,"line":98},[77,9961,102],{"emptyLinePlaceholder":101},[77,9963,9964],{"class":79,"line":105},[77,9965,2454],{},[77,9967,9968],{"class":79,"line":111},[77,9969,2459],{},[77,9971,9972],{"class":79,"line":2462},[77,9973,2465],{},[77,9975,9976],{"class":79,"line":2468},[77,9977,2471],{},[10,9979,117],{},[68,9981,9983],{"className":9982,"code":2477,"language":123,"meta":73},[121],[50,9984,2477],{"__ignoreMap":73},[10,9986,128],{},[14,9988,131],{"id":131},[133,9990,9991,9995],{},[40,9992,9993,2491],{},[50,9994,2490],{},[40,9996,9997,2497],{},[50,9998,2496],{},[14,10000,151],{"id":151},[37,10002,10003,10007],{},[40,10004,2504,10005,339],{},[50,10006,2507],{},[40,10008,2510],{},[14,10010,166],{"id":166},[133,10012,10013,10015],{},[40,10014,2517],{},[40,10016,2520],{},[10,10018,181],{},[14,10020,184],{"id":184},[10,10022,2527],{},[189,10024,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10026},[10027,10028,10029,10030,10031,10032,10033,10034],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":2370,"description":2375},[202,2547,2548],{"id":2551,"title":2552,"body":10039,"category":202,"cover":203,"description":2557,"extension":204,"meta":10176,"navigation":101,"path":2734,"pinned":207,"publishedAt":208,"seo":10177,"slug":2736,"stem":2737,"summary":2738,"tags":10178,"updatedAt":208,"visible":101,"__hash__":2742},{"type":7,"value":10040,"toc":10164},[10041,10043,10045,10047,10049,10053,10059,10061,10069,10071,10073,10097,10099,10104,10106,10108,10126,10128,10130,10134,10136,10138,10144,10146,10156,10158,10160,10162],[10,10042,2557],{},[14,10044,16],{"id":16},[10,10046,2562],{},[14,10048,22],{"id":22},[10,10050,10051],{},[26,10052],{"alt":2569,"src":2570},[10,10054,2573,10055,2577,10057,339],{},[50,10056,2576],{},[50,10058,2580],{},[14,10060,35],{"id":35},[37,10062,10063,10065,10067],{},[40,10064,2587],{},[40,10066,2590],{},[40,10068,2593],{},[14,10070,63],{"id":63},[10,10072,66],{},[68,10074,10075],{"className":70,"code":2600,"language":72,"meta":73,"style":73},[50,10076,10077,10081,10085,10089,10093],{"__ignoreMap":73},[77,10078,10079],{"class":79,"line":80},[77,10080,2607],{},[77,10082,10083],{"class":79,"line":86},[77,10084,2612],{},[77,10086,10087],{"class":79,"line":92},[77,10088,2617],{},[77,10090,10091],{"class":79,"line":98},[77,10092,2622],{},[77,10094,10095],{"class":79,"line":105},[77,10096,2627],{},[10,10098,117],{},[68,10100,10102],{"className":10101,"code":2633,"language":123,"meta":73},[121],[50,10103,2633],{"__ignoreMap":73},[10,10105,128],{},[14,10107,131],{"id":131},[133,10109,10110,10118],{},[40,10111,2644,10112,2647,10114,2651,10116,2655],{},[50,10113,202],{},[50,10115,2650],{},[50,10117,2654],{},[40,10119,10120,2661,10122,2665,10124,2669],{},[50,10121,2660],{},[50,10123,2664],{},[50,10125,2668],{},[305,10127,2672],{"id":2672},[10,10129,2675],{},[10,10131,10132],{},[26,10133],{"alt":2680,"src":2681},[10,10135,2684],{},[14,10137,151],{"id":151},[37,10139,10140,10142],{},[40,10141,2691],{},[40,10143,2694],{},[14,10145,166],{"id":166},[133,10147,10148,10154],{},[40,10149,2701,10150,2705,10152,339],{},[50,10151,2704],{},[50,10153,2708],{},[40,10155,2711],{},[10,10157,181],{},[14,10159,184],{"id":184},[10,10161,2718],{},[189,10163,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10165},[10166,10167,10168,10169,10170,10173,10174,10175],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":10171},[10172],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":2552,"description":2557},[202,2740,2741],{"id":2744,"title":2745,"body":10180,"category":202,"cover":203,"description":2750,"extension":204,"meta":10345,"navigation":101,"path":2965,"pinned":207,"publishedAt":208,"seo":10346,"slug":2967,"stem":2968,"summary":2969,"tags":10347,"updatedAt":208,"visible":101,"__hash__":2973},{"type":7,"value":10181,"toc":10333},[10182,10184,10186,10188,10190,10194,10200,10202,10222,10224,10226,10262,10264,10269,10271,10273,10287,10289,10291,10295,10301,10303,10313,10315,10325,10327,10329,10331],[10,10183,2750],{},[14,10185,16],{"id":16},[10,10187,2755],{},[14,10189,22],{"id":22},[10,10191,10192],{},[26,10193],{"alt":2762,"src":2763},[10,10195,2766,10196,986,10198,2773],{},[50,10197,2769],{},[50,10199,2772],{},[14,10201,35],{"id":35},[37,10203,10204,10212,10220],{},[40,10205,10206,2783,10208,2787,10210,2791],{},[50,10207,2782],{},[50,10209,2786],{},[50,10211,2790],{},[40,10213,10214,2797,10216,2801,10218,2805],{},[50,10215,2796],{},[50,10217,2800],{},[50,10219,2804],{},[40,10221,2808],{},[14,10223,63],{"id":63},[10,10225,66],{},[68,10227,10228],{"className":70,"code":2815,"language":72,"meta":73,"style":73},[50,10229,10230,10234,10238,10242,10246,10250,10254,10258],{"__ignoreMap":73},[77,10231,10232],{"class":79,"line":80},[77,10233,2822],{},[77,10235,10236],{"class":79,"line":86},[77,10237,2827],{},[77,10239,10240],{"class":79,"line":92},[77,10241,102],{"emptyLinePlaceholder":101},[77,10243,10244],{"class":79,"line":98},[77,10245,2836],{},[77,10247,10248],{"class":79,"line":105},[77,10249,2841],{},[77,10251,10252],{"class":79,"line":111},[77,10253,2846],{},[77,10255,10256],{"class":79,"line":2462},[77,10257,2851],{},[77,10259,10260],{"class":79,"line":2468},[77,10261,2856],{},[10,10263,117],{},[68,10265,10267],{"className":10266,"code":2862,"language":123,"meta":73},[121],[50,10268,2862],{"__ignoreMap":73},[10,10270,128],{},[14,10272,131],{"id":131},[133,10274,10275,10281],{},[40,10276,10277,2876,10279,2880],{},[50,10278,2875],{},[50,10280,2879],{},[40,10282,10283,2886,10285,2889],{},[50,10284,2885],{},[50,10286,2804],{},[305,10288,2672],{"id":2672},[10,10290,2894],{},[10,10292,10293],{},[26,10294],{"alt":2899,"src":2900},[10,10296,10297,2905,10299,2908],{},[50,10298,2796],{},[50,10300,2800],{},[14,10302,151],{"id":151},[37,10304,10305,10311],{},[40,10306,2915,10307,2918,10309,2921],{},[50,10308,2790],{},[50,10310,2782],{},[40,10312,2924],{},[14,10314,166],{"id":166},[133,10316,10317,10321],{},[40,10318,2931,10319,2935],{},[50,10320,2934],{},[40,10322,2938,10323,2942],{},[50,10324,2941],{},[10,10326,181],{},[14,10328,184],{"id":184},[10,10330,2949],{},[189,10332,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10334},[10335,10336,10337,10338,10339,10342,10343,10344],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":10340},[10341],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":2745,"description":2750},[202,2971,2972],{"id":2975,"title":2976,"body":10349,"category":202,"cover":203,"description":2981,"extension":204,"meta":10482,"navigation":101,"path":3150,"pinned":207,"publishedAt":208,"seo":10483,"slug":3152,"stem":3153,"summary":3154,"tags":10484,"updatedAt":208,"visible":101,"__hash__":3157},{"type":7,"value":10350,"toc":10472},[10351,10353,10355,10357,10359,10363,10373,10375,10385,10387,10389,10417,10419,10424,10426,10428,10442,10444,10452,10454,10464,10466,10468,10470],[10,10352,2981],{},[14,10354,16],{"id":16},[10,10356,2986],{},[14,10358,22],{"id":22},[10,10360,10361],{},[26,10362],{"alt":2993,"src":2994},[10,10364,10365,3000,10367,3004,10369,3008,10371,3012],{},[50,10366,2999],{},[50,10368,3003],{},[50,10370,3007],{},[50,10372,3011],{},[14,10374,35],{"id":35},[37,10376,10377,10379,10383],{},[40,10378,3019],{},[40,10380,10381,3024],{},[50,10382,3011],{},[40,10384,3027],{},[14,10386,63],{"id":63},[10,10388,66],{},[68,10390,10391],{"className":70,"code":3034,"language":72,"meta":73,"style":73},[50,10392,10393,10397,10401,10405,10409,10413],{"__ignoreMap":73},[77,10394,10395],{"class":79,"line":80},[77,10396,3041],{},[77,10398,10399],{"class":79,"line":86},[77,10400,3046],{},[77,10402,10403],{"class":79,"line":92},[77,10404,3051],{},[77,10406,10407],{"class":79,"line":98},[77,10408,102],{"emptyLinePlaceholder":101},[77,10410,10411],{"class":79,"line":105},[77,10412,3060],{},[77,10414,10415],{"class":79,"line":111},[77,10416,3065],{},[10,10418,117],{},[68,10420,10422],{"className":10421,"code":3071,"language":123,"meta":73},[121],[50,10423,3071],{"__ignoreMap":73},[10,10425,128],{},[14,10427,131],{"id":131},[133,10429,10430,10436],{},[40,10431,3082,10432,3085,10434,3089],{},[50,10433,2999],{},[50,10435,3088],{},[40,10437,10438,3095,10440,3099],{},[50,10439,3094],{},[50,10441,3098],{},[14,10443,151],{"id":151},[37,10445,10446,10450],{},[40,10447,3106,10448,3110],{},[50,10449,3109],{},[40,10451,3113],{},[14,10453,166],{"id":166},[133,10455,10456,10458],{},[40,10457,3120],{},[40,10459,1697,10460,3126,10462,3129],{},[50,10461,3125],{},[50,10463,3011],{},[10,10465,181],{},[14,10467,184],{"id":184},[10,10469,3136],{},[189,10471,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10473},[10474,10475,10476,10477,10478,10479,10480,10481],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":2976,"description":2981},[202,2320,3156],{"id":3159,"title":3160,"body":10486,"category":202,"cover":203,"description":3165,"extension":204,"meta":10615,"navigation":101,"path":3326,"pinned":207,"publishedAt":208,"seo":10616,"slug":3328,"stem":3329,"summary":3330,"tags":10617,"updatedAt":208,"visible":101,"__hash__":3334},{"type":7,"value":10487,"toc":10605},[10488,10490,10492,10494,10496,10500,10504,10506,10516,10518,10520,10552,10554,10559,10561,10563,10575,10577,10587,10589,10597,10599,10601,10603],[10,10489,3165],{},[14,10491,16],{"id":16},[10,10493,3170],{},[14,10495,22],{"id":22},[10,10497,10498],{},[26,10499],{"alt":3177,"src":3178},[10,10501,3181,10502,3185],{},[50,10503,3184],{},[14,10505,35],{"id":35},[37,10507,10508,10510,10512],{},[40,10509,3192],{},[40,10511,3195],{},[40,10513,3198,10514,339],{},[50,10515,3201],{},[14,10517,63],{"id":63},[10,10519,66],{},[68,10521,10522],{"className":70,"code":3208,"language":72,"meta":73,"style":73},[50,10523,10524,10528,10532,10536,10540,10544,10548],{"__ignoreMap":73},[77,10525,10526],{"class":79,"line":80},[77,10527,3215],{},[77,10529,10530],{"class":79,"line":86},[77,10531,3220],{},[77,10533,10534],{"class":79,"line":92},[77,10535,102],{"emptyLinePlaceholder":101},[77,10537,10538],{"class":79,"line":98},[77,10539,3229],{},[77,10541,10542],{"class":79,"line":105},[77,10543,3234],{},[77,10545,10546],{"class":79,"line":111},[77,10547,3239],{},[77,10549,10550],{"class":79,"line":2462},[77,10551,3244],{},[10,10553,117],{},[68,10555,10557],{"className":10556,"code":3250,"language":123,"meta":73},[121],[50,10558,3250],{"__ignoreMap":73},[10,10560,128],{},[14,10562,131],{"id":131},[133,10564,10565,10567],{},[40,10566,3261],{},[40,10568,10569,3267,10571,3271,10573,3275],{},[50,10570,3266],{},[50,10572,3270],{},[50,10574,3274],{},[14,10576,151],{"id":151},[37,10578,10579,10585],{},[40,10580,3282,10581,3286,10583,339],{},[50,10582,3285],{},[50,10584,3289],{},[40,10586,3292],{},[14,10588,166],{"id":166},[133,10590,10591,10593],{},[40,10592,3299],{},[40,10594,3302,10595,3305],{},[50,10596,3274],{},[10,10598,181],{},[14,10600,184],{"id":184},[10,10602,3312],{},[189,10604,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10606},[10607,10608,10609,10610,10611,10612,10613,10614],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":3160,"description":3165},[202,3332,3333],{"id":3336,"title":3337,"body":10619,"category":202,"cover":203,"description":3342,"extension":204,"meta":10738,"navigation":101,"path":3484,"pinned":207,"publishedAt":208,"seo":10739,"slug":3486,"stem":3487,"summary":3488,"tags":10740,"updatedAt":208,"visible":101,"__hash__":3491},{"type":7,"value":10620,"toc":10728},[10621,10623,10625,10627,10629,10633,10635,10637,10645,10647,10649,10677,10679,10684,10686,10688,10698,10700,10708,10710,10720,10722,10724,10726],[10,10622,3342],{},[14,10624,16],{"id":16},[10,10626,3347],{},[14,10628,22],{"id":22},[10,10630,10631],{},[26,10632],{"alt":3354,"src":3355},[10,10634,3358],{},[14,10636,35],{"id":35},[37,10638,10639,10641,10643],{},[40,10640,3365],{},[40,10642,3368],{},[40,10644,3371],{},[14,10646,63],{"id":63},[10,10648,66],{},[68,10650,10651],{"className":70,"code":3378,"language":72,"meta":73,"style":73},[50,10652,10653,10657,10661,10665,10669,10673],{"__ignoreMap":73},[77,10654,10655],{"class":79,"line":80},[77,10656,3385],{},[77,10658,10659],{"class":79,"line":86},[77,10660,3390],{},[77,10662,10663],{"class":79,"line":92},[77,10664,3395],{},[77,10666,10667],{"class":79,"line":98},[77,10668,102],{"emptyLinePlaceholder":101},[77,10670,10671],{"class":79,"line":105},[77,10672,3404],{},[77,10674,10675],{"class":79,"line":111},[77,10676,3409],{},[10,10678,117],{},[68,10680,10682],{"className":10681,"code":3415,"language":123,"meta":73},[121],[50,10683,3415],{"__ignoreMap":73},[10,10685,128],{},[14,10687,131],{"id":131},[133,10689,10690,10694],{},[40,10691,10692,3429],{},[50,10693,3428],{},[40,10695,10696,3435],{},[50,10697,3434],{},[14,10699,151],{"id":151},[37,10701,10702,10706],{},[40,10703,3442,10704,3446],{},[50,10705,3445],{},[40,10707,3449],{},[14,10709,166],{"id":166},[133,10711,10712,10714],{},[40,10713,3456],{},[40,10715,2150,10716,2153,10718,3463],{},[50,10717,3445],{},[50,10719,3434],{},[10,10721,181],{},[14,10723,184],{"id":184},[10,10725,3470],{},[189,10727,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10729},[10730,10731,10732,10733,10734,10735,10736,10737],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":3337,"description":3342},[202,3490,3333],{"id":3493,"title":3494,"body":10742,"category":202,"cover":203,"description":3499,"extension":204,"meta":10867,"navigation":101,"path":3655,"pinned":207,"publishedAt":208,"seo":10868,"slug":3657,"stem":3658,"summary":3659,"tags":10869,"updatedAt":208,"visible":101,"__hash__":3662},{"type":7,"value":10743,"toc":10857},[10744,10746,10748,10750,10752,10756,10762,10764,10774,10776,10778,10806,10808,10813,10815,10817,10827,10829,10841,10843,10849,10851,10853,10855],[10,10745,3499],{},[14,10747,16],{"id":16},[10,10749,3504],{},[14,10751,22],{"id":22},[10,10753,10754],{},[26,10755],{"alt":3511,"src":3512},[10,10757,3515,10758,3519,10760,3522],{},[50,10759,3518],{},[50,10761,144],{},[14,10763,35],{"id":35},[37,10765,10766,10768,10772],{},[40,10767,3529],{},[40,10769,2313,10770,3535],{},[50,10771,3534],{},[40,10773,3538],{},[14,10775,63],{"id":63},[10,10777,66],{},[68,10779,10780],{"className":70,"code":3545,"language":72,"meta":73,"style":73},[50,10781,10782,10786,10790,10794,10798,10802],{"__ignoreMap":73},[77,10783,10784],{"class":79,"line":80},[77,10785,3552],{},[77,10787,10788],{"class":79,"line":86},[77,10789,3557],{},[77,10791,10792],{"class":79,"line":92},[77,10793,102],{"emptyLinePlaceholder":101},[77,10795,10796],{"class":79,"line":98},[77,10797,3566],{},[77,10799,10800],{"class":79,"line":105},[77,10801,3571],{},[77,10803,10804],{"class":79,"line":111},[77,10805,3576],{},[10,10807,117],{},[68,10809,10811],{"className":10810,"code":3582,"language":123,"meta":73},[121],[50,10812,3582],{"__ignoreMap":73},[10,10814,128],{},[14,10816,131],{"id":131},[133,10818,10819,10821],{},[40,10820,3593],{},[40,10822,3596,10823,3599,10825,3603],{},[50,10824,144],{},[50,10826,3602],{},[14,10828,151],{"id":151},[37,10830,10831,10835],{},[40,10832,3610,10833,3614],{},[50,10834,3613],{},[40,10836,3617,10837,3621,10839,339],{},[50,10838,3620],{},[50,10840,3624],{},[14,10842,166],{"id":166},[133,10844,10845,10847],{},[40,10846,3631],{},[40,10848,3634],{},[10,10850,181],{},[14,10852,184],{"id":184},[10,10854,3641],{},[189,10856,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10858},[10859,10860,10861,10862,10863,10864,10865,10866],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":3494,"description":3499},[202,3661,3333],{"id":3664,"title":3665,"body":10871,"category":202,"cover":203,"description":3670,"extension":204,"meta":10994,"navigation":101,"path":3820,"pinned":207,"publishedAt":208,"seo":10995,"slug":3822,"stem":3823,"summary":3824,"tags":10996,"updatedAt":208,"visible":101,"__hash__":3827},{"type":7,"value":10872,"toc":10984},[10873,10875,10877,10879,10881,10885,10887,10889,10901,10903,10905,10933,10935,10940,10942,10944,10954,10956,10966,10968,10976,10978,10980,10982],[10,10874,3670],{},[14,10876,16],{"id":16},[10,10878,3675],{},[14,10880,22],{"id":22},[10,10882,10883],{},[26,10884],{"alt":3682,"src":3683},[10,10886,3686],{},[14,10888,35],{"id":35},[37,10890,10891,10893,10895],{},[40,10892,3693],{},[40,10894,3696],{},[40,10896,3699,10897,3703,10899,3707],{},[50,10898,3702],{},[50,10900,3706],{},[14,10902,63],{"id":63},[10,10904,66],{},[68,10906,10907],{"className":70,"code":3714,"language":72,"meta":73,"style":73},[50,10908,10909,10913,10917,10921,10925,10929],{"__ignoreMap":73},[77,10910,10911],{"class":79,"line":80},[77,10912,3721],{},[77,10914,10915],{"class":79,"line":86},[77,10916,3726],{},[77,10918,10919],{"class":79,"line":92},[77,10920,102],{"emptyLinePlaceholder":101},[77,10922,10923],{"class":79,"line":98},[77,10924,3735],{},[77,10926,10927],{"class":79,"line":105},[77,10928,3740],{},[77,10930,10931],{"class":79,"line":111},[77,10932,3745],{},[10,10934,117],{},[68,10936,10938],{"className":10937,"code":3751,"language":123,"meta":73},[121],[50,10939,3751],{"__ignoreMap":73},[10,10941,128],{},[14,10943,131],{"id":131},[133,10945,10946,10948],{},[40,10947,3762],{},[40,10949,10950,3768,10952,3772],{},[50,10951,3767],{},[50,10953,3771],{},[14,10955,151],{"id":151},[37,10957,10958,10964],{},[40,10959,2313,10960,3781,10962,339],{},[50,10961,3706],{},[50,10963,3702],{},[40,10965,3786],{},[14,10967,166],{"id":166},[133,10969,10970,10974],{},[40,10971,3793,10972,3796],{},[50,10973,3702],{},[40,10975,3799],{},[10,10977,181],{},[14,10979,184],{"id":184},[10,10981,3806],{},[189,10983,191],{},{"title":73,"searchDepth":86,"depth":86,"links":10985},[10986,10987,10988,10989,10990,10991,10992,10993],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":3665,"description":3670},[202,3826,3333],{"id":3829,"title":3830,"body":10998,"category":202,"cover":203,"description":3835,"extension":204,"meta":11157,"navigation":101,"path":4034,"pinned":207,"publishedAt":208,"seo":11158,"slug":4036,"stem":4037,"summary":4038,"tags":11159,"updatedAt":208,"visible":101,"__hash__":4042},{"type":7,"value":10999,"toc":11145},[11000,11002,11004,11006,11008,11012,11018,11020,11032,11034,11036,11076,11078,11083,11085,11087,11101,11103,11105,11109,11111,11113,11123,11125,11137,11139,11141,11143],[10,11001,3835],{},[14,11003,16],{"id":16},[10,11005,3840],{},[14,11007,22],{"id":22},[10,11009,11010],{},[26,11011],{"alt":3847,"src":3848},[10,11013,11014,3854,11016,3858],{},[50,11015,3853],{},[50,11017,3857],{},[14,11019,35],{"id":35},[37,11021,11022,11028,11030],{},[40,11023,11024,3867,11026,3871],{},[50,11025,2782],{},[50,11027,3870],{},[40,11029,3874],{},[40,11031,3877],{},[14,11033,63],{"id":63},[10,11035,66],{},[68,11037,11038],{"className":70,"code":3884,"language":72,"meta":73,"style":73},[50,11039,11040,11044,11048,11052,11056,11060,11064,11068,11072],{"__ignoreMap":73},[77,11041,11042],{"class":79,"line":80},[77,11043,3891],{},[77,11045,11046],{"class":79,"line":86},[77,11047,3896],{},[77,11049,11050],{"class":79,"line":92},[77,11051,3901],{},[77,11053,11054],{"class":79,"line":98},[77,11055,102],{"emptyLinePlaceholder":101},[77,11057,11058],{"class":79,"line":105},[77,11059,3910],{},[77,11061,11062],{"class":79,"line":111},[77,11063,3915],{},[77,11065,11066],{"class":79,"line":2462},[77,11067,3920],{},[77,11069,11070],{"class":79,"line":2468},[77,11071,3925],{},[77,11073,11074],{"class":79,"line":3928},[77,11075,3931],{},[10,11077,117],{},[68,11079,11081],{"className":11080,"code":3937,"language":123,"meta":73},[121],[50,11082,3937],{"__ignoreMap":73},[10,11084,128],{},[14,11086,131],{"id":131},[133,11088,11089,11093],{},[40,11090,11091,3951],{},[50,11092,3950],{},[40,11094,11095,3957,11097,3961,11099,3965],{},[50,11096,3956],{},[50,11098,3960],{},[50,11100,3964],{},[305,11102,2672],{"id":2672},[10,11104,3970],{},[10,11106,11107],{},[26,11108],{"alt":3975,"src":3976},[10,11110,3979],{},[14,11112,151],{"id":151},[37,11114,11115,11121],{},[40,11116,3986,11117,3989,11119,339],{},[50,11118,2782],{},[50,11120,3870],{},[40,11122,3994],{},[14,11124,166],{"id":166},[133,11126,11127,11129],{},[40,11128,4001],{},[40,11130,2313,11131,4007,11133,1134,11135,339],{},[50,11132,4006],{},[50,11134,3870],{},[50,11136,2782],{},[10,11138,181],{},[14,11140,184],{"id":184},[10,11142,4018],{},[189,11144,191],{},{"title":73,"searchDepth":86,"depth":86,"links":11146},[11147,11148,11149,11150,11151,11154,11155,11156],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11152},[11153],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":3830,"description":3835},[202,4040,4041],{"id":4044,"title":4045,"body":11161,"category":202,"cover":203,"description":4050,"extension":204,"meta":11333,"navigation":101,"path":4264,"pinned":207,"publishedAt":208,"seo":11334,"slug":4266,"stem":4267,"summary":4268,"tags":11335,"updatedAt":208,"visible":101,"__hash__":4271},{"type":7,"value":11162,"toc":11320},[11163,11165,11167,11169,11171,11175,11183,11185,11193,11195,11197,11241,11243,11248,11250,11252,11264,11266,11268,11272,11278,11280,11282,11286,11290,11292,11304,11306,11312,11314,11316,11318],[10,11164,4050],{},[14,11166,16],{"id":16},[10,11168,4055],{},[14,11170,22],{"id":22},[10,11172,11173],{},[26,11174],{"alt":4062,"src":4063},[10,11176,11177,53,11179,53,11181,4073],{},[50,11178,1133],{},[50,11180,4070],{},[50,11182,1137],{},[14,11184,35],{"id":35},[37,11186,11187,11189,11191],{},[40,11188,4080],{},[40,11190,4083],{},[40,11192,4086],{},[14,11194,63],{"id":63},[10,11196,66],{},[68,11198,11199],{"className":70,"code":4093,"language":72,"meta":73,"style":73},[50,11200,11201,11205,11209,11213,11217,11221,11225,11229,11233,11237],{"__ignoreMap":73},[77,11202,11203],{"class":79,"line":80},[77,11204,4100],{},[77,11206,11207],{"class":79,"line":86},[77,11208,102],{"emptyLinePlaceholder":101},[77,11210,11211],{"class":79,"line":92},[77,11212,4109],{},[77,11214,11215],{"class":79,"line":98},[77,11216,4114],{},[77,11218,11219],{"class":79,"line":105},[77,11220,4119],{},[77,11222,11223],{"class":79,"line":111},[77,11224,4124],{},[77,11226,11227],{"class":79,"line":2462},[77,11228,1123],{},[77,11230,11231],{"class":79,"line":2468},[77,11232,4133],{},[77,11234,11235],{"class":79,"line":3928},[77,11236,102],{"emptyLinePlaceholder":101},[77,11238,11239],{"class":79,"line":4140},[77,11240,4143],{},[10,11242,117],{},[68,11244,11246],{"className":11245,"code":4149,"language":123,"meta":73},[121],[50,11247,4149],{"__ignoreMap":73},[10,11249,128],{},[14,11251,131],{"id":131},[133,11253,11254,11258],{},[40,11255,4160,11256,4164],{},[50,11257,4163],{},[40,11259,11260,4170,11262,4173],{},[50,11261,4169],{},[50,11263,1137],{},[305,11265,2672],{"id":2672},[10,11267,4178],{},[10,11269,11270],{},[26,11271],{"alt":4183,"src":4184},[10,11273,11274,4189,11276,4192],{},[50,11275,4163],{},[50,11277,4169],{},[305,11279,2672],{"id":4195},[10,11281,4198],{},[10,11283,11284],{},[26,11285],{"alt":4203,"src":4204},[10,11287,4207,11288,4210],{},[50,11289,1133],{},[14,11291,151],{"id":151},[37,11293,11294,11298],{},[40,11295,4217,11296,4220],{},[50,11297,4169],{},[40,11299,4223,11300,4226,11302,4230],{},[50,11301,1133],{},[50,11303,4229],{},[14,11305,166],{"id":166},[133,11307,11308,11310],{},[40,11309,4237],{},[40,11311,4240],{},[10,11313,181],{},[14,11315,184],{"id":184},[10,11317,4247],{},[189,11319,191],{},{"title":73,"searchDepth":86,"depth":86,"links":11321},[11322,11323,11324,11325,11326,11330,11331,11332],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11327},[11328,11329],{"id":2672,"depth":92,"text":2672},{"id":4195,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":4045,"description":4050},[202,1133,4270],{"id":4273,"title":4274,"body":11337,"category":202,"cover":203,"description":4279,"extension":204,"meta":11474,"navigation":101,"path":4446,"pinned":207,"publishedAt":208,"seo":11475,"slug":4448,"stem":4449,"summary":4450,"tags":11476,"updatedAt":208,"visible":101,"__hash__":4453},{"type":7,"value":11338,"toc":11462},[11339,11341,11343,11345,11347,11351,11355,11357,11367,11369,11371,11403,11405,11410,11412,11414,11424,11426,11428,11432,11436,11438,11444,11446,11454,11456,11458,11460],[10,11340,4279],{},[14,11342,16],{"id":16},[10,11344,4284],{},[14,11346,22],{"id":22},[10,11348,11349],{},[26,11350],{"alt":4291,"src":4292},[10,11352,11353,4298],{},[50,11354,4297],{},[14,11356,35],{"id":35},[37,11358,11359,11361,11363],{},[40,11360,4305],{},[40,11362,4308],{},[40,11364,4311,11365,4315],{},[50,11366,4314],{},[14,11368,63],{"id":63},[10,11370,66],{},[68,11372,11373],{"className":70,"code":4322,"language":72,"meta":73,"style":73},[50,11374,11375,11379,11383,11387,11391,11395,11399],{"__ignoreMap":73},[77,11376,11377],{"class":79,"line":80},[77,11378,4329],{},[77,11380,11381],{"class":79,"line":86},[77,11382,102],{"emptyLinePlaceholder":101},[77,11384,11385],{"class":79,"line":92},[77,11386,4338],{},[77,11388,11389],{"class":79,"line":98},[77,11390,4343],{},[77,11392,11393],{"class":79,"line":105},[77,11394,4348],{},[77,11396,11397],{"class":79,"line":111},[77,11398,102],{"emptyLinePlaceholder":101},[77,11400,11401],{"class":79,"line":2462},[77,11402,4357],{},[10,11404,117],{},[68,11406,11408],{"className":11407,"code":4363,"language":123,"meta":73},[121],[50,11409,4363],{"__ignoreMap":73},[10,11411,128],{},[14,11413,131],{"id":131},[133,11415,11416,11420],{},[40,11417,4374,11418,4378],{},[50,11419,4377],{},[40,11421,4381,11422,4384],{},[50,11423,4377],{},[305,11425,2672],{"id":2672},[10,11427,4389],{},[10,11429,11430],{},[26,11431],{"alt":4394,"src":4395},[10,11433,4398,11434,4401],{},[50,11435,4377],{},[14,11437,151],{"id":151},[37,11439,11440,11442],{},[40,11441,4408],{},[40,11443,4411],{},[14,11445,166],{"id":166},[133,11447,11448,11452],{},[40,11449,2313,11450,4420],{},[50,11451,4297],{},[40,11453,4423],{},[10,11455,181],{},[14,11457,184],{"id":184},[10,11459,4430],{},[189,11461,191],{},{"title":73,"searchDepth":86,"depth":86,"links":11463},[11464,11465,11466,11467,11468,11471,11472,11473],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11469},[11470],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":4274,"description":4279},[202,4297,4452],{"id":4455,"title":4456,"body":11478,"category":202,"cover":203,"description":4461,"extension":204,"meta":11603,"navigation":101,"path":4610,"pinned":207,"publishedAt":208,"seo":11604,"slug":4612,"stem":4613,"summary":4614,"tags":11605,"updatedAt":208,"visible":101,"__hash__":4617},{"type":7,"value":11479,"toc":11593},[11480,11482,11484,11486,11488,11492,11496,11498,11508,11510,11512,11544,11546,11551,11553,11555,11567,11569,11575,11577,11585,11587,11589,11591],[10,11481,4461],{},[14,11483,16],{"id":16},[10,11485,4466],{},[14,11487,22],{"id":22},[10,11489,11490],{},[26,11491],{"alt":4473,"src":4474},[10,11493,11494,4479],{},[50,11495,4314],{},[14,11497,35],{"id":35},[37,11499,11500,11504,11506],{},[40,11501,11502,4489],{},[50,11503,4488],{},[40,11505,4492],{},[40,11507,4495],{},[14,11509,63],{"id":63},[10,11511,66],{},[68,11513,11514],{"className":70,"code":4502,"language":72,"meta":73,"style":73},[50,11515,11516,11520,11524,11528,11532,11536,11540],{"__ignoreMap":73},[77,11517,11518],{"class":79,"line":80},[77,11519,4509],{},[77,11521,11522],{"class":79,"line":86},[77,11523,102],{"emptyLinePlaceholder":101},[77,11525,11526],{"class":79,"line":92},[77,11527,4518],{},[77,11529,11530],{"class":79,"line":98},[77,11531,4523],{},[77,11533,11534],{"class":79,"line":105},[77,11535,102],{"emptyLinePlaceholder":101},[77,11537,11538],{"class":79,"line":111},[77,11539,4532],{},[77,11541,11542],{"class":79,"line":2462},[77,11543,4537],{},[10,11545,117],{},[68,11547,11549],{"className":11548,"code":4543,"language":123,"meta":73},[121],[50,11550,4543],{"__ignoreMap":73},[10,11552,128],{},[14,11554,131],{"id":131},[133,11556,11557,11563],{},[40,11558,4554,11559,4557,11561,4561],{},[50,11560,4314],{},[50,11562,4560],{},[40,11564,11565,4566],{},[50,11566,4488],{},[14,11568,151],{"id":151},[37,11570,11571,11573],{},[40,11572,4573],{},[40,11574,4576],{},[14,11576,166],{"id":166},[133,11578,11579,11581],{},[40,11580,4583],{},[40,11582,2313,11583,4589],{},[50,11584,4588],{},[10,11586,181],{},[14,11588,184],{"id":184},[10,11590,4596],{},[189,11592,191],{},{"title":73,"searchDepth":86,"depth":86,"links":11594},[11595,11596,11597,11598,11599,11600,11601,11602],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":4456,"description":4461},[202,4314,4616],{"id":4619,"title":4620,"body":11607,"category":202,"cover":203,"description":4625,"extension":204,"meta":11752,"navigation":101,"path":4800,"pinned":207,"publishedAt":208,"seo":11753,"slug":4802,"stem":4803,"summary":4804,"tags":11754,"updatedAt":208,"visible":101,"__hash__":4806},{"type":7,"value":11608,"toc":11742},[11609,11611,11613,11615,11617,11621,11627,11629,11643,11645,11647,11691,11693,11698,11700,11702,11712,11714,11726,11728,11734,11736,11738,11740],[10,11610,4625],{},[14,11612,16],{"id":16},[10,11614,4630],{},[14,11616,22],{"id":22},[10,11618,11619],{},[26,11620],{"alt":4637,"src":4638},[10,11622,11623,4644,11625,4648],{},[50,11624,4643],{},[50,11626,4647],{},[14,11628,35],{"id":35},[37,11630,11631,11633,11639],{},[40,11632,4655],{},[40,11634,11635,4660,11637,4663],{},[50,11636,4643],{},[50,11638,4297],{},[40,11640,4666,11641,4669],{},[50,11642,4647],{},[14,11644,63],{"id":63},[10,11646,66],{},[68,11648,11649],{"className":70,"code":4676,"language":72,"meta":73,"style":73},[50,11650,11651,11655,11659,11663,11667,11671,11675,11679,11683,11687],{"__ignoreMap":73},[77,11652,11653],{"class":79,"line":80},[77,11654,4683],{},[77,11656,11657],{"class":79,"line":86},[77,11658,102],{"emptyLinePlaceholder":101},[77,11660,11661],{"class":79,"line":92},[77,11662,4692],{},[77,11664,11665],{"class":79,"line":98},[77,11666,4697],{},[77,11668,11669],{"class":79,"line":105},[77,11670,4702],{},[77,11672,11673],{"class":79,"line":111},[77,11674,4707],{},[77,11676,11677],{"class":79,"line":2462},[77,11678,4712],{},[77,11680,11681],{"class":79,"line":2468},[77,11682,4537],{},[77,11684,11685],{"class":79,"line":3928},[77,11686,102],{"emptyLinePlaceholder":101},[77,11688,11689],{"class":79,"line":4140},[77,11690,4725],{},[10,11692,117],{},[68,11694,11696],{"className":11695,"code":4731,"language":123,"meta":73},[121],[50,11697,4731],{"__ignoreMap":73},[10,11699,128],{},[14,11701,131],{"id":131},[133,11703,11704,11708],{},[40,11705,4742,11706,4745],{},[50,11707,4643],{},[40,11709,4748,11710,4751],{},[50,11711,4647],{},[14,11713,151],{"id":151},[37,11715,11716,11720],{},[40,11717,3442,11718,4760],{},[50,11719,4643],{},[40,11721,4763,11722,4766,11724,4769],{},[50,11723,4297],{},[50,11725,4643],{},[14,11727,166],{"id":166},[133,11729,11730,11732],{},[40,11731,4776],{},[40,11733,4779],{},[10,11735,181],{},[14,11737,184],{"id":184},[10,11739,4786],{},[189,11741,191],{},{"title":73,"searchDepth":86,"depth":86,"links":11743},[11744,11745,11746,11747,11748,11749,11750,11751],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":4620,"description":4625},[202,4647,4643],{"id":4808,"title":4809,"body":11756,"category":202,"cover":203,"description":4814,"extension":204,"meta":11895,"navigation":101,"path":4986,"pinned":207,"publishedAt":208,"seo":11896,"slug":4988,"stem":4989,"summary":4990,"tags":11897,"updatedAt":208,"visible":101,"__hash__":4994},{"type":7,"value":11757,"toc":11883},[11758,11760,11762,11764,11766,11770,11772,11774,11790,11792,11794,11822,11824,11829,11831,11833,11845,11847,11849,11853,11855,11857,11867,11869,11875,11877,11879,11881],[10,11759,4814],{},[14,11761,16],{"id":16},[10,11763,4819],{},[14,11765,22],{"id":22},[10,11767,11768],{},[26,11769],{"alt":4826,"src":4827},[10,11771,4830],{},[14,11773,35],{"id":35},[37,11775,11776,11778,11780],{},[40,11777,4837],{},[40,11779,4840],{},[40,11781,4843,11782,53,11784,4850,11786,53,11788,339],{},[50,11783,4846],{},[50,11785,4849],{},[50,11787,4853],{},[50,11789,4856],{},[14,11791,63],{"id":63},[10,11793,66],{},[68,11795,11796],{"className":70,"code":4863,"language":72,"meta":73,"style":73},[50,11797,11798,11802,11806,11810,11814,11818],{"__ignoreMap":73},[77,11799,11800],{"class":79,"line":80},[77,11801,4870],{},[77,11803,11804],{"class":79,"line":86},[77,11805,102],{"emptyLinePlaceholder":101},[77,11807,11808],{"class":79,"line":92},[77,11809,4879],{},[77,11811,11812],{"class":79,"line":98},[77,11813,4884],{},[77,11815,11816],{"class":79,"line":105},[77,11817,4889],{},[77,11819,11820],{"class":79,"line":111},[77,11821,4894],{},[10,11823,117],{},[68,11825,11827],{"className":11826,"code":4900,"language":123,"meta":73},[121],[50,11828,4900],{"__ignoreMap":73},[10,11830,128],{},[14,11832,131],{"id":131},[133,11834,11835,11843],{},[40,11836,4911,11837,4914,11839,1134,11841,339],{},[50,11838,4846],{},[50,11840,4917],{},[50,11842,4920],{},[40,11844,4923],{},[305,11846,2672],{"id":2672},[10,11848,4928],{},[10,11850,11851],{},[26,11852],{"alt":4933,"src":4934},[10,11854,4937],{},[14,11856,151],{"id":151},[37,11858,11859,11865],{},[40,11860,4944,11861,986,11863,4950],{},[50,11862,4947],{},[50,11864,4853],{},[40,11866,4953],{},[14,11868,166],{"id":166},[133,11870,11871,11873],{},[40,11872,4960],{},[40,11874,4963],{},[10,11876,181],{},[14,11878,184],{"id":184},[10,11880,4970],{},[189,11882,191],{},{"title":73,"searchDepth":86,"depth":86,"links":11884},[11885,11886,11887,11888,11889,11892,11893,11894],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11890},[11891],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":4809,"description":4814},[202,4992,4993],{"id":4996,"title":4997,"body":11899,"category":202,"cover":203,"description":5002,"extension":204,"meta":12016,"navigation":101,"path":5141,"pinned":207,"publishedAt":208,"seo":12017,"slug":5143,"stem":5144,"summary":5145,"tags":12018,"updatedAt":208,"visible":101,"__hash__":5149},{"type":7,"value":11900,"toc":12006},[11901,11903,11905,11907,11909,11913,11915,11917,11925,11927,11929,11961,11963,11968,11970,11972,11980,11982,11990,11992,11998,12000,12002,12004],[10,11902,5002],{},[14,11904,16],{"id":16},[10,11906,5007],{},[14,11908,22],{"id":22},[10,11910,11911],{},[26,11912],{"alt":5014,"src":5015},[10,11914,5018],{},[14,11916,35],{"id":35},[37,11918,11919,11921,11923],{},[40,11920,5025],{},[40,11922,5028],{},[40,11924,5031],{},[14,11926,63],{"id":63},[10,11928,66],{},[68,11930,11931],{"className":70,"code":5038,"language":72,"meta":73,"style":73},[50,11932,11933,11937,11941,11945,11949,11953,11957],{"__ignoreMap":73},[77,11934,11935],{"class":79,"line":80},[77,11936,5045],{},[77,11938,11939],{"class":79,"line":86},[77,11940,102],{"emptyLinePlaceholder":101},[77,11942,11943],{"class":79,"line":92},[77,11944,5054],{},[77,11946,11947],{"class":79,"line":98},[77,11948,5059],{},[77,11950,11951],{"class":79,"line":105},[77,11952,102],{"emptyLinePlaceholder":101},[77,11954,11955],{"class":79,"line":111},[77,11956,5068],{},[77,11958,11959],{"class":79,"line":2462},[77,11960,5073],{},[10,11962,117],{},[68,11964,11966],{"className":11965,"code":5079,"language":123,"meta":73},[121],[50,11967,5079],{"__ignoreMap":73},[10,11969,128],{},[14,11971,131],{"id":131},[133,11973,11974,11976],{},[40,11975,5090],{},[40,11977,5093,11978,5097],{},[50,11979,5096],{},[14,11981,151],{"id":151},[37,11983,11984,11988],{},[40,11985,5104,11986,5107],{},[50,11987,4314],{},[40,11989,5110],{},[14,11991,166],{"id":166},[133,11993,11994,11996],{},[40,11995,5117],{},[40,11997,5120],{},[10,11999,181],{},[14,12001,184],{"id":184},[10,12003,5127],{},[189,12005,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12007},[12008,12009,12010,12011,12012,12013,12014,12015],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":4997,"description":5002},[202,5147,5148],{"id":5151,"title":5152,"body":12020,"category":202,"cover":203,"description":5157,"extension":204,"meta":12139,"navigation":101,"path":5301,"pinned":207,"publishedAt":208,"seo":12140,"slug":5303,"stem":5304,"summary":5305,"tags":12141,"updatedAt":208,"visible":101,"__hash__":5309},{"type":7,"value":12021,"toc":12129},[12022,12024,12026,12028,12030,12034,12036,12038,12046,12048,12050,12082,12084,12089,12091,12093,12103,12105,12111,12113,12121,12123,12125,12127],[10,12023,5157],{},[14,12025,16],{"id":16},[10,12027,5162],{},[14,12029,22],{"id":22},[10,12031,12032],{},[26,12033],{"alt":5169,"src":5170},[10,12035,5173],{},[14,12037,35],{"id":35},[37,12039,12040,12042,12044],{},[40,12041,5180],{},[40,12043,5183],{},[40,12045,5186],{},[14,12047,63],{"id":63},[10,12049,66],{},[68,12051,12052],{"className":70,"code":5193,"language":72,"meta":73,"style":73},[50,12053,12054,12058,12062,12066,12070,12074,12078],{"__ignoreMap":73},[77,12055,12056],{"class":79,"line":80},[77,12057,5200],{},[77,12059,12060],{"class":79,"line":86},[77,12061,5205],{},[77,12063,12064],{"class":79,"line":92},[77,12065,5210],{},[77,12067,12068],{"class":79,"line":98},[77,12069,102],{"emptyLinePlaceholder":101},[77,12071,12072],{"class":79,"line":105},[77,12073,5219],{},[77,12075,12076],{"class":79,"line":111},[77,12077,5224],{},[77,12079,12080],{"class":79,"line":2462},[77,12081,5229],{},[10,12083,117],{},[68,12085,12087],{"className":12086,"code":5235,"language":123,"meta":73},[121],[50,12088,5235],{"__ignoreMap":73},[10,12090,128],{},[14,12092,131],{"id":131},[133,12094,12095,12099],{},[40,12096,915,12097,5249],{},[50,12098,5248],{},[40,12100,5252,12101,5256],{},[50,12102,5255],{},[14,12104,151],{"id":151},[37,12106,12107,12109],{},[40,12108,5263],{},[40,12110,5266],{},[14,12112,166],{"id":166},[133,12114,12115,12119],{},[40,12116,5273,12117,5277],{},[50,12118,5276],{},[40,12120,5280],{},[10,12122,181],{},[14,12124,184],{"id":184},[10,12126,5287],{},[189,12128,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12130},[12131,12132,12133,12134,12135,12136,12137,12138],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":5152,"description":5157},[202,5307,5308],{"id":5311,"title":5312,"body":12143,"category":202,"cover":203,"description":5317,"extension":204,"meta":12288,"navigation":101,"path":5498,"pinned":207,"publishedAt":208,"seo":12289,"slug":5500,"stem":5501,"summary":5502,"tags":12290,"updatedAt":208,"visible":101,"__hash__":5506},{"type":7,"value":12144,"toc":12276},[12145,12147,12149,12151,12153,12157,12161,12163,12175,12177,12179,12207,12209,12214,12216,12218,12232,12234,12236,12240,12248,12250,12260,12262,12268,12270,12272,12274],[10,12146,5317],{},[14,12148,16],{"id":16},[10,12150,5322],{},[14,12152,22],{"id":22},[10,12154,12155],{},[26,12156],{"alt":5329,"src":5330},[10,12158,5333,12159,5337],{},[50,12160,5336],{},[14,12162,35],{"id":35},[37,12164,12165,12167,12169],{},[40,12166,5344],{},[40,12168,5347],{},[40,12170,5350,12171,5353,12173,339],{},[50,12172,5336],{},[50,12174,5356],{},[14,12176,63],{"id":63},[10,12178,66],{},[68,12180,12181],{"className":70,"code":5363,"language":72,"meta":73,"style":73},[50,12182,12183,12187,12191,12195,12199,12203],{"__ignoreMap":73},[77,12184,12185],{"class":79,"line":80},[77,12186,5370],{},[77,12188,12189],{"class":79,"line":86},[77,12190,5375],{},[77,12192,12193],{"class":79,"line":92},[77,12194,5380],{},[77,12196,12197],{"class":79,"line":98},[77,12198,102],{"emptyLinePlaceholder":101},[77,12200,12201],{"class":79,"line":105},[77,12202,5389],{},[77,12204,12205],{"class":79,"line":111},[77,12206,5394],{},[10,12208,117],{},[68,12210,12212],{"className":12211,"code":5400,"language":123,"meta":73},[121],[50,12213,5400],{"__ignoreMap":73},[10,12215,128],{},[14,12217,131],{"id":131},[133,12219,12220,12226],{},[40,12221,5411,12222,53,12224,5417],{},[50,12223,5414],{},[50,12225,4377],{},[40,12227,12228,5423,12230,5427],{},[50,12229,5422],{},[50,12231,5426],{},[305,12233,2672],{"id":2672},[10,12235,5432],{},[10,12237,12238],{},[26,12239],{"alt":5437,"src":5438},[10,12241,12242,53,12244,1134,12246,5448],{},[50,12243,5414],{},[50,12245,4377],{},[50,12247,5447],{},[14,12249,151],{"id":151},[37,12251,12252,12256],{},[40,12253,5455,12254,5459],{},[50,12255,5458],{},[40,12257,5462,12258,5465],{},[50,12259,5447],{},[14,12261,166],{"id":166},[133,12263,12264,12266],{},[40,12265,5472],{},[40,12267,5475],{},[10,12269,181],{},[14,12271,184],{"id":184},[10,12273,5482],{},[189,12275,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12277},[12278,12279,12280,12281,12282,12285,12286,12287],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12283},[12284],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":5312,"description":5317},[202,5504,5505],{"id":5508,"title":5509,"body":12292,"category":202,"cover":203,"description":5514,"extension":204,"meta":12441,"navigation":101,"path":5695,"pinned":207,"publishedAt":208,"seo":12442,"slug":5697,"stem":5698,"summary":5699,"tags":12443,"updatedAt":208,"visible":101,"__hash__":5703},{"type":7,"value":12293,"toc":12429},[12294,12296,12298,12300,12302,12306,12308,12310,12322,12324,12326,12370,12372,12377,12379,12381,12393,12395,12397,12401,12403,12405,12413,12415,12421,12423,12425,12427],[10,12295,5514],{},[14,12297,16],{"id":16},[10,12299,5519],{},[14,12301,22],{"id":22},[10,12303,12304],{},[26,12305],{"alt":5526,"src":5527},[10,12307,5530],{},[14,12309,35],{"id":35},[37,12311,12312,12314,12318],{},[40,12313,5537],{},[40,12315,12316,5543],{},[50,12317,5542],{},[40,12319,12320,5549],{},[50,12321,5548],{},[14,12323,63],{"id":63},[10,12325,66],{},[68,12327,12328],{"className":70,"code":5556,"language":72,"meta":73,"style":73},[50,12329,12330,12334,12338,12342,12346,12350,12354,12358,12362,12366],{"__ignoreMap":73},[77,12331,12332],{"class":79,"line":80},[77,12333,5563],{},[77,12335,12336],{"class":79,"line":86},[77,12337,5568],{},[77,12339,12340],{"class":79,"line":92},[77,12341,102],{"emptyLinePlaceholder":101},[77,12343,12344],{"class":79,"line":98},[77,12345,5577],{},[77,12347,12348],{"class":79,"line":105},[77,12349,5582],{},[77,12351,12352],{"class":79,"line":111},[77,12353,102],{"emptyLinePlaceholder":101},[77,12355,12356],{"class":79,"line":2462},[77,12357,5591],{},[77,12359,12360],{"class":79,"line":2468},[77,12361,5596],{},[77,12363,12364],{"class":79,"line":3928},[77,12365,102],{"emptyLinePlaceholder":101},[77,12367,12368],{"class":79,"line":4140},[77,12369,5605],{},[10,12371,117],{},[68,12373,12375],{"className":12374,"code":5611,"language":123,"meta":73},[121],[50,12376,5611],{"__ignoreMap":73},[10,12378,128],{},[14,12380,131],{"id":131},[133,12382,12383,12387],{},[40,12384,5622,12385,5626],{},[50,12386,5625],{},[40,12388,12389,5632,12391,339],{},[50,12390,5631],{},[50,12392,5635],{},[305,12394,2672],{"id":2672},[10,12396,5640],{},[10,12398,12399],{},[26,12400],{"alt":5645,"src":5646},[10,12402,5649],{},[14,12404,151],{"id":151},[37,12406,12407,12411],{},[40,12408,5656,12409,5659],{},[50,12410,5356],{},[40,12412,5662],{},[14,12414,166],{"id":166},[133,12416,12417,12419],{},[40,12418,5669],{},[40,12420,5672],{},[10,12422,181],{},[14,12424,184],{"id":184},[10,12426,5679],{},[189,12428,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12430},[12431,12432,12433,12434,12435,12438,12439,12440],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12436},[12437],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":5509,"description":5514},[202,5701,5702],{"id":5705,"title":5706,"body":12445,"category":202,"cover":203,"description":5711,"extension":204,"meta":12606,"navigation":101,"path":5909,"pinned":207,"publishedAt":208,"seo":12607,"slug":5911,"stem":5912,"summary":5913,"tags":12608,"updatedAt":208,"visible":101,"__hash__":5917},{"type":7,"value":12446,"toc":12594},[12447,12449,12451,12453,12455,12459,12461,12463,12475,12477,12479,12531,12533,12538,12540,12542,12560,12562,12564,12568,12570,12572,12578,12580,12586,12588,12590,12592],[10,12448,5711],{},[14,12450,16],{"id":16},[10,12452,5716],{},[14,12454,22],{"id":22},[10,12456,12457],{},[26,12458],{"alt":5723,"src":5724},[10,12460,5727],{},[14,12462,35],{"id":35},[37,12464,12465,12467,12469],{},[40,12466,5734],{},[40,12468,5737],{},[40,12470,12471,2153,12473,5746],{},[50,12472,5742],{},[50,12474,5745],{},[14,12476,63],{"id":63},[10,12478,66],{},[68,12480,12481],{"className":70,"code":5753,"language":72,"meta":73,"style":73},[50,12482,12483,12487,12491,12495,12499,12503,12507,12511,12515,12519,12523,12527],{"__ignoreMap":73},[77,12484,12485],{"class":79,"line":80},[77,12486,5760],{},[77,12488,12489],{"class":79,"line":86},[77,12490,102],{"emptyLinePlaceholder":101},[77,12492,12493],{"class":79,"line":92},[77,12494,5769],{},[77,12496,12497],{"class":79,"line":98},[77,12498,5774],{},[77,12500,12501],{"class":79,"line":105},[77,12502,102],{"emptyLinePlaceholder":101},[77,12504,12505],{"class":79,"line":111},[77,12506,5783],{},[77,12508,12509],{"class":79,"line":2462},[77,12510,5788],{},[77,12512,12513],{"class":79,"line":2468},[77,12514,5793],{},[77,12516,12517],{"class":79,"line":3928},[77,12518,102],{"emptyLinePlaceholder":101},[77,12520,12521],{"class":79,"line":4140},[77,12522,5802],{},[77,12524,12525],{"class":79,"line":5805},[77,12526,102],{"emptyLinePlaceholder":101},[77,12528,12529],{"class":79,"line":5810},[77,12530,5813],{},[10,12532,117],{},[68,12534,12536],{"className":12535,"code":5819,"language":123,"meta":73},[121],[50,12537,5819],{"__ignoreMap":73},[10,12539,128],{},[14,12541,131],{"id":131},[133,12543,12544,12554],{},[40,12545,12546,5833,12548,5837,12550,5840,12552,5844],{},[50,12547,5832],{},[50,12549,5836],{},[50,12551,5625],{},[50,12553,5843],{},[40,12555,12556,5849,12558,5852],{},[50,12557,4560],{},[50,12559,2185],{},[305,12561,2672],{"id":2672},[10,12563,5857],{},[10,12565,12566],{},[26,12567],{"alt":5862,"src":5863},[10,12569,5866],{},[14,12571,151],{"id":151},[37,12573,12574,12576],{},[40,12575,5873],{},[40,12577,5876],{},[14,12579,166],{"id":166},[133,12581,12582,12584],{},[40,12583,5883],{},[40,12585,5886],{},[10,12587,181],{},[14,12589,184],{"id":184},[10,12591,5893],{},[189,12593,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12595},[12596,12597,12598,12599,12600,12603,12604,12605],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12601},[12602],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":5706,"description":5711},[202,5915,5916],{"id":4,"title":5,"body":12610,"category":202,"cover":203,"description":12,"extension":204,"meta":12733,"navigation":101,"path":206,"pinned":207,"publishedAt":208,"seo":12734,"slug":210,"stem":211,"summary":212,"tags":12735,"updatedAt":208,"visible":101,"__hash__":216},{"type":7,"value":12611,"toc":12723},[12612,12614,12616,12618,12620,12624,12626,12628,12642,12644,12646,12674,12676,12681,12683,12685,12695,12697,12705,12707,12715,12717,12719,12721],[10,12613,12],{},[14,12615,16],{"id":16},[10,12617,19],{},[14,12619,22],{"id":22},[10,12621,12622],{},[26,12623],{"alt":28,"src":29},[10,12625,32],{},[14,12627,35],{"id":35},[37,12629,12630,12632,12634],{},[40,12631,42],{},[40,12633,45],{},[40,12635,48,12636,53,12638,53,12640,60],{},[50,12637,52],{},[50,12639,56],{},[50,12641,59],{},[14,12643,63],{"id":63},[10,12645,66],{},[68,12647,12648],{"className":70,"code":71,"language":72,"meta":73,"style":73},[50,12649,12650,12654,12658,12662,12666,12670],{"__ignoreMap":73},[77,12651,12652],{"class":79,"line":80},[77,12653,83],{},[77,12655,12656],{"class":79,"line":86},[77,12657,89],{},[77,12659,12660],{"class":79,"line":92},[77,12661,95],{},[77,12663,12664],{"class":79,"line":98},[77,12665,102],{"emptyLinePlaceholder":101},[77,12667,12668],{"class":79,"line":105},[77,12669,108],{},[77,12671,12672],{"class":79,"line":111},[77,12673,114],{},[10,12675,117],{},[68,12677,12679],{"className":12678,"code":122,"language":123,"meta":73},[121],[50,12680,122],{"__ignoreMap":73},[10,12682,128],{},[14,12684,131],{"id":131},[133,12686,12687,12693],{},[40,12688,137,12689,141,12691,145],{},[50,12690,140],{},[50,12692,144],{},[40,12694,148],{},[14,12696,151],{"id":151},[37,12698,12699,12703],{},[40,12700,156,12701,160],{},[50,12702,159],{},[40,12704,163],{},[14,12706,166],{"id":166},[133,12708,12709,12711],{},[40,12710,171],{},[40,12712,174,12713,178],{},[50,12714,177],{},[10,12716,181],{},[14,12718,184],{"id":184},[10,12720,187],{},[189,12722,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12724},[12725,12726,12727,12728,12729,12730,12731,12732],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":5,"description":12},[202,214,215],{"id":6046,"title":6047,"body":12737,"category":202,"cover":203,"description":6052,"extension":204,"meta":12914,"navigation":101,"path":6280,"pinned":207,"publishedAt":208,"seo":12915,"slug":6282,"stem":6283,"summary":6284,"tags":12916,"updatedAt":208,"visible":101,"__hash__":6288},{"type":7,"value":12738,"toc":12902},[12739,12741,12743,12747,12749,12753,12759,12761,12773,12775,12779,12803,12807,12823,12829,12831,12836,12838,12840,12856,12858,12860,12864,12868,12870,12882,12884,12894,12896,12898,12900],[10,12740,6052],{},[14,12742,16],{"id":16},[10,12744,6057,12745,6060],{},[271,12746,140],{},[14,12748,22],{"id":22},[10,12750,12751],{},[26,12752],{"alt":6067,"src":6068},[10,12754,6071,12755,6075,12757,6079],{},[50,12756,6074],{},[50,12758,6078],{},[14,12760,35],{"id":35},[37,12762,12763,12767,12769],{},[40,12764,6086,12765,6089],{},[50,12766,1148],{},[40,12768,6092],{},[40,12770,6095,12771,6099],{},[50,12772,6098],{},[14,12774,63],{"id":63},[10,12776,6104,12777,6108],{},[50,12778,6107],{},[68,12780,12781],{"className":70,"code":6111,"language":72,"meta":73,"style":73},[50,12782,12783,12787,12791,12795,12799],{"__ignoreMap":73},[77,12784,12785],{"class":79,"line":80},[77,12786,6118],{},[77,12788,12789],{"class":79,"line":86},[77,12790,6123],{},[77,12792,12793],{"class":79,"line":92},[77,12794,102],{"emptyLinePlaceholder":101},[77,12796,12797],{"class":79,"line":98},[77,12798,6132],{},[77,12800,12801],{"class":79,"line":105},[77,12802,6137],{},[10,12804,6140,12805,6144],{},[50,12806,6143],{},[68,12808,12809],{"className":70,"code":6147,"language":72,"meta":73,"style":73},[50,12810,12811,12815,12819],{"__ignoreMap":73},[77,12812,12813],{"class":79,"line":80},[77,12814,6154],{},[77,12816,12817],{"class":79,"line":86},[77,12818,102],{"emptyLinePlaceholder":101},[77,12820,12821],{"class":79,"line":92},[77,12822,6163],{},[10,12824,6166,12825,1134,12827,339],{},[50,12826,6169],{},[50,12828,6172],{},[10,12830,117],{},[68,12832,12834],{"className":12833,"code":6178,"language":123,"meta":73},[121],[50,12835,6178],{"__ignoreMap":73},[10,12837,128],{},[14,12839,131],{"id":131},[133,12841,12842,12848],{},[40,12843,6189,12844,6192,12846,6196],{},[50,12845,6107],{},[50,12847,6195],{},[40,12849,12850,6201,12852,6204,12854,6207],{},[50,12851,6143],{},[50,12853,6107],{},[50,12855,6143],{},[305,12857,2672],{"id":2672},[10,12859,6212],{},[10,12861,12862],{},[26,12863],{"alt":6217,"src":6218},[10,12865,6221,12866,6224],{},[50,12867,6195],{},[14,12869,151],{"id":151},[37,12871,12872,12878],{},[40,12873,6231,12874,1134,12876,339],{},[50,12875,6107],{},[50,12877,6143],{},[40,12879,6238,12880,6242],{},[50,12881,6241],{},[14,12883,166],{"id":166},[133,12885,12886,12890],{},[40,12887,2328,12888,6252],{},[50,12889,6251],{},[40,12891,6255,12892,339],{},[50,12893,6074],{},[10,12895,181],{},[14,12897,184],{"id":184},[10,12899,6264],{},[189,12901,191],{},{"title":73,"searchDepth":86,"depth":86,"links":12903},[12904,12905,12906,12907,12908,12911,12912,12913],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12909},[12910],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":6047,"description":6052},[202,6286,6287],{"id":6290,"title":6291,"body":12918,"category":202,"cover":203,"description":6296,"extension":204,"meta":13057,"navigation":101,"path":6462,"pinned":207,"publishedAt":208,"seo":13058,"slug":6464,"stem":6465,"summary":6466,"tags":13059,"updatedAt":208,"visible":101,"__hash__":6469},{"type":7,"value":12919,"toc":13047},[12920,12922,12924,12926,12928,12932,12934,12936,12946,12948,12950,12990,12992,12997,12999,13001,13019,13021,13029,13031,13039,13041,13043,13045],[10,12921,6296],{},[14,12923,16],{"id":16},[10,12925,6301],{},[14,12927,22],{"id":22},[10,12929,12930],{},[26,12931],{"alt":6308,"src":6309},[10,12933,6312],{},[14,12935,35],{"id":35},[37,12937,12938,12942,12944],{},[40,12939,12940,6322],{},[50,12941,6321],{},[40,12943,6325],{},[40,12945,6328],{},[14,12947,63],{"id":63},[10,12949,1551],{},[68,12951,12952],{"className":568,"code":6335,"language":570,"meta":73,"style":73},[50,12953,12954,12964,12970,12976,12986],{"__ignoreMap":73},[77,12955,12956,12958,12960,12962],{"class":79,"line":80},[77,12957,668],{"class":577},[77,12959,610],{"class":580},[77,12961,6346],{"class":613},[77,12963,6349],{"class":613},[77,12965,12966,12968],{"class":79,"line":86},[77,12967,6354],{"class":580},[77,12969,6357],{"class":613},[77,12971,12972,12974],{"class":79,"line":92},[77,12973,72],{"class":577},[77,12975,581],{"class":580},[77,12977,12978,12980,12982,12984],{"class":79,"line":98},[77,12979,72],{"class":577},[77,12981,610],{"class":580},[77,12983,614],{"class":613},[77,12985,581],{"class":580},[77,12987,12988],{"class":79,"line":105},[77,12989,6378],{"class":577},[10,12991,117],{},[68,12993,12995],{"className":12994,"code":6384,"language":123,"meta":73},[121],[50,12996,6384],{"__ignoreMap":73},[10,12998,128],{},[14,13000,131],{"id":131},[133,13002,13003,13009],{},[40,13004,13005,6398,13007,6401],{},[50,13006,6397],{},[50,13008,668],{},[40,13010,6404,13011,2153,13013,6410,13015,3703,13017,6416],{},[50,13012,72],{},[50,13014,6409],{},[50,13016,6321],{},[50,13018,6415],{},[14,13020,151],{"id":151},[37,13022,13023,13025],{},[40,13024,6423],{},[40,13026,3442,13027,6428],{},[50,13028,6321],{},[14,13030,166],{"id":166},[133,13032,13033,13037],{},[40,13034,6435,13035,339],{},[50,13036,6438],{},[40,13038,6441],{},[10,13040,181],{},[14,13042,184],{"id":184},[10,13044,6448],{},[189,13046,1635],{},{"title":73,"searchDepth":86,"depth":86,"links":13048},[13049,13050,13051,13052,13053,13054,13055,13056],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":6291,"description":6296},[202,6468,237],{"id":6471,"title":6472,"body":13061,"category":202,"cover":203,"description":6477,"extension":204,"meta":13214,"navigation":101,"path":6666,"pinned":207,"publishedAt":208,"seo":13215,"slug":6668,"stem":6669,"summary":6670,"tags":13216,"updatedAt":208,"visible":101,"__hash__":6674},{"type":7,"value":13062,"toc":13204},[13063,13065,13067,13069,13071,13075,13081,13083,13099,13101,13103,13147,13149,13154,13156,13158,13170,13172,13186,13188,13196,13198,13200,13202],[10,13064,6477],{},[14,13066,16],{"id":16},[10,13068,6482],{},[14,13070,22],{"id":22},[10,13072,13073],{},[26,13074],{"alt":6489,"src":6490},[10,13076,13077,6496,13079,6499],{},[50,13078,6495],{},[50,13080,2409],{},[14,13082,35],{"id":35},[37,13084,13085,13087,13095],{},[40,13086,6506],{},[40,13088,13089,53,13091,53,13093,6518],{},[50,13090,6511],{},[50,13092,6514],{},[50,13094,6517],{},[40,13096,6521,13097,6525],{},[50,13098,6524],{},[14,13100,63],{"id":63},[10,13102,66],{},[68,13104,13105],{"className":70,"code":6532,"language":72,"meta":73,"style":73},[50,13106,13107,13111,13115,13119,13123,13127,13131,13135,13139,13143],{"__ignoreMap":73},[77,13108,13109],{"class":79,"line":80},[77,13110,6539],{},[77,13112,13113],{"class":79,"line":86},[77,13114,102],{"emptyLinePlaceholder":101},[77,13116,13117],{"class":79,"line":92},[77,13118,6548],{},[77,13120,13121],{"class":79,"line":98},[77,13122,6553],{},[77,13124,13125],{"class":79,"line":105},[77,13126,6558],{},[77,13128,13129],{"class":79,"line":111},[77,13130,102],{"emptyLinePlaceholder":101},[77,13132,13133],{"class":79,"line":2462},[77,13134,6567],{},[77,13136,13137],{"class":79,"line":2468},[77,13138,6572],{},[77,13140,13141],{"class":79,"line":3928},[77,13142,6577],{},[77,13144,13145],{"class":79,"line":4140},[77,13146,6582],{},[10,13148,117],{},[68,13150,13152],{"className":13151,"code":6588,"language":123,"meta":73},[121],[50,13153,6588],{"__ignoreMap":73},[10,13155,128],{},[14,13157,131],{"id":131},[133,13159,13160,13164],{},[40,13161,13162,6602],{},[50,13163,6601],{},[40,13165,2313,13166,6607,13168,6610],{},[50,13167,2409],{},[50,13169,6495],{},[14,13171,151],{"id":151},[37,13173,13174,13180],{},[40,13175,3442,13176,6619,13178,6622],{},[50,13177,6495],{},[50,13179,6511],{},[40,13181,6625,13182,986,13184,6631],{},[50,13183,2409],{},[50,13185,6630],{},[14,13187,166],{"id":166},[133,13189,13190,13194],{},[40,13191,6638,13192,6642],{},[50,13193,6641],{},[40,13195,6645],{},[10,13197,181],{},[14,13199,184],{"id":184},[10,13201,6652],{},[189,13203,191],{},{"title":73,"searchDepth":86,"depth":86,"links":13205},[13206,13207,13208,13209,13210,13211,13212,13213],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":6472,"description":6477},[202,6672,6673],{"id":6676,"title":6677,"body":13218,"category":202,"cover":203,"description":6682,"extension":204,"meta":13365,"navigation":101,"path":6861,"pinned":207,"publishedAt":208,"seo":13366,"slug":6863,"stem":6864,"summary":6865,"tags":13367,"updatedAt":208,"visible":101,"__hash__":6869},{"type":7,"value":13219,"toc":13355},[13220,13222,13224,13226,13228,13232,13234,13236,13254,13256,13258,13306,13308,13313,13315,13317,13325,13327,13337,13339,13347,13349,13351,13353],[10,13221,6682],{},[14,13223,16],{"id":16},[10,13225,6687],{},[14,13227,22],{"id":22},[10,13229,13230],{},[26,13231],{"alt":6694,"src":6695},[10,13233,6698],{},[14,13235,35],{"id":35},[37,13237,13238,13242,13248],{},[40,13239,13240,6708],{},[50,13241,6707],{},[40,13243,13244,6714,13246,339],{},[50,13245,6713],{},[50,13247,6717],{},[40,13249,6720,13250,6724,13252,6728],{},[50,13251,6723],{},[50,13253,6727],{},[14,13255,63],{"id":63},[10,13257,66],{},[68,13259,13260],{"className":70,"code":6735,"language":72,"meta":73,"style":73},[50,13261,13262,13266,13270,13274,13278,13282,13286,13290,13294,13298,13302],{"__ignoreMap":73},[77,13263,13264],{"class":79,"line":80},[77,13265,6539],{},[77,13267,13268],{"class":79,"line":86},[77,13269,102],{"emptyLinePlaceholder":101},[77,13271,13272],{"class":79,"line":92},[77,13273,6750],{},[77,13275,13276],{"class":79,"line":98},[77,13277,6755],{},[77,13279,13280],{"class":79,"line":105},[77,13281,6760],{},[77,13283,13284],{"class":79,"line":111},[77,13285,6765],{},[77,13287,13288],{"class":79,"line":2462},[77,13289,102],{"emptyLinePlaceholder":101},[77,13291,13292],{"class":79,"line":2468},[77,13293,6774],{},[77,13295,13296],{"class":79,"line":3928},[77,13297,6779],{},[77,13299,13300],{"class":79,"line":4140},[77,13301,6784],{},[77,13303,13304],{"class":79,"line":5805},[77,13305,6789],{},[10,13307,117],{},[68,13309,13311],{"className":13310,"code":6795,"language":123,"meta":73},[121],[50,13312,6795],{"__ignoreMap":73},[10,13314,128],{},[14,13316,131],{"id":131},[133,13318,13319,13323],{},[40,13320,6806,13321,6809],{},[50,13322,6723],{},[40,13324,6812],{},[14,13326,151],{"id":151},[37,13328,13329,13333],{},[40,13330,2313,13331,6821],{},[50,13332,6707],{},[40,13334,6824,13335,339],{},[50,13336,6827],{},[14,13338,166],{"id":166},[133,13340,13341,13343],{},[40,13342,6834],{},[40,13344,6837,13345,6840],{},[50,13346,313],{},[10,13348,181],{},[14,13350,184],{"id":184},[10,13352,6847],{},[189,13354,191],{},{"title":73,"searchDepth":86,"depth":86,"links":13356},[13357,13358,13359,13360,13361,13362,13363,13364],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":6677,"description":6682},[202,6867,6868],{"id":6871,"title":6872,"body":13369,"category":202,"cover":203,"description":6877,"extension":204,"meta":13512,"navigation":101,"path":7045,"pinned":207,"publishedAt":208,"seo":13513,"slug":7047,"stem":7048,"summary":7049,"tags":13514,"updatedAt":208,"visible":101,"__hash__":7053},{"type":7,"value":13370,"toc":13502},[13371,13373,13375,13377,13379,13383,13389,13391,13401,13403,13405,13457,13459,13464,13466,13468,13478,13480,13486,13488,13494,13496,13498,13500],[10,13372,6877],{},[14,13374,16],{"id":16},[10,13376,6882],{},[14,13378,22],{"id":22},[10,13380,13381],{},[26,13382],{"alt":6889,"src":6890},[10,13384,13385,6896,13387,6900],{},[50,13386,6895],{},[50,13388,6899],{},[14,13390,35],{"id":35},[37,13392,13393,13395,13399],{},[40,13394,6907],{},[40,13396,13397,6913],{},[50,13398,6912],{},[40,13400,6916],{},[14,13402,63],{"id":63},[10,13404,66],{},[68,13406,13407],{"className":70,"code":6923,"language":72,"meta":73,"style":73},[50,13408,13409,13413,13417,13421,13425,13429,13433,13437,13441,13445,13449,13453],{"__ignoreMap":73},[77,13410,13411],{"class":79,"line":80},[77,13412,6930],{},[77,13414,13415],{"class":79,"line":86},[77,13416,102],{"emptyLinePlaceholder":101},[77,13418,13419],{"class":79,"line":92},[77,13420,6939],{},[77,13422,13423],{"class":79,"line":98},[77,13424,102],{"emptyLinePlaceholder":101},[77,13426,13427],{"class":79,"line":105},[77,13428,6948],{},[77,13430,13431],{"class":79,"line":111},[77,13432,6953],{},[77,13434,13435],{"class":79,"line":2462},[77,13436,6765],{},[77,13438,13439],{"class":79,"line":2468},[77,13440,102],{"emptyLinePlaceholder":101},[77,13442,13443],{"class":79,"line":3928},[77,13444,6966],{},[77,13446,13447],{"class":79,"line":4140},[77,13448,6971],{},[77,13450,13451],{"class":79,"line":5805},[77,13452,6784],{},[77,13454,13455],{"class":79,"line":5810},[77,13456,6980],{},[10,13458,117],{},[68,13460,13462],{"className":13461,"code":6986,"language":123,"meta":73},[121],[50,13463,6986],{"__ignoreMap":73},[10,13465,128],{},[14,13467,131],{"id":131},[133,13469,13470,13474],{},[40,13471,13472,6999],{},[50,13473,6895],{},[40,13475,13476,7004],{},[50,13477,6899],{},[14,13479,151],{"id":151},[37,13481,13482,13484],{},[40,13483,7011],{},[40,13485,7014],{},[14,13487,166],{"id":166},[133,13489,13490,13492],{},[40,13491,7021],{},[40,13493,7024],{},[10,13495,181],{},[14,13497,184],{"id":184},[10,13499,7031],{},[189,13501,191],{},{"title":73,"searchDepth":86,"depth":86,"links":13503},[13504,13505,13506,13507,13508,13509,13510,13511],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":6872,"description":6877},[202,7051,7052],{"id":7055,"title":7056,"body":13516,"category":202,"cover":203,"description":7061,"extension":204,"meta":13667,"navigation":101,"path":7246,"pinned":207,"publishedAt":208,"seo":13668,"slug":7248,"stem":7249,"summary":7250,"tags":13669,"updatedAt":208,"visible":101,"__hash__":7254},{"type":7,"value":13517,"toc":13657},[13518,13520,13522,13524,13526,13530,13534,13536,13550,13552,13554,13606,13608,13613,13615,13617,13629,13631,13641,13643,13649,13651,13653,13655],[10,13519,7061],{},[14,13521,16],{"id":16},[10,13523,7066],{},[14,13525,22],{"id":22},[10,13527,13528],{},[26,13529],{"alt":7073,"src":7074},[10,13531,13532,7080],{},[50,13533,7079],{},[14,13535,35],{"id":35},[37,13537,13538,13544,13548],{},[40,13539,2313,13540,7090,13542,7094],{},[50,13541,7089],{},[50,13543,7093],{},[40,13545,7097,13546,7101],{},[50,13547,7100],{},[40,13549,7104],{},[14,13551,63],{"id":63},[10,13553,66],{},[68,13555,13556],{"className":70,"code":7111,"language":72,"meta":73,"style":73},[50,13557,13558,13562,13566,13570,13574,13578,13582,13586,13590,13594,13598,13602],{"__ignoreMap":73},[77,13559,13560],{"class":79,"line":80},[77,13561,7118],{},[77,13563,13564],{"class":79,"line":86},[77,13565,102],{"emptyLinePlaceholder":101},[77,13567,13568],{"class":79,"line":92},[77,13569,7127],{},[77,13571,13572],{"class":79,"line":98},[77,13573,7132],{},[77,13575,13576],{"class":79,"line":105},[77,13577,7137],{},[77,13579,13580],{"class":79,"line":111},[77,13581,7142],{},[77,13583,13584],{"class":79,"line":2462},[77,13585,7147],{},[77,13587,13588],{"class":79,"line":2468},[77,13589,102],{"emptyLinePlaceholder":101},[77,13591,13592],{"class":79,"line":3928},[77,13593,7156],{},[77,13595,13596],{"class":79,"line":4140},[77,13597,7161],{},[77,13599,13600],{"class":79,"line":5805},[77,13601,7166],{},[77,13603,13604],{"class":79,"line":5810},[77,13605,7171],{},[10,13607,117],{},[68,13609,13611],{"className":13610,"code":7177,"language":123,"meta":73},[121],[50,13612,7177],{"__ignoreMap":73},[10,13614,128],{},[14,13616,131],{"id":131},[133,13618,13619,13625],{},[40,13620,13621,7191,13623,7194],{},[50,13622,7190],{},[50,13624,7100],{},[40,13626,13627,7199],{},[50,13628,7079],{},[14,13630,151],{"id":151},[37,13632,13633,13635],{},[40,13634,7206],{},[40,13636,7209,13637,7212,13639,7215],{},[50,13638,7089],{},[50,13640,7093],{},[14,13642,166],{"id":166},[133,13644,13645,13647],{},[40,13646,7222],{},[40,13648,7225],{},[10,13650,181],{},[14,13652,184],{"id":184},[10,13654,7232],{},[189,13656,191],{},{"title":73,"searchDepth":86,"depth":86,"links":13658},[13659,13660,13661,13662,13663,13664,13665,13666],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":7056,"description":7061},[202,7252,7253],{"id":7256,"title":7257,"body":13671,"category":202,"cover":203,"description":7262,"extension":204,"meta":13885,"navigation":101,"path":7536,"pinned":207,"publishedAt":208,"seo":13886,"slug":7538,"stem":7539,"summary":7540,"tags":13887,"updatedAt":208,"visible":101,"__hash__":7544},{"type":7,"value":13672,"toc":13872},[13673,13675,13677,13679,13681,13685,13691,13693,13705,13707,13709,13769,13771,13776,13778,13780,13798,13800,13808,13812,13820,13822,13826,13830,13836,13838,13848,13850,13864,13866,13868,13870],[10,13674,7262],{},[14,13676,16],{"id":16},[10,13678,7267],{},[14,13680,22],{"id":22},[10,13682,13683],{},[26,13684],{"alt":7274,"src":7275},[10,13686,7278,13687,7282,13689,7286],{},[50,13688,7281],{},[50,13690,7285],{},[14,13692,35],{"id":35},[37,13694,13695,13699,13703],{},[40,13696,7293,13697,7296],{},[50,13698,7281],{},[40,13700,13701,7302],{},[50,13702,7301],{},[40,13704,7305],{},[14,13706,63],{"id":63},[10,13708,66],{},[68,13710,13711],{"className":70,"code":7312,"language":72,"meta":73,"style":73},[50,13712,13713,13717,13721,13725,13729,13733,13737,13741,13745,13749,13753,13757,13761,13765],{"__ignoreMap":73},[77,13714,13715],{"class":79,"line":80},[77,13716,7319],{},[77,13718,13719],{"class":79,"line":86},[77,13720,7324],{},[77,13722,13723],{"class":79,"line":92},[77,13724,7329],{},[77,13726,13727],{"class":79,"line":98},[77,13728,7334],{},[77,13730,13731],{"class":79,"line":105},[77,13732,7339],{},[77,13734,13735],{"class":79,"line":111},[77,13736,102],{"emptyLinePlaceholder":101},[77,13738,13739],{"class":79,"line":2462},[77,13740,7348],{},[77,13742,13743],{"class":79,"line":2468},[77,13744,7353],{},[77,13746,13747],{"class":79,"line":3928},[77,13748,7358],{},[77,13750,13751],{"class":79,"line":4140},[77,13752,7363],{},[77,13754,13755],{"class":79,"line":5805},[77,13756,1123],{},[77,13758,13759],{"class":79,"line":5810},[77,13760,7372],{},[77,13762,13763],{"class":79,"line":7375},[77,13764,7378],{},[77,13766,13767],{"class":79,"line":7381},[77,13768,7384],{},[10,13770,117],{},[68,13772,13774],{"className":13773,"code":7390,"language":123,"meta":73},[121],[50,13775,7390],{"__ignoreMap":73},[10,13777,128],{},[14,13779,131],{"id":131},[133,13781,13782,13790],{},[40,13783,13784,7403,13786,7406,13788,7410],{},[50,13785,3011],{},[50,13787,7301],{},[50,13789,7409],{},[40,13791,7413,13792,7416,13794,7419,13796,339],{},[50,13793,7281],{},[50,13795,1137],{},[50,13797,7285],{},[305,13799,2672],{"id":2672},[10,13801,13802,53,13804,1134,13806,7432],{},[50,13803,7281],{},[50,13805,1137],{},[50,13807,7285],{},[10,13809,13810],{},[26,13811],{"alt":7437,"src":7438},[10,13813,13814,7443,13816,7446,13818,7449],{},[50,13815,7281],{},[50,13817,1137],{},[50,13819,7285],{},[305,13821,2672],{"id":4195},[10,13823,13824,7457],{},[50,13825,7456],{},[10,13827,13828],{},[26,13829],{"alt":7462,"src":7463},[10,13831,7466,13832,7469,13834,7472],{},[50,13833,7456],{},[50,13835,1137],{},[14,13837,151],{"id":151},[37,13839,13840,13844],{},[40,13841,7479,13842,7483],{},[50,13843,7482],{},[40,13845,7486,13846,7489],{},[50,13847,7456],{},[14,13849,166],{"id":166},[133,13851,13852,13860],{},[40,13853,7496,13854,7500,13856,1134,13858,339],{},[50,13855,7499],{},[50,13857,7503],{},[50,13859,7506],{},[40,13861,7509,13862,7512],{},[50,13863,6717],{},[10,13865,181],{},[14,13867,184],{"id":184},[10,13869,7519],{},[189,13871,191],{},{"title":73,"searchDepth":86,"depth":86,"links":13873},[13874,13875,13876,13877,13878,13882,13883,13884],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":13879},[13880,13881],{"id":2672,"depth":92,"text":2672},{"id":4195,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":7257,"description":7262},[202,7542,7543],{"id":7546,"title":7547,"body":13889,"category":202,"cover":203,"description":7552,"extension":204,"meta":14040,"navigation":101,"path":7729,"pinned":207,"publishedAt":208,"seo":14041,"slug":7731,"stem":7732,"summary":7733,"tags":14042,"updatedAt":208,"visible":101,"__hash__":7736},{"type":7,"value":13890,"toc":14030},[13891,13893,13895,13897,13899,13903,13907,13909,13921,13923,13925,13973,13975,13980,13982,13984,13994,13996,14006,14008,14022,14024,14026,14028],[10,13892,7552],{},[14,13894,16],{"id":16},[10,13896,7557],{},[14,13898,22],{"id":22},[10,13900,13901],{},[26,13902],{"alt":7564,"src":7565},[10,13904,7568,13905,7571],{},[50,13906,6727],{},[14,13908,35],{"id":35},[37,13910,13911,13915,13919],{},[40,13912,13913,7580],{},[50,13914,6727],{},[40,13916,13917,7586],{},[50,13918,7585],{},[40,13920,7589],{},[14,13922,63],{"id":63},[10,13924,66],{},[68,13926,13927],{"className":70,"code":7596,"language":72,"meta":73,"style":73},[50,13928,13929,13933,13937,13941,13945,13949,13953,13957,13961,13965,13969],{"__ignoreMap":73},[77,13930,13931],{"class":79,"line":80},[77,13932,6539],{},[77,13934,13935],{"class":79,"line":86},[77,13936,102],{"emptyLinePlaceholder":101},[77,13938,13939],{"class":79,"line":92},[77,13940,6750],{},[77,13942,13943],{"class":79,"line":98},[77,13944,102],{"emptyLinePlaceholder":101},[77,13946,13947],{"class":79,"line":105},[77,13948,7619],{},[77,13950,13951],{"class":79,"line":111},[77,13952,7624],{},[77,13954,13955],{"class":79,"line":2462},[77,13956,102],{"emptyLinePlaceholder":101},[77,13958,13959],{"class":79,"line":2468},[77,13960,7633],{},[77,13962,13963],{"class":79,"line":3928},[77,13964,7638],{},[77,13966,13967],{"class":79,"line":4140},[77,13968,102],{"emptyLinePlaceholder":101},[77,13970,13971],{"class":79,"line":5805},[77,13972,7647],{},[10,13974,117],{},[68,13976,13978],{"className":13977,"code":7653,"language":123,"meta":73},[121],[50,13979,7653],{"__ignoreMap":73},[10,13981,128],{},[14,13983,131],{"id":131},[133,13985,13986,13992],{},[40,13987,7568,13988,7666,13990,339],{},[50,13989,6727],{},[50,13991,7669],{},[40,13993,7672],{},[14,13995,151],{"id":151},[37,13997,13998,14002],{},[40,13999,4763,14000,7681],{},[50,14001,6727],{},[40,14003,7684,14004,7687],{},[50,14005,6727],{},[14,14007,166],{"id":166},[133,14009,14010,14016],{},[40,14011,7694,14012,7698,14014,339],{},[50,14013,7697],{},[50,14015,6727],{},[40,14017,4763,14018,7705,14020,339],{},[50,14019,6727],{},[50,14021,7708],{},[10,14023,181],{},[14,14025,184],{"id":184},[10,14027,7715],{},[189,14029,191],{},{"title":73,"searchDepth":86,"depth":86,"links":14031},[14032,14033,14034,14035,14036,14037,14038,14039],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":7547,"description":7552},[202,6727,7735],{"id":7738,"title":7739,"body":14044,"category":202,"cover":203,"description":7744,"extension":204,"meta":14215,"navigation":101,"path":7957,"pinned":207,"publishedAt":208,"seo":14216,"slug":7959,"stem":7960,"summary":7961,"tags":14217,"updatedAt":208,"visible":101,"__hash__":7965},{"type":7,"value":14045,"toc":14203},[14046,14048,14050,14052,14054,14058,14060,14062,14074,14076,14078,14134,14136,14141,14143,14145,14161,14163,14165,14169,14175,14177,14185,14187,14195,14197,14199,14201],[10,14047,7744],{},[14,14049,16],{"id":16},[10,14051,7749],{},[14,14053,22],{"id":22},[10,14055,14056],{},[26,14057],{"alt":7756,"src":7757},[10,14059,7760],{},[14,14061,35],{"id":35},[37,14063,14064,14068,14072],{},[40,14065,14066,7770],{},[50,14067,7769],{},[40,14069,14070,7776],{},[50,14071,7775],{},[40,14073,7779],{},[14,14075,63],{"id":63},[10,14077,66],{},[68,14079,14080],{"className":70,"code":7786,"language":72,"meta":73,"style":73},[50,14081,14082,14086,14090,14094,14098,14102,14106,14110,14114,14118,14122,14126,14130],{"__ignoreMap":73},[77,14083,14084],{"class":79,"line":80},[77,14085,7793],{},[77,14087,14088],{"class":79,"line":86},[77,14089,7798],{},[77,14091,14092],{"class":79,"line":92},[77,14093,7803],{},[77,14095,14096],{"class":79,"line":98},[77,14097,7808],{},[77,14099,14100],{"class":79,"line":105},[77,14101,102],{"emptyLinePlaceholder":101},[77,14103,14104],{"class":79,"line":111},[77,14105,7817],{},[77,14107,14108],{"class":79,"line":2462},[77,14109,7822],{},[77,14111,14112],{"class":79,"line":2468},[77,14113,7827],{},[77,14115,14116],{"class":79,"line":3928},[77,14117,7832],{},[77,14119,14120],{"class":79,"line":4140},[77,14121,102],{"emptyLinePlaceholder":101},[77,14123,14124],{"class":79,"line":5805},[77,14125,7841],{},[77,14127,14128],{"class":79,"line":5810},[77,14129,7846],{},[77,14131,14132],{"class":79,"line":7375},[77,14133,7851],{},[10,14135,117],{},[68,14137,14139],{"className":14138,"code":7857,"language":123,"meta":73},[121],[50,14140,7857],{"__ignoreMap":73},[10,14142,128],{},[14,14144,131],{"id":131},[133,14146,14147,14153],{},[40,14148,7868,14149,7872,14151,7875],{},[50,14150,7871],{},[50,14152,7775],{},[40,14154,14155,7881,14157,7885,14159,7888],{},[50,14156,7880],{},[50,14158,7884],{},[50,14160,7769],{},[305,14162,2672],{"id":2672},[10,14164,7893],{},[10,14166,14167],{},[26,14168],{"alt":7898,"src":7899},[10,14170,7902,14171,1134,14173,7908],{},[50,14172,4560],{},[50,14174,7907],{},[14,14176,151],{"id":151},[37,14178,14179,14183],{},[40,14180,7915,14181,7918],{},[50,14182,7769],{},[40,14184,7921],{},[14,14186,166],{"id":166},[133,14188,14189,14193],{},[40,14190,5273,14191,7931],{},[50,14192,7930],{},[40,14194,7934],{},[10,14196,181],{},[14,14198,184],{"id":184},[10,14200,7941],{},[189,14202,191],{},{"title":73,"searchDepth":86,"depth":86,"links":14204},[14205,14206,14207,14208,14209,14212,14213,14214],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14210},[14211],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":7739,"description":7744},[202,7963,7964],{"id":7967,"title":7968,"body":14219,"category":202,"cover":203,"description":7973,"extension":204,"meta":14366,"navigation":101,"path":8152,"pinned":207,"publishedAt":208,"seo":14367,"slug":8154,"stem":8155,"summary":8156,"tags":14368,"updatedAt":208,"visible":101,"__hash__":8160},{"type":7,"value":14220,"toc":14356},[14221,14223,14225,14227,14229,14233,14235,14237,14245,14247,14249,14305,14307,14312,14314,14316,14328,14330,14336,14338,14348,14350,14352,14354],[10,14222,7973],{},[14,14224,16],{"id":16},[10,14226,7978],{},[14,14228,22],{"id":22},[10,14230,14231],{},[26,14232],{"alt":7985,"src":7986},[10,14234,7989],{},[14,14236,35],{"id":35},[37,14238,14239,14241,14243],{},[40,14240,7996],{},[40,14242,7999],{},[40,14244,8002],{},[14,14246,63],{"id":63},[10,14248,66],{},[68,14250,14251],{"className":70,"code":8009,"language":72,"meta":73,"style":73},[50,14252,14253,14257,14261,14265,14269,14273,14277,14281,14285,14289,14293,14297,14301],{"__ignoreMap":73},[77,14254,14255],{"class":79,"line":80},[77,14256,8016],{},[77,14258,14259],{"class":79,"line":86},[77,14260,8021],{},[77,14262,14263],{"class":79,"line":92},[77,14264,8026],{},[77,14266,14267],{"class":79,"line":98},[77,14268,102],{"emptyLinePlaceholder":101},[77,14270,14271],{"class":79,"line":105},[77,14272,8035],{},[77,14274,14275],{"class":79,"line":111},[77,14276,8040],{},[77,14278,14279],{"class":79,"line":2462},[77,14280,8045],{},[77,14282,14283],{"class":79,"line":2468},[77,14284,102],{"emptyLinePlaceholder":101},[77,14286,14287],{"class":79,"line":3928},[77,14288,8054],{},[77,14290,14291],{"class":79,"line":4140},[77,14292,8059],{},[77,14294,14295],{"class":79,"line":5805},[77,14296,102],{"emptyLinePlaceholder":101},[77,14298,14299],{"class":79,"line":5810},[77,14300,8068],{},[77,14302,14303],{"class":79,"line":7375},[77,14304,8073],{},[10,14306,117],{},[68,14308,14310],{"className":14309,"code":8079,"language":123,"meta":73},[121],[50,14311,8079],{"__ignoreMap":73},[10,14313,128],{},[14,14315,131],{"id":131},[133,14317,14318,14324],{},[40,14319,14320,8093,14322,8097],{},[50,14321,8092],{},[50,14323,8096],{},[40,14325,8100,14326,8104],{},[50,14327,8103],{},[14,14329,151],{"id":151},[37,14331,14332,14334],{},[40,14333,8111],{},[40,14335,8114],{},[14,14337,166],{"id":166},[133,14339,14340,14346],{},[40,14341,8121,14342,8125,14344,339],{},[50,14343,8124],{},[50,14345,8128],{},[40,14347,8131],{},[10,14349,181],{},[14,14351,184],{"id":184},[10,14353,8138],{},[189,14355,191],{},{"title":73,"searchDepth":86,"depth":86,"links":14357},[14358,14359,14360,14361,14362,14363,14364,14365],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":7968,"description":7973},[202,8158,8159],{"id":8162,"title":8163,"body":14370,"category":202,"cover":203,"description":8168,"extension":204,"meta":14533,"navigation":101,"path":8372,"pinned":207,"publishedAt":208,"seo":14534,"slug":8374,"stem":8375,"summary":8376,"tags":14535,"updatedAt":208,"visible":101,"__hash__":8380},{"type":7,"value":14371,"toc":14521},[14372,14374,14376,14378,14380,14384,14388,14390,14406,14408,14410,14454,14456,14461,14463,14465,14479,14481,14485,14489,14493,14495,14501,14503,14513,14515,14517,14519],[10,14373,8168],{},[14,14375,16],{"id":16},[10,14377,8173],{},[14,14379,22],{"id":22},[10,14381,14382],{},[26,14383],{"alt":8180,"src":8181},[10,14385,8184,14386,8188],{},[50,14387,8187],{},[14,14389,35],{"id":35},[37,14391,14392,14398,14404],{},[40,14393,14394,8198,14396,8202],{},[50,14395,8197],{},[50,14397,8201],{},[40,14399,8205,14400,8209,14402,8212],{},[50,14401,8208],{},[50,14403,4314],{},[40,14405,8215],{},[14,14407,63],{"id":63},[10,14409,66],{},[68,14411,14412],{"className":70,"code":8222,"language":72,"meta":73,"style":73},[50,14413,14414,14418,14422,14426,14430,14434,14438,14442,14446,14450],{"__ignoreMap":73},[77,14415,14416],{"class":79,"line":80},[77,14417,8229],{},[77,14419,14420],{"class":79,"line":86},[77,14421,8234],{},[77,14423,14424],{"class":79,"line":92},[77,14425,8239],{},[77,14427,14428],{"class":79,"line":98},[77,14429,8244],{},[77,14431,14432],{"class":79,"line":105},[77,14433,8249],{},[77,14435,14436],{"class":79,"line":111},[77,14437,102],{"emptyLinePlaceholder":101},[77,14439,14440],{"class":79,"line":2462},[77,14441,8258],{},[77,14443,14444],{"class":79,"line":2468},[77,14445,8263],{},[77,14447,14448],{"class":79,"line":3928},[77,14449,8263],{},[77,14451,14452],{"class":79,"line":4140},[77,14453,8263],{},[10,14455,117],{},[68,14457,14459],{"className":14458,"code":8277,"language":123,"meta":73},[121],[50,14460,8277],{"__ignoreMap":73},[10,14462,128],{},[14,14464,131],{"id":131},[133,14466,14467,14471],{},[40,14468,7868,14469,8291],{},[50,14470,8290],{},[40,14472,8294,14473,8297,14475,8300,14477,8304],{},[50,14474,8201],{},[50,14476,8187],{},[50,14478,8303],{},[305,14480,2672],{"id":2672},[10,14482,8309,14483,8312],{},[50,14484,8201],{},[10,14486,14487],{},[26,14488],{"alt":8317,"src":8318},[10,14490,8321,14491,8324],{},[50,14492,8187],{},[14,14494,151],{"id":151},[37,14496,14497,14499],{},[40,14498,8331],{},[40,14500,8334],{},[14,14502,166],{"id":166},[133,14504,14505,14507],{},[40,14506,8341],{},[40,14508,3986,14509,8346,14511,8349],{},[50,14510,4314],{},[50,14512,8201],{},[10,14514,181],{},[14,14516,184],{"id":184},[10,14518,8356],{},[189,14520,191],{},{"title":73,"searchDepth":86,"depth":86,"links":14522},[14523,14524,14525,14526,14527,14530,14531,14532],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14528},[14529],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":8163,"description":8168},[202,8378,8379],{"id":8382,"title":8383,"body":14537,"category":202,"cover":203,"description":8388,"extension":204,"meta":14720,"navigation":101,"path":8613,"pinned":207,"publishedAt":208,"seo":14721,"slug":8615,"stem":8616,"summary":8617,"tags":14722,"updatedAt":208,"visible":101,"__hash__":8620},{"type":7,"value":14538,"toc":14708},[14539,14541,14543,14545,14547,14551,14553,14555,14569,14571,14573,14641,14643,14648,14650,14652,14666,14668,14670,14674,14680,14682,14690,14692,14700,14702,14704,14706],[10,14540,8388],{},[14,14542,16],{"id":16},[10,14544,8393],{},[14,14546,22],{"id":22},[10,14548,14549],{},[26,14550],{"alt":8400,"src":8401},[10,14552,8404],{},[14,14554,35],{"id":35},[37,14556,14557,14563,14565],{},[40,14558,14559,8414,14561,339],{},[50,14560,8413],{},[50,14562,8417],{},[40,14564,8420],{},[40,14566,14567,8426],{},[50,14568,8425],{},[14,14570,63],{"id":63},[10,14572,66],{},[68,14574,14575],{"className":70,"code":8433,"language":72,"meta":73,"style":73},[50,14576,14577,14581,14585,14589,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633,14637],{"__ignoreMap":73},[77,14578,14579],{"class":79,"line":80},[77,14580,8440],{},[77,14582,14583],{"class":79,"line":86},[77,14584,102],{"emptyLinePlaceholder":101},[77,14586,14587],{"class":79,"line":92},[77,14588,8449],{},[77,14590,14591],{"class":79,"line":98},[77,14592,8454],{},[77,14594,14595],{"class":79,"line":105},[77,14596,8459],{},[77,14598,14599],{"class":79,"line":111},[77,14600,8464],{},[77,14602,14603],{"class":79,"line":2462},[77,14604,8469],{},[77,14606,14607],{"class":79,"line":2468},[77,14608,8474],{},[77,14610,14611],{"class":79,"line":3928},[77,14612,8479],{},[77,14614,14615],{"class":79,"line":4140},[77,14616,8484],{},[77,14618,14619],{"class":79,"line":5805},[77,14620,102],{"emptyLinePlaceholder":101},[77,14622,14623],{"class":79,"line":5810},[77,14624,8493],{},[77,14626,14627],{"class":79,"line":7375},[77,14628,6118],{},[77,14630,14631],{"class":79,"line":7381},[77,14632,6123],{},[77,14634,14635],{"class":79,"line":8504},[77,14636,102],{"emptyLinePlaceholder":101},[77,14638,14639],{"class":79,"line":8509},[77,14640,8512],{},[10,14642,117],{},[68,14644,14646],{"className":14645,"code":8518,"language":123,"meta":73},[121],[50,14647,8518],{"__ignoreMap":73},[10,14649,128],{},[14,14651,131],{"id":131},[133,14653,14654,14664],{},[40,14655,8529,14656,8533,14658,8537,14660,8541,14662,339],{},[50,14657,8532],{},[50,14659,8536],{},[50,14661,8540],{},[50,14663,8532],{},[40,14665,8546],{},[305,14667,2672],{"id":2672},[10,14669,8551],{},[10,14671,14672],{},[26,14673],{"alt":8556,"src":8557},[10,14675,14676,8562,14678,339],{},[50,14677,8413],{},[50,14679,8417],{},[14,14681,151],{"id":151},[37,14683,14684,14688],{},[40,14685,8571,14686,339],{},[50,14687,5356],{},[40,14689,8576],{},[14,14691,166],{"id":166},[133,14693,14694,14696],{},[40,14695,8583],{},[40,14697,8586,14698,8590],{},[50,14699,8589],{},[10,14701,181],{},[14,14703,184],{"id":184},[10,14705,8597],{},[189,14707,191],{},{"title":73,"searchDepth":86,"depth":86,"links":14709},[14710,14711,14712,14713,14714,14717,14718,14719],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14715},[14716],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":8383,"description":8388},[202,8619,5307],{"id":8622,"title":8623,"body":14724,"category":202,"cover":203,"description":8628,"extension":204,"meta":14883,"navigation":101,"path":8816,"pinned":207,"publishedAt":208,"seo":14884,"slug":8818,"stem":8819,"summary":8820,"tags":14885,"updatedAt":208,"visible":101,"__hash__":8824},{"type":7,"value":14725,"toc":14871},[14726,14728,14730,14732,14734,14738,14740,14742,14750,14752,14754,14818,14820,14825,14827,14829,14837,14839,14841,14845,14847,14849,14855,14857,14863,14865,14867,14869],[10,14727,8628],{},[14,14729,16],{"id":16},[10,14731,8633],{},[14,14733,22],{"id":22},[10,14735,14736],{},[26,14737],{"alt":8640,"src":8641},[10,14739,8644],{},[14,14741,35],{"id":35},[37,14743,14744,14746,14748],{},[40,14745,8651],{},[40,14747,8654],{},[40,14749,8657],{},[14,14751,63],{"id":63},[10,14753,66],{},[68,14755,14756],{"className":70,"code":8664,"language":72,"meta":73,"style":73},[50,14757,14758,14762,14766,14770,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810,14814],{"__ignoreMap":73},[77,14759,14760],{"class":79,"line":80},[77,14761,8671],{},[77,14763,14764],{"class":79,"line":86},[77,14765,8676],{},[77,14767,14768],{"class":79,"line":92},[77,14769,102],{"emptyLinePlaceholder":101},[77,14771,14772],{"class":79,"line":98},[77,14773,8685],{},[77,14775,14776],{"class":79,"line":105},[77,14777,102],{"emptyLinePlaceholder":101},[77,14779,14780],{"class":79,"line":111},[77,14781,8694],{},[77,14783,14784],{"class":79,"line":2462},[77,14785,8699],{},[77,14787,14788],{"class":79,"line":2468},[77,14789,8704],{},[77,14791,14792],{"class":79,"line":3928},[77,14793,102],{"emptyLinePlaceholder":101},[77,14795,14796],{"class":79,"line":4140},[77,14797,8713],{},[77,14799,14800],{"class":79,"line":5805},[77,14801,8718],{},[77,14803,14804],{"class":79,"line":5810},[77,14805,8723],{},[77,14807,14808],{"class":79,"line":7375},[77,14809,102],{"emptyLinePlaceholder":101},[77,14811,14812],{"class":79,"line":7381},[77,14813,6132],{},[77,14815,14816],{"class":79,"line":8504},[77,14817,8736],{},[10,14819,117],{},[68,14821,14823],{"className":14822,"code":8742,"language":123,"meta":73},[121],[50,14824,8742],{"__ignoreMap":73},[10,14826,128],{},[14,14828,131],{"id":131},[133,14830,14831,14835],{},[40,14832,14833,8756],{},[50,14834,8755],{},[40,14836,8759],{},[305,14838,2672],{"id":2672},[10,14840,8764],{},[10,14842,14843],{},[26,14844],{"alt":8769,"src":8770},[10,14846,8773],{},[14,14848,151],{"id":151},[37,14850,14851,14853],{},[40,14852,8780],{},[40,14854,8783],{},[14,14856,166],{"id":166},[133,14858,14859,14861],{},[40,14860,8790],{},[40,14862,8793],{},[10,14864,181],{},[14,14866,184],{"id":184},[10,14868,8800],{},[189,14870,191],{},{"title":73,"searchDepth":86,"depth":86,"links":14872},[14873,14874,14875,14876,14877,14880,14881,14882],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14878},[14879],{"id":2672,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":8623,"description":8628},[202,8822,8823],{"id":8826,"title":8827,"body":14887,"category":202,"cover":203,"description":8832,"extension":204,"meta":15125,"navigation":101,"path":9133,"pinned":207,"publishedAt":208,"seo":15126,"slug":9135,"stem":9136,"summary":9137,"tags":15127,"updatedAt":208,"visible":101,"__hash__":9141},{"type":7,"value":14888,"toc":15112},[14889,14891,14893,14895,14897,14901,14903,14905,14915,14917,14919,15035,15037,15042,15044,15046,15056,15058,15060,15064,15066,15068,15070,15074,15078,15080,15088,15090,15104,15106,15108,15110],[10,14890,8832],{},[14,14892,16],{"id":16},[10,14894,8837],{},[14,14896,22],{"id":22},[10,14898,14899],{},[26,14900],{"alt":8844,"src":8845},[10,14902,8848],{},[14,14904,35],{"id":35},[37,14906,14907,14909,14911],{},[40,14908,8855],{},[40,14910,8858],{},[40,14912,8861,14913,8865],{},[50,14914,8864],{},[14,14916,63],{"id":63},[10,14918,66],{},[68,14920,14921],{"className":70,"code":8872,"language":72,"meta":73,"style":73},[50,14922,14923,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031],{"__ignoreMap":73},[77,14924,14925],{"class":79,"line":80},[77,14926,6930],{},[77,14928,14929],{"class":79,"line":86},[77,14930,6539],{},[77,14932,14933],{"class":79,"line":92},[77,14934,102],{"emptyLinePlaceholder":101},[77,14936,14937],{"class":79,"line":98},[77,14938,8891],{},[77,14940,14941],{"class":79,"line":105},[77,14942,8896],{},[77,14944,14945],{"class":79,"line":111},[77,14946,8901],{},[77,14948,14949],{"class":79,"line":2462},[77,14950,8906],{},[77,14952,14953],{"class":79,"line":2468},[77,14954,102],{"emptyLinePlaceholder":101},[77,14956,14957],{"class":79,"line":3928},[77,14958,8915],{},[77,14960,14961],{"class":79,"line":4140},[77,14962,8920],{},[77,14964,14965],{"class":79,"line":5805},[77,14966,8925],{},[77,14968,14969],{"class":79,"line":5810},[77,14970,8930],{},[77,14972,14973],{"class":79,"line":7375},[77,14974,8935],{},[77,14976,14977],{"class":79,"line":7381},[77,14978,102],{"emptyLinePlaceholder":101},[77,14980,14981],{"class":79,"line":8504},[77,14982,8944],{},[77,14984,14985],{"class":79,"line":8509},[77,14986,8949],{},[77,14988,14989],{"class":79,"line":8952},[77,14990,8955],{},[77,14992,14993],{"class":79,"line":8958},[77,14994,102],{"emptyLinePlaceholder":101},[77,14996,14997],{"class":79,"line":8963},[77,14998,8966],{},[77,15000,15001],{"class":79,"line":8969},[77,15002,102],{"emptyLinePlaceholder":101},[77,15004,15005],{"class":79,"line":8974},[77,15006,7348],{},[77,15008,15009],{"class":79,"line":8979},[77,15010,8982],{},[77,15012,15013],{"class":79,"line":8985},[77,15014,8988],{},[77,15016,15017],{"class":79,"line":8991},[77,15018,8994],{},[77,15020,15021],{"class":79,"line":8997},[77,15022,7358],{},[77,15024,15025],{"class":79,"line":9002},[77,15026,9005],{},[77,15028,15029],{"class":79,"line":9008},[77,15030,1123],{},[77,15032,15033],{"class":79,"line":9013},[77,15034,9016],{},[10,15036,117],{},[68,15038,15040],{"className":15039,"code":9022,"language":123,"meta":73},[121],[50,15041,9022],{"__ignoreMap":73},[10,15043,128],{},[14,15045,131],{"id":131},[133,15047,15048,15052],{},[40,15049,9033,15050,9036],{},[50,15051,8864],{},[40,15053,15054,9041],{},[50,15055,8096],{},[305,15057,2672],{"id":2672},[10,15059,9046],{},[10,15061,15062],{},[26,15063],{"alt":9051,"src":9052},[10,15065,9055],{},[305,15067,2672],{"id":4195},[10,15069,9060],{},[10,15071,15072],{},[26,15073],{"alt":9065,"src":9066},[10,15075,9069,15076,9073],{},[50,15077,9072],{},[14,15079,151],{"id":151},[37,15081,15082,15084],{},[40,15083,9080],{},[40,15085,9083,15086,9086],{},[50,15087,9072],{},[14,15089,166],{"id":166},[133,15091,15092,15096,15098],{},[40,15093,9093,15094,9096],{},[50,15095,9072],{},[40,15097,9099],{},[40,15099,9102,15100,9106,15102,9109],{},[50,15101,9105],{},[50,15103,6074],{},[10,15105,181],{},[14,15107,184],{"id":184},[10,15109,9116],{},[189,15111,191],{},{"title":73,"searchDepth":86,"depth":86,"links":15113},[15114,15115,15116,15117,15118,15122,15123,15124],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":35,"depth":86,"text":35},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":15119},[15120,15121],{"id":2672,"depth":92,"text":2672},{"id":4195,"depth":92,"text":2672},{"id":151,"depth":86,"text":151},{"id":166,"depth":86,"text":166},{"id":184,"depth":86,"text":184},{},{"title":8827,"description":8832},[202,9139,9140],{"id":1033,"title":1034,"body":15129,"category":202,"cover":1042,"description":73,"extension":204,"meta":15365,"navigation":101,"path":1359,"pinned":207,"publishedAt":1360,"seo":15366,"slug":1362,"stem":1363,"summary":1364,"tags":15367,"updatedAt":1360,"visible":101,"__hash__":1368},{"type":7,"value":15130,"toc":15350},[15131,15135,15137,15139,15141,15143,15163,15165,15170,15172,15174,15202,15208,15210,15214,15216,15236,15238,15248,15250,15252,15254,15256,15258,15260,15262,15264,15266,15286,15288,15290,15294,15296,15298,15300,15302,15306,15308,15326,15328,15330,15332,15334,15336,15338,15340,15342,15344,15346,15348],[10,15132,15133],{},[26,15134],{"alt":1041,"src":1042},[10,15136,1045],{},[10,15138,1048],{},[14,15140,1052],{"id":1051},[10,15142,1055],{},[68,15144,15145],{"className":70,"code":1058,"language":72,"meta":73,"style":73},[50,15146,15147,15151,15155,15159],{"__ignoreMap":73},[77,15148,15149],{"class":79,"line":80},[77,15150,1065],{},[77,15152,15153],{"class":79,"line":86},[77,15154,1070],{},[77,15156,15157],{"class":79,"line":92},[77,15158,102],{"emptyLinePlaceholder":101},[77,15160,15161],{"class":79,"line":98},[77,15162,1079],{},[10,15164,1082],{},[68,15166,15168],{"className":15167,"code":1086,"language":123,"meta":73},[121],[50,15169,1086],{"__ignoreMap":73},[10,15171,1091],{},[10,15173,1094],{},[68,15175,15176],{"className":70,"code":1097,"language":72,"meta":73,"style":73},[50,15177,15178,15182,15186,15190,15194,15198],{"__ignoreMap":73},[77,15179,15180],{"class":79,"line":80},[77,15181,1104],{},[77,15183,15184],{"class":79,"line":86},[77,15185,102],{"emptyLinePlaceholder":101},[77,15187,15188],{"class":79,"line":92},[77,15189,1113],{},[77,15191,15192],{"class":79,"line":98},[77,15193,1118],{},[77,15195,15196],{"class":79,"line":105},[77,15197,1123],{},[77,15199,15200],{"class":79,"line":111},[77,15201,1128],{},[10,15203,15204,1134,15206,1138],{},[50,15205,1133],{},[50,15207,1137],{},[14,15209,1142],{"id":1141},[10,15211,1145,15212,1149],{},[50,15213,1148],{},[10,15215,1152],{},[68,15217,15218],{"className":70,"code":1155,"language":72,"meta":73,"style":73},[50,15219,15220,15224,15228,15232],{"__ignoreMap":73},[77,15221,15222],{"class":79,"line":80},[77,15223,1162],{},[77,15225,15226],{"class":79,"line":86},[77,15227,1167],{},[77,15229,15230],{"class":79,"line":92},[77,15231,1172],{},[77,15233,15234],{"class":79,"line":98},[77,15235,1177],{},[10,15237,1180],{},[68,15239,15240],{"className":568,"code":1183,"language":570,"meta":73,"style":73},[50,15241,15242],{"__ignoreMap":73},[77,15243,15244,15246],{"class":79,"line":80},[77,15245,668],{"class":577},[77,15247,1192],{"class":613},[10,15249,1195],{},[14,15251,1199],{"id":1198},[305,15253,1202],{"id":1202},[10,15255,1205],{},[305,15257,1208],{"id":1208},[10,15259,1211],{},[305,15261,1214],{"id":1214},[10,15263,1217],{},[10,15265,1220],{},[68,15267,15268],{"className":70,"code":1223,"language":72,"meta":73,"style":73},[50,15269,15270,15274,15278,15282],{"__ignoreMap":73},[77,15271,15272],{"class":79,"line":80},[77,15273,1230],{},[77,15275,15276],{"class":79,"line":86},[77,15277,102],{"emptyLinePlaceholder":101},[77,15279,15280],{"class":79,"line":92},[77,15281,1239],{},[77,15283,15284],{"class":79,"line":98},[77,15285,1244],{},[10,15287,1247],{},[305,15289,1250],{"id":1250},[10,15291,1253,15292,1256],{},[50,15293,237],{},[10,15295,1259],{},[305,15297,1262],{"id":1262},[10,15299,1265],{},[14,15301,1269],{"id":1268},[10,15303,15304],{},[26,15305],{"alt":1274,"src":1275},[10,15307,1278],{},[37,15309,15310,15312,15314,15316,15318,15320,15322,15324],{},[40,15311,1283],{},[40,15313,1286],{},[40,15315,1289],{},[40,15317,1292],{},[40,15319,1295],{},[40,15321,1298],{},[40,15323,1301],{},[40,15325,1304],{},[10,15327,1307],{},[14,15329,1311],{"id":1310},[10,15331,1314],{},[10,15333,1317],{},[14,15335,1321],{"id":1320},[10,15337,1324],{},[10,15339,1327],{},[10,15341,1330],{},[14,15343,1333],{"id":1333},[10,15345,1336],{},[10,15347,1339],{},[189,15349,1342],{},{"title":73,"searchDepth":86,"depth":86,"links":15351},[15352,15353,15354,15361,15362,15363,15364],{"id":1051,"depth":86,"text":1052},{"id":1141,"depth":86,"text":1142},{"id":1198,"depth":86,"text":1199,"children":15355},[15356,15357,15358,15359,15360],{"id":1202,"depth":92,"text":1202},{"id":1208,"depth":92,"text":1208},{"id":1214,"depth":92,"text":1214},{"id":1250,"depth":92,"text":1250},{"id":1262,"depth":92,"text":1262},{"id":1268,"depth":86,"text":1269},{"id":1310,"depth":86,"text":1311},{"id":1320,"depth":86,"text":1321},{"id":1333,"depth":86,"text":1333},{},{"title":1034,"description":73},[202,1366,1367],{"id":219,"title":220,"body":15369,"category":202,"cover":203,"description":73,"extension":204,"meta":15948,"navigation":101,"path":1022,"pinned":207,"publishedAt":1023,"seo":15949,"slug":1025,"stem":1026,"summary":1027,"tags":15950,"updatedAt":1023,"visible":101,"__hash__":1031},{"type":7,"value":15370,"toc":15924},[15371,15373,15375,15377,15381,15383,15385,15409,15421,15423,15425,15430,15434,15438,15450,15454,15458,15462,15464,15498,15500,15504,15508,15510,15532,15562,15574,15584,15592,15594,15600,15610,15612,15617,15621,15623,15637,15643,15663,15665,15667,15669,15679,15683,15685,15694,15698,15700,15702,15722,15726,15728,15730,15732,15734,15754,15756,15758,15760,15786,15788,15804,15806,15822,15826,15828,15830,15850,15852,15854,15856,15860,15870,15872,15874,15876,15886,15894,15896,15898,15912,15922],[14,15372,225],{"id":225},[10,15374,228],{},[10,15376,231],{},[10,15378,234,15379,238],{},[50,15380,237],{},[14,15382,241],{"id":241},[10,15384,244],{},[246,15386,15387,15389],{},[10,15388,250],{},[246,15390,15391,15397,15399,15403,15405],{},[10,15392,255,15393,259,15395,263],{},[50,15394,258],{},[50,15396,262],{},[10,15398,266],{},[10,15400,269,15401,274],{},[271,15402,273],{},[10,15404,277],{},[10,15406,15407],{},[26,15408],{"alt":282,"src":283},[246,15410,15411,15413],{},[10,15412,288],{},[246,15414,15415,15417],{},[10,15416,293],{},[10,15418,15419],{},[26,15420],{"alt":298,"src":299},[14,15422,303],{"id":302},[305,15424,308],{"id":307},[10,15426,311,15427,319],{},[313,15428,318],{"href":315,"rel":15429},[317],[246,15431,15432],{},[10,15433,324],{},[10,15435,15436],{},[26,15437],{"alt":329,"src":330},[37,15439,15440,15444,15448],{},[40,15441,335,15442,339],{},[271,15443,338],{},[40,15445,342,15446,339],{},[271,15447,345],{},[40,15449,348],{},[10,15451,15452],{},[26,15453],{"alt":353,"src":354},[246,15455,15456],{},[10,15457,359],{},[10,15459,15460],{},[26,15461],{"alt":364,"src":365},[305,15463,369],{"id":368},[246,15465,15466,15470,15474,15494],{},[246,15467,15468],{},[10,15469,376],{},[10,15471,379,15472,383],{},[271,15473,382],{},[68,15475,15476],{"className":70,"code":386,"language":72,"meta":73,"style":73},[50,15477,15478,15482,15486,15490],{"__ignoreMap":73},[77,15479,15480],{"class":79,"line":80},[77,15481,393],{},[77,15483,15484],{"class":79,"line":86},[77,15485,398],{},[77,15487,15488],{"class":79,"line":92},[77,15489,403],{},[77,15491,15492],{"class":79,"line":98},[77,15493,408],{},[10,15495,411,15496,415],{},[271,15497,414],{},[10,15499,418],{},[10,15501,421,15502,424],{},[50,15503,72],{},[10,15505,15506],{},[26,15507],{"alt":429,"src":430},[10,15509,433],{},[246,15511,15512,15514,15518],{},[10,15513,438],{},[10,15515,15516],{},[271,15517,443],{},[246,15519,15520,15524,15528],{},[10,15521,448,15522,451],{},[50,15523,72],{},[10,15525,454,15526,457],{},[50,15527,72],{},[10,15529,460,15530,464],{},[271,15531,463],{},[246,15533,15534,15536,15540],{},[10,15535,469],{},[10,15537,15538],{},[271,15539,474],{},[246,15541,15542,15548,15556,15558],{},[10,15543,15544,482,15546,486],{},[50,15545,481],{},[50,15547,485],{},[10,15549,489,15550,492,15552,496,15554,500],{},[50,15551,481],{},[271,15553,495],{},[271,15555,499],{},[10,15557,503],{},[10,15559,15560,509],{},[271,15561,508],{},[246,15563,15564,15566],{},[10,15565,514],{},[246,15567,15568,15572],{},[10,15569,519,15570,523],{},[271,15571,522],{},[10,15573,526],{},[246,15575,15576,15580],{},[10,15577,531,15578],{},[271,15579,534],{},[10,15581,15582],{},[26,15583],{"alt":539,"src":540},[246,15585,15586,15588],{},[10,15587,545],{},[10,15589,15590],{},[26,15591],{"alt":539,"src":550},[305,15593,554],{"id":553},[10,15595,557,15596,561,15598,565],{},[50,15597,560],{},[50,15599,564],{},[68,15601,15602],{"className":568,"code":569,"language":570,"meta":73,"style":73},[50,15603,15604],{"__ignoreMap":73},[77,15605,15606,15608],{"class":79,"line":80},[77,15607,72],{"class":577},[77,15609,581],{"class":580},[10,15611,584],{},[68,15613,15615],{"className":15614,"code":588,"language":123,"meta":73},[121],[50,15616,588],{"__ignoreMap":73},[10,15618,15619],{},[26,15620],{"alt":539,"src":595},[10,15622,598],{},[68,15624,15625],{"className":568,"code":601,"language":570,"meta":73,"style":73},[50,15626,15627],{"__ignoreMap":73},[77,15628,15629,15631,15633,15635],{"class":79,"line":80},[77,15630,72],{"class":577},[77,15632,610],{"class":580},[77,15634,614],{"class":613},[77,15636,581],{"class":580},[10,15638,619,15639,622,15641,626],{},[50,15640,72],{},[50,15642,625],{},[68,15644,15645],{"className":568,"code":629,"language":570,"meta":73,"style":73},[50,15646,15647,15653],{"__ignoreMap":73},[77,15648,15649,15651],{"class":79,"line":80},[77,15650,485],{"class":577},[77,15652,581],{"class":580},[77,15654,15655,15657,15659,15661],{"class":79,"line":86},[77,15656,485],{"class":577},[77,15658,610],{"class":580},[77,15660,614],{"class":613},[77,15662,581],{"class":580},[14,15664,651],{"id":650},[305,15666,655],{"id":654},[10,15668,658],{},[68,15670,15671],{"className":568,"code":661,"language":570,"meta":73,"style":73},[50,15672,15673],{"__ignoreMap":73},[77,15674,15675,15677],{"class":79,"line":80},[77,15676,668],{"class":577},[77,15678,581],{"class":580},[10,15680,673,15681,677],{},[50,15682,676],{},[305,15684,681],{"id":680},[10,15686,311,15687,689,15690,339,15692,696],{},[313,15688,688],{"href":686,"rel":15689},[317],[271,15691,692],{},[50,15693,695],{},[10,15695,699,15696,703],{},[50,15697,702],{},[305,15699,707],{"id":706},[10,15701,710],{},[68,15703,15704],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,15705,15706,15712],{"__ignoreMap":73},[77,15707,15708,15710],{"class":79,"line":80},[77,15709,668],{"class":577},[77,15711,581],{"class":580},[77,15713,15714,15716,15718,15720],{"class":79,"line":86},[77,15715,668],{"class":577},[77,15717,610],{"class":580},[77,15719,614],{"class":613},[77,15721,581],{"class":580},[10,15723,734,15724,737],{},[50,15725,668],{},[14,15727,741],{"id":740},[10,15729,744],{},[305,15731,748],{"id":747},[10,15733,751],{},[68,15735,15736],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,15737,15738,15744],{"__ignoreMap":73},[77,15739,15740,15742],{"class":79,"line":80},[77,15741,668],{"class":577},[77,15743,581],{"class":580},[77,15745,15746,15748,15750,15752],{"class":79,"line":86},[77,15747,668],{"class":577},[77,15749,610],{"class":580},[77,15751,614],{"class":613},[77,15753,581],{"class":580},[10,15755,774],{},[305,15757,778],{"id":777},[10,15759,781],{},[68,15761,15762],{"className":568,"code":784,"language":570,"meta":73,"style":73},[50,15763,15764,15772],{"__ignoreMap":73},[77,15765,15766,15768,15770],{"class":79,"line":80},[77,15767,791],{"class":577},[77,15769,794],{"class":613},[77,15771,797],{"class":613},[77,15773,15774,15776,15778,15780,15782,15784],{"class":79,"line":86},[77,15775,791],{"class":577},[77,15777,794],{"class":613},[77,15779,806],{"class":613},[77,15781,809],{"class":613},[77,15783,812],{"class":613},[77,15785,815],{"class":613},[10,15787,818],{},[68,15789,15790],{"className":568,"code":821,"language":570,"meta":73,"style":73},[50,15791,15792],{"__ignoreMap":73},[77,15793,15794,15796,15798,15800,15802],{"class":79,"line":80},[77,15795,791],{"class":577},[77,15797,830],{"class":613},[77,15799,806],{"class":613},[77,15801,809],{"class":613},[77,15803,837],{"class":613},[10,15805,840],{},[68,15807,15808],{"className":568,"code":843,"language":570,"meta":73,"style":73},[50,15809,15810],{"__ignoreMap":73},[77,15811,15812,15814,15816,15818,15820],{"class":79,"line":80},[77,15813,791],{"class":577},[77,15815,852],{"class":613},[77,15817,855],{"class":580},[77,15819,858],{"class":613},[77,15821,861],{"class":613},[10,15823,15824,866],{},[50,15825,791],{},[305,15827,870],{"id":869},[10,15829,873],{},[68,15831,15832],{"className":568,"code":713,"language":570,"meta":73,"style":73},[50,15833,15834,15840],{"__ignoreMap":73},[77,15835,15836,15838],{"class":79,"line":80},[77,15837,668],{"class":577},[77,15839,581],{"class":580},[77,15841,15842,15844,15846,15848],{"class":79,"line":86},[77,15843,668],{"class":577},[77,15845,610],{"class":580},[77,15847,614],{"class":613},[77,15849,581],{"class":580},[10,15851,896],{},[14,15853,899],{"id":899},[305,15855,903],{"id":902},[10,15857,906,15858,910],{},[50,15859,909],{},[133,15861,15862,15866,15868],{},[40,15863,915,15864,918],{},[50,15865,625],{},[40,15867,921],{},[40,15869,924],{},[10,15871,927],{},[305,15873,931],{"id":930},[10,15875,934],{},[68,15877,15878],{"className":568,"code":661,"language":570,"meta":73,"style":73},[50,15879,15880],{"__ignoreMap":73},[77,15881,15882,15884],{"class":79,"line":80},[77,15883,668],{"class":577},[77,15885,581],{"class":580},[10,15887,947,15888,950,15890,953,15892,339],{},[50,15889,668],{},[50,15891,72],{},[50,15893,668],{},[305,15895,959],{"id":958},[10,15897,962],{},[68,15899,15900],{"className":568,"code":965,"language":570,"meta":73,"style":73},[50,15901,15902],{"__ignoreMap":73},[77,15903,15904,15906,15908,15910],{"class":79,"line":80},[77,15905,668],{"class":577},[77,15907,610],{"class":580},[77,15909,614],{"class":613},[77,15911,581],{"class":580},[10,15913,980,15914,983,15916,986,15918,989,15920,993],{},[50,15915,668],{},[50,15917,72],{},[50,15919,485],{},[50,15921,992],{},[189,15923,996],{},{"title":73,"searchDepth":86,"depth":86,"links":15925},[15926,15927,15928,15933,15938,15943],{"id":225,"depth":86,"text":225},{"id":241,"depth":86,"text":241},{"id":302,"depth":86,"text":303,"children":15929},[15930,15931,15932],{"id":307,"depth":92,"text":308},{"id":368,"depth":92,"text":369},{"id":553,"depth":92,"text":554},{"id":650,"depth":86,"text":651,"children":15934},[15935,15936,15937],{"id":654,"depth":92,"text":655},{"id":680,"depth":92,"text":681},{"id":706,"depth":92,"text":707},{"id":740,"depth":86,"text":741,"children":15939},[15940,15941,15942],{"id":747,"depth":92,"text":748},{"id":777,"depth":92,"text":778},{"id":869,"depth":92,"text":870},{"id":899,"depth":86,"text":899,"children":15944},[15945,15946,15947],{"id":902,"depth":92,"text":903},{"id":930,"depth":92,"text":931},{"id":958,"depth":92,"text":959},{},{"title":220,"description":73},[202,1029,1030],1786973365421]