[{"data":1,"prerenderedAt":15993},["ShallowReactive",2],{"post-python-booleans-comparisons-logic":3,"sidebar-posts":282,"post-related-source":9184},{"id":4,"title":5,"body":6,"category":267,"cover":268,"description":12,"extension":269,"meta":270,"navigation":114,"path":271,"pinned":272,"publishedAt":273,"seo":274,"slug":275,"stem":276,"summary":277,"tags":278,"updatedAt":273,"visible":114,"__hash__":281},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":8,"toc":255},"minimark",[9,13,17,20,23,30,42,45,80,83,86,146,149,157,160,163,185,189,192,198,206,209,223,226,242,245,248,251],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[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\u002F09-boolean-logic.svg",[10,31,32,33,37,38,41],{},"比较表达式先产生 ",[34,35,36],"code",{},"True"," 或 ",[34,39,40],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,43,44],{"id":44},"核心概念",[46,47,48,63,77],"ul",{},[49,50,51,54,55,58,59,62],"li",{},[34,52,53],{},"=="," 判断是否相等，",[34,56,57],{},"!="," 判断是否不等；单个 ",[34,60,61],{},"="," 是赋值。",[49,64,65,68,69,72,73,76],{},[34,66,67],{},"and"," 要求两侧都为真，",[34,70,71],{},"or"," 只需一侧为真，",[34,74,75],{},"not"," 取反。",[49,78,79],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,81,82],{"id":82},"跟着示例运行",[10,84,85],{},"把下面代码保存到本课脚本并运行：",[87,88,93],"pre",{"className":89,"code":90,"language":91,"meta":92,"style":92},"language-python shiki shiki-themes github-dark","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","python","",[34,94,95,103,109,116,122,128,134,140],{"__ignoreMap":92},[96,97,100],"span",{"class":98,"line":99},"line",1,[96,101,102],{},"age = 20\n",[96,104,106],{"class":98,"line":105},2,[96,107,108],{},"has_ticket = True\n",[96,110,112],{"class":98,"line":111},3,[96,113,115],{"emptyLinePlaceholder":114},true,"\n",[96,117,119],{"class":98,"line":118},4,[96,120,121],{},"is_adult = age >= 18\n",[96,123,125],{"class":98,"line":124},5,[96,126,127],{},"can_enter = is_adult and has_ticket\n",[96,129,131],{"class":98,"line":130},6,[96,132,133],{},"print(is_adult)\n",[96,135,137],{"class":98,"line":136},7,[96,138,139],{},"print(can_enter)\n",[96,141,143],{"class":98,"line":142},8,[96,144,145],{},"print(not has_ticket)\n",[10,147,148],{},"预期结果：",[87,150,155],{"className":151,"code":153,"language":154,"meta":92},[152],"language-text","True\nTrue\nFalse\n","text",[34,156,153],{"__ignoreMap":92},[10,158,159],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,161,162],{"id":162},"按执行顺序拆开看",[164,165,166,176],"ol",{},[49,167,168,171,172,175],{},[34,169,170],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,173,174],{},"is_adult","，这一步没有任何分支跳转。",[49,177,178,181,182,184],{},[34,179,180],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,183,75],{}," 只对紧随其后的值取反。",[186,187,188],"h3",{"id":188},"再看一个具体细节",[10,190,191],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,193,194],{},[26,195],{"alt":196,"src":197},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,199,200,202,203,205],{},[34,201,67],{}," 只有“真、真”得到真；",[34,204,71],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,207,208],{"id":208},"初学者容易混淆的地方",[46,210,211,220],{},[49,212,213,214,216,217,219],{},"用单个等号判断相等。",[34,215,61],{}," 是赋值，",[34,218,53],{}," 才是相等比较。",[49,221,222],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,224,225],{"id":225},"练习",[164,227,228,235],{},[49,229,230,231,234],{},"判断数字 ",[34,232,233],{},"15"," 是否同时大于 10 且小于 20。",[49,236,237,238,241],{},"分别修改年龄和票据状态，记录 ",[34,239,240],{},"can_enter"," 的四种组合结果。",[10,243,244],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,246,247],{"id":247},"本篇边界",[10,249,250],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,253,254],"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":92,"searchDepth":105,"depth":105,"links":256},[257,258,259,260,261,264,265,266],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":262},[263],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",false,"2026-08-17",{"title":5,"description":12},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[267,279,280],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",[283,1095,1432,1566,1718,1897,2085,2250,2434,2615,2807,2976,3160,3337,3494,3665,3830,4045,4274,4456,4620,4809,4997,5152,5312,5509,5706,5920,6087,6331,6512,6717,6912,7096,7297,7587,7779,8008,8203,8423,8663,8867],{"id":284,"title":285,"body":286,"category":267,"cover":268,"description":92,"extension":269,"meta":1084,"navigation":114,"path":1085,"pinned":272,"publishedAt":1086,"seo":1087,"slug":1088,"stem":1089,"summary":1090,"tags":1091,"updatedAt":1086,"visible":114,"__hash__":1094},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":287,"toc":1060},[288,291,294,297,304,307,310,349,365,369,373,384,389,395,413,419,424,430,434,480,483,489,495,498,529,574,591,605,615,619,630,646,649,655,660,663,681,691,712,716,720,723,735,742,746,761,768,772,775,796,802,806,809,813,816,836,839,843,846,880,883,902,905,926,931,935,938,958,961,964,968,975,989,992,996,999,1009,1020,1024,1027,1042,1057],[14,289,290],{"id":290},"引言",[10,292,293],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,295,296],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,298,299,300,303],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,301,302],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,305,306],{"id":306},"扫盲",[10,308,309],{},"那么这里有几个概念：",[311,312,313,316],"blockquote",{},[10,314,315],{},"为什么需要安装python解释器？",[311,317,318,329,332,340,343],{},[10,319,320,321,324,325,328],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,322,323],{},"0","和",[34,326,327],{},"1","组成的机器指令。",[10,330,331],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,333,334,335,339],{},"这样，我们就能用",[336,337,338],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,341,342],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,344,345],{},[26,346],{"alt":347,"src":348},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[311,350,351,354],{},[10,352,353],{},"pip又是什么？",[311,355,356,359],{},[10,357,358],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,360,361],{},[26,362],{"alt":363,"src":364},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,366,368],{"id":367},"windows-安装","Windows 安装",[186,370,372],{"id":371},"_1-下载官方安装程序","1. 下载官方安装程序",[10,374,375,376,383],{},"打开 ",[377,378,382],"a",{"href":379,"rel":380},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[381],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[311,385,386],{},[10,387,388],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,390,391],{},[26,392],{"alt":393,"src":394},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[46,396,397,404,410],{},[49,398,399,400,403],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[336,401,402],{},"Windows installer (64-bit)","。",[49,405,406,407,403],{},"搭载 ARM 处理器的 Windows 设备选择 ",[336,408,409],{},"Windows installer (ARM64)",[49,411,412],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,414,415],{},[26,416],{"alt":417,"src":418},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[311,420,421],{},[10,422,423],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,425,426],{},[26,427],{"alt":428,"src":429},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[186,431,433],{"id":432},"_2-安装并加入-path","2. 安装并加入 PATH",[311,435,436,441,448,473],{},[311,437,438],{},[10,439,440],{},"PATH 环境变量",[10,442,443,444,447],{},"Windows 有一个特殊的变量叫 ",[336,445,446],{},"PATH","，它里面存了一串文件夹路径，比如：",[87,449,451],{"className":89,"code":450,"language":91,"meta":92,"style":92},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,452,453,458,463,468],{"__ignoreMap":92},[96,454,455],{"class":98,"line":99},[96,456,457],{},"D:\\Python313\\\n",[96,459,460],{"class":98,"line":105},[96,461,462],{},"D:\\Python313\\Scripts\\\n",[96,464,465],{"class":98,"line":111},[96,466,467],{},"C:\\Windows\\System32\\\n",[96,469,470],{"class":98,"line":118},[96,471,472],{},"...\n",[10,474,475,476,479],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[336,477,478],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,481,482],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,484,485,486,488],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,487,91],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,490,491],{},[26,492],{"alt":493,"src":494},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,496,497],{},"对安装界面最底部的两个勾选项分别解释 :",[311,499,500,503,508],{},[10,501,502],{},"Add python.exe to PATH",[10,504,505],{},[336,506,507],{},"把 Python 添加到系统环境变量",[311,509,510,516,522],{},[10,511,512,513,515],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,514,91],{}," 就能运行",[10,517,518,519,521],{},"不勾选的话，命令行输入 ",[34,520,91],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,523,524,525,528],{},"必须",[336,526,527],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[311,530,531,534,539],{},[10,532,533],{},"Use admin privileges when installing py.exe",[10,535,536],{},[336,537,538],{},"使用管理员权限安装 py.exe（Python 启动器）",[311,540,541,551,565,568],{},[10,542,543,546,547,550],{},[34,544,545],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,548,549],{},"py"," 来启动 Python。",[10,552,553,554,556,557,560,561,564],{},"勾选后，",[34,555,545],{}," 会安装到",[336,558,559],{},"系统级目录","，电脑上",[336,562,563],{},"所有用户账户","都能用",[10,566,567],{},"不勾选，只有当前用户能用",[10,569,570,573],{},[336,571,572],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[311,575,576,579],{},[10,577,578],{},"操作建议",[311,580,581,588],{},[10,582,583,584,587],{},"两个都勾上之后，再点 ",[336,585,586],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,589,590],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[311,592,593,599],{},[10,594,595,596],{},"Python 安装的",[336,597,598],{},"可选功能页",[10,600,601],{},[26,602],{"alt":603,"src":604},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[311,606,607,610],{},[10,608,609],{},"高级选项页",[10,611,612],{},[26,613],{"alt":603,"src":614},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[186,616,618],{"id":617},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,620,621,622,625,626,629],{},"按 ",[34,623,624],{},"Win + R","，输入 ",[34,627,628],{},"cmd"," 并回车，然后执行：",[87,631,635],{"className":632,"code":633,"language":634,"meta":92,"style":92},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,636,637],{"__ignoreMap":92},[96,638,639,642],{"class":98,"line":99},[96,640,91],{"class":641},"svObZ",[96,643,645],{"class":644},"sDLfK"," --version\n",[10,647,648],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[87,650,653],{"className":651,"code":652,"language":154,"meta":92},[152],"Python 3.x.x\n",[34,654,652],{"__ignoreMap":92},[10,656,657],{},[26,658],{"alt":603,"src":659},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,661,662],{},"继续检查 pip：",[87,664,666],{"className":632,"code":665,"language":634,"meta":92,"style":92},"python -m pip --version\n",[34,667,668],{"__ignoreMap":92},[96,669,670,672,675,679],{"class":98,"line":99},[96,671,91],{"class":641},[96,673,674],{"class":644}," -m",[96,676,678],{"class":677},"sU2Wk"," pip",[96,680,645],{"class":644},[10,682,683,684,686,687,690],{},"如果 ",[34,685,91],{}," 无法识别，但 ",[34,688,689],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[87,692,694],{"className":632,"code":693,"language":634,"meta":92,"style":92},"py --version\npy -m pip --version\n",[34,695,696,702],{"__ignoreMap":92},[96,697,698,700],{"class":98,"line":99},[96,699,549],{"class":641},[96,701,645],{"class":644},[96,703,704,706,708,710],{"class":98,"line":105},[96,705,549],{"class":641},[96,707,674],{"class":644},[96,709,678],{"class":677},[96,711,645],{"class":644},[14,713,715],{"id":714},"macos-安装","macOS 安装",[186,717,719],{"id":718},"_1-先检查现有环境","1. 先检查现有环境",[10,721,722],{},"打开“终端”应用，执行：",[87,724,726],{"className":632,"code":725,"language":634,"meta":92,"style":92},"python3 --version\n",[34,727,728],{"__ignoreMap":92},[96,729,730,733],{"class":98,"line":99},[96,731,732],{"class":641},"python3",[96,734,645],{"class":644},[10,736,737,738,741],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,739,740],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[186,743,745],{"id":744},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,747,375,748,753,754,403,757,760],{},[377,749,752],{"href":750,"rel":751},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[381],"Python macOS 下载页","，下载当前稳定版的 ",[336,755,756],{},"macOS 64-bit universal2 installer",[34,758,759],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,762,763,764,767],{},"下载完成后打开 ",[34,765,766],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[186,769,771],{"id":770},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,773,774],{},"安装完成后重新打开终端，执行：",[87,776,778],{"className":632,"code":777,"language":634,"meta":92,"style":92},"python3 --version\npython3 -m pip --version\n",[34,779,780,786],{"__ignoreMap":92},[96,781,782,784],{"class":98,"line":99},[96,783,732],{"class":641},[96,785,645],{"class":644},[96,787,788,790,792,794],{"class":98,"line":105},[96,789,732],{"class":641},[96,791,674],{"class":644},[96,793,678],{"class":677},[96,795,645],{"class":644},[10,797,798,799,801],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,800,732],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,803,805],{"id":804},"linux-安装","Linux 安装",[10,807,808],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[186,810,812],{"id":811},"_1-检查是否已经安装","1. 检查是否已经安装",[10,814,815],{},"打开终端，执行：",[87,817,818],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,819,820,826],{"__ignoreMap":92},[96,821,822,824],{"class":98,"line":99},[96,823,732],{"class":641},[96,825,645],{"class":644},[96,827,828,830,832,834],{"class":98,"line":105},[96,829,732],{"class":641},[96,831,674],{"class":644},[96,833,678],{"class":677},[96,835,645],{"class":644},[10,837,838],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[186,840,842],{"id":841},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,844,845],{},"Ubuntu 或 Debian：",[87,847,849],{"className":632,"code":848,"language":634,"meta":92,"style":92},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,850,851,862],{"__ignoreMap":92},[96,852,853,856,859],{"class":98,"line":99},[96,854,855],{"class":641},"sudo",[96,857,858],{"class":677}," apt",[96,860,861],{"class":677}," update\n",[96,863,864,866,868,871,874,877],{"class":98,"line":105},[96,865,855],{"class":641},[96,867,858],{"class":677},[96,869,870],{"class":677}," install",[96,872,873],{"class":677}," python3",[96,875,876],{"class":677}," python3-pip",[96,878,879],{"class":677}," python3-venv\n",[10,881,882],{},"Fedora：",[87,884,886],{"className":632,"code":885,"language":634,"meta":92,"style":92},"sudo dnf install python3 python3-pip\n",[34,887,888],{"__ignoreMap":92},[96,889,890,892,895,897,899],{"class":98,"line":99},[96,891,855],{"class":641},[96,893,894],{"class":677}," dnf",[96,896,870],{"class":677},[96,898,873],{"class":677},[96,900,901],{"class":677}," python3-pip\n",[10,903,904],{},"Arch Linux：",[87,906,908],{"className":632,"code":907,"language":634,"meta":92,"style":92},"sudo pacman -S python python-pip\n",[34,909,910],{"__ignoreMap":92},[96,911,912,914,917,920,923],{"class":98,"line":99},[96,913,855],{"class":641},[96,915,916],{"class":677}," pacman",[96,918,919],{"class":644}," -S",[96,921,922],{"class":677}," python",[96,924,925],{"class":677}," python-pip\n",[10,927,928,930],{},[34,929,855],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[186,932,934],{"id":933},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,936,937],{},"安装结束后执行：",[87,939,940],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,941,942,948],{"__ignoreMap":92},[96,943,944,946],{"class":98,"line":99},[96,945,732],{"class":641},[96,947,645],{"class":644},[96,949,950,952,954,956],{"class":98,"line":105},[96,951,732],{"class":641},[96,953,674],{"class":644},[96,955,678],{"class":677},[96,957,645],{"class":644},[10,959,960],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,962,963],{"id":963},"常见问题",[186,965,967],{"id":966},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,969,970,971,974],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,972,973],{},"python --version","。如果仍然失败，按下面的顺序检查：",[164,976,977,983,986],{},[49,978,979,980,982],{},"执行 ",[34,981,689],{},"，确认 Python Launcher 是否可用。",[49,984,985],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[49,987,988],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,990,991],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[186,993,995],{"id":994},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,997,998],{},"先尝试：",[87,1000,1001],{"className":632,"code":725,"language":634,"meta":92,"style":92},[34,1002,1003],{"__ignoreMap":92},[96,1004,1005,1007],{"class":98,"line":99},[96,1006,732],{"class":641},[96,1008,645],{"class":644},[10,1010,1011,1012,1014,1015,1017,1018,403],{},"在这两个系统中，只有 ",[34,1013,732],{}," 命令而没有 ",[34,1016,91],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,1019,732],{},[186,1021,1023],{"id":1022},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,1025,1026],{},"先使用模块方式检查：",[87,1028,1030],{"className":632,"code":1029,"language":634,"meta":92,"style":92},"python3 -m pip --version\n",[34,1031,1032],{"__ignoreMap":92},[96,1033,1034,1036,1038,1040],{"class":98,"line":99},[96,1035,732],{"class":641},[96,1037,674],{"class":644},[96,1039,678],{"class":677},[96,1041,645],{"class":644},[10,1043,1044,1045,1047,1048,37,1050,1052,1053,1056],{},"Windows 用户将命令中的 ",[34,1046,732],{}," 换成 ",[34,1049,91],{},[34,1051,549],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,1054,1055],{},"python3-pip","；不要直接使用其他系统的安装命令。",[252,1058,1059],{},"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":92,"searchDepth":105,"depth":105,"links":1061},[1062,1063,1064,1069,1074,1079],{"id":290,"depth":105,"text":290},{"id":306,"depth":105,"text":306},{"id":367,"depth":105,"text":368,"children":1065},[1066,1067,1068],{"id":371,"depth":111,"text":372},{"id":432,"depth":111,"text":433},{"id":617,"depth":111,"text":618},{"id":714,"depth":105,"text":715,"children":1070},[1071,1072,1073],{"id":718,"depth":111,"text":719},{"id":744,"depth":111,"text":745},{"id":770,"depth":111,"text":771},{"id":804,"depth":105,"text":805,"children":1075},[1076,1077,1078],{"id":811,"depth":111,"text":812},{"id":841,"depth":111,"text":842},{"id":933,"depth":111,"text":934},{"id":963,"depth":105,"text":963,"children":1080},[1081,1082,1083],{"id":966,"depth":111,"text":967},{"id":994,"depth":111,"text":995},{"id":1022,"depth":111,"text":1023},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":285,"description":92},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[267,1092,1093],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1096,"title":1097,"body":1098,"category":267,"cover":1105,"description":92,"extension":269,"meta":1421,"navigation":114,"path":1422,"pinned":272,"publishedAt":1423,"seo":1424,"slug":1425,"stem":1426,"summary":1427,"tags":1428,"updatedAt":1423,"visible":114,"__hash__":1431},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1099,"toc":1406},[1100,1106,1109,1112,1116,1119,1143,1146,1152,1155,1158,1192,1202,1206,1213,1216,1241,1244,1256,1259,1263,1266,1269,1272,1275,1278,1281,1284,1308,1311,1314,1320,1323,1326,1329,1333,1339,1342,1368,1371,1375,1378,1381,1385,1388,1391,1394,1397,1400,1403],[10,1101,1102],{},[26,1103],{"alt":1104,"src":1105},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1107,1108],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1110,1111],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1113,1115],{"id":1114},"python-代码是什么样的","Python 代码是什么样的",[10,1117,1118],{},"下面是一段简单的 Python 代码：",[87,1120,1122],{"className":89,"code":1121,"language":91,"meta":92,"style":92},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1123,1124,1129,1134,1138],{"__ignoreMap":92},[96,1125,1126],{"class":98,"line":99},[96,1127,1128],{},"name = \"Python\"\n",[96,1130,1131],{"class":98,"line":105},[96,1132,1133],{},"year = 2026\n",[96,1135,1136],{"class":98,"line":111},[96,1137,115],{"emptyLinePlaceholder":114},[96,1139,1140],{"class":98,"line":118},[96,1141,1142],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1144,1145],{},"运行结果：",[87,1147,1150],{"className":1148,"code":1149,"language":154,"meta":92},[152],"正在学习 Python，当前年份是 2026\n",[34,1151,1149],{"__ignoreMap":92},[10,1153,1154],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1156,1157],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[87,1159,1161],{"className":89,"code":1160,"language":91,"meta":92,"style":92},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1162,1163,1168,1172,1177,1182,1187],{"__ignoreMap":92},[96,1164,1165],{"class":98,"line":99},[96,1166,1167],{},"score = 85\n",[96,1169,1170],{"class":98,"line":105},[96,1171,115],{"emptyLinePlaceholder":114},[96,1173,1174],{"class":98,"line":111},[96,1175,1176],{},"if score >= 60:\n",[96,1178,1179],{"class":98,"line":118},[96,1180,1181],{},"    print(\"成绩合格\")\n",[96,1183,1184],{"class":98,"line":124},[96,1185,1186],{},"else:\n",[96,1188,1189],{"class":98,"line":130},[96,1190,1191],{},"    print(\"需要继续学习\")\n",[10,1193,1194,1197,1198,1201],{},[34,1195,1196],{},"if"," 和 ",[34,1199,1200],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1203,1205],{"id":1204},"python-如何运行代码","Python 如何运行代码",[10,1207,1208,1209,1212],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1210,1211],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1214,1215],{},"交互式环境适合快速验证一个表达式：",[87,1217,1219],{"className":89,"code":1218,"language":91,"meta":92,"style":92},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1220,1221,1226,1231,1236],{"__ignoreMap":92},[96,1222,1223],{"class":98,"line":99},[96,1224,1225],{},">>> 10 + 20\n",[96,1227,1228],{"class":98,"line":105},[96,1229,1230],{},"30\n",[96,1232,1233],{"class":98,"line":111},[96,1234,1235],{},">>> \"Python\".lower()\n",[96,1237,1238],{"class":98,"line":118},[96,1239,1240],{},"'python'\n",[10,1242,1243],{},"需要保存和重复运行的程序，则可以写入文件：",[87,1245,1247],{"className":632,"code":1246,"language":634,"meta":92,"style":92},"python3 hello.py\n",[34,1248,1249],{"__ignoreMap":92},[96,1250,1251,1253],{"class":98,"line":99},[96,1252,732],{"class":641},[96,1254,1255],{"class":677}," hello.py\n",[10,1257,1258],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1260,1262],{"id":1261},"python-的特点","Python 的特点",[186,1264,1265],{"id":1265},"语法相对简洁",[10,1267,1268],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[186,1270,1271],{"id":1271},"支持多种编程方式",[10,1273,1274],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[186,1276,1277],{"id":1277},"标准库比较完整",[10,1279,1280],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1282,1283],{},"例如，获取当前时间：",[87,1285,1287],{"className":89,"code":1286,"language":91,"meta":92,"style":92},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1288,1289,1294,1298,1303],{"__ignoreMap":92},[96,1290,1291],{"class":98,"line":99},[96,1292,1293],{},"from datetime import datetime\n",[96,1295,1296],{"class":98,"line":105},[96,1297,115],{"emptyLinePlaceholder":114},[96,1299,1300],{"class":98,"line":111},[96,1301,1302],{},"now = datetime.now()\n",[96,1304,1305],{"class":98,"line":118},[96,1306,1307],{},"print(now)\n",[10,1309,1310],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[186,1312,1313],{"id":1313},"第三方工具丰富",[10,1315,1316,1317,1319],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1318,302],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1321,1322],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[186,1324,1325],{"id":1325},"支持多个操作系统",[10,1327,1328],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1330,1332],{"id":1331},"python-可以做什么","Python 可以做什么",[10,1334,1335],{},[26,1336],{"alt":1337,"src":1338},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1340,1341],{},"Python 的应用范围比较广，常见方向包括：",[46,1343,1344,1347,1350,1353,1356,1359,1362,1365],{},[49,1345,1346],{},"编写自动化脚本，批量处理文件和重复任务；",[49,1348,1349],{},"开发网站后端和 API 服务；",[49,1351,1352],{},"进行数据清洗、统计分析和图表展示；",[49,1354,1355],{},"编写网络爬虫和信息采集工具；",[49,1357,1358],{},"开发自动化测试程序；",[49,1360,1361],{},"进行机器学习和人工智能开发；",[49,1363,1364],{},"编写运维、监控和辅助开发工具；",[49,1366,1367],{},"开发部分桌面应用和插件。",[10,1369,1370],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1372,1374],{"id":1373},"python-的发展","Python 的发展",[10,1376,1377],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1379,1380],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1382,1384],{"id":1383},"python-也有局限","Python 也有局限",[10,1386,1387],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1389,1390],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1392,1393],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1395,1396],{"id":1396},"写在最后",[10,1398,1399],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1401,1402],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[252,1404,1405],{},"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":92,"searchDepth":105,"depth":105,"links":1407},[1408,1409,1410,1417,1418,1419,1420],{"id":1114,"depth":105,"text":1115},{"id":1204,"depth":105,"text":1205},{"id":1261,"depth":105,"text":1262,"children":1411},[1412,1413,1414,1415,1416],{"id":1265,"depth":111,"text":1265},{"id":1271,"depth":111,"text":1271},{"id":1277,"depth":111,"text":1277},{"id":1313,"depth":111,"text":1313},{"id":1325,"depth":111,"text":1325},{"id":1331,"depth":105,"text":1332},{"id":1373,"depth":105,"text":1374},{"id":1383,"depth":105,"text":1384},{"id":1396,"depth":105,"text":1396},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1097,"description":92},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[267,1429,1430],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1433,"title":1434,"body":1435,"category":267,"cover":268,"description":1439,"extension":269,"meta":1557,"navigation":114,"path":1558,"pinned":272,"publishedAt":273,"seo":1559,"slug":1560,"stem":1561,"summary":1562,"tags":1563,"updatedAt":273,"visible":114,"__hash__":1565},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1436,"toc":1547},[1437,1440,1442,1445,1447,1453,1458,1460,1474,1476,1478,1487,1489,1495,1497,1499,1515,1517,1528,1530,1538,1540,1542,1545],[10,1438,1439],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1441,16],{"id":16},[10,1443,1444],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1446,22],{"id":22},[10,1448,1449],{},[26,1450],{"alt":1451,"src":1452},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1454,1455,1457],{},[34,1456,1211],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1459,44],{"id":44},[46,1461,1462,1468,1471],{},[49,1463,1464,1465,1467],{},"源代码是人编写的文本，通常保存在 ",[34,1466,1211],{}," 文件中。",[49,1469,1470],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[49,1472,1473],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1475,82],{"id":82},[10,1477,85],{},[87,1479,1481],{"className":89,"code":1480,"language":91,"meta":92,"style":92},"print(\"你好，Python\")\n",[34,1482,1483],{"__ignoreMap":92},[96,1484,1485],{"class":98,"line":99},[96,1486,1480],{},[10,1488,148],{},[87,1490,1493],{"className":1491,"code":1492,"language":154,"meta":92},[152],"你好，Python\n",[34,1494,1492],{"__ignoreMap":92},[10,1496,159],{},[14,1498,162],{"id":162},[164,1500,1501,1508],{},[49,1502,1503,1504,1507],{},"终端启动解释器后，解释器读取 ",[34,1505,1506],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[49,1509,1510,1511,1514],{},"字符串对象先准备好，再交给 ",[34,1512,1513],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1516,208],{"id":208},[46,1518,1519,1522],{},[49,1520,1521],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[49,1523,1524,1525,1527],{},"认为 ",[34,1526,1211],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1529,225],{"id":225},[164,1531,1532,1535],{},[49,1533,1534],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[49,1536,1537],{},"把示例文字改成自己的学习目标并重新运行。",[10,1539,244],{},[14,1541,247],{"id":247},[10,1543,1544],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,1546,254],{},{"title":92,"searchDepth":105,"depth":105,"links":1548},[1549,1550,1551,1552,1553,1554,1555,1556],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1434,"description":1439},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[267,1429,1564],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1567,"title":1568,"body":1569,"category":267,"cover":268,"description":1573,"extension":269,"meta":1709,"navigation":114,"path":1710,"pinned":272,"publishedAt":273,"seo":1711,"slug":1712,"stem":1713,"summary":1714,"tags":1715,"updatedAt":273,"visible":114,"__hash__":1717},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1570,"toc":1699},[1571,1574,1576,1579,1581,1587,1593,1595,1610,1612,1615,1635,1637,1643,1645,1647,1660,1662,1676,1678,1689,1691,1693,1696],[10,1572,1573],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1575,16],{"id":16},[10,1577,1578],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1580,22],{"id":22},[10,1582,1583],{},[26,1584],{"alt":1585,"src":1586},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1588,1589,1590,1592],{},"终端收到 ",[34,1591,732],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1594,44],{"id":44},[46,1596,1597,1600,1603],{},[49,1598,1599],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[49,1601,1602],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[49,1604,1605,1606,1609],{},"检查 pip 时使用 ",[34,1607,1608],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1611,82],{"id":82},[10,1613,1614],{},"在 macOS 终端执行：",[87,1616,1617],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,1618,1619,1625],{"__ignoreMap":92},[96,1620,1621,1623],{"class":98,"line":99},[96,1622,732],{"class":641},[96,1624,645],{"class":644},[96,1626,1627,1629,1631,1633],{"class":98,"line":105},[96,1628,732],{"class":641},[96,1630,674],{"class":644},[96,1632,678],{"class":677},[96,1634,645],{"class":644},[10,1636,148],{},[87,1638,1641],{"className":1639,"code":1640,"language":154,"meta":92},[152],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1642,1640],{"__ignoreMap":92},[10,1644,159],{},[14,1646,162],{"id":162},[164,1648,1649,1655],{},[49,1650,1651,1654],{},[34,1652,1653],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[49,1656,1657,1659],{},[34,1658,740],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1661,208],{"id":208},[46,1663,1664,1670],{},[49,1665,1666,1667,1669],{},"看到系统已有 ",[34,1668,732],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[49,1671,1672,1673,1675],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1674,732],{},"，不修改系统自带工具。",[14,1677,225],{"id":225},[164,1679,1680,1686],{},[49,1681,979,1682,1685],{},[34,1683,1684],{},"which python3","，记录当前解释器路径。",[49,1687,1688],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1690,244],{},[14,1692,247],{"id":247},[10,1694,1695],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,1697,1698],{},"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":92,"searchDepth":105,"depth":105,"links":1700},[1701,1702,1703,1704,1705,1706,1707,1708],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1568,"description":1573},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[267,1716,1092],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1719,"title":1720,"body":1721,"category":267,"cover":268,"description":1886,"extension":269,"meta":1887,"navigation":114,"path":1888,"pinned":272,"publishedAt":273,"seo":1889,"slug":1890,"stem":1891,"summary":1892,"tags":1893,"updatedAt":273,"visible":114,"__hash__":1896},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1722,"toc":1876},[1723,1729,1731,1734,1736,1742,1745,1747,1771,1773,1775,1802,1804,1810,1812,1814,1832,1834,1848,1850,1864,1866,1868,1874],[10,1724,1725,1726,1728],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1727,1211],{}," 脚本。",[14,1730,16],{"id":16},[10,1732,1733],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1735,22],{"id":22},[10,1737,1738],{},[26,1739],{"alt":1740,"src":1741},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1743,1744],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1746,44],{"id":44},[46,1748,1749,1758,1765],{},[49,1750,1751,1752,1754,1755,403],{},"在终端输入 ",[34,1753,732],{}," 进入 REPL，提示符通常是 ",[34,1756,1757],{},">>>",[49,1759,1760,1761,1764],{},"输入 ",[34,1762,1763],{},"exit()"," 或按 Control-D 退出 REPL。",[49,1766,1767,1768,1770],{},"需要保存、复查或多次运行的代码应写入 ",[34,1769,1211],{}," 文件。",[14,1772,82],{"id":82},[10,1774,85],{},[87,1776,1780],{"className":1777,"code":1778,"language":1779,"meta":92,"style":92},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1781,1782,1787,1792,1797],{"__ignoreMap":92},[96,1783,1784],{"class":98,"line":99},[96,1785,1786],{},">>> 2 + 3\n",[96,1788,1789],{"class":98,"line":105},[96,1790,1791],{},"5\n",[96,1793,1794],{"class":98,"line":111},[96,1795,1796],{},">>> \"python\".upper()\n",[96,1798,1799],{"class":98,"line":118},[96,1800,1801],{},"'PYTHON'\n",[10,1803,148],{},[87,1805,1808],{"className":1806,"code":1807,"language":154,"meta":92},[152],"REPL 会直接显示表达式结果\n",[34,1809,1807],{"__ignoreMap":92},[10,1811,159],{},[14,1813,162],{"id":162},[164,1815,1816,1826],{},[49,1817,1818,1819,1822,1823,403],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1820,1821],{},"2 + 3"," 能直接看到 ",[34,1824,1825],{},"5",[49,1827,1828,1829,1831],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1830,1513],{}," 才会写到标准输出。",[14,1833,208],{"id":208},[46,1835,1836,1845],{},[49,1837,1838,1839,1841,1842,1844],{},"把提示符 ",[34,1840,1757],{}," 复制进 ",[34,1843,1211],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[49,1846,1847],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1849,225],{"id":225},[164,1851,1852,1858],{},[49,1853,1854,1855,403],{},"在 REPL 计算 ",[34,1856,1857],{},"12 * 8",[49,1859,1860,1861,1863],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1862,1513],{}," 时是否显示结果。",[10,1865,244],{},[14,1867,247],{"id":247},[10,1869,1870,1871,1873],{},"本篇目标是根据任务选择 REPL 或 ",[34,1872,1211],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,1875,254],{},{"title":92,"searchDepth":105,"depth":105,"links":1877},[1878,1879,1880,1881,1882,1883,1884,1885],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1720,"description":1886},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[267,1894,1895],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1898,"title":1899,"body":1900,"category":267,"cover":268,"description":1904,"extension":269,"meta":2075,"navigation":114,"path":2076,"pinned":272,"publishedAt":273,"seo":2077,"slug":2078,"stem":2079,"summary":2080,"tags":2081,"updatedAt":273,"visible":114,"__hash__":2084},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1901,"toc":2065},[1902,1905,1907,1910,1912,1918,1924,1926,1944,1946,1948,1993,1995,2001,2003,2005,2027,2029,2041,2043,2055,2057,2059,2062],[10,1903,1904],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1906,16],{"id":16},[10,1908,1909],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1911,22],{"id":22},[10,1913,1914],{},[26,1915],{"alt":1916,"src":1917},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1919,1920,1923],{},[34,1921,1922],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1925,44],{"id":44},[46,1927,1928,1931,1941],{},[49,1929,1930],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[49,1932,1933,1936,1937,1940],{},[34,1934,1935],{},"pwd"," 显示当前目录，",[34,1938,1939],{},"ls"," 显示目录里的文件。",[49,1942,1943],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1945,82],{"id":82},[10,1947,1614],{},[87,1949,1951],{"className":632,"code":1950,"language":634,"meta":92,"style":92},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1952,1953,1961,1968,1973,1987],{"__ignoreMap":92},[96,1954,1955,1958],{"class":98,"line":99},[96,1956,1957],{"class":641},"mkdir",[96,1959,1960],{"class":677}," python-study\n",[96,1962,1963,1966],{"class":98,"line":105},[96,1964,1965],{"class":644},"cd",[96,1967,1960],{"class":677},[96,1969,1970],{"class":98,"line":111},[96,1971,1972],{"class":644},"pwd\n",[96,1974,1975,1978,1981,1985],{"class":98,"line":118},[96,1976,1977],{"class":644},"printf",[96,1979,1980],{"class":677}," 'print(\"项目已经运行\")\\n'",[96,1982,1984],{"class":1983},"snl16"," >",[96,1986,1255],{"class":677},[96,1988,1989,1991],{"class":98,"line":124},[96,1990,732],{"class":641},[96,1992,1255],{"class":677},[10,1994,148],{},[87,1996,1999],{"className":1997,"code":1998,"language":154,"meta":92},[152],"项目已经运行\n",[34,2000,1998],{"__ignoreMap":92},[10,2002,159],{},[14,2004,162],{"id":162},[164,2006,2007,2018],{},[49,2008,2009,2011,2012,2014,2015,2017],{},[34,2010,1957],{}," 创建目录，",[34,2013,1965],{}," 改变终端当前目录，",[34,2016,1935],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[49,2019,2020,2022,2023,2026],{},[34,2021,1922],{}," 会在当前目录寻找 ",[34,2024,2025],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2028,208],{"id":208},[46,2030,2031,2038],{},[49,2032,2033,2034,1197,2036,403],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,2035,1935],{},[34,2037,1939],{},[49,2039,2040],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2042,225],{"id":225},[164,2044,2045,2052],{},[49,2046,2047,2048,2051],{},"新建 ",[34,2049,2050],{},"lesson01.py"," 并输出课程编号。",[49,2053,2054],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2056,244],{},[14,2058,247],{"id":247},[10,2060,2061],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,2063,2064],{},"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":92,"searchDepth":105,"depth":105,"links":2066},[2067,2068,2069,2070,2071,2072,2073,2074],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1899,"description":1904},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[267,2082,2083],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2086,"title":2087,"body":2088,"category":267,"cover":268,"description":2092,"extension":269,"meta":2240,"navigation":114,"path":2241,"pinned":272,"publishedAt":273,"seo":2242,"slug":2243,"stem":2244,"summary":2245,"tags":2246,"updatedAt":273,"visible":114,"__hash__":2249},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2089,"toc":2230},[2090,2093,2095,2098,2100,2106,2117,2119,2139,2141,2143,2163,2165,2171,2173,2175,2194,2196,2204,2206,2221,2223,2225,2228],[10,2091,2092],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2094,16],{"id":16},[10,2096,2097],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2099,22],{"id":22},[10,2101,2102],{},[26,2103],{"alt":2104,"src":2105},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2107,2108,2109,403,2111,2114,2115,403],{},"Python 先计算表达式，再把得到的对象交给 ",[34,2110,1513],{},[34,2112,2113],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2116,1821],{},[14,2118,44],{"id":44},[46,2120,2121,2127,2136],{},[49,2122,2123,2126],{},[34,2124,2125],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[49,2128,2129,2132,2133,403],{},[34,2130,2131],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2134,2135],{},"12",[49,2137,2138],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2140,82],{"id":82},[10,2142,85],{},[87,2144,2146],{"className":89,"code":2145,"language":91,"meta":92,"style":92},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2147,2148,2153,2158],{"__ignoreMap":92},[96,2149,2150],{"class":98,"line":99},[96,2151,2152],{},"print(42)\n",[96,2154,2155],{"class":98,"line":105},[96,2156,2157],{},"print(7 + 5)\n",[96,2159,2160],{"class":98,"line":111},[96,2161,2162],{},"print(\"Python 基础课\")\n",[10,2164,148],{},[87,2166,2169],{"className":2167,"code":2168,"language":154,"meta":92},[152],"42\n12\nPython 基础课\n",[34,2170,2168],{"__ignoreMap":92},[10,2172,159],{},[14,2174,162],{"id":162},[164,2176,2177,2185],{},[49,2178,2179,2182,2183,403],{},[34,2180,2181],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2184,2135],{},[49,2186,2187,2189,2190,2193],{},[34,2188,1513],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2191,2192],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2195,208],{"id":208},[46,2197,2198,2201],{},[49,2199,2200],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[49,2202,2203],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2205,225],{"id":225},[164,2207,2208,2211],{},[49,2209,2210],{},"分别输出一个整数、一个小数和一段文本。",[49,2212,2213,2214,2216,2217,2220],{},"比较 ",[34,2215,2113],{}," 与 ",[34,2218,2219],{},"print(\"2 + 3\")"," 的结果。",[10,2222,244],{},[14,2224,247],{"id":247},[10,2226,2227],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,2229,254],{},{"title":92,"searchDepth":105,"depth":105,"links":2231},[2232,2233,2234,2235,2236,2237,2238,2239],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2087,"description":2092},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[267,2247,2248],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2251,"title":2252,"body":2253,"category":267,"cover":268,"description":2257,"extension":269,"meta":2424,"navigation":114,"path":2425,"pinned":272,"publishedAt":273,"seo":2426,"slug":2427,"stem":2428,"summary":2429,"tags":2430,"updatedAt":273,"visible":114,"__hash__":2433},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2254,"toc":2414},[2255,2258,2260,2263,2265,2271,2274,2276,2302,2304,2306,2334,2336,2342,2344,2346,2370,2372,2388,2390,2405,2407,2409,2412],[10,2256,2257],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2259,16],{"id":16},[10,2261,2262],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2264,22],{"id":22},[10,2266,2267],{},[26,2268],{"alt":2269,"src":2270},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2272,2273],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2275,44],{"id":44},[46,2277,2278,2281,2291],{},[49,2279,2280],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[49,2282,2283,2284,2216,2287,2290],{},"变量名区分大小写，",[34,2285,2286],{},"score",[34,2288,2289],{},"Score"," 是两个名字。",[49,2292,2293,2294,2297,2298,2301],{},"使用能表达含义的名称；不要用 ",[34,2295,2296],{},"list","、",[34,2299,2300],{},"str"," 等内置名称作为普通变量名。",[14,2303,82],{"id":82},[10,2305,85],{},[87,2307,2309],{"className":89,"code":2308,"language":91,"meta":92,"style":92},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2310,2311,2316,2321,2325,2330],{"__ignoreMap":92},[96,2312,2313],{"class":98,"line":99},[96,2314,2315],{},"score = 90\n",[96,2317,2318],{"class":98,"line":105},[96,2319,2320],{},"print(score)\n",[96,2322,2323],{"class":98,"line":111},[96,2324,115],{"emptyLinePlaceholder":114},[96,2326,2327],{"class":98,"line":118},[96,2328,2329],{},"score = 95\n",[96,2331,2332],{"class":98,"line":124},[96,2333,2320],{},[10,2335,148],{},[87,2337,2340],{"className":2338,"code":2339,"language":154,"meta":92},[152],"90\n95\n",[34,2341,2339],{"__ignoreMap":92},[10,2343,159],{},[14,2345,162],{"id":162},[164,2347,2348,2357],{},[49,2349,979,2350,2353,2354,2356],{},[34,2351,2352],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2355,2286],{}," 再绑定到它。",[49,2358,979,2359,2362,2363,2366,2367,403],{},[34,2360,2361],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2364,2365],{},"90"," 没有被改造成 ",[34,2368,2369],{},"95",[14,2371,208],{"id":208},[46,2373,2374,2377],{},[49,2375,2376],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[49,2378,2379,2380,2297,2382,2297,2384,2387],{},"使用 ",[34,2381,2296],{},[34,2383,2300],{},[34,2385,2386],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2389,225],{"id":225},[164,2391,2392,2402],{},[49,2393,2394,2395,1197,2398,2401],{},"创建 ",[34,2396,2397],{},"course_name",[34,2399,2400],{},"lesson_count"," 两个变量并输出。",[49,2403,2404],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2406,244],{},[14,2408,247],{"id":247},[10,2410,2411],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,2413,254],{},{"title":92,"searchDepth":105,"depth":105,"links":2415},[2416,2417,2418,2419,2420,2421,2422,2423],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2252,"description":2257},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[267,2431,2432],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2435,"title":2436,"body":2437,"category":267,"cover":268,"description":2441,"extension":269,"meta":2605,"navigation":114,"path":2606,"pinned":272,"publishedAt":273,"seo":2607,"slug":2608,"stem":2609,"summary":2610,"tags":2611,"updatedAt":273,"visible":114,"__hash__":2614},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2438,"toc":2595},[2439,2442,2444,2447,2449,2455,2458,2460,2489,2491,2493,2537,2539,2545,2547,2549,2563,2565,2576,2578,2586,2588,2590,2593],[10,2440,2441],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2443,16],{"id":16},[10,2445,2446],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2448,22],{"id":22},[10,2450,2451],{},[26,2452],{"alt":2453,"src":2454},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2456,2457],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2459,44],{"id":44},[46,2461,2462,2472,2486],{},[49,2463,2464,2467,2468,2471],{},[34,2465,2466],{},"int"," 表示整数，",[34,2469,2470],{},"float"," 表示浮点数。",[49,2473,2474,2477,2478,2481,2482,2485],{},[34,2475,2476],{},"\u002F"," 总是进行真除法；",[34,2479,2480],{},"\u002F\u002F"," 是向下取整除法，",[34,2483,2484],{},"%"," 得到余数。",[49,2487,2488],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2490,82],{"id":82},[10,2492,85],{},[87,2494,2496],{"className":89,"code":2495,"language":91,"meta":92,"style":92},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2497,2498,2503,2508,2513,2517,2522,2527,2532],{"__ignoreMap":92},[96,2499,2500],{"class":98,"line":99},[96,2501,2502],{},"price = 25\n",[96,2504,2505],{"class":98,"line":105},[96,2506,2507],{},"count = 4\n",[96,2509,2510],{"class":98,"line":111},[96,2511,2512],{},"discount = 0.9\n",[96,2514,2515],{"class":98,"line":118},[96,2516,115],{"emptyLinePlaceholder":114},[96,2518,2519],{"class":98,"line":124},[96,2520,2521],{},"total = price * count * discount\n",[96,2523,2524],{"class":98,"line":130},[96,2525,2526],{},"average = total \u002F count\n",[96,2528,2529],{"class":98,"line":136},[96,2530,2531],{},"print(total)\n",[96,2533,2534],{"class":98,"line":142},[96,2535,2536],{},"print(average)\n",[10,2538,148],{},[87,2540,2543],{"className":2541,"code":2542,"language":154,"meta":92},[152],"90.0\n22.5\n",[34,2544,2542],{"__ignoreMap":92},[10,2546,159],{},[14,2548,162],{"id":162},[164,2550,2551,2557],{},[49,2552,2553,2556],{},[34,2554,2555],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[49,2558,2559,2562],{},[34,2560,2561],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2564,208],{"id":208},[46,2566,2567,2573],{},[49,2568,2569,2570,403],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2571,2572],{},"decimal.Decimal",[49,2574,2575],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2577,225],{"id":225},[164,2579,2580,2583],{},[49,2581,2582],{},"计算 137 除以 10 的商和余数。",[49,2584,2585],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2587,244],{},[14,2589,247],{"id":247},[10,2591,2592],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,2594,254],{},{"title":92,"searchDepth":105,"depth":105,"links":2596},[2597,2598,2599,2600,2601,2602,2603,2604],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2436,"description":2441},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[267,2612,2613],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2616,"title":2617,"body":2618,"category":267,"cover":268,"description":2622,"extension":269,"meta":2797,"navigation":114,"path":2798,"pinned":272,"publishedAt":273,"seo":2799,"slug":2800,"stem":2801,"summary":2802,"tags":2803,"updatedAt":273,"visible":114,"__hash__":2806},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2619,"toc":2785},[2620,2623,2625,2628,2630,2636,2646,2648,2659,2661,2663,2693,2695,2701,2703,2705,2735,2737,2740,2746,2749,2751,2759,2761,2776,2778,2780,2783],[10,2621,2622],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2624,16],{"id":16},[10,2626,2627],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2629,22],{"id":22},[10,2631,2632],{},[26,2633],{"alt":2634,"src":2635},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2637,2638,2639,2642,2643,403],{},"切片 ",[34,2640,2641],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2644,2645],{},"stop - start",[14,2647,44],{"id":44},[46,2649,2650,2653,2656],{},[49,2651,2652],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[49,2654,2655],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[49,2657,2658],{},"切片会创建新的字符串，不会修改原字符串。",[14,2660,82],{"id":82},[10,2662,85],{},[87,2664,2666],{"className":89,"code":2665,"language":91,"meta":92,"style":92},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2667,2668,2673,2678,2683,2688],{"__ignoreMap":92},[96,2669,2670],{"class":98,"line":99},[96,2671,2672],{},"language = \"Python\"\n",[96,2674,2675],{"class":98,"line":105},[96,2676,2677],{},"print(language[0])\n",[96,2679,2680],{"class":98,"line":111},[96,2681,2682],{},"print(language[-1])\n",[96,2684,2685],{"class":98,"line":118},[96,2686,2687],{},"print(language[0:3])\n",[96,2689,2690],{"class":98,"line":124},[96,2691,2692],{},"print(language + \" 3.14\")\n",[10,2694,148],{},[87,2696,2699],{"className":2697,"code":2698,"language":154,"meta":92},[152],"P\nn\nPyt\nPython 3.14\n",[34,2700,2698],{"__ignoreMap":92},[10,2702,159],{},[14,2704,162],{"id":162},[164,2706,2707,2721],{},[49,2708,2709,2710,2712,2713,2716,2717,2720],{},"字符串 ",[34,2711,267],{}," 的正索引从 ",[34,2714,2715],{},"P"," 的 0 开始，负索引从末尾 ",[34,2718,2719],{},"n"," 的 -1 开始。",[49,2722,2723,2726,2727,2730,2731,2734],{},[34,2724,2725],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2728,2729],{},"Pyt","；索引 3 的 ",[34,2732,2733],{},"h"," 不在结果中。",[186,2736,188],{"id":188},[10,2738,2739],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2741,2742],{},[26,2743],{"alt":2744,"src":2745},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2747,2748],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2750,208],{"id":208},[46,2752,2753,2756],{},[49,2754,2755],{},"把第一个字符写成索引 1，造成整体偏移一位。",[49,2757,2758],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2760,225],{"id":225},[164,2762,2763,2773],{},[49,2764,2765,2766,2769,2770,403],{},"从 ",[34,2767,2768],{},"\"programming\""," 中切出 ",[34,2771,2772],{},"\"gram\"",[49,2774,2775],{},"使用负索引取得字符串倒数第二个字符。",[10,2777,244],{},[14,2779,247],{"id":247},[10,2781,2782],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,2784,254],{},{"title":92,"searchDepth":105,"depth":105,"links":2786},[2787,2788,2789,2790,2791,2794,2795,2796],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":2792},[2793],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2617,"description":2622},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[267,2804,2805],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":4,"title":5,"body":2808,"category":267,"cover":268,"description":12,"extension":269,"meta":2973,"navigation":114,"path":271,"pinned":272,"publishedAt":273,"seo":2974,"slug":275,"stem":276,"summary":277,"tags":2975,"updatedAt":273,"visible":114,"__hash__":281},{"type":7,"value":2809,"toc":2961},[2810,2812,2814,2816,2818,2822,2828,2830,2850,2852,2854,2890,2892,2897,2899,2901,2915,2917,2919,2923,2929,2931,2941,2943,2953,2955,2957,2959],[10,2811,12],{},[14,2813,16],{"id":16},[10,2815,19],{},[14,2817,22],{"id":22},[10,2819,2820],{},[26,2821],{"alt":28,"src":29},[10,2823,32,2824,37,2826,41],{},[34,2825,36],{},[34,2827,40],{},[14,2829,44],{"id":44},[46,2831,2832,2840,2848],{},[49,2833,2834,54,2836,58,2838,62],{},[34,2835,53],{},[34,2837,57],{},[34,2839,61],{},[49,2841,2842,68,2844,72,2846,76],{},[34,2843,67],{},[34,2845,71],{},[34,2847,75],{},[49,2849,79],{},[14,2851,82],{"id":82},[10,2853,85],{},[87,2855,2856],{"className":89,"code":90,"language":91,"meta":92,"style":92},[34,2857,2858,2862,2866,2870,2874,2878,2882,2886],{"__ignoreMap":92},[96,2859,2860],{"class":98,"line":99},[96,2861,102],{},[96,2863,2864],{"class":98,"line":105},[96,2865,108],{},[96,2867,2868],{"class":98,"line":111},[96,2869,115],{"emptyLinePlaceholder":114},[96,2871,2872],{"class":98,"line":118},[96,2873,121],{},[96,2875,2876],{"class":98,"line":124},[96,2877,127],{},[96,2879,2880],{"class":98,"line":130},[96,2881,133],{},[96,2883,2884],{"class":98,"line":136},[96,2885,139],{},[96,2887,2888],{"class":98,"line":142},[96,2889,145],{},[10,2891,148],{},[87,2893,2895],{"className":2894,"code":153,"language":154,"meta":92},[152],[34,2896,153],{"__ignoreMap":92},[10,2898,159],{},[14,2900,162],{"id":162},[164,2902,2903,2909],{},[49,2904,2905,171,2907,175],{},[34,2906,170],{},[34,2908,174],{},[49,2910,2911,181,2913,184],{},[34,2912,180],{},[34,2914,75],{},[186,2916,188],{"id":188},[10,2918,191],{},[10,2920,2921],{},[26,2922],{"alt":196,"src":197},[10,2924,2925,202,2927,205],{},[34,2926,67],{},[34,2928,71],{},[14,2930,208],{"id":208},[46,2932,2933,2939],{},[49,2934,213,2935,216,2937,219],{},[34,2936,61],{},[34,2938,53],{},[49,2940,222],{},[14,2942,225],{"id":225},[164,2944,2945,2949],{},[49,2946,230,2947,234],{},[34,2948,233],{},[49,2950,237,2951,241],{},[34,2952,240],{},[10,2954,244],{},[14,2956,247],{"id":247},[10,2958,250],{},[252,2960,254],{},{"title":92,"searchDepth":105,"depth":105,"links":2962},[2963,2964,2965,2966,2967,2970,2971,2972],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":2968},[2969],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5,"description":12},[267,279,280],{"id":2977,"title":2978,"body":2979,"category":267,"cover":268,"description":2983,"extension":269,"meta":3151,"navigation":114,"path":3152,"pinned":272,"publishedAt":273,"seo":3153,"slug":3154,"stem":3155,"summary":3156,"tags":3157,"updatedAt":273,"visible":114,"__hash__":3159},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2980,"toc":3141},[2981,2984,2986,2989,2991,2997,3015,3017,3030,3032,3034,3068,3070,3076,3078,3080,3102,3104,3116,3118,3132,3134,3136,3139],[10,2982,2983],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2985,16],{"id":16},[10,2987,2988],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2990,22],{"id":22},[10,2992,2993],{},[26,2994],{"alt":2995,"src":2996},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2998,2999,3002,3003,3006,3007,3010,3011,3014],{},[34,3000,3001],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,3004,3005],{},"18","，程序首先得到的也是 ",[34,3008,3009],{},"\"18\"","，需要 ",[34,3012,3013],{},"int()"," 后才能按整数参与计算。",[14,3016,44],{"id":44},[46,3018,3019,3022,3027],{},[49,3020,3021],{},"提示文字应告诉用户需要输入什么。",[49,3023,3024,3026],{},[34,3025,3013],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[49,3028,3029],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3031,82],{"id":82},[10,3033,85],{},[87,3035,3037],{"className":89,"code":3036,"language":91,"meta":92,"style":92},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,3038,3039,3044,3049,3054,3058,3063],{"__ignoreMap":92},[96,3040,3041],{"class":98,"line":99},[96,3042,3043],{},"name = input(\"请输入姓名：\")\n",[96,3045,3046],{"class":98,"line":105},[96,3047,3048],{},"age_text = input(\"请输入年龄：\")\n",[96,3050,3051],{"class":98,"line":111},[96,3052,3053],{},"age = int(age_text)\n",[96,3055,3056],{"class":98,"line":118},[96,3057,115],{"emptyLinePlaceholder":114},[96,3059,3060],{"class":98,"line":124},[96,3061,3062],{},"print(\"你好，\" + name)\n",[96,3064,3065],{"class":98,"line":130},[96,3066,3067],{},"print(age + 1)\n",[10,3069,148],{},[87,3071,3074],{"className":3072,"code":3073,"language":154,"meta":92},[152],"根据输入显示姓名，并输出下一年的年龄\n",[34,3075,3073],{"__ignoreMap":92},[10,3077,159],{},[14,3079,162],{"id":162},[164,3081,3082,3092],{},[49,3083,3084,3085,3087,3088,3091],{},"两次 ",[34,3086,3001],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3089,3090],{},"age_text"," 用来提醒这仍是文本。",[49,3093,3094,3097,3098,3101],{},[34,3095,3096],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3099,3100],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3103,208],{"id":208},[46,3105,3106,3113],{},[49,3107,3108,3109,3112],{},"直接计算 ",[34,3110,3111],{},"input(...) + 1","，忽略输入结果是字符串。",[49,3114,3115],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3117,225],{"id":225},[164,3119,3120,3123],{},[49,3121,3122],{},"接收两个整数并输出它们的和。",[49,3124,1760,3125,3128,3129,3131],{},[34,3126,3127],{},"18.5"," 给 ",[34,3130,3013],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3133,244],{},[14,3135,247],{"id":247},[10,3137,3138],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,3140,254],{},{"title":92,"searchDepth":105,"depth":105,"links":3142},[3143,3144,3145,3146,3147,3148,3149,3150],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2978,"description":2983},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[267,2386,3158],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3161,"title":3162,"body":3163,"category":267,"cover":268,"description":3167,"extension":269,"meta":3327,"navigation":114,"path":3328,"pinned":272,"publishedAt":273,"seo":3329,"slug":3330,"stem":3331,"summary":3332,"tags":3333,"updatedAt":273,"visible":114,"__hash__":3336},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3164,"toc":3317},[3165,3168,3170,3173,3175,3181,3188,3190,3204,3206,3208,3247,3249,3255,3257,3259,3278,3280,3295,3297,3308,3310,3312,3315],[10,3166,3167],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3169,16],{"id":16},[10,3171,3172],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3174,22],{"id":22},[10,3176,3177],{},[26,3178],{"alt":3179,"src":3180},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3182,3183,3184,3187],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3185,3186],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3189,44],{"id":44},[46,3191,3192,3195,3198],{},[49,3193,3194],{},"列表使用方括号，元素之间用逗号分隔。",[49,3196,3197],{},"列表可变，可以替换、追加和删除元素。",[49,3199,3200,3201,403],{},"访问不存在的索引会产生 ",[34,3202,3203],{},"IndexError",[14,3205,82],{"id":82},[10,3207,85],{},[87,3209,3211],{"className":89,"code":3210,"language":91,"meta":92,"style":92},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3212,3213,3218,3223,3227,3232,3237,3242],{"__ignoreMap":92},[96,3214,3215],{"class":98,"line":99},[96,3216,3217],{},"scores = [82, 90, 76]\n",[96,3219,3220],{"class":98,"line":105},[96,3221,3222],{},"print(scores[0])\n",[96,3224,3225],{"class":98,"line":111},[96,3226,115],{"emptyLinePlaceholder":114},[96,3228,3229],{"class":98,"line":118},[96,3230,3231],{},"scores[1] = 95\n",[96,3233,3234],{"class":98,"line":124},[96,3235,3236],{},"scores.append(88)\n",[96,3238,3239],{"class":98,"line":130},[96,3240,3241],{},"print(scores)\n",[96,3243,3244],{"class":98,"line":136},[96,3245,3246],{},"print(len(scores))\n",[10,3248,148],{},[87,3250,3253],{"className":3251,"code":3252,"language":154,"meta":92},[152],"82\n[82, 95, 76, 88]\n4\n",[34,3254,3252],{"__ignoreMap":92},[10,3256,159],{},[14,3258,162],{"id":162},[164,3260,3261,3264],{},[49,3262,3263],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[49,3265,3266,3269,3270,3273,3274,3277],{},[34,3267,3268],{},"scores[1] = 95"," 替换第二个位置，",[34,3271,3272],{},"append(88)"," 在末尾增加新位置，",[34,3275,3276],{},"len()"," 因而从 3 变为 4。",[14,3279,208],{"id":208},[46,3281,3282,3292],{},[49,3283,3284,3285,3288,3289,403],{},"访问 ",[34,3286,3287],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3290,3291],{},"len(scores) - 1",[49,3293,3294],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3296,225],{"id":225},[164,3298,3299,3302],{},[49,3300,3301],{},"建立三项学习任务列表，再追加第四项。",[49,3303,3304,3305,3307],{},"修改第二项，并用 ",[34,3306,3276],{}," 检查元素数量。",[10,3309,244],{},[14,3311,247],{"id":247},[10,3313,3314],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,3316,254],{},{"title":92,"searchDepth":105,"depth":105,"links":3318},[3319,3320,3321,3322,3323,3324,3325,3326],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3162,"description":3167},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[267,3334,3335],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3338,"title":3339,"body":3340,"category":267,"cover":268,"description":3344,"extension":269,"meta":3485,"navigation":114,"path":3486,"pinned":272,"publishedAt":273,"seo":3487,"slug":3488,"stem":3489,"summary":3490,"tags":3491,"updatedAt":273,"visible":114,"__hash__":3493},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3341,"toc":3475},[3342,3345,3347,3350,3352,3358,3361,3363,3374,3376,3378,3412,3414,3420,3422,3424,3438,3440,3452,3454,3466,3468,3470,3473],[10,3343,3344],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3346,16],{"id":16},[10,3348,3349],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3351,22],{"id":22},[10,3353,3354],{},[26,3355],{"alt":3356,"src":3357},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3359,3360],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3362,44],{"id":44},[46,3364,3365,3368,3371],{},[49,3366,3367],{},"元组常用来表达固定数量、固定含义的一组值。",[49,3369,3370],{},"只有一个元素的元组必须保留尾随逗号。",[49,3372,3373],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3375,82],{"id":82},[10,3377,85],{},[87,3379,3381],{"className":89,"code":3380,"language":91,"meta":92,"style":92},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3382,3383,3388,3393,3398,3402,3407],{"__ignoreMap":92},[96,3384,3385],{"class":98,"line":99},[96,3386,3387],{},"point = (120, 80)\n",[96,3389,3390],{"class":98,"line":105},[96,3391,3392],{},"print(point[0])\n",[96,3394,3395],{"class":98,"line":111},[96,3396,3397],{},"print(point[1])\n",[96,3399,3400],{"class":98,"line":118},[96,3401,115],{"emptyLinePlaceholder":114},[96,3403,3404],{"class":98,"line":124},[96,3405,3406],{},"single = (5,)\n",[96,3408,3409],{"class":98,"line":130},[96,3410,3411],{},"print(single)\n",[10,3413,148],{},[87,3415,3418],{"className":3416,"code":3417,"language":154,"meta":92},[152],"120\n80\n(5,)\n",[34,3419,3417],{"__ignoreMap":92},[10,3421,159],{},[14,3423,162],{"id":162},[164,3425,3426,3432],{},[49,3427,3428,3431],{},[34,3429,3430],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[49,3433,3434,3437],{},[34,3435,3436],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3439,208],{"id":208},[46,3441,3442,3449],{},[49,3443,3444,3445,3448],{},"把 ",[34,3446,3447],{},"(5)"," 当作元组，实际它仍是整数。",[49,3450,3451],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3453,225],{"id":225},[164,3455,3456,3459],{},[49,3457,3458],{},"用元组表示宽度和高度。",[49,3460,2213,3461,2216,3463,3465],{},[34,3462,3447],{},[34,3464,3436],{}," 的类型。",[10,3467,244],{},[14,3469,247],{"id":247},[10,3471,3472],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,3474,254],{},{"title":92,"searchDepth":105,"depth":105,"links":3476},[3477,3478,3479,3480,3481,3482,3483,3484],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3339,"description":3344},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[267,3492,3335],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3495,"title":3496,"body":3497,"category":267,"cover":268,"description":3501,"extension":269,"meta":3656,"navigation":114,"path":3657,"pinned":272,"publishedAt":273,"seo":3658,"slug":3659,"stem":3660,"summary":3661,"tags":3662,"updatedAt":273,"visible":114,"__hash__":3664},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3498,"toc":3646},[3499,3502,3504,3507,3509,3515,3525,3527,3541,3543,3545,3579,3581,3587,3589,3591,3606,3608,3627,3629,3637,3639,3641,3644],[10,3500,3501],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3503,16],{"id":16},[10,3505,3506],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3508,22],{"id":22},[10,3510,3511],{},[26,3512],{"alt":3513,"src":3514},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3516,3517,3518,3521,3522,3524],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3519,3520],{},"student[\"score\"]"," 读取的是键 ",[34,3523,2286],{}," 对应的值，而不是“第几个元素”。",[14,3526,44],{"id":44},[46,3528,3529,3532,3538],{},[49,3530,3531],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[49,3533,2379,3534,3537],{},[34,3535,3536],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[49,3539,3540],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3542,82],{"id":82},[10,3544,85],{},[87,3546,3548],{"className":89,"code":3547,"language":91,"meta":92,"style":92},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3549,3550,3555,3560,3564,3569,3574],{"__ignoreMap":92},[96,3551,3552],{"class":98,"line":99},[96,3553,3554],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[96,3556,3557],{"class":98,"line":105},[96,3558,3559],{},"print(student[\"name\"])\n",[96,3561,3562],{"class":98,"line":111},[96,3563,115],{"emptyLinePlaceholder":114},[96,3565,3566],{"class":98,"line":118},[96,3567,3568],{},"student[\"score\"] = 95\n",[96,3570,3571],{"class":98,"line":124},[96,3572,3573],{},"student[\"city\"] = \"郑州\"\n",[96,3575,3576],{"class":98,"line":130},[96,3577,3578],{},"print(student)\n",[10,3580,148],{},[87,3582,3585],{"className":3583,"code":3584,"language":154,"meta":92},[152],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3586,3584],{"__ignoreMap":92},[10,3588,159],{},[14,3590,162],{"id":162},[164,3592,3593,3596],{},[49,3594,3595],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[49,3597,3598,3599,3601,3602,3605],{},"给已有键 ",[34,3600,2286],{}," 赋值会更新映射，给新键 ",[34,3603,3604],{},"city"," 赋值会增加映射。",[14,3607,208],{"id":208},[46,3609,3610,3617],{},[49,3611,3612,3613,3616],{},"按位置理解字典并尝试 ",[34,3614,3615],{},"student[0]","，而实际键是字符串。",[49,3618,3619,3620,3623,3624,403],{},"直接读取不确定存在的键并忽略 ",[34,3621,3622],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3625,3626],{},"get()",[14,3628,225],{"id":225},[164,3630,3631,3634],{},[49,3632,3633],{},"建立一本书的标题、作者和页数字典。",[49,3635,3636],{},"添加分类键，再修改页数。",[10,3638,244],{},[14,3640,247],{"id":247},[10,3642,3643],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,3645,254],{},{"title":92,"searchDepth":105,"depth":105,"links":3647},[3648,3649,3650,3651,3652,3653,3654,3655],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3496,"description":3501},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[267,3663,3335],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3666,"title":3667,"body":3668,"category":267,"cover":268,"description":3672,"extension":269,"meta":3821,"navigation":114,"path":3822,"pinned":272,"publishedAt":273,"seo":3823,"slug":3824,"stem":3825,"summary":3826,"tags":3827,"updatedAt":273,"visible":114,"__hash__":3829},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3669,"toc":3811},[3670,3673,3675,3678,3680,3686,3689,3691,3710,3712,3714,3748,3750,3756,3758,3760,3775,3777,3789,3791,3802,3804,3806,3809],[10,3671,3672],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3674,16],{"id":16},[10,3676,3677],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3679,22],{"id":22},[10,3681,3682],{},[26,3683],{"alt":3684,"src":3685},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3687,3688],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3690,44],{"id":44},[46,3692,3693,3696,3699],{},[49,3694,3695],{},"集合中的元素不重复。",[49,3697,3698],{},"集合是无序容器，不要依赖打印顺序或索引。",[49,3700,3701,3702,3705,3706,3709],{},"创建空集合必须写 ",[34,3703,3704],{},"set()","；",[34,3707,3708],{},"{}"," 创建的是空字典。",[14,3711,82],{"id":82},[10,3713,85],{},[87,3715,3717],{"className":89,"code":3716,"language":91,"meta":92,"style":92},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3718,3719,3724,3729,3733,3738,3743],{"__ignoreMap":92},[96,3720,3721],{"class":98,"line":99},[96,3722,3723],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[96,3725,3726],{"class":98,"line":105},[96,3727,3728],{},"right = {\"Python\", \"Docker\"}\n",[96,3730,3731],{"class":98,"line":111},[96,3732,115],{"emptyLinePlaceholder":114},[96,3734,3735],{"class":98,"line":118},[96,3736,3737],{},"print(left & right)\n",[96,3739,3740],{"class":98,"line":124},[96,3741,3742],{},"print(left | right)\n",[96,3744,3745],{"class":98,"line":130},[96,3746,3747],{},"print(\"Git\" in left)\n",[10,3749,148],{},[87,3751,3754],{"className":3752,"code":3753,"language":154,"meta":92},[152],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3755,3753],{"__ignoreMap":92},[10,3757,159],{},[14,3759,162],{"id":162},[164,3761,3762,3765],{},[49,3763,3764],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[49,3766,3767,3770,3771,3774],{},[34,3768,3769],{},"&"," 计算交集，",[34,3772,3773],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3776,208],{"id":208},[46,3778,3779,3786],{},[49,3780,2379,3781,3783,3784,403],{},[34,3782,3708],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3785,3704],{},[49,3787,3788],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3790,225],{"id":225},[164,3792,3793,3799],{},[49,3794,3795,3796,3798],{},"把包含重复标签的列表交给 ",[34,3797,3704],{}," 去重。",[49,3800,3801],{},"计算两组课程标签的交集和差集。",[10,3803,244],{},[14,3805,247],{"id":247},[10,3807,3808],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,3810,254],{},{"title":92,"searchDepth":105,"depth":105,"links":3812},[3813,3814,3815,3816,3817,3818,3819,3820],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3667,"description":3672},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[267,3828,3335],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3831,"title":3832,"body":3833,"category":267,"cover":268,"description":3837,"extension":269,"meta":4035,"navigation":114,"path":4036,"pinned":272,"publishedAt":273,"seo":4037,"slug":4038,"stem":4039,"summary":4040,"tags":4041,"updatedAt":273,"visible":114,"__hash__":4044},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3834,"toc":4023},[3835,3838,3840,3843,3845,3851,3861,3863,3880,3882,3884,3934,3936,3942,3944,3946,3968,3970,3973,3979,3982,3984,3997,3999,4014,4016,4018,4021],[10,3836,3837],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3839,16],{"id":16},[10,3841,3842],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3844,22],{"id":22},[10,3846,3847],{},[26,3848],{"alt":3849,"src":3850},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3852,3853,3856,3857,3860],{},[34,3854,3855],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3858,3859],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3862,44],{"id":44},[46,3864,3865,3874,3877],{},[49,3866,3867,3869,3870,3873],{},[34,3868,53],{}," 比较内容是否相等，",[34,3871,3872],{},"is"," 比较是否为同一个对象。",[49,3875,3876],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[49,3878,3879],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3881,82],{"id":82},[10,3883,85],{},[87,3885,3887],{"className":89,"code":3886,"language":91,"meta":92,"style":92},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3888,3889,3894,3899,3904,3908,3913,3918,3923,3928],{"__ignoreMap":92},[96,3890,3891],{"class":98,"line":99},[96,3892,3893],{},"tasks = [\"变量\", \"字符串\"]\n",[96,3895,3896],{"class":98,"line":105},[96,3897,3898],{},"shared = tasks\n",[96,3900,3901],{"class":98,"line":111},[96,3902,3903],{},"backup = tasks.copy()\n",[96,3905,3906],{"class":98,"line":118},[96,3907,115],{"emptyLinePlaceholder":114},[96,3909,3910],{"class":98,"line":124},[96,3911,3912],{},"tasks.append(\"列表\")\n",[96,3914,3915],{"class":98,"line":130},[96,3916,3917],{},"print(shared)\n",[96,3919,3920],{"class":98,"line":136},[96,3921,3922],{},"print(backup)\n",[96,3924,3925],{"class":98,"line":142},[96,3926,3927],{},"print(tasks is shared)\n",[96,3929,3931],{"class":98,"line":3930},9,[96,3932,3933],{},"print(tasks is backup)\n",[10,3935,148],{},[87,3937,3940],{"className":3938,"code":3939,"language":154,"meta":92},[152],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3941,3939],{"__ignoreMap":92},[10,3943,159],{},[14,3945,162],{"id":162},[164,3947,3948,3954],{},[49,3949,3950,3953],{},[34,3951,3952],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[49,3955,3956,3959,3960,3963,3964,3967],{},[34,3957,3958],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3961,3962],{},"shared"," 能观察到变化，",[34,3965,3966],{},"backup"," 不会。",[186,3969,188],{"id":188},[10,3971,3972],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3974,3975],{},[26,3976],{"alt":3977,"src":3978},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3980,3981],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3983,208],{"id":208},[46,3985,3986,3994],{},[49,3987,3988,3989,3991,3992,403],{},"用 ",[34,3990,53],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,3993,3872],{},[49,3995,3996],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3998,225],{"id":225},[164,4000,4001,4004],{},[49,4002,4003],{},"让两个变量引用同一个字典并修改其中一个。",[49,4005,2379,4006,4009,4010,1197,4012,403],{},[34,4007,4008],{},"copy()"," 创建外层副本，再比较 ",[34,4011,3872],{},[34,4013,53],{},[10,4015,244],{},[14,4017,247],{"id":247},[10,4019,4020],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,4022,254],{},{"title":92,"searchDepth":105,"depth":105,"links":4024},[4025,4026,4027,4028,4029,4032,4033,4034],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":4030},[4031],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3832,"description":3837},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[267,4042,4043],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4046,"title":4047,"body":4048,"category":267,"cover":268,"description":4052,"extension":269,"meta":4265,"navigation":114,"path":4266,"pinned":272,"publishedAt":273,"seo":4267,"slug":4268,"stem":4269,"summary":4270,"tags":4271,"updatedAt":273,"visible":114,"__hash__":4273},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4049,"toc":4252},[4050,4053,4055,4058,4060,4066,4076,4078,4089,4091,4093,4146,4148,4154,4156,4158,4176,4178,4181,4187,4195,4198,4201,4207,4213,4215,4233,4235,4243,4245,4247,4250],[10,4051,4052],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4054,16],{"id":16},[10,4056,4057],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4059,22],{"id":22},[10,4061,4062],{},[26,4063],{"alt":4064,"src":4065},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4067,4068,2297,4070,2297,4073,4075],{},[34,4069,1196],{},[34,4071,4072],{},"elif",[34,4074,1200],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4077,44],{"id":44},[46,4079,4080,4083,4086],{},[49,4081,4082],{},"冒号表示接下来开始一个代码块。",[49,4084,4085],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[49,4087,4088],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4090,82],{"id":82},[10,4092,85],{},[87,4094,4096],{"className":89,"code":4095,"language":91,"meta":92,"style":92},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4097,4098,4103,4107,4112,4117,4122,4127,4131,4136,4140],{"__ignoreMap":92},[96,4099,4100],{"class":98,"line":99},[96,4101,4102],{},"score = int(input(\"请输入分数：\"))\n",[96,4104,4105],{"class":98,"line":105},[96,4106,115],{"emptyLinePlaceholder":114},[96,4108,4109],{"class":98,"line":111},[96,4110,4111],{},"if score >= 90:\n",[96,4113,4114],{"class":98,"line":118},[96,4115,4116],{},"    level = \"优秀\"\n",[96,4118,4119],{"class":98,"line":124},[96,4120,4121],{},"elif score >= 60:\n",[96,4123,4124],{"class":98,"line":130},[96,4125,4126],{},"    level = \"合格\"\n",[96,4128,4129],{"class":98,"line":136},[96,4130,1186],{},[96,4132,4133],{"class":98,"line":142},[96,4134,4135],{},"    level = \"需要继续学习\"\n",[96,4137,4138],{"class":98,"line":3930},[96,4139,115],{"emptyLinePlaceholder":114},[96,4141,4143],{"class":98,"line":4142},10,[96,4144,4145],{},"print(level)\n",[10,4147,148],{},[87,4149,4152],{"className":4150,"code":4151,"language":154,"meta":92},[152],"输入 85 时输出：合格\n",[34,4153,4151],{"__ignoreMap":92},[10,4155,159],{},[14,4157,162],{"id":162},[164,4159,4160,4167],{},[49,4161,4162,4163,4166],{},"输入先转换为整数，程序从 ",[34,4164,4165],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[49,4168,4169,4172,4173,4175],{},[34,4170,4171],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4174,1200],{}," 被跳过；最终三个分支只会选择一个。",[186,4177,188],{"id":188},[10,4179,4180],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4182,4183],{},[26,4184],{"alt":4185,"src":4186},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4188,4189,4191,4192,4194],{},[34,4190,4165],{}," 必须放在 ",[34,4193,4171],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[186,4196,188],{"id":4197},"再看一个具体细节-1",[10,4199,4200],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4202,4203],{},[26,4204],{"alt":4205,"src":4206},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4208,4209,4210,4212],{},"同一缩进层级属于同一个代码块；回到 ",[34,4211,1196],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4214,208],{"id":208},[46,4216,4217,4223],{},[49,4218,4219,4220,4222],{},"先写 ",[34,4221,4171],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[49,4224,4225,4226,4228,4229,4232],{},"混用多个独立 ",[34,4227,1196],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4230,4231],{},"if\u002Felif\u002Felse"," 链。",[14,4234,225],{"id":225},[164,4236,4237,4240],{},[49,4238,4239],{},"根据温度输出“冷、适中、热”三个等级。",[49,4241,4242],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4244,244],{},[14,4246,247],{"id":247},[10,4248,4249],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,4251,254],{},{"title":92,"searchDepth":105,"depth":105,"links":4253},[4254,4255,4256,4257,4258,4262,4263,4264],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":4259},[4260,4261],{"id":188,"depth":111,"text":188},{"id":4197,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4047,"description":4052},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[267,1196,4272],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4275,"title":4276,"body":4277,"category":267,"cover":268,"description":4281,"extension":269,"meta":4447,"navigation":114,"path":4448,"pinned":272,"publishedAt":273,"seo":4449,"slug":4450,"stem":4451,"summary":4452,"tags":4453,"updatedAt":273,"visible":114,"__hash__":4455},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4278,"toc":4435},[4279,4282,4284,4287,4289,4295,4301,4303,4318,4320,4322,4360,4362,4368,4370,4372,4387,4389,4392,4398,4404,4406,4414,4416,4426,4428,4430,4433],[10,4280,4281],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4283,16],{"id":16},[10,4285,4286],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4288,22],{"id":22},[10,4290,4291],{},[26,4292],{"alt":4293,"src":4294},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4296,4297,4300],{},[34,4298,4299],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4302,44],{"id":44},[46,4304,4305,4308,4311],{},[49,4306,4307],{},"进入循环前先准备参与条件判断的状态。",[49,4309,4310],{},"循环体中必须有机会让条件变为假。",[49,4312,4313,4314,4317],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4315,4316],{},"for"," 通常更直接。",[14,4319,82],{"id":82},[10,4321,85],{},[87,4323,4325],{"className":89,"code":4324,"language":91,"meta":92,"style":92},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4326,4327,4332,4336,4341,4346,4351,4355],{"__ignoreMap":92},[96,4328,4329],{"class":98,"line":99},[96,4330,4331],{},"count = 1\n",[96,4333,4334],{"class":98,"line":105},[96,4335,115],{"emptyLinePlaceholder":114},[96,4337,4338],{"class":98,"line":111},[96,4339,4340],{},"while count \u003C= 3:\n",[96,4342,4343],{"class":98,"line":118},[96,4344,4345],{},"    print(\"第\", count, \"次练习\")\n",[96,4347,4348],{"class":98,"line":124},[96,4349,4350],{},"    count = count + 1\n",[96,4352,4353],{"class":98,"line":130},[96,4354,115],{"emptyLinePlaceholder":114},[96,4356,4357],{"class":98,"line":136},[96,4358,4359],{},"print(\"练习结束\")\n",[10,4361,148],{},[87,4363,4366],{"className":4364,"code":4365,"language":154,"meta":92},[152],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4367,4365],{"__ignoreMap":92},[10,4369,159],{},[14,4371,162],{"id":162},[164,4373,4374,4381],{},[49,4375,4376,4377,4380],{},"进入循环前 ",[34,4378,4379],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[49,4382,4383,4384,4386],{},"循环体末尾把 ",[34,4385,4379],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[186,4388,188],{"id":188},[10,4390,4391],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4393,4394],{},[26,4395],{"alt":4396,"src":4397},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4399,4400,4401,4403],{},"第4次检查时 ",[34,4402,4379],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4405,208],{"id":208},[46,4407,4408,4411],{},[49,4409,4410],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[49,4412,4413],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4415,225],{"id":225},[164,4417,4418,4423],{},[49,4419,2379,4420,4422],{},[34,4421,4299],{}," 输出 1 到 5。",[49,4424,4425],{},"计算 1 到 10 的累加和。",[10,4427,244],{},[14,4429,247],{"id":247},[10,4431,4432],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,4434,254],{},{"title":92,"searchDepth":105,"depth":105,"links":4436},[4437,4438,4439,4440,4441,4444,4445,4446],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":4442},[4443],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4276,"description":4281},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[267,4299,4454],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4457,"title":4458,"body":4459,"category":267,"cover":268,"description":4463,"extension":269,"meta":4611,"navigation":114,"path":4612,"pinned":272,"publishedAt":273,"seo":4613,"slug":4614,"stem":4615,"summary":4616,"tags":4617,"updatedAt":273,"visible":114,"__hash__":4619},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4460,"toc":4601},[4461,4464,4466,4469,4471,4477,4482,4484,4498,4500,4502,4540,4542,4548,4550,4552,4569,4571,4579,4581,4592,4594,4596,4599],[10,4462,4463],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4465,16],{"id":16},[10,4467,4468],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4470,22],{"id":22},[10,4472,4473],{},[26,4474],{"alt":4475,"src":4476},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4478,4479,4481],{},[34,4480,4316],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4483,44],{"id":44},[46,4485,4486,4492,4495],{},[49,4487,4488,4491],{},[34,4489,4490],{},"range(1, 4)"," 包含 1，不包含 4。",[49,4493,4494],{},"只需要元素时直接遍历元素，不必手工维护索引。",[49,4496,4497],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4499,82],{"id":82},[10,4501,85],{},[87,4503,4505],{"className":89,"code":4504,"language":91,"meta":92,"style":92},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4506,4507,4512,4516,4521,4526,4530,4535],{"__ignoreMap":92},[96,4508,4509],{"class":98,"line":99},[96,4510,4511],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[96,4513,4514],{"class":98,"line":105},[96,4515,115],{"emptyLinePlaceholder":114},[96,4517,4518],{"class":98,"line":111},[96,4519,4520],{},"for course in courses:\n",[96,4522,4523],{"class":98,"line":118},[96,4524,4525],{},"    print(course)\n",[96,4527,4528],{"class":98,"line":124},[96,4529,115],{"emptyLinePlaceholder":114},[96,4531,4532],{"class":98,"line":130},[96,4533,4534],{},"for number in range(1, 4):\n",[96,4536,4537],{"class":98,"line":136},[96,4538,4539],{},"    print(number)\n",[10,4541,148],{},[87,4543,4546],{"className":4544,"code":4545,"language":154,"meta":92},[152],"变量\n字符串\n列表\n1\n2\n3\n",[34,4547,4545],{"__ignoreMap":92},[10,4549,159],{},[14,4551,162],{"id":162},[164,4553,4554,4564],{},[49,4555,4556,4557,4559,4560,4563],{},"第一个 ",[34,4558,4316],{}," 依次从列表取得字符串，循环变量 ",[34,4561,4562],{},"course"," 每轮重新绑定。",[49,4565,4566,4568],{},[34,4567,4490],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4570,208],{"id":208},[46,4572,4573,4576],{},[49,4574,4575],{},"只需要元素却手工维护索引，增加越界风险。",[49,4577,4578],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4580,225],{"id":225},[164,4582,4583,4586],{},[49,4584,4585],{},"逐项输出一个字符串中的字符。",[49,4587,2379,4588,4591],{},[34,4589,4590],{},"range()"," 输出 2、4、6、8。",[10,4593,244],{},[14,4595,247],{"id":247},[10,4597,4598],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,4600,254],{},{"title":92,"searchDepth":105,"depth":105,"links":4602},[4603,4604,4605,4606,4607,4608,4609,4610],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4458,"description":4463},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[267,4316,4618],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4621,"title":4622,"body":4623,"category":267,"cover":268,"description":4627,"extension":269,"meta":4801,"navigation":114,"path":4802,"pinned":272,"publishedAt":273,"seo":4803,"slug":4804,"stem":4805,"summary":4806,"tags":4807,"updatedAt":273,"visible":114,"__hash__":4808},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4624,"toc":4791},[4625,4628,4630,4633,4635,4641,4651,4653,4672,4674,4676,4728,4730,4736,4738,4740,4754,4756,4772,4774,4782,4784,4786,4789],[10,4626,4627],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4629,16],{"id":16},[10,4631,4632],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4634,22],{"id":22},[10,4636,4637],{},[26,4638],{"alt":4639,"src":4640},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4642,4643,4646,4647,4650],{},[34,4644,4645],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4648,4649],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4652,44],{"id":44},[46,4654,4655,4658,4666],{},[49,4656,4657],{},"先写普通循环，再在确有需要时加入流程控制语句。",[49,4659,4660,4662,4663,4665],{},[34,4661,4645],{}," 前要确认不会跳过 ",[34,4664,4299],{}," 循环中的状态更新。",[49,4667,4668,4669,4671],{},"多层嵌套中 ",[34,4670,4649],{}," 只结束它所在的最内层循环。",[14,4673,82],{"id":82},[10,4675,85],{},[87,4677,4679],{"className":89,"code":4678,"language":91,"meta":92,"style":92},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,4680,4681,4686,4690,4695,4700,4705,4710,4715,4719,4723],{"__ignoreMap":92},[96,4682,4683],{"class":98,"line":99},[96,4684,4685],{},"numbers = [3, -1, 0, 8, 12]\n",[96,4687,4688],{"class":98,"line":105},[96,4689,115],{"emptyLinePlaceholder":114},[96,4691,4692],{"class":98,"line":111},[96,4693,4694],{},"for number in numbers:\n",[96,4696,4697],{"class":98,"line":118},[96,4698,4699],{},"    if number \u003C 0:\n",[96,4701,4702],{"class":98,"line":124},[96,4703,4704],{},"        continue\n",[96,4706,4707],{"class":98,"line":130},[96,4708,4709],{},"    if number == 0:\n",[96,4711,4712],{"class":98,"line":136},[96,4713,4714],{},"        break\n",[96,4716,4717],{"class":98,"line":142},[96,4718,4539],{},[96,4720,4721],{"class":98,"line":3930},[96,4722,115],{"emptyLinePlaceholder":114},[96,4724,4725],{"class":98,"line":4142},[96,4726,4727],{},"print(\"循环结束\")\n",[10,4729,148],{},[87,4731,4734],{"className":4732,"code":4733,"language":154,"meta":92},[152],"3\n循环结束\n",[34,4735,4733],{"__ignoreMap":92},[10,4737,159],{},[14,4739,162],{"id":162},[164,4741,4742,4748],{},[49,4743,4744,4745,4747],{},"遇到 -1 时 ",[34,4746,4645],{}," 立即结束本轮，后面的判断和输出都不执行。",[49,4749,4750,4751,4753],{},"遇到 0 时 ",[34,4752,4649],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4755,208],{"id":208},[46,4757,4758,4763],{},[49,4759,3444,4760,4762],{},[34,4761,4645],{}," 当作结束循环，实际它只跳到下一轮。",[49,4764,4765,4766,4768,4769,4771],{},"在 ",[34,4767,4299],{}," 中把状态更新放在可能被 ",[34,4770,4645],{}," 跳过的位置，造成无限循环。",[14,4773,225],{"id":225},[164,4775,4776,4779],{},[49,4777,4778],{},"跳过列表中的空字符串并输出其他内容。",[49,4780,4781],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4783,244],{},[14,4785,247],{"id":247},[10,4787,4788],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,4790,254],{},{"title":92,"searchDepth":105,"depth":105,"links":4792},[4793,4794,4795,4796,4797,4798,4799,4800],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4622,"description":4627},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[267,4649,4645],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4810,"title":4811,"body":4812,"category":267,"cover":268,"description":4816,"extension":269,"meta":4987,"navigation":114,"path":4988,"pinned":272,"publishedAt":273,"seo":4989,"slug":4990,"stem":4991,"summary":4992,"tags":4993,"updatedAt":273,"visible":114,"__hash__":4996},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4813,"toc":4975},[4814,4817,4819,4822,4824,4830,4833,4835,4859,4861,4863,4897,4899,4905,4907,4909,4926,4928,4931,4937,4940,4942,4956,4958,4966,4968,4970,4973],[10,4815,4816],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4818,16],{"id":16},[10,4820,4821],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4823,22],{"id":22},[10,4825,4826],{},[26,4827],{"alt":4828,"src":4829},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4831,4832],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4834,44],{"id":44},[46,4836,4837,4840,4843],{},[49,4838,4839],{},"每增加一层嵌套，阅读成本都会上升。",[49,4841,4842],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[49,4844,4845,4846,2297,4849,4852,4853,2297,4856,403],{},"变量名使用 ",[34,4847,4848],{},"row",[34,4850,4851],{},"cell"," 等层级含义，避免全部写成 ",[34,4854,4855],{},"i",[34,4857,4858],{},"j",[14,4860,82],{"id":82},[10,4862,85],{},[87,4864,4866],{"className":89,"code":4865,"language":91,"meta":92,"style":92},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4867,4868,4873,4877,4882,4887,4892],{"__ignoreMap":92},[96,4869,4870],{"class":98,"line":99},[96,4871,4872],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[96,4874,4875],{"class":98,"line":105},[96,4876,115],{"emptyLinePlaceholder":114},[96,4878,4879],{"class":98,"line":111},[96,4880,4881],{},"for row in table:\n",[96,4883,4884],{"class":98,"line":118},[96,4885,4886],{},"    for cell in row:\n",[96,4888,4889],{"class":98,"line":124},[96,4890,4891],{},"        print(cell)\n",[96,4893,4894],{"class":98,"line":130},[96,4895,4896],{},"    print(\"一行结束\")\n",[10,4898,148],{},[87,4900,4903],{"className":4901,"code":4902,"language":154,"meta":92},[152],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4904,4902],{"__ignoreMap":92},[10,4906,159],{},[14,4908,162],{"id":162},[164,4910,4911,4923],{},[49,4912,4913,4914,4916,4917,1197,4920,403],{},"外层变量 ",[34,4915,4848],{}," 先引用第一行列表，内层才依次处理 ",[34,4918,4919],{},"A1",[34,4921,4922],{},"A2",[49,4924,4925],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[186,4927,188],{"id":188},[10,4929,4930],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4932,4933],{},[26,4934],{"alt":4935,"src":4936},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4938,4939],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4941,208],{"id":208},[46,4943,4944,4953],{},[49,4945,4946,4947,37,4950,4952],{},"把两层循环变量都叫 ",[34,4948,4949],{},"item",[34,4951,4855],{},"，难以确认当前层级。",[49,4954,4955],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4957,225],{"id":225},[164,4959,4960,4963],{},[49,4961,4962],{},"打印一个 2×3 数字表。",[49,4964,4965],{},"在内层增加条件，只输出大于 3 的元素。",[10,4967,244],{},[14,4969,247],{"id":247},[10,4971,4972],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,4974,254],{},{"title":92,"searchDepth":105,"depth":105,"links":4976},[4977,4978,4979,4980,4981,4984,4985,4986],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":4982},[4983],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4811,"description":4816},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[267,4994,4995],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4998,"title":4999,"body":5000,"category":267,"cover":268,"description":5004,"extension":269,"meta":5142,"navigation":114,"path":5143,"pinned":272,"publishedAt":273,"seo":5144,"slug":5145,"stem":5146,"summary":5147,"tags":5148,"updatedAt":273,"visible":114,"__hash__":5151},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5001,"toc":5132},[5002,5005,5007,5010,5012,5018,5021,5023,5034,5036,5038,5076,5078,5084,5086,5088,5100,5102,5113,5115,5123,5125,5127,5130],[10,5003,5004],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5006,16],{"id":16},[10,5008,5009],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5011,22],{"id":22},[10,5013,5014],{},[26,5015],{"alt":5016,"src":5017},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5019,5020],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5022,44],{"id":44},[46,5024,5025,5028,5031],{},[49,5026,5027],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[49,5029,5030],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[49,5032,5033],{},"推导式创建新列表，不修改输入列表。",[14,5035,82],{"id":82},[10,5037,85],{},[87,5039,5041],{"className":89,"code":5040,"language":91,"meta":92,"style":92},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,5042,5043,5048,5052,5057,5062,5066,5071],{"__ignoreMap":92},[96,5044,5045],{"class":98,"line":99},[96,5046,5047],{},"numbers = [1, 2, 3, 4, 5]\n",[96,5049,5050],{"class":98,"line":105},[96,5051,115],{"emptyLinePlaceholder":114},[96,5053,5054],{"class":98,"line":111},[96,5055,5056],{},"squares = [number * number for number in numbers]\n",[96,5058,5059],{"class":98,"line":118},[96,5060,5061],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[96,5063,5064],{"class":98,"line":124},[96,5065,115],{"emptyLinePlaceholder":114},[96,5067,5068],{"class":98,"line":130},[96,5069,5070],{},"print(squares)\n",[96,5072,5073],{"class":98,"line":136},[96,5074,5075],{},"print(even_squares)\n",[10,5077,148],{},[87,5079,5082],{"className":5080,"code":5081,"language":154,"meta":92},[152],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5083,5081],{"__ignoreMap":92},[10,5085,159],{},[14,5087,162],{"id":162},[164,5089,5090,5093],{},[49,5091,5092],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[49,5094,5095,5096,5099],{},"第二条先用 ",[34,5097,5098],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5101,208],{"id":208},[46,5103,5104,5110],{},[49,5105,5106,5107,5109],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5108,4316],{}," 开始找输入。",[49,5111,5112],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5114,225],{"id":225},[164,5116,5117,5120],{},[49,5118,5119],{},"把字符串列表转换为长度列表。",[49,5121,5122],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5124,244],{},[14,5126,247],{"id":247},[10,5128,5129],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,5131,254],{},{"title":92,"searchDepth":105,"depth":105,"links":5133},[5134,5135,5136,5137,5138,5139,5140,5141],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4999,"description":5004},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[267,5149,5150],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5153,"title":5154,"body":5155,"category":267,"cover":268,"description":5159,"extension":269,"meta":5302,"navigation":114,"path":5303,"pinned":272,"publishedAt":273,"seo":5304,"slug":5305,"stem":5306,"summary":5307,"tags":5308,"updatedAt":273,"visible":114,"__hash__":5311},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5156,"toc":5292},[5157,5160,5162,5165,5167,5173,5176,5178,5189,5191,5193,5232,5234,5240,5242,5244,5259,5261,5269,5271,5283,5285,5287,5290],[10,5158,5159],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5161,16],{"id":16},[10,5163,5164],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5166,22],{"id":22},[10,5168,5169],{},[26,5170],{"alt":5171,"src":5172},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5174,5175],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5177,44],{"id":44},[46,5179,5180,5183,5186],{},[49,5181,5182],{},"函数名描述动作，使用小写字母和下划线。",[49,5184,5185],{},"函数定义要先执行，之后才能调用。",[49,5187,5188],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5190,82],{"id":82},[10,5192,85],{},[87,5194,5196],{"className":89,"code":5195,"language":91,"meta":92,"style":92},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5197,5198,5203,5208,5213,5217,5222,5227],{"__ignoreMap":92},[96,5199,5200],{"class":98,"line":99},[96,5201,5202],{},"def show_progress():\n",[96,5204,5205],{"class":98,"line":105},[96,5206,5207],{},"    print(\"正在学习函数\")\n",[96,5209,5210],{"class":98,"line":111},[96,5211,5212],{},"    print(\"本节完成 50%\")\n",[96,5214,5215],{"class":98,"line":118},[96,5216,115],{"emptyLinePlaceholder":114},[96,5218,5219],{"class":98,"line":124},[96,5220,5221],{},"print(\"调用前\")\n",[96,5223,5224],{"class":98,"line":130},[96,5225,5226],{},"show_progress()\n",[96,5228,5229],{"class":98,"line":136},[96,5230,5231],{},"print(\"调用后\")\n",[10,5233,148],{},[87,5235,5238],{"className":5236,"code":5237,"language":154,"meta":92},[152],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5239,5237],{"__ignoreMap":92},[10,5241,159],{},[14,5243,162],{"id":162},[164,5245,5246,5252],{},[49,5247,979,5248,5251],{},[34,5249,5250],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[49,5253,5254,5255,5258],{},"运行到 ",[34,5256,5257],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5260,208],{"id":208},[46,5262,5263,5266],{},[49,5264,5265],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[49,5267,5268],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5270,225],{"id":225},[164,5272,5273,5280],{},[49,5274,5275,5276,5279],{},"定义 ",[34,5277,5278],{},"show_plan()"," 输出两行学习计划。",[49,5281,5282],{},"连续调用同一个函数两次，观察执行顺序。",[10,5284,244],{},[14,5286,247],{"id":247},[10,5288,5289],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,5291,254],{},{"title":92,"searchDepth":105,"depth":105,"links":5293},[5294,5295,5296,5297,5298,5299,5300,5301],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5154,"description":5159},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[267,5309,5310],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5313,"title":5314,"body":5315,"category":267,"cover":268,"description":5319,"extension":269,"meta":5499,"navigation":114,"path":5500,"pinned":272,"publishedAt":273,"seo":5501,"slug":5502,"stem":5503,"summary":5504,"tags":5505,"updatedAt":273,"visible":114,"__hash__":5508},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5316,"toc":5487},[5317,5320,5322,5325,5327,5333,5340,5342,5359,5361,5363,5397,5399,5405,5407,5409,5430,5432,5435,5441,5451,5453,5468,5470,5478,5480,5482,5485],[10,5318,5319],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5321,16],{"id":16},[10,5323,5324],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5326,22],{"id":22},[10,5328,5329],{},[26,5330],{"alt":5331,"src":5332},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5334,5335,5336,5339],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5337,5338],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5341,44],{"id":44},[46,5343,5344,5347,5350],{},[49,5345,5346],{},"形参出现在函数定义中，实参出现在函数调用中。",[49,5348,5349],{},"局部变量默认只在函数内部可见。",[49,5351,5352,5353,5355,5356,403],{},"没有显式 ",[34,5354,5338],{}," 的函数会返回 ",[34,5357,5358],{},"None",[14,5360,82],{"id":82},[10,5362,85],{},[87,5364,5366],{"className":89,"code":5365,"language":91,"meta":92,"style":92},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,5367,5368,5373,5378,5383,5387,5392],{"__ignoreMap":92},[96,5369,5370],{"class":98,"line":99},[96,5371,5372],{},"def calculate_total(price, count):\n",[96,5374,5375],{"class":98,"line":105},[96,5376,5377],{},"    total = price * count\n",[96,5379,5380],{"class":98,"line":111},[96,5381,5382],{},"    return total\n",[96,5384,5385],{"class":98,"line":118},[96,5386,115],{"emptyLinePlaceholder":114},[96,5388,5389],{"class":98,"line":124},[96,5390,5391],{},"result = calculate_total(25, 4)\n",[96,5393,5394],{"class":98,"line":130},[96,5395,5396],{},"print(result)\n",[10,5398,148],{},[87,5400,5403],{"className":5401,"code":5402,"language":154,"meta":92},[152],"100\n",[34,5404,5402],{"__ignoreMap":92},[10,5406,159],{},[14,5408,162],{"id":162},[164,5410,5411,5420],{},[49,5412,5413,5414,2297,5417,5419],{},"调用时 25 和 4 分别绑定到 ",[34,5415,5416],{},"price",[34,5418,4379],{},"，它们只在本次函数调用的局部范围中使用。",[49,5421,5422,5425,5426,5429],{},[34,5423,5424],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5427,5428],{},"result"," 并输出。",[186,5431,188],{"id":188},[10,5433,5434],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5436,5437],{},[26,5438],{"alt":5439,"src":5440},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5442,5443,2297,5445,1197,5447,5450],{},[34,5444,5416],{},[34,5446,4379],{},[34,5448,5449],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5452,208],{"id":208},[46,5454,5455,5462],{},[49,5456,5457,5458,5461],{},"在函数内部只 ",[34,5459,5460],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[49,5463,5464,5465,5467],{},"试图在函数外直接访问局部变量 ",[34,5466,5449],{},"，它的名字只在调用期间的局部作用域存在。",[14,5469,225],{"id":225},[164,5471,5472,5475],{},[49,5473,5474],{},"编写计算长方形面积的函数。",[49,5476,5477],{},"让函数返回结果后在调用方加上单位再输出。",[10,5479,244],{},[14,5481,247],{"id":247},[10,5483,5484],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,5486,254],{},{"title":92,"searchDepth":105,"depth":105,"links":5488},[5489,5490,5491,5492,5493,5496,5497,5498],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":5494},[5495],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5314,"description":5319},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[267,5506,5507],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5510,"title":5511,"body":5512,"category":267,"cover":268,"description":5516,"extension":269,"meta":5696,"navigation":114,"path":5697,"pinned":272,"publishedAt":273,"seo":5698,"slug":5699,"stem":5700,"summary":5701,"tags":5702,"updatedAt":273,"visible":114,"__hash__":5705},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5513,"toc":5684},[5514,5517,5519,5522,5524,5530,5533,5535,5552,5554,5556,5608,5610,5616,5618,5620,5638,5640,5643,5649,5652,5654,5665,5667,5675,5677,5679,5682],[10,5515,5516],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5518,16],{"id":16},[10,5520,5521],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5523,22],{"id":22},[10,5525,5526],{},[26,5527],{"alt":5528,"src":5529},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5531,5532],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5534,44],{"id":44},[46,5536,5537,5540,5546],{},[49,5538,5539],{},"必需参数应放在有默认值的参数之前。",[49,5541,5542,5545],{},[34,5543,5544],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[49,5547,5548,5551],{},[34,5549,5550],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5553,82],{"id":82},[10,5555,85],{},[87,5557,5559],{"className":89,"code":5558,"language":91,"meta":92,"style":92},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,5560,5561,5566,5571,5575,5580,5585,5589,5594,5599,5603],{"__ignoreMap":92},[96,5562,5563],{"class":98,"line":99},[96,5564,5565],{},"def build_title(name, level=\"基础\"):\n",[96,5567,5568],{"class":98,"line":105},[96,5569,5570],{},"    return name + \"｜\" + level\n",[96,5572,5573],{"class":98,"line":111},[96,5574,115],{"emptyLinePlaceholder":114},[96,5576,5577],{"class":98,"line":118},[96,5578,5579],{},"print(build_title(\"Python\"))\n",[96,5581,5582],{"class":98,"line":124},[96,5583,5584],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[96,5586,5587],{"class":98,"line":130},[96,5588,115],{"emptyLinePlaceholder":114},[96,5590,5591],{"class":98,"line":136},[96,5592,5593],{},"def total(*numbers):\n",[96,5595,5596],{"class":98,"line":142},[96,5597,5598],{},"    return sum(numbers)\n",[96,5600,5601],{"class":98,"line":3930},[96,5602,115],{"emptyLinePlaceholder":114},[96,5604,5605],{"class":98,"line":4142},[96,5606,5607],{},"print(total(10, 20, 30))\n",[10,5609,148],{},[87,5611,5614],{"className":5612,"code":5613,"language":154,"meta":92},[152],"Python｜基础\n异常处理｜进阶\n60\n",[34,5615,5613],{"__ignoreMap":92},[10,5617,159],{},[14,5619,162],{"id":162},[164,5621,5622,5629],{},[49,5623,5624,5625,5628],{},"第一次调用只提供必需参数，",[34,5626,5627],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[49,5630,5631,5634,5635,403],{},[34,5632,5633],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5636,5637],{},"sum()",[186,5639,188],{"id":188},[10,5641,5642],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5644,5645],{},[26,5646],{"alt":5647,"src":5648},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5650,5651],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5653,208],{"id":208},[46,5655,5656,5662],{},[49,5657,5658,5659,5661],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5660,5358],{}," 再在函数内创建。",[49,5663,5664],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5666,225],{"id":225},[164,5668,5669,5672],{},[49,5670,5671],{},"给问候函数增加默认称呼。",[49,5673,5674],{},"编写接收任意数量分数并返回总分的函数。",[10,5676,244],{},[14,5678,247],{"id":247},[10,5680,5681],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,5683,254],{},{"title":92,"searchDepth":105,"depth":105,"links":5685},[5686,5687,5688,5689,5690,5693,5694,5695],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":5691},[5692],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5511,"description":5516},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[267,5703,5704],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5707,"title":5708,"body":5709,"category":267,"cover":268,"description":5713,"extension":269,"meta":5910,"navigation":114,"path":5911,"pinned":272,"publishedAt":273,"seo":5912,"slug":5913,"stem":5914,"summary":5915,"tags":5916,"updatedAt":273,"visible":114,"__hash__":5919},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5710,"toc":5898},[5711,5714,5716,5719,5721,5727,5730,5732,5749,5751,5753,5816,5818,5824,5826,5828,5855,5857,5860,5866,5869,5871,5879,5881,5889,5891,5893,5896],[10,5712,5713],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5715,16],{"id":16},[10,5717,5718],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5720,22],{"id":22},[10,5722,5723],{},[26,5724],{"alt":5725,"src":5726},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5728,5729],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5731,44],{"id":44},[46,5733,5734,5737,5740],{},[49,5735,5736],{},"函数内部赋值默认创建局部变量。",[49,5738,5739],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[49,5741,5742,2216,5745,5748],{},[34,5743,5744],{},"global",[34,5746,5747],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5750,82],{"id":82},[10,5752,85],{},[87,5754,5756],{"className":89,"code":5755,"language":91,"meta":92,"style":92},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5757,5758,5763,5767,5772,5777,5781,5786,5791,5796,5800,5805,5810],{"__ignoreMap":92},[96,5759,5760],{"class":98,"line":99},[96,5761,5762],{},"course = \"Python\"\n",[96,5764,5765],{"class":98,"line":105},[96,5766,115],{"emptyLinePlaceholder":114},[96,5768,5769],{"class":98,"line":111},[96,5770,5771],{},"def outer():\n",[96,5773,5774],{"class":98,"line":118},[96,5775,5776],{},"    level = \"基础\"\n",[96,5778,5779],{"class":98,"line":124},[96,5780,115],{"emptyLinePlaceholder":114},[96,5782,5783],{"class":98,"line":130},[96,5784,5785],{},"    def show():\n",[96,5787,5788],{"class":98,"line":136},[96,5789,5790],{},"        lesson = \"作用域\"\n",[96,5792,5793],{"class":98,"line":142},[96,5794,5795],{},"        print(course, level, lesson)\n",[96,5797,5798],{"class":98,"line":3930},[96,5799,115],{"emptyLinePlaceholder":114},[96,5801,5802],{"class":98,"line":4142},[96,5803,5804],{},"    show()\n",[96,5806,5808],{"class":98,"line":5807},11,[96,5809,115],{"emptyLinePlaceholder":114},[96,5811,5813],{"class":98,"line":5812},12,[96,5814,5815],{},"outer()\n",[10,5817,148],{},[87,5819,5822],{"className":5820,"code":5821,"language":154,"meta":92},[152],"Python 基础 作用域\n",[34,5823,5821],{"__ignoreMap":92},[10,5825,159],{},[14,5827,162],{"id":162},[164,5829,5830,5847],{},[49,5831,5832,5835,5836,5839,5840,5842,5843,5846],{},[34,5833,5834],{},"show()"," 中查找 ",[34,5837,5838],{},"lesson"," 时先在局部找到，查找 ",[34,5841,5627],{}," 时到外层 ",[34,5844,5845],{},"outer()"," 找到。",[49,5848,5849,5851,5852,5854],{},[34,5850,4562],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5853,2248],{}," 最后在内置作用域找到。",[186,5856,188],{"id":188},[10,5858,5859],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5861,5862],{},[26,5863],{"alt":5864,"src":5865},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5867,5868],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5870,208],{"id":208},[46,5872,5873,5876],{},[49,5874,5875],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[49,5877,5878],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5880,225],{"id":225},[164,5882,5883,5886],{},[49,5884,5885],{},"在内外层定义同名变量，观察最近作用域优先。",[49,5887,5888],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5890,244],{},[14,5892,247],{"id":247},[10,5894,5895],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,5897,254],{},{"title":92,"searchDepth":105,"depth":105,"links":5899},[5900,5901,5902,5903,5904,5907,5908,5909],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":5905},[5906],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5708,"description":5713},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[267,5917,5918],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5921,"title":5922,"body":5923,"category":267,"cover":268,"description":5927,"extension":269,"meta":6077,"navigation":114,"path":6078,"pinned":272,"publishedAt":273,"seo":6079,"slug":6080,"stem":6081,"summary":6082,"tags":6083,"updatedAt":273,"visible":114,"__hash__":6086},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5924,"toc":6067},[5925,5928,5930,5933,5935,5941,5944,5946,5965,5967,5969,6003,6005,6011,6013,6015,6030,6032,6044,6046,6058,6060,6062,6065],[10,5926,5927],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5929,16],{"id":16},[10,5931,5932],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5934,22],{"id":22},[10,5936,5937],{},[26,5938],{"alt":5939,"src":5940},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5942,5943],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5945,44],{"id":44},[46,5947,5948,5951,5954],{},[49,5949,5950],{},"文档字符串紧跟在函数定义后的第一条语句。",[49,5952,5953],{},"注解表达接口意图，不代替输入校验和测试。",[49,5955,5956,5957,2297,5959,2297,5961,5964],{},"基础注解优先使用 ",[34,5958,2300],{},[34,5960,2466],{},[34,5962,5963],{},"list[str]"," 等直接写法。",[14,5966,82],{"id":82},[10,5968,85],{},[87,5970,5972],{"className":89,"code":5971,"language":91,"meta":92,"style":92},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5973,5974,5979,5984,5989,5993,5998],{"__ignoreMap":92},[96,5975,5976],{"class":98,"line":99},[96,5977,5978],{},"def format_score(name: str, score: int) -> str:\n",[96,5980,5981],{"class":98,"line":105},[96,5982,5983],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[96,5985,5986],{"class":98,"line":111},[96,5987,5988],{},"    return name + \"：\" + str(score)\n",[96,5990,5991],{"class":98,"line":118},[96,5992,115],{"emptyLinePlaceholder":114},[96,5994,5995],{"class":98,"line":124},[96,5996,5997],{},"print(format_score(\"小郑\", 95))\n",[96,5999,6000],{"class":98,"line":130},[96,6001,6002],{},"print(format_score.__doc__)\n",[10,6004,148],{},[87,6006,6009],{"className":6007,"code":6008,"language":154,"meta":92},[152],"小郑：95\n返回带姓名的分数文本。\n",[34,6010,6008],{"__ignoreMap":92},[10,6012,159],{},[14,6014,162],{"id":162},[164,6016,6017,6027],{},[49,6018,6019,6020,6023,6024,6026],{},"函数签名说明 ",[34,6021,6022],{},"name"," 预期为字符串、",[34,6025,2286],{}," 预期为整数，返回值预期为字符串。",[49,6028,6029],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6031,208],{"id":208},[46,6033,6034,6041],{},[49,6035,6036,6037,6040],{},"认为加了 ",[34,6038,6039],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[49,6042,6043],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6045,225],{"id":225},[164,6047,6048,6051],{},[49,6049,6050],{},"为面积函数补充参数和返回值注解。",[49,6052,6053,6054,6057],{},"通过 ",[34,6055,6056],{},"函数名.__doc__"," 查看文档字符串。",[10,6059,244],{},[14,6061,247],{"id":247},[10,6063,6064],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,6066,254],{},{"title":92,"searchDepth":105,"depth":105,"links":6068},[6069,6070,6071,6072,6073,6074,6075,6076],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5922,"description":5927},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[267,6084,6085],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6088,"title":6089,"body":6090,"category":267,"cover":268,"description":6094,"extension":269,"meta":6321,"navigation":114,"path":6322,"pinned":272,"publishedAt":273,"seo":6323,"slug":6324,"stem":6325,"summary":6326,"tags":6327,"updatedAt":273,"visible":114,"__hash__":6330},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6091,"toc":6309},[6092,6095,6097,6103,6105,6111,6122,6124,6142,6144,6151,6180,6187,6206,6215,6217,6223,6225,6227,6250,6252,6255,6261,6267,6269,6285,6287,6300,6302,6304,6307],[10,6093,6094],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6096,16],{"id":16},[10,6098,6099,6100,6102],{},"本篇只处理“模块、import 与 ",[336,6101,6022],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6104,22],{"id":22},[10,6106,6107],{},[26,6108],{"alt":6109,"src":6110},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6112,6113,6114,6117,6118,6121],{},"同一个文件直接运行时 ",[34,6115,6116],{},"__name__"," 等于 ",[34,6119,6120],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6123,44],{"id":44},[46,6125,6126,6132,6135],{},[49,6127,6128,6129,6131],{},"一个 ",[34,6130,1211],{}," 文件就是一个模块。",[49,6133,6134],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[49,6136,6137,6138,6141],{},"避免使用 ",[34,6139,6140],{},"from module import *","，它会让名字来源不清楚。",[14,6143,82],{"id":82},[10,6145,6146,6147,6150],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6148,6149],{},"calculator.py","：",[87,6152,6154],{"className":89,"code":6153,"language":91,"meta":92,"style":92},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6155,6156,6161,6166,6170,6175],{"__ignoreMap":92},[96,6157,6158],{"class":98,"line":99},[96,6159,6160],{},"def add(left, right):\n",[96,6162,6163],{"class":98,"line":105},[96,6164,6165],{},"    return left + right\n",[96,6167,6168],{"class":98,"line":111},[96,6169,115],{"emptyLinePlaceholder":114},[96,6171,6172],{"class":98,"line":118},[96,6173,6174],{},"if __name__ == \"__main__\":\n",[96,6176,6177],{"class":98,"line":124},[96,6178,6179],{},"    print(add(2, 3))\n",[10,6181,6182,6183,6186],{},"再创建 ",[34,6184,6185],{},"app.py","，从模块中导入函数：",[87,6188,6190],{"className":89,"code":6189,"language":91,"meta":92,"style":92},"from calculator import add\n\nprint(add(10, 20))\n",[34,6191,6192,6197,6201],{"__ignoreMap":92},[96,6193,6194],{"class":98,"line":99},[96,6195,6196],{},"from calculator import add\n",[96,6198,6199],{"class":98,"line":105},[96,6200,115],{"emptyLinePlaceholder":114},[96,6202,6203],{"class":98,"line":111},[96,6204,6205],{},"print(add(10, 20))\n",[10,6207,6208,6209,1197,6212,403],{},"分别执行 ",[34,6210,6211],{},"python3 calculator.py",[34,6213,6214],{},"python3 app.py",[10,6216,148],{},[87,6218,6221],{"className":6219,"code":6220,"language":154,"meta":92},[152],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6222,6220],{"__ignoreMap":92},[10,6224,159],{},[14,6226,162],{"id":162},[164,6228,6229,6239],{},[49,6230,6231,6232,6234,6235,6238],{},"直接运行 ",[34,6233,6149],{}," 时，模块名是 ",[34,6236,6237],{},"__main__","，入口代码输出 5。",[49,6240,6241,6243,6244,6246,6247,6249],{},[34,6242,6185],{}," 导入模块时，",[34,6245,6149],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6248,6185],{}," 调用函数输出 30。",[186,6251,188],{"id":188},[10,6253,6254],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6256,6257],{},[26,6258],{"alt":6259,"src":6260},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6262,6263,6264,6266],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6265,6237],{}," 保护下的演示代码。",[14,6268,208],{"id":208},[46,6270,6271,6278],{},[49,6272,6273,6274,1197,6276,403],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6275,6149],{},[34,6277,6185],{},[49,6279,6280,6281,6284],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6282,6283],{},"json.py","，导致导入目标被遮蔽。",[14,6286,225],{"id":225},[164,6288,6289,6295],{},[49,6290,2394,6291,6294],{},[34,6292,6293],{},"text_tools.py"," 并导出一个格式化函数。",[49,6296,6297,6298,403],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6299,6116],{},[10,6301,244],{},[14,6303,247],{"id":247},[10,6305,6306],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,6308,254],{},{"title":92,"searchDepth":105,"depth":105,"links":6310},[6311,6312,6313,6314,6315,6318,6319,6320],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":6316},[6317],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6089,"description":6094},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[267,6328,6329],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6332,"title":6333,"body":6334,"category":267,"cover":268,"description":6338,"extension":269,"meta":6503,"navigation":114,"path":6504,"pinned":272,"publishedAt":273,"seo":6505,"slug":6506,"stem":6507,"summary":6508,"tags":6509,"updatedAt":273,"visible":114,"__hash__":6511},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6335,"toc":6493},[6336,6339,6341,6344,6346,6352,6355,6357,6371,6373,6375,6421,6423,6429,6431,6433,6459,6461,6471,6473,6484,6486,6488,6491],[10,6337,6338],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6340,16],{"id":16},[10,6342,6343],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6345,22],{"id":22},[10,6347,6348],{},[26,6349],{"alt":6350,"src":6351},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6353,6354],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6356,44],{"id":44},[46,6358,6359,6365,6368],{},[49,6360,6361,6364],{},[34,6362,6363],{},".venv"," 是常见目录名，不应提交到 Git。",[49,6366,6367],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[49,6369,6370],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6372,82],{"id":82},[10,6374,1614],{},[87,6376,6378],{"className":632,"code":6377,"language":634,"meta":92,"style":92},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6379,6380,6392,6400,6406,6416],{"__ignoreMap":92},[96,6381,6382,6384,6386,6389],{"class":98,"line":99},[96,6383,732],{"class":641},[96,6385,674],{"class":644},[96,6387,6388],{"class":677}," venv",[96,6390,6391],{"class":677}," .venv\n",[96,6393,6394,6397],{"class":98,"line":105},[96,6395,6396],{"class":644},"source",[96,6398,6399],{"class":677}," .venv\u002Fbin\u002Factivate\n",[96,6401,6402,6404],{"class":98,"line":111},[96,6403,91],{"class":641},[96,6405,645],{"class":644},[96,6407,6408,6410,6412,6414],{"class":98,"line":118},[96,6409,91],{"class":641},[96,6411,674],{"class":644},[96,6413,678],{"class":677},[96,6415,645],{"class":644},[96,6417,6418],{"class":98,"line":124},[96,6419,6420],{"class":641},"deactivate\n",[10,6422,148],{},[87,6424,6427],{"className":6425,"code":6426,"language":154,"meta":92},[152],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6428,6426],{"__ignoreMap":92},[10,6430,159],{},[14,6432,162],{"id":162},[164,6434,6435,6444],{},[49,6436,6437,6440,6441,6443],{},[34,6438,6439],{},"venv"," 根据当前 ",[34,6442,732],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[49,6445,6446,6447,2216,6449,6452,6453,3705,6455,6458],{},"激活后 ",[34,6448,91],{},[34,6450,6451],{},"python -m pip"," 优先指向 ",[34,6454,6363],{},[34,6456,6457],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6460,208],{"id":208},[46,6462,6463,6466],{},[49,6464,6465],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[49,6467,3444,6468,6470],{},[34,6469,6363],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6472,225],{"id":225},[164,6474,6475,6481],{},[49,6476,6477,6478,403],{},"创建虚拟环境并记录激活前后的 ",[34,6479,6480],{},"which python",[49,6482,6483],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6485,244],{},[14,6487,247],{"id":247},[10,6489,6490],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,6492,1698],{},{"title":92,"searchDepth":105,"depth":105,"links":6494},[6495,6496,6497,6498,6499,6500,6501,6502],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6333,"description":6338},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[267,6510,302],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6513,"title":6514,"body":6515,"category":267,"cover":268,"description":6519,"extension":269,"meta":6707,"navigation":114,"path":6708,"pinned":272,"publishedAt":273,"seo":6709,"slug":6710,"stem":6711,"summary":6712,"tags":6713,"updatedAt":273,"visible":114,"__hash__":6716},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6516,"toc":6697},[6517,6520,6522,6525,6527,6533,6542,6544,6568,6570,6572,6625,6627,6633,6635,6637,6653,6655,6674,6676,6688,6690,6692,6695],[10,6518,6519],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6521,16],{"id":16},[10,6523,6524],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6526,22],{"id":22},[10,6528,6529],{},[26,6530],{"alt":6531,"src":6532},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6534,6535,6538,6539,6541],{},[34,6536,6537],{},"Path"," 使用 ",[34,6540,2476],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6543,44],{"id":44},[46,6545,6546,6549,6561],{},[49,6547,6548],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[49,6550,6551,2297,6554,2297,6557,6560],{},[34,6552,6553],{},"exists()",[34,6555,6556],{},"is_file()",[34,6558,6559],{},"is_dir()"," 检查真实文件系统状态。",[49,6562,6563,6564,6567],{},"创建目录前明确目标；",[34,6565,6566],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6569,82],{"id":82},[10,6571,85],{},[87,6573,6575],{"className":89,"code":6574,"language":91,"meta":92,"style":92},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,6576,6577,6582,6586,6591,6596,6601,6605,6610,6615,6620],{"__ignoreMap":92},[96,6578,6579],{"class":98,"line":99},[96,6580,6581],{},"from pathlib import Path\n",[96,6583,6584],{"class":98,"line":105},[96,6585,115],{"emptyLinePlaceholder":114},[96,6587,6588],{"class":98,"line":111},[96,6589,6590],{},"project = Path.cwd()\n",[96,6592,6593],{"class":98,"line":118},[96,6594,6595],{},"data_dir = project \u002F \"data\"\n",[96,6597,6598],{"class":98,"line":124},[96,6599,6600],{},"file_path = data_dir \u002F \"records.json\"\n",[96,6602,6603],{"class":98,"line":130},[96,6604,115],{"emptyLinePlaceholder":114},[96,6606,6607],{"class":98,"line":136},[96,6608,6609],{},"print(project)\n",[96,6611,6612],{"class":98,"line":142},[96,6613,6614],{},"print(file_path.name)\n",[96,6616,6617],{"class":98,"line":3930},[96,6618,6619],{},"print(file_path.suffix)\n",[96,6621,6622],{"class":98,"line":4142},[96,6623,6624],{},"print(file_path.exists())\n",[10,6626,148],{},[87,6628,6631],{"className":6629,"code":6630,"language":154,"meta":92},[152],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6632,6630],{"__ignoreMap":92},[10,6634,159],{},[14,6636,162],{"id":162},[164,6638,6639,6645],{},[49,6640,6641,6644],{},[34,6642,6643],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[49,6646,2379,6647,6649,6650,6652],{},[34,6648,2476],{}," 组合路径片段只创建新的 ",[34,6651,6537],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6654,208],{"id":208},[46,6656,6657,6665],{},[49,6658,3444,6659,6661,6662,6664],{},[34,6660,6537],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6663,6553],{}," 等方法确认。",[49,6666,6667,6668,37,6670,6673],{},"手工拼接 ",[34,6669,2476],{},[34,6671,6672],{},"\\"," 分隔符，降低跨平台可读性。",[14,6675,225],{"id":225},[164,6677,6678,6685],{},[49,6679,6680,6681,6684],{},"组合 ",[34,6682,6683],{},"output\u002Freport.txt"," 路径但先不创建文件。",[49,6686,6687],{},"输出路径的父目录、文件名和扩展名。",[10,6689,244],{},[14,6691,247],{"id":247},[10,6693,6694],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,6696,254],{},{"title":92,"searchDepth":105,"depth":105,"links":6698},[6699,6700,6701,6702,6703,6704,6705,6706],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6514,"description":6519},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[267,6714,6715],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6718,"title":6719,"body":6720,"category":267,"cover":268,"description":6724,"extension":269,"meta":6902,"navigation":114,"path":6903,"pinned":272,"publishedAt":273,"seo":6904,"slug":6905,"stem":6906,"summary":6907,"tags":6908,"updatedAt":273,"visible":114,"__hash__":6911},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6721,"toc":6892},[6722,6725,6727,6730,6732,6738,6741,6743,6771,6773,6775,6832,6834,6840,6842,6844,6855,6857,6870,6872,6883,6885,6887,6890],[10,6723,6724],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6726,16],{"id":16},[10,6728,6729],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6731,22],{"id":22},[10,6733,6734],{},[26,6735],{"alt":6736,"src":6737},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6739,6740],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6742,44],{"id":44},[46,6744,6745,6751,6760],{},[49,6746,6747,6750],{},[34,6748,6749],{},"w"," 模式会截断原文件，写入前必须确认目标。",[49,6752,6753,6756,6757,403],{},[34,6754,6755],{},"r"," 模式读取不存在文件会产生 ",[34,6758,6759],{},"FileNotFoundError",[49,6761,6762,6763,6766,6767,6770],{},"本篇显式调用 ",[34,6764,6765],{},"close()","；第 34 篇会用 ",[34,6768,6769],{},"with"," 更可靠地管理关闭动作。",[14,6772,82],{"id":82},[10,6774,85],{},[87,6776,6778],{"className":89,"code":6777,"language":91,"meta":92,"style":92},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,6779,6780,6784,6788,6793,6798,6803,6808,6812,6817,6822,6827],{"__ignoreMap":92},[96,6781,6782],{"class":98,"line":99},[96,6783,6581],{},[96,6785,6786],{"class":98,"line":105},[96,6787,115],{"emptyLinePlaceholder":114},[96,6789,6790],{"class":98,"line":111},[96,6791,6792],{},"file_path = Path(\"notes.txt\")\n",[96,6794,6795],{"class":98,"line":118},[96,6796,6797],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[96,6799,6800],{"class":98,"line":124},[96,6801,6802],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[96,6804,6805],{"class":98,"line":130},[96,6806,6807],{},"writer.close()\n",[96,6809,6810],{"class":98,"line":136},[96,6811,115],{"emptyLinePlaceholder":114},[96,6813,6814],{"class":98,"line":142},[96,6815,6816],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[96,6818,6819],{"class":98,"line":3930},[96,6820,6821],{},"content = reader.read()\n",[96,6823,6824],{"class":98,"line":4142},[96,6825,6826],{},"reader.close()\n",[96,6828,6829],{"class":98,"line":5807},[96,6830,6831],{},"print(content)\n",[10,6833,148],{},[87,6835,6838],{"className":6836,"code":6837,"language":154,"meta":92},[152],"变量\n循环\n函数\n",[34,6839,6837],{"__ignoreMap":92},[10,6841,159],{},[14,6843,162],{"id":162},[164,6845,6846,6852],{},[49,6847,6848,6849,6851],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6850,6765],{}," 确保缓冲内容交给文件系统。",[49,6853,6854],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6856,208],{"id":208},[46,6858,6859,6864],{},[49,6860,2379,6861,6863],{},[34,6862,6749],{}," 模式打开重要文件却未确认覆盖风险。",[49,6865,6866,6867,403],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6868,6869],{},"encoding=\"utf-8\"",[14,6871,225],{"id":225},[164,6873,6874,6877],{},[49,6875,6876],{},"写入三行学习记录并读取。",[49,6878,6879,6880,6882],{},"改用 ",[34,6881,377],{}," 模式追加一行，确认原内容仍保留。",[10,6884,244],{},[14,6886,247],{"id":247},[10,6888,6889],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,6891,254],{},{"title":92,"searchDepth":105,"depth":105,"links":6893},[6894,6895,6896,6897,6898,6899,6900,6901],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6719,"description":6724},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[267,6909,6910],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6913,"title":6914,"body":6915,"category":267,"cover":268,"description":6919,"extension":269,"meta":7086,"navigation":114,"path":7087,"pinned":272,"publishedAt":273,"seo":7088,"slug":7089,"stem":7090,"summary":7091,"tags":7092,"updatedAt":273,"visible":114,"__hash__":7095},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6916,"toc":7076},[6917,6920,6922,6925,6927,6933,6943,6945,6959,6961,6963,7023,7025,7031,7033,7035,7047,7049,7057,7059,7067,7069,7071,7074],[10,6918,6919],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6921,16],{"id":16},[10,6923,6924],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6926,22],{"id":22},[10,6928,6929],{},[26,6930],{"alt":6931,"src":6932},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6934,6935,6938,6939,6942],{},[34,6936,6937],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6940,6941],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6944,44],{"id":44},[46,6946,6947,6950,6956],{},[49,6948,6949],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[49,6951,6952,6955],{},[34,6953,6954],{},"ensure_ascii=False"," 让中文以可读字符写入。",[49,6957,6958],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6960,82],{"id":82},[10,6962,85],{},[87,6964,6966],{"className":89,"code":6965,"language":91,"meta":92,"style":92},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,6967,6968,6973,6977,6982,6986,6991,6996,7000,7004,7009,7014,7018],{"__ignoreMap":92},[96,6969,6970],{"class":98,"line":99},[96,6971,6972],{},"import json\n",[96,6974,6975],{"class":98,"line":105},[96,6976,115],{"emptyLinePlaceholder":114},[96,6978,6979],{"class":98,"line":111},[96,6980,6981],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[96,6983,6984],{"class":98,"line":118},[96,6985,115],{"emptyLinePlaceholder":114},[96,6987,6988],{"class":98,"line":124},[96,6989,6990],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[96,6992,6993],{"class":98,"line":130},[96,6994,6995],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[96,6997,6998],{"class":98,"line":136},[96,6999,6807],{},[96,7001,7002],{"class":98,"line":142},[96,7003,115],{"emptyLinePlaceholder":114},[96,7005,7006],{"class":98,"line":3930},[96,7007,7008],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[96,7010,7011],{"class":98,"line":4142},[96,7012,7013],{},"loaded = json.load(reader)\n",[96,7015,7016],{"class":98,"line":5807},[96,7017,6826],{},[96,7019,7020],{"class":98,"line":5812},[96,7021,7022],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7024,148],{},[87,7026,7029],{"className":7027,"code":7028,"language":154,"meta":92},[152],"Python 60\n",[34,7030,7028],{"__ignoreMap":92},[10,7032,159],{},[14,7034,162],{"id":162},[164,7036,7037,7042],{},[49,7038,7039,7041],{},[34,7040,6937],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[49,7043,7044,7046],{},[34,7045,6941],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7048,208],{"id":208},[46,7050,7051,7054],{},[49,7052,7053],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[49,7055,7056],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7058,225],{"id":225},[164,7060,7061,7064],{},[49,7062,7063],{},"保存包含两条学习记录的列表。",[49,7065,7066],{},"读取后修改进度，再重新写回文件。",[10,7068,244],{},[14,7070,247],{"id":247},[10,7072,7073],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,7075,254],{},{"title":92,"searchDepth":105,"depth":105,"links":7077},[7078,7079,7080,7081,7082,7083,7084,7085],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6914,"description":6919},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[267,7093,7094],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7097,"title":7098,"body":7099,"category":267,"cover":268,"description":7103,"extension":269,"meta":7287,"navigation":114,"path":7288,"pinned":272,"publishedAt":273,"seo":7289,"slug":7290,"stem":7291,"summary":7292,"tags":7293,"updatedAt":273,"visible":114,"__hash__":7296},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7100,"toc":7277},[7101,7104,7106,7109,7111,7117,7123,7125,7147,7149,7151,7214,7216,7222,7224,7226,7242,7244,7258,7260,7268,7270,7272,7275],[10,7102,7103],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7105,16],{"id":16},[10,7107,7108],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7110,22],{"id":22},[10,7112,7113],{},[26,7114],{"alt":7115,"src":7116},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7118,7119,7122],{},[34,7120,7121],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7124,44],{"id":44},[46,7126,7127,7137,7144],{},[49,7128,2379,7129,7132,7133,7136],{},[34,7130,7131],{},"newline=\"\""," 让 ",[34,7134,7135],{},"csv"," 模块正确处理换行。",[49,7138,7139,7140,7143],{},"字段顺序由 ",[34,7141,7142],{},"fieldnames"," 决定，字典键需要与字段名一致。",[49,7145,7146],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7148,82],{"id":82},[10,7150,85],{},[87,7152,7154],{"className":89,"code":7153,"language":91,"meta":92,"style":92},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,7155,7156,7161,7165,7170,7175,7180,7185,7190,7194,7199,7204,7209],{"__ignoreMap":92},[96,7157,7158],{"class":98,"line":99},[96,7159,7160],{},"import csv\n",[96,7162,7163],{"class":98,"line":105},[96,7164,115],{"emptyLinePlaceholder":114},[96,7166,7167],{"class":98,"line":111},[96,7168,7169],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[96,7171,7172],{"class":98,"line":118},[96,7173,7174],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[96,7176,7177],{"class":98,"line":124},[96,7178,7179],{},"writer.writeheader()\n",[96,7181,7182],{"class":98,"line":130},[96,7183,7184],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[96,7186,7187],{"class":98,"line":136},[96,7188,7189],{},"writer_file.close()\n",[96,7191,7192],{"class":98,"line":142},[96,7193,115],{"emptyLinePlaceholder":114},[96,7195,7196],{"class":98,"line":3930},[96,7197,7198],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[96,7200,7201],{"class":98,"line":4142},[96,7202,7203],{},"for row in csv.DictReader(reader_file):\n",[96,7205,7206],{"class":98,"line":5807},[96,7207,7208],{},"    print(row[\"name\"], row[\"score\"])\n",[96,7210,7211],{"class":98,"line":5812},[96,7212,7213],{},"reader_file.close()\n",[10,7215,148],{},[87,7217,7220],{"className":7218,"code":7219,"language":154,"meta":92},[152],"小郑 95\n",[34,7221,7219],{"__ignoreMap":92},[10,7223,159],{},[14,7225,162],{"id":162},[164,7227,7228,7237],{},[49,7229,7230,7233,7234,7236],{},[34,7231,7232],{},"DictWriter"," 按 ",[34,7235,7142],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[49,7238,7239,7241],{},[34,7240,7121],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7243,208],{"id":208},[46,7245,7246,7249],{},[49,7247,7248],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[49,7250,7251,7252,7254,7255,7257],{},"在 macOS 以外环境忽略 ",[34,7253,7131],{}," 可能出现额外空行；统一交给 ",[34,7256,7135],{}," 模块管理换行。",[14,7259,225],{"id":225},[164,7261,7262,7265],{},[49,7263,7264],{},"写入三名学习者的课程和分数。",[49,7266,7267],{},"读取 CSV 后把分数字符串转换为整数。",[10,7269,244],{},[14,7271,247],{"id":247},[10,7273,7274],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,7276,254],{},{"title":92,"searchDepth":105,"depth":105,"links":7278},[7279,7280,7281,7282,7283,7284,7285,7286],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7098,"description":7103},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[267,7294,7295],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7298,"title":7299,"body":7300,"category":267,"cover":268,"description":7304,"extension":269,"meta":7577,"navigation":114,"path":7578,"pinned":272,"publishedAt":273,"seo":7579,"slug":7580,"stem":7581,"summary":7582,"tags":7583,"updatedAt":273,"visible":114,"__hash__":7586},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7301,"toc":7564},[7302,7305,7307,7310,7312,7318,7329,7331,7348,7350,7352,7427,7429,7435,7437,7439,7464,7466,7475,7481,7492,7494,7500,7506,7515,7517,7532,7534,7555,7557,7559,7562],[10,7303,7304],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7306,16],{"id":16},[10,7308,7309],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7311,22],{"id":22},[10,7313,7314],{},[26,7315],{"alt":7316,"src":7317},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7319,7320,7321,7324,7325,7328],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7322,7323],{},"except","；无论是否异常，",[34,7326,7327],{},"finally"," 都会在离开结构前执行。",[14,7330,44],{"id":44},[46,7332,7333,7339,7345],{},[49,7334,7335,7336,7338],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7337,7323],{}," 吞掉全部错误。",[49,7340,7341,7344],{},[34,7342,7343],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[49,7346,7347],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7349,82],{"id":82},[10,7351,85],{},[87,7353,7355],{"className":89,"code":7354,"language":91,"meta":92,"style":92},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,7356,7357,7362,7367,7372,7377,7382,7386,7391,7396,7401,7406,7410,7415,7421],{"__ignoreMap":92},[96,7358,7359],{"class":98,"line":99},[96,7360,7361],{},"def parse_age(text):\n",[96,7363,7364],{"class":98,"line":105},[96,7365,7366],{},"    age = int(text)\n",[96,7368,7369],{"class":98,"line":111},[96,7370,7371],{},"    if age \u003C 0:\n",[96,7373,7374],{"class":98,"line":118},[96,7375,7376],{},"        raise ValueError(\"年龄不能为负数\")\n",[96,7378,7379],{"class":98,"line":124},[96,7380,7381],{},"    return age\n",[96,7383,7384],{"class":98,"line":130},[96,7385,115],{"emptyLinePlaceholder":114},[96,7387,7388],{"class":98,"line":136},[96,7389,7390],{},"try:\n",[96,7392,7393],{"class":98,"line":142},[96,7394,7395],{},"    age = parse_age(\"18\")\n",[96,7397,7398],{"class":98,"line":3930},[96,7399,7400],{},"except ValueError as error:\n",[96,7402,7403],{"class":98,"line":4142},[96,7404,7405],{},"    print(\"输入错误：\", error)\n",[96,7407,7408],{"class":98,"line":5807},[96,7409,1186],{},[96,7411,7412],{"class":98,"line":5812},[96,7413,7414],{},"    print(\"年龄：\", age)\n",[96,7416,7418],{"class":98,"line":7417},13,[96,7419,7420],{},"finally:\n",[96,7422,7424],{"class":98,"line":7423},14,[96,7425,7426],{},"    print(\"处理结束\")\n",[10,7428,148],{},[87,7430,7433],{"className":7431,"code":7432,"language":154,"meta":92},[152],"年龄： 18\n处理结束\n",[34,7434,7432],{"__ignoreMap":92},[10,7436,159],{},[14,7438,162],{"id":162},[164,7440,7441,7453],{},[49,7442,7443,7445,7446,7448,7449,7452],{},[34,7444,3013],{}," 或主动 ",[34,7447,7343],{}," 都可能产生 ",[34,7450,7451],{},"ValueError","，控制流立即离开当前正常路径。",[49,7454,7455,7456,7458,7459,7461,7462,403],{},"有异常时进入匹配的 ",[34,7457,7323],{},"；没有异常时执行 ",[34,7460,1200],{},"；两种情况最后都会执行 ",[34,7463,7327],{},[186,7465,188],{"id":188},[10,7467,7468,2297,7470,1197,7472,7474],{},[34,7469,7323],{},[34,7471,1200],{},[34,7473,7327],{}," 的职责不同，不能只看它们出现的顺序。",[10,7476,7477],{},[26,7478],{"alt":7479,"src":7480},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7482,7483,7485,7486,7488,7489,7491],{},[34,7484,7323],{}," 处理匹配异常，",[34,7487,1200],{}," 只在无异常时运行，",[34,7490,7327],{}," 负责两条路径都需要的清理动作。",[186,7493,188],{"id":4197},[10,7495,7496,7499],{},[34,7497,7498],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7501,7502],{},[26,7503],{"alt":7504,"src":7505},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7507,7508,7509,7511,7512,7514],{},"只把可能产生预期异常的操作放进 ",[34,7510,7498],{},"，后续正常业务放进 ",[34,7513,1200],{},"，错误边界会更清楚。",[14,7516,208],{"id":208},[46,7518,7519,7526],{},[49,7520,7521,7522,7525],{},"使用裸 ",[34,7523,7524],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[49,7527,7528,7529,7531],{},"把整个程序包在一个巨大 ",[34,7530,7498],{}," 中，无法判断究竟哪一步允许失败。",[14,7533,225],{"id":225},[164,7535,7536,7549],{},[49,7537,7538,7539,7542,7543,1197,7546,403],{},"让 ",[34,7540,7541],{},"parse_age"," 分别处理 ",[34,7544,7545],{},"\"abc\"",[34,7547,7548],{},"\"-1\"",[49,7550,7551,7552,7554],{},"为文件读取捕获 ",[34,7553,6759],{}," 并给出清晰提示。",[10,7556,244],{},[14,7558,247],{"id":247},[10,7560,7561],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,7563,254],{},{"title":92,"searchDepth":105,"depth":105,"links":7565},[7566,7567,7568,7569,7570,7574,7575,7576],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":7571},[7572,7573],{"id":188,"depth":111,"text":188},{"id":4197,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7299,"description":7304},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[267,7584,7585],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7588,"title":7589,"body":7590,"category":267,"cover":268,"description":7594,"extension":269,"meta":7770,"navigation":114,"path":7771,"pinned":272,"publishedAt":273,"seo":7772,"slug":7773,"stem":7774,"summary":7775,"tags":7776,"updatedAt":273,"visible":114,"__hash__":7778},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7591,"toc":7760},[7592,7595,7597,7600,7602,7608,7614,7616,7632,7634,7636,7690,7692,7698,7700,7702,7715,7717,7730,7732,7751,7753,7755,7758],[10,7593,7594],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7596,16],{"id":16},[10,7598,7599],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7601,22],{"id":22},[10,7603,7604],{},[26,7605],{"alt":7606,"src":7607},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7609,7610,7611,7613],{},"进入 ",[34,7612,6769],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7615,44],{"id":44},[46,7617,7618,7623,7629],{},[49,7619,7620,7622],{},[34,7621,6769],{}," 把资源获取和释放配成一个清晰边界。",[49,7624,7625,7628],{},[34,7626,7627],{},"as file"," 得到的是上下文返回的资源对象。",[49,7630,7631],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7633,82],{"id":82},[10,7635,85],{},[87,7637,7639],{"className":89,"code":7638,"language":91,"meta":92,"style":92},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[34,7640,7641,7645,7649,7653,7657,7662,7667,7671,7676,7681,7685],{"__ignoreMap":92},[96,7642,7643],{"class":98,"line":99},[96,7644,6581],{},[96,7646,7647],{"class":98,"line":105},[96,7648,115],{"emptyLinePlaceholder":114},[96,7650,7651],{"class":98,"line":111},[96,7652,6792],{},[96,7654,7655],{"class":98,"line":118},[96,7656,115],{"emptyLinePlaceholder":114},[96,7658,7659],{"class":98,"line":124},[96,7660,7661],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[96,7663,7664],{"class":98,"line":130},[96,7665,7666],{},"    file.write(\"上下文管理器\\n\")\n",[96,7668,7669],{"class":98,"line":136},[96,7670,115],{"emptyLinePlaceholder":114},[96,7672,7673],{"class":98,"line":142},[96,7674,7675],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[96,7677,7678],{"class":98,"line":3930},[96,7679,7680],{},"    print(file.read())\n",[96,7682,7683],{"class":98,"line":4142},[96,7684,115],{"emptyLinePlaceholder":114},[96,7686,7687],{"class":98,"line":5807},[96,7688,7689],{},"print(file.closed)\n",[10,7691,148],{},[87,7693,7696],{"className":7694,"code":7695,"language":154,"meta":92},[152],"上下文管理器\n\nTrue\n",[34,7697,7695],{"__ignoreMap":92},[10,7699,159],{},[14,7701,162],{"id":162},[164,7703,7704,7712],{},[49,7705,7610,7706,7708,7709,403],{},[34,7707,6769],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7710,7711],{},"file",[49,7713,7714],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7716,208],{"id":208},[46,7718,7719,7724],{},[49,7720,4765,7721,7723],{},[34,7722,6769],{}," 代码块外继续读写已经关闭的文件对象。",[49,7725,7726,7727,7729],{},"误以为 ",[34,7728,6769],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7731,225],{"id":225},[164,7733,7734,7743],{},[49,7735,7736,7737,7740,7741,403],{},"把第 30 篇的手动 ",[34,7738,7739],{},"open\u002Fclose"," 改写为 ",[34,7742,6769],{},[49,7744,4765,7745,7747,7748,403],{},[34,7746,6769],{}," 块后检查 ",[34,7749,7750],{},"file.closed",[10,7752,244],{},[14,7754,247],{"id":247},[10,7756,7757],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,7759,254],{},{"title":92,"searchDepth":105,"depth":105,"links":7761},[7762,7763,7764,7765,7766,7767,7768,7769],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7589,"description":7594},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[267,6769,7777],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7780,"title":7781,"body":7782,"category":267,"cover":268,"description":7786,"extension":269,"meta":7998,"navigation":114,"path":7999,"pinned":272,"publishedAt":273,"seo":8000,"slug":8001,"stem":8002,"summary":8003,"tags":8004,"updatedAt":273,"visible":114,"__hash__":8007},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7783,"toc":7986},[7784,7787,7789,7792,7794,7800,7803,7805,7822,7824,7826,7894,7896,7902,7904,7906,7931,7933,7936,7942,7951,7953,7964,7966,7977,7979,7981,7984],[10,7785,7786],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7788,16],{"id":16},[10,7790,7791],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7793,22],{"id":22},[10,7795,7796],{},[26,7797],{"alt":7798,"src":7799},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7801,7802],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7804,44],{"id":44},[46,7806,7807,7813,7819],{},[49,7808,7809,7812],{},[34,7810,7811],{},"self"," 表示当前实例，由方法调用自动传入。",[49,7814,7815,7818],{},[34,7816,7817],{},"__init__"," 在实例创建过程中初始化属性。",[49,7820,7821],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7823,82],{"id":82},[10,7825,85],{},[87,7827,7829],{"className":89,"code":7828,"language":91,"meta":92,"style":92},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,7830,7831,7836,7841,7846,7851,7855,7860,7865,7870,7875,7879,7884,7889],{"__ignoreMap":92},[96,7832,7833],{"class":98,"line":99},[96,7834,7835],{},"class LearningRecord:\n",[96,7837,7838],{"class":98,"line":105},[96,7839,7840],{},"    def __init__(self, course, progress=0):\n",[96,7842,7843],{"class":98,"line":111},[96,7844,7845],{},"        self.course = course\n",[96,7847,7848],{"class":98,"line":118},[96,7849,7850],{},"        self.progress = progress\n",[96,7852,7853],{"class":98,"line":124},[96,7854,115],{"emptyLinePlaceholder":114},[96,7856,7857],{"class":98,"line":130},[96,7858,7859],{},"    def advance(self, amount):\n",[96,7861,7862],{"class":98,"line":136},[96,7863,7864],{},"        self.progress = self.progress + amount\n",[96,7866,7867],{"class":98,"line":142},[96,7868,7869],{},"        if self.progress > 100:\n",[96,7871,7872],{"class":98,"line":3930},[96,7873,7874],{},"            self.progress = 100\n",[96,7876,7877],{"class":98,"line":4142},[96,7878,115],{"emptyLinePlaceholder":114},[96,7880,7881],{"class":98,"line":5807},[96,7882,7883],{},"record = LearningRecord(\"Python\", 40)\n",[96,7885,7886],{"class":98,"line":5812},[96,7887,7888],{},"record.advance(15)\n",[96,7890,7891],{"class":98,"line":7417},[96,7892,7893],{},"print(record.course, record.progress)\n",[10,7895,148],{},[87,7897,7900],{"className":7898,"code":7899,"language":154,"meta":92},[152],"Python 55\n",[34,7901,7899],{"__ignoreMap":92},[10,7903,159],{},[14,7905,162],{"id":162},[164,7907,7908,7918],{},[49,7909,7910,7911,7914,7915,7917],{},"调用 ",[34,7912,7913],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7916,7817],{}," 把课程和进度保存在该实例属性中。",[49,7919,7920,7923,7924,7927,7928,7930],{},[34,7921,7922],{},"record.advance(15)"," 自动把 ",[34,7925,7926],{},"record"," 作为 ",[34,7929,7811],{},"，方法更新同一实例的进度并限制上限。",[186,7932,188],{"id":188},[10,7934,7935],{},"类是共同定义，实例则各自保存状态。",[10,7937,7938],{},[26,7939],{"alt":7940,"src":7941},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7943,7944,7945,1197,7947,7950],{},"两个实例共享同一套方法定义，但 ",[34,7946,4562],{},[34,7948,7949],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7952,208],{"id":208},[46,7954,7955,7961],{},[49,7956,7957,7958,7960],{},"调用实例方法时手工再传一次 ",[34,7959,7811],{},"。通过实例调用时 Python 会自动绑定。",[49,7962,7963],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7965,225],{"id":225},[164,7967,7968,7974],{},[49,7969,5275,7970,7973],{},[34,7971,7972],{},"Book"," 类，保存标题和阅读页数。",[49,7975,7976],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7978,244],{},[14,7980,247],{"id":247},[10,7982,7983],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,7985,254],{},{"title":92,"searchDepth":105,"depth":105,"links":7987},[7988,7989,7990,7991,7992,7995,7996,7997],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":7993},[7994],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7781,"description":7786},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[267,8005,8006],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":8009,"title":8010,"body":8011,"category":267,"cover":268,"description":8015,"extension":269,"meta":8193,"navigation":114,"path":8194,"pinned":272,"publishedAt":273,"seo":8195,"slug":8196,"stem":8197,"summary":8198,"tags":8199,"updatedAt":273,"visible":114,"__hash__":8202},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":8012,"toc":8183},[8013,8016,8018,8021,8023,8029,8032,8034,8045,8047,8049,8116,8118,8124,8126,8128,8147,8149,8157,8159,8174,8176,8178,8181],[10,8014,8015],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8017,16],{"id":16},[10,8019,8020],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8022,22],{"id":22},[10,8024,8025],{},[26,8026],{"alt":8027,"src":8028},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8030,8031],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8033,44],{"id":44},[46,8035,8036,8039,8042],{},[49,8037,8038],{},"封装让对象通过方法维护自己的有效状态。",[49,8040,8041],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[49,8043,8044],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8046,82],{"id":82},[10,8048,85],{},[87,8050,8052],{"className":89,"code":8051,"language":91,"meta":92,"style":92},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,8053,8054,8059,8064,8069,8073,8078,8083,8088,8092,8097,8102,8106,8111],{"__ignoreMap":92},[96,8055,8056],{"class":98,"line":99},[96,8057,8058],{},"class Storage:\n",[96,8060,8061],{"class":98,"line":105},[96,8062,8063],{},"    def save(self, text):\n",[96,8065,8066],{"class":98,"line":111},[96,8067,8068],{},"        print(\"保存：\", text)\n",[96,8070,8071],{"class":98,"line":118},[96,8072,115],{"emptyLinePlaceholder":114},[96,8074,8075],{"class":98,"line":124},[96,8076,8077],{},"class LearningService:\n",[96,8079,8080],{"class":98,"line":130},[96,8081,8082],{},"    def __init__(self, storage):\n",[96,8084,8085],{"class":98,"line":136},[96,8086,8087],{},"        self.storage = storage\n",[96,8089,8090],{"class":98,"line":142},[96,8091,115],{"emptyLinePlaceholder":114},[96,8093,8094],{"class":98,"line":3930},[96,8095,8096],{},"    def finish_lesson(self, title):\n",[96,8098,8099],{"class":98,"line":4142},[96,8100,8101],{},"        self.storage.save(title)\n",[96,8103,8104],{"class":98,"line":5807},[96,8105,115],{"emptyLinePlaceholder":114},[96,8107,8108],{"class":98,"line":5812},[96,8109,8110],{},"service = LearningService(Storage())\n",[96,8112,8113],{"class":98,"line":7417},[96,8114,8115],{},"service.finish_lesson(\"异常处理\")\n",[10,8117,148],{},[87,8119,8122],{"className":8120,"code":8121,"language":154,"meta":92},[152],"保存： 异常处理\n",[34,8123,8121],{"__ignoreMap":92},[10,8125,159],{},[14,8127,162],{"id":162},[164,8129,8130,8140],{},[49,8131,8132,8135,8136,8139],{},[34,8133,8134],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8137,8138],{},"save()"," 的协作对象。",[49,8141,8142,8143,8146],{},"调用业务方法时，服务把保存动作委托给 ",[34,8144,8145],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8148,208],{"id":208},[46,8150,8151,8154],{},[49,8152,8153],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[49,8155,8156],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8158,225],{"id":225},[164,8160,8161,8171],{},[49,8162,8163,8164,8167,8168,403],{},"用组合让 ",[34,8165,8166],{},"OrderService"," 使用一个 ",[34,8169,8170],{},"Notifier",[49,8172,8173],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8175,244],{},[14,8177,247],{"id":247},[10,8179,8180],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,8182,254],{},{"title":92,"searchDepth":105,"depth":105,"links":8184},[8185,8186,8187,8188,8189,8190,8191,8192],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":8010,"description":8015},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[267,8200,8201],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8204,"title":8205,"body":8206,"category":267,"cover":268,"description":8210,"extension":269,"meta":8413,"navigation":114,"path":8414,"pinned":272,"publishedAt":273,"seo":8415,"slug":8416,"stem":8417,"summary":8418,"tags":8419,"updatedAt":273,"visible":114,"__hash__":8422},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8207,"toc":8401},[8208,8211,8213,8216,8218,8224,8231,8233,8258,8260,8262,8314,8316,8322,8324,8326,8347,8349,8355,8361,8367,8369,8377,8379,8392,8394,8396,8399],[10,8209,8210],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8212,16],{"id":16},[10,8214,8215],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8217,22],{"id":22},[10,8219,8220],{},[26,8221],{"alt":8222,"src":8223},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8225,8226,8227,8230],{},"生成器运行到 ",[34,8228,8229],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8232,44],{"id":44},[46,8234,8235,8245,8255],{},[49,8236,8237,8240,8241,8244],{},[34,8238,8239],{},"iter()"," 从可迭代对象取得迭代器，",[34,8242,8243],{},"next()"," 请求下一个值。",[49,8246,8247,8248,8251,8252,8254],{},"没有更多值时迭代器抛出 ",[34,8249,8250],{},"StopIteration","，",[34,8253,4316],{}," 会自动处理。",[49,8256,8257],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8259,82],{"id":82},[10,8261,85],{},[87,8263,8265],{"className":89,"code":8264,"language":91,"meta":92,"style":92},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,8266,8267,8272,8277,8282,8287,8292,8296,8301,8306,8310],{"__ignoreMap":92},[96,8268,8269],{"class":98,"line":99},[96,8270,8271],{},"def countdown(start):\n",[96,8273,8274],{"class":98,"line":105},[96,8275,8276],{},"    current = start\n",[96,8278,8279],{"class":98,"line":111},[96,8280,8281],{},"    while current > 0:\n",[96,8283,8284],{"class":98,"line":118},[96,8285,8286],{},"        yield current\n",[96,8288,8289],{"class":98,"line":124},[96,8290,8291],{},"        current = current - 1\n",[96,8293,8294],{"class":98,"line":130},[96,8295,115],{"emptyLinePlaceholder":114},[96,8297,8298],{"class":98,"line":136},[96,8299,8300],{},"iterator = countdown(3)\n",[96,8302,8303],{"class":98,"line":142},[96,8304,8305],{},"print(next(iterator))\n",[96,8307,8308],{"class":98,"line":3930},[96,8309,8305],{},[96,8311,8312],{"class":98,"line":4142},[96,8313,8305],{},[10,8315,148],{},[87,8317,8320],{"className":8318,"code":8319,"language":154,"meta":92},[152],"3\n2\n1\n",[34,8321,8319],{"__ignoreMap":92},[10,8323,159],{},[14,8325,162],{"id":162},[164,8327,8328,8334],{},[49,8329,7910,8330,8333],{},[34,8331,8332],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[49,8335,8336,8337,8339,8340,8342,8343,8346],{},"每次 ",[34,8338,8243],{}," 运行到下一个 ",[34,8341,8229],{}," 并暂停，局部变量 ",[34,8344,8345],{},"current"," 和执行位置被保留。",[186,8348,188],{"id":188},[10,8350,8351,8352,8354],{},"生成器的暂停位置可以展开成多次 ",[34,8353,8243],{}," 的时间线。",[10,8356,8357],{},[26,8358],{"alt":8359,"src":8360},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8362,8363,8364,8366],{},"每次请求只推进到下一个 ",[34,8365,8229],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8368,208],{"id":208},[46,8370,8371,8374],{},[49,8372,8373],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[49,8375,8376],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8378,225],{"id":225},[164,8380,8381,8384],{},[49,8382,8383],{},"编写产生 1 到指定上限偶数的生成器。",[49,8385,3988,8386,8388,8389,8391],{},[34,8387,4316],{}," 遍历生成器，比较手动 ",[34,8390,8243],{}," 的差异。",[10,8393,244],{},[14,8395,247],{"id":247},[10,8397,8398],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,8400,254],{},{"title":92,"searchDepth":105,"depth":105,"links":8402},[8403,8404,8405,8406,8407,8410,8411,8412],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":8408},[8409],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8205,"description":8210},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[267,8420,8421],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8424,"title":8425,"body":8426,"category":267,"cover":268,"description":8430,"extension":269,"meta":8654,"navigation":114,"path":8655,"pinned":272,"publishedAt":273,"seo":8656,"slug":8657,"stem":8658,"summary":8659,"tags":8660,"updatedAt":273,"visible":114,"__hash__":8662},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8427,"toc":8642},[8428,8431,8433,8436,8438,8444,8447,8449,8469,8471,8473,8555,8557,8563,8565,8567,8589,8591,8594,8600,8607,8609,8619,8621,8633,8635,8637,8640],[10,8429,8430],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8432,16],{"id":16},[10,8434,8435],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8437,22],{"id":22},[10,8439,8440],{},[26,8441],{"alt":8442,"src":8443},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8445,8446],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8448,44],{"id":44},[46,8450,8451,8460,8463],{},[49,8452,8453,8456,8457,403],{},[34,8454,8455],{},"@trace"," 等价于 ",[34,8458,8459],{},"add = trace(add)",[49,8461,8462],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[49,8464,8465,8468],{},[34,8466,8467],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8470,82],{"id":82},[10,8472,85],{},[87,8474,8476],{"className":89,"code":8475,"language":91,"meta":92,"style":92},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,8477,8478,8483,8487,8492,8497,8502,8507,8512,8517,8522,8527,8531,8536,8540,8544,8549],{"__ignoreMap":92},[96,8479,8480],{"class":98,"line":99},[96,8481,8482],{},"from functools import wraps\n",[96,8484,8485],{"class":98,"line":105},[96,8486,115],{"emptyLinePlaceholder":114},[96,8488,8489],{"class":98,"line":111},[96,8490,8491],{},"def trace(function):\n",[96,8493,8494],{"class":98,"line":118},[96,8495,8496],{},"    @wraps(function)\n",[96,8498,8499],{"class":98,"line":124},[96,8500,8501],{},"    def wrapper(*args, **kwargs):\n",[96,8503,8504],{"class":98,"line":130},[96,8505,8506],{},"        print(\"开始：\", function.__name__)\n",[96,8508,8509],{"class":98,"line":136},[96,8510,8511],{},"        result = function(*args, **kwargs)\n",[96,8513,8514],{"class":98,"line":142},[96,8515,8516],{},"        print(\"结束：\", function.__name__)\n",[96,8518,8519],{"class":98,"line":3930},[96,8520,8521],{},"        return result\n",[96,8523,8524],{"class":98,"line":4142},[96,8525,8526],{},"    return wrapper\n",[96,8528,8529],{"class":98,"line":5807},[96,8530,115],{"emptyLinePlaceholder":114},[96,8532,8533],{"class":98,"line":5812},[96,8534,8535],{},"@trace\n",[96,8537,8538],{"class":98,"line":7417},[96,8539,6160],{},[96,8541,8542],{"class":98,"line":7423},[96,8543,6165],{},[96,8545,8547],{"class":98,"line":8546},15,[96,8548,115],{"emptyLinePlaceholder":114},[96,8550,8552],{"class":98,"line":8551},16,[96,8553,8554],{},"print(add(2, 3))\n",[10,8556,148],{},[87,8558,8561],{"className":8559,"code":8560,"language":154,"meta":92},[152],"开始： add\n结束： add\n5\n",[34,8562,8560],{"__ignoreMap":92},[10,8564,159],{},[14,8566,162],{"id":162},[164,8568,8569,8586],{},[49,8570,8571,8572,8575,8576,8579,8580,8583,8584,403],{},"解释器执行定义时，把原 ",[34,8573,8574],{},"add"," 函数交给 ",[34,8577,8578],{},"trace","，返回的 ",[34,8581,8582],{},"wrapper"," 重新绑定到名字 ",[34,8585,8574],{},[49,8587,8588],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[186,8590,188],{"id":188},[10,8592,8593],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8595,8596],{},[26,8597],{"alt":8598,"src":8599},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8601,8602,8604,8605,403],{},[34,8603,8455],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8606,8459],{},[14,8608,208],{"id":208},[46,8610,8611,8616],{},[49,8612,8613,8614,403],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8615,5358],{},[49,8617,8618],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8620,225],{"id":225},[164,8622,8623,8626],{},[49,8624,8625],{},"编写只记录调用次数的简单装饰器。",[49,8627,8628,8629,8632],{},"删除包装函数的 ",[34,8630,8631],{},"return result","，观察调用方得到什么。",[10,8634,244],{},[14,8636,247],{"id":247},[10,8638,8639],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,8641,254],{},{"title":92,"searchDepth":105,"depth":105,"links":8643},[8644,8645,8646,8647,8648,8651,8652,8653],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":8649},[8650],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8425,"description":8430},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[267,8661,5309],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8664,"title":8665,"body":8666,"category":267,"cover":268,"description":8670,"extension":269,"meta":8857,"navigation":114,"path":8858,"pinned":272,"publishedAt":273,"seo":8859,"slug":8860,"stem":8861,"summary":8862,"tags":8863,"updatedAt":273,"visible":114,"__hash__":8866},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8667,"toc":8845},[8668,8671,8673,8676,8678,8684,8687,8689,8700,8702,8704,8779,8781,8787,8789,8791,8802,8804,8807,8813,8816,8818,8826,8828,8836,8838,8840,8843],[10,8669,8670],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8672,16],{"id":16},[10,8674,8675],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8677,22],{"id":22},[10,8679,8680],{},[26,8681],{"alt":8682,"src":8683},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8685,8686],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8688,44],{"id":44},[46,8690,8691,8694,8697],{},[49,8692,8693],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[49,8695,8696],{},"日志记录运行状态，测试判断结果是否符合约定。",[49,8698,8699],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8701,82],{"id":82},[10,8703,85],{},[87,8705,8707],{"className":89,"code":8706,"language":91,"meta":92,"style":92},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,8708,8709,8714,8719,8723,8728,8732,8737,8742,8747,8751,8756,8761,8766,8770,8774],{"__ignoreMap":92},[96,8710,8711],{"class":98,"line":99},[96,8712,8713],{},"import logging\n",[96,8715,8716],{"class":98,"line":105},[96,8717,8718],{},"import unittest\n",[96,8720,8721],{"class":98,"line":111},[96,8722,115],{"emptyLinePlaceholder":114},[96,8724,8725],{"class":98,"line":118},[96,8726,8727],{},"logging.basicConfig(level=logging.INFO)\n",[96,8729,8730],{"class":98,"line":124},[96,8731,115],{"emptyLinePlaceholder":114},[96,8733,8734],{"class":98,"line":130},[96,8735,8736],{},"def clamp_progress(value):\n",[96,8738,8739],{"class":98,"line":136},[96,8740,8741],{},"    logging.info(\"检查进度：%s\", value)\n",[96,8743,8744],{"class":98,"line":142},[96,8745,8746],{},"    return max(0, min(100, value))\n",[96,8748,8749],{"class":98,"line":3930},[96,8750,115],{"emptyLinePlaceholder":114},[96,8752,8753],{"class":98,"line":4142},[96,8754,8755],{},"class ProgressTest(unittest.TestCase):\n",[96,8757,8758],{"class":98,"line":5807},[96,8759,8760],{},"    def test_upper_limit(self):\n",[96,8762,8763],{"class":98,"line":5812},[96,8764,8765],{},"        self.assertEqual(clamp_progress(120), 100)\n",[96,8767,8768],{"class":98,"line":7417},[96,8769,115],{"emptyLinePlaceholder":114},[96,8771,8772],{"class":98,"line":7423},[96,8773,6174],{},[96,8775,8776],{"class":98,"line":8546},[96,8777,8778],{},"    unittest.main()\n",[10,8780,148],{},[87,8782,8785],{"className":8783,"code":8784,"language":154,"meta":92},[152],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8786,8784],{"__ignoreMap":92},[10,8788,159],{},[14,8790,162],{"id":162},[164,8792,8793,8799],{},[49,8794,8795,8798],{},[34,8796,8797],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[49,8800,8801],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[186,8803,188],{"id":188},[10,8805,8806],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8808,8809],{},[26,8810],{"alt":8811,"src":8812},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8814,8815],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8817,208],{"id":208},[46,8819,8820,8823],{},[49,8821,8822],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[49,8824,8825],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8827,225],{"id":225},[164,8829,8830,8833],{},[49,8831,8832],{},"为负数进度增加测试。",[49,8834,8835],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8837,244],{},[14,8839,247],{"id":247},[10,8841,8842],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,8844,254],{},{"title":92,"searchDepth":105,"depth":105,"links":8846},[8847,8848,8849,8850,8851,8854,8855,8856],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":8852},[8853],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8665,"description":8670},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[267,8864,8865],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8868,"title":8869,"body":8870,"category":267,"cover":268,"description":8874,"extension":269,"meta":9174,"navigation":114,"path":9175,"pinned":272,"publishedAt":273,"seo":9176,"slug":9177,"stem":9178,"summary":9179,"tags":9180,"updatedAt":273,"visible":114,"__hash__":9183},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8871,"toc":9161},[8872,8875,8877,8880,8882,8888,8891,8893,8908,8910,8912,9059,9061,9067,9069,9071,9084,9086,9089,9095,9098,9100,9103,9109,9116,9118,9129,9131,9152,9154,9156,9159],[10,8873,8874],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8876,16],{"id":16},[10,8878,8879],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8881,22],{"id":22},[10,8883,8884],{},[26,8885],{"alt":8886,"src":8887},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8889,8890],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8892,44],{"id":44},[46,8894,8895,8898,8901],{},[49,8896,8897],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[49,8899,8900],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[49,8902,8903,8904,8907],{},"实际扩展前先为 ",[34,8905,8906],{},"add()"," 和存储边界补充测试。",[14,8909,82],{"id":82},[10,8911,85],{},[87,8913,8915],{"className":89,"code":8914,"language":91,"meta":92,"style":92},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,8916,8917,8921,8925,8929,8934,8939,8944,8949,8953,8958,8963,8968,8973,8978,8982,8987,8992,8998,9003,9009,9014,9019,9025,9031,9037,9042,9048,9053],{"__ignoreMap":92},[96,8918,8919],{"class":98,"line":99},[96,8920,6972],{},[96,8922,8923],{"class":98,"line":105},[96,8924,6581],{},[96,8926,8927],{"class":98,"line":111},[96,8928,115],{"emptyLinePlaceholder":114},[96,8930,8931],{"class":98,"line":118},[96,8932,8933],{},"class LearningRecords:\n",[96,8935,8936],{"class":98,"line":124},[96,8937,8938],{},"    def __init__(self, file_path):\n",[96,8940,8941],{"class":98,"line":130},[96,8942,8943],{},"        self.file_path = Path(file_path)\n",[96,8945,8946],{"class":98,"line":136},[96,8947,8948],{},"        self.items = []\n",[96,8950,8951],{"class":98,"line":142},[96,8952,115],{"emptyLinePlaceholder":114},[96,8954,8955],{"class":98,"line":3930},[96,8956,8957],{},"    def add(self, title):\n",[96,8959,8960],{"class":98,"line":4142},[96,8961,8962],{},"        title = title.strip()\n",[96,8964,8965],{"class":98,"line":5807},[96,8966,8967],{},"        if not title:\n",[96,8969,8970],{"class":98,"line":5812},[96,8971,8972],{},"            raise ValueError(\"课程名称不能为空\")\n",[96,8974,8975],{"class":98,"line":7417},[96,8976,8977],{},"        self.items.append({\"title\": title, \"done\": False})\n",[96,8979,8980],{"class":98,"line":7423},[96,8981,115],{"emptyLinePlaceholder":114},[96,8983,8984],{"class":98,"line":8546},[96,8985,8986],{},"    def save(self):\n",[96,8988,8989],{"class":98,"line":8551},[96,8990,8991],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[96,8993,8995],{"class":98,"line":8994},17,[96,8996,8997],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[96,8999,9001],{"class":98,"line":9000},18,[96,9002,115],{"emptyLinePlaceholder":114},[96,9004,9006],{"class":98,"line":9005},19,[96,9007,9008],{},"records = LearningRecords(\"learning-records.json\")\n",[96,9010,9012],{"class":98,"line":9011},20,[96,9013,115],{"emptyLinePlaceholder":114},[96,9015,9017],{"class":98,"line":9016},21,[96,9018,7390],{},[96,9020,9022],{"class":98,"line":9021},22,[96,9023,9024],{},"    title = input(\"输入已学习课程：\")\n",[96,9026,9028],{"class":98,"line":9027},23,[96,9029,9030],{},"    records.add(title)\n",[96,9032,9034],{"class":98,"line":9033},24,[96,9035,9036],{},"    records.save()\n",[96,9038,9040],{"class":98,"line":9039},25,[96,9041,7400],{},[96,9043,9045],{"class":98,"line":9044},26,[96,9046,9047],{},"    print(\"无法保存：\", error)\n",[96,9049,9051],{"class":98,"line":9050},27,[96,9052,1186],{},[96,9054,9056],{"class":98,"line":9055},28,[96,9057,9058],{},"    print(\"已保存 1 条学习记录\")\n",[10,9060,148],{},[87,9062,9065],{"className":9063,"code":9064,"language":154,"meta":92},[152],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9066,9064],{"__ignoreMap":92},[10,9068,159],{},[14,9070,162],{"id":162},[164,9072,9073,9079],{},[49,9074,9075,9076,9078],{},"输入层取得课程名后，",[34,9077,8906],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[49,9080,9081,9083],{},[34,9082,8138],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[186,9085,188],{"id":188},[10,9087,9088],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9090,9091],{},[26,9092],{"alt":9093,"src":9094},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9096,9097],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[186,9099,188],{"id":4197},[10,9101,9102],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9104,9105],{},[26,9106],{"alt":9107,"src":9108},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9110,9111,9112,9115],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9113,9114],{},"load()"," 把文件状态恢复到内存。",[14,9117,208],{"id":208},[46,9119,9120,9123],{},[49,9121,9122],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[49,9124,9125,9126,9128],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9127,9114],{}," 是下一项必要扩展。",[14,9130,225],{"id":225},[164,9132,9133,9139,9142],{},[49,9134,9135,9136,9138],{},"增加 ",[34,9137,9114],{},"，文件不存在时从空列表开始。",[49,9140,9141],{},"增加按序号标记完成的功能，并校验序号范围。",[49,9143,9144,9145,9148,9149,9151],{},"把输入循环放进 ",[34,9146,9147],{},"main()","，通过 ",[34,9150,6116],{}," 控制程序入口。",[10,9153,244],{},[14,9155,247],{"id":247},[10,9157,9158],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[252,9160,254],{},{"title":92,"searchDepth":105,"depth":105,"links":9162},[9163,9164,9165,9166,9167,9171,9172,9173],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":9168},[9169,9170],{"id":188,"depth":111,"text":188},{"id":4197,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8869,"description":8874},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[267,9181,9182],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9185,9288,9407,9538,9681,9806,9943,10080,10221,10390,10527,10660,10783,10912,11039,11202,11378,11519,11648,11797,11940,12061,12184,12333,12486,12651,12778,12959,13102,13259,13410,13557,13712,13930,14085,14260,14411,14578,14765,14928,15170,15410],{"id":1433,"title":1434,"body":9186,"category":267,"cover":268,"description":1439,"extension":269,"meta":9285,"navigation":114,"path":1558,"pinned":272,"publishedAt":273,"seo":9286,"slug":1560,"stem":1561,"summary":1562,"tags":9287,"updatedAt":273,"visible":114,"__hash__":1565},{"type":7,"value":9187,"toc":9275},[9188,9190,9192,9194,9196,9200,9204,9206,9216,9218,9220,9228,9230,9235,9237,9239,9249,9251,9259,9261,9267,9269,9271,9273],[10,9189,1439],{},[14,9191,16],{"id":16},[10,9193,1444],{},[14,9195,22],{"id":22},[10,9197,9198],{},[26,9199],{"alt":1451,"src":1452},[10,9201,9202,1457],{},[34,9203,1211],{},[14,9205,44],{"id":44},[46,9207,9208,9212,9214],{},[49,9209,1464,9210,1467],{},[34,9211,1211],{},[49,9213,1470],{},[49,9215,1473],{},[14,9217,82],{"id":82},[10,9219,85],{},[87,9221,9222],{"className":89,"code":1480,"language":91,"meta":92,"style":92},[34,9223,9224],{"__ignoreMap":92},[96,9225,9226],{"class":98,"line":99},[96,9227,1480],{},[10,9229,148],{},[87,9231,9233],{"className":9232,"code":1492,"language":154,"meta":92},[152],[34,9234,1492],{"__ignoreMap":92},[10,9236,159],{},[14,9238,162],{"id":162},[164,9240,9241,9245],{},[49,9242,1503,9243,1507],{},[34,9244,1506],{},[49,9246,1510,9247,1514],{},[34,9248,1513],{},[14,9250,208],{"id":208},[46,9252,9253,9255],{},[49,9254,1521],{},[49,9256,1524,9257,1527],{},[34,9258,1211],{},[14,9260,225],{"id":225},[164,9262,9263,9265],{},[49,9264,1534],{},[49,9266,1537],{},[10,9268,244],{},[14,9270,247],{"id":247},[10,9272,1544],{},[252,9274,254],{},{"title":92,"searchDepth":105,"depth":105,"links":9276},[9277,9278,9279,9280,9281,9282,9283,9284],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":1434,"description":1439},[267,1429,1564],{"id":1567,"title":1568,"body":9289,"category":267,"cover":268,"description":1573,"extension":269,"meta":9404,"navigation":114,"path":1710,"pinned":272,"publishedAt":273,"seo":9405,"slug":1712,"stem":1713,"summary":1714,"tags":9406,"updatedAt":273,"visible":114,"__hash__":1717},{"type":7,"value":9290,"toc":9394},[9291,9293,9295,9297,9299,9303,9307,9309,9319,9321,9323,9343,9345,9350,9352,9354,9364,9366,9376,9378,9386,9388,9390,9392],[10,9292,1573],{},[14,9294,16],{"id":16},[10,9296,1578],{},[14,9298,22],{"id":22},[10,9300,9301],{},[26,9302],{"alt":1585,"src":1586},[10,9304,1589,9305,1592],{},[34,9306,732],{},[14,9308,44],{"id":44},[46,9310,9311,9313,9315],{},[49,9312,1599],{},[49,9314,1602],{},[49,9316,1605,9317,1609],{},[34,9318,1608],{},[14,9320,82],{"id":82},[10,9322,1614],{},[87,9324,9325],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,9326,9327,9333],{"__ignoreMap":92},[96,9328,9329,9331],{"class":98,"line":99},[96,9330,732],{"class":641},[96,9332,645],{"class":644},[96,9334,9335,9337,9339,9341],{"class":98,"line":105},[96,9336,732],{"class":641},[96,9338,674],{"class":644},[96,9340,678],{"class":677},[96,9342,645],{"class":644},[10,9344,148],{},[87,9346,9348],{"className":9347,"code":1640,"language":154,"meta":92},[152],[34,9349,1640],{"__ignoreMap":92},[10,9351,159],{},[14,9353,162],{"id":162},[164,9355,9356,9360],{},[49,9357,9358,1654],{},[34,9359,1653],{},[49,9361,9362,1659],{},[34,9363,740],{},[14,9365,208],{"id":208},[46,9367,9368,9372],{},[49,9369,1666,9370,1669],{},[34,9371,732],{},[49,9373,1672,9374,1675],{},[34,9375,732],{},[14,9377,225],{"id":225},[164,9379,9380,9384],{},[49,9381,979,9382,1685],{},[34,9383,1684],{},[49,9385,1688],{},[10,9387,244],{},[14,9389,247],{"id":247},[10,9391,1695],{},[252,9393,1698],{},{"title":92,"searchDepth":105,"depth":105,"links":9395},[9396,9397,9398,9399,9400,9401,9402,9403],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":1568,"description":1573},[267,1716,1092],{"id":1719,"title":1720,"body":9408,"category":267,"cover":268,"description":1886,"extension":269,"meta":9535,"navigation":114,"path":1888,"pinned":272,"publishedAt":273,"seo":9536,"slug":1890,"stem":1891,"summary":1892,"tags":9537,"updatedAt":273,"visible":114,"__hash__":1896},{"type":7,"value":9409,"toc":9525},[9410,9414,9416,9418,9420,9424,9426,9428,9444,9446,9448,9468,9470,9475,9477,9479,9491,9493,9503,9505,9515,9517,9519,9523],[10,9411,1725,9412,1728],{},[34,9413,1211],{},[14,9415,16],{"id":16},[10,9417,1733],{},[14,9419,22],{"id":22},[10,9421,9422],{},[26,9423],{"alt":1740,"src":1741},[10,9425,1744],{},[14,9427,44],{"id":44},[46,9429,9430,9436,9440],{},[49,9431,1751,9432,1754,9434,403],{},[34,9433,732],{},[34,9435,1757],{},[49,9437,1760,9438,1764],{},[34,9439,1763],{},[49,9441,1767,9442,1770],{},[34,9443,1211],{},[14,9445,82],{"id":82},[10,9447,85],{},[87,9449,9450],{"className":1777,"code":1778,"language":1779,"meta":92,"style":92},[34,9451,9452,9456,9460,9464],{"__ignoreMap":92},[96,9453,9454],{"class":98,"line":99},[96,9455,1786],{},[96,9457,9458],{"class":98,"line":105},[96,9459,1791],{},[96,9461,9462],{"class":98,"line":111},[96,9463,1796],{},[96,9465,9466],{"class":98,"line":118},[96,9467,1801],{},[10,9469,148],{},[87,9471,9473],{"className":9472,"code":1807,"language":154,"meta":92},[152],[34,9474,1807],{"__ignoreMap":92},[10,9476,159],{},[14,9478,162],{"id":162},[164,9480,9481,9487],{},[49,9482,1818,9483,1822,9485,403],{},[34,9484,1821],{},[34,9486,1825],{},[49,9488,1828,9489,1831],{},[34,9490,1513],{},[14,9492,208],{"id":208},[46,9494,9495,9501],{},[49,9496,1838,9497,1841,9499,1844],{},[34,9498,1757],{},[34,9500,1211],{},[49,9502,1847],{},[14,9504,225],{"id":225},[164,9506,9507,9511],{},[49,9508,1854,9509,403],{},[34,9510,1857],{},[49,9512,1860,9513,1863],{},[34,9514,1513],{},[10,9516,244],{},[14,9518,247],{"id":247},[10,9520,1870,9521,1873],{},[34,9522,1211],{},[252,9524,254],{},{"title":92,"searchDepth":105,"depth":105,"links":9526},[9527,9528,9529,9530,9531,9532,9533,9534],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":1720,"description":1886},[267,1894,1895],{"id":1898,"title":1899,"body":9539,"category":267,"cover":268,"description":1904,"extension":269,"meta":9678,"navigation":114,"path":2076,"pinned":272,"publishedAt":273,"seo":9679,"slug":2078,"stem":2079,"summary":2080,"tags":9680,"updatedAt":273,"visible":114,"__hash__":2084},{"type":7,"value":9540,"toc":9668},[9541,9543,9545,9547,9549,9553,9557,9559,9571,9573,9575,9611,9613,9618,9620,9622,9638,9640,9650,9652,9660,9662,9664,9666],[10,9542,1904],{},[14,9544,16],{"id":16},[10,9546,1909],{},[14,9548,22],{"id":22},[10,9550,9551],{},[26,9552],{"alt":1916,"src":1917},[10,9554,9555,1923],{},[34,9556,1922],{},[14,9558,44],{"id":44},[46,9560,9561,9563,9569],{},[49,9562,1930],{},[49,9564,9565,1936,9567,1940],{},[34,9566,1935],{},[34,9568,1939],{},[49,9570,1943],{},[14,9572,82],{"id":82},[10,9574,1614],{},[87,9576,9577],{"className":632,"code":1950,"language":634,"meta":92,"style":92},[34,9578,9579,9585,9591,9595,9605],{"__ignoreMap":92},[96,9580,9581,9583],{"class":98,"line":99},[96,9582,1957],{"class":641},[96,9584,1960],{"class":677},[96,9586,9587,9589],{"class":98,"line":105},[96,9588,1965],{"class":644},[96,9590,1960],{"class":677},[96,9592,9593],{"class":98,"line":111},[96,9594,1972],{"class":644},[96,9596,9597,9599,9601,9603],{"class":98,"line":118},[96,9598,1977],{"class":644},[96,9600,1980],{"class":677},[96,9602,1984],{"class":1983},[96,9604,1255],{"class":677},[96,9606,9607,9609],{"class":98,"line":124},[96,9608,732],{"class":641},[96,9610,1255],{"class":677},[10,9612,148],{},[87,9614,9616],{"className":9615,"code":1998,"language":154,"meta":92},[152],[34,9617,1998],{"__ignoreMap":92},[10,9619,159],{},[14,9621,162],{"id":162},[164,9623,9624,9632],{},[49,9625,9626,2011,9628,2014,9630,2017],{},[34,9627,1957],{},[34,9629,1965],{},[34,9631,1935],{},[49,9633,9634,2022,9636,2026],{},[34,9635,1922],{},[34,9637,2025],{},[14,9639,208],{"id":208},[46,9641,9642,9648],{},[49,9643,2033,9644,1197,9646,403],{},[34,9645,1935],{},[34,9647,1939],{},[49,9649,2040],{},[14,9651,225],{"id":225},[164,9653,9654,9658],{},[49,9655,2047,9656,2051],{},[34,9657,2050],{},[49,9659,2054],{},[10,9661,244],{},[14,9663,247],{"id":247},[10,9665,2061],{},[252,9667,2064],{},{"title":92,"searchDepth":105,"depth":105,"links":9669},[9670,9671,9672,9673,9674,9675,9676,9677],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":1899,"description":1904},[267,2082,2083],{"id":2086,"title":2087,"body":9682,"category":267,"cover":268,"description":2092,"extension":269,"meta":9803,"navigation":114,"path":2241,"pinned":272,"publishedAt":273,"seo":9804,"slug":2243,"stem":2244,"summary":2245,"tags":9805,"updatedAt":273,"visible":114,"__hash__":2249},{"type":7,"value":9683,"toc":9793},[9684,9686,9688,9690,9692,9696,9704,9706,9720,9722,9724,9740,9742,9747,9749,9751,9765,9767,9773,9775,9785,9787,9789,9791],[10,9685,2092],{},[14,9687,16],{"id":16},[10,9689,2097],{},[14,9691,22],{"id":22},[10,9693,9694],{},[26,9695],{"alt":2104,"src":2105},[10,9697,2108,9698,403,9700,2114,9702,403],{},[34,9699,1513],{},[34,9701,2113],{},[34,9703,1821],{},[14,9705,44],{"id":44},[46,9707,9708,9712,9718],{},[49,9709,9710,2126],{},[34,9711,2125],{},[49,9713,9714,2132,9716,403],{},[34,9715,2131],{},[34,9717,2135],{},[49,9719,2138],{},[14,9721,82],{"id":82},[10,9723,85],{},[87,9725,9726],{"className":89,"code":2145,"language":91,"meta":92,"style":92},[34,9727,9728,9732,9736],{"__ignoreMap":92},[96,9729,9730],{"class":98,"line":99},[96,9731,2152],{},[96,9733,9734],{"class":98,"line":105},[96,9735,2157],{},[96,9737,9738],{"class":98,"line":111},[96,9739,2162],{},[10,9741,148],{},[87,9743,9745],{"className":9744,"code":2168,"language":154,"meta":92},[152],[34,9746,2168],{"__ignoreMap":92},[10,9748,159],{},[14,9750,162],{"id":162},[164,9752,9753,9759],{},[49,9754,9755,2182,9757,403],{},[34,9756,2181],{},[34,9758,2135],{},[49,9760,9761,2189,9763,2193],{},[34,9762,1513],{},[34,9764,2192],{},[14,9766,208],{"id":208},[46,9768,9769,9771],{},[49,9770,2200],{},[49,9772,2203],{},[14,9774,225],{"id":225},[164,9776,9777,9779],{},[49,9778,2210],{},[49,9780,2213,9781,2216,9783,2220],{},[34,9782,2113],{},[34,9784,2219],{},[10,9786,244],{},[14,9788,247],{"id":247},[10,9790,2227],{},[252,9792,254],{},{"title":92,"searchDepth":105,"depth":105,"links":9794},[9795,9796,9797,9798,9799,9800,9801,9802],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":2087,"description":2092},[267,2247,2248],{"id":2251,"title":2252,"body":9807,"category":267,"cover":268,"description":2257,"extension":269,"meta":9940,"navigation":114,"path":2425,"pinned":272,"publishedAt":273,"seo":9941,"slug":2427,"stem":2428,"summary":2429,"tags":9942,"updatedAt":273,"visible":114,"__hash__":2433},{"type":7,"value":9808,"toc":9930},[9809,9811,9813,9815,9817,9821,9823,9825,9841,9843,9845,9869,9871,9876,9878,9880,9896,9898,9910,9912,9922,9924,9926,9928],[10,9810,2257],{},[14,9812,16],{"id":16},[10,9814,2262],{},[14,9816,22],{"id":22},[10,9818,9819],{},[26,9820],{"alt":2269,"src":2270},[10,9822,2273],{},[14,9824,44],{"id":44},[46,9826,9827,9829,9835],{},[49,9828,2280],{},[49,9830,2283,9831,2216,9833,2290],{},[34,9832,2286],{},[34,9834,2289],{},[49,9836,2293,9837,2297,9839,2301],{},[34,9838,2296],{},[34,9840,2300],{},[14,9842,82],{"id":82},[10,9844,85],{},[87,9846,9847],{"className":89,"code":2308,"language":91,"meta":92,"style":92},[34,9848,9849,9853,9857,9861,9865],{"__ignoreMap":92},[96,9850,9851],{"class":98,"line":99},[96,9852,2315],{},[96,9854,9855],{"class":98,"line":105},[96,9856,2320],{},[96,9858,9859],{"class":98,"line":111},[96,9860,115],{"emptyLinePlaceholder":114},[96,9862,9863],{"class":98,"line":118},[96,9864,2329],{},[96,9866,9867],{"class":98,"line":124},[96,9868,2320],{},[10,9870,148],{},[87,9872,9874],{"className":9873,"code":2339,"language":154,"meta":92},[152],[34,9875,2339],{"__ignoreMap":92},[10,9877,159],{},[14,9879,162],{"id":162},[164,9881,9882,9888],{},[49,9883,979,9884,2353,9886,2356],{},[34,9885,2352],{},[34,9887,2286],{},[49,9889,979,9890,2362,9892,2366,9894,403],{},[34,9891,2361],{},[34,9893,2365],{},[34,9895,2369],{},[14,9897,208],{"id":208},[46,9899,9900,9902],{},[49,9901,2376],{},[49,9903,2379,9904,2297,9906,2297,9908,2387],{},[34,9905,2296],{},[34,9907,2300],{},[34,9909,2386],{},[14,9911,225],{"id":225},[164,9913,9914,9920],{},[49,9915,2394,9916,1197,9918,2401],{},[34,9917,2397],{},[34,9919,2400],{},[49,9921,2404],{},[10,9923,244],{},[14,9925,247],{"id":247},[10,9927,2411],{},[252,9929,254],{},{"title":92,"searchDepth":105,"depth":105,"links":9931},[9932,9933,9934,9935,9936,9937,9938,9939],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":2252,"description":2257},[267,2431,2432],{"id":2435,"title":2436,"body":9944,"category":267,"cover":268,"description":2441,"extension":269,"meta":10077,"navigation":114,"path":2606,"pinned":272,"publishedAt":273,"seo":10078,"slug":2608,"stem":2609,"summary":2610,"tags":10079,"updatedAt":273,"visible":114,"__hash__":2614},{"type":7,"value":9945,"toc":10067},[9946,9948,9950,9952,9954,9958,9960,9962,9980,9982,9984,10020,10022,10027,10029,10031,10041,10043,10051,10053,10059,10061,10063,10065],[10,9947,2441],{},[14,9949,16],{"id":16},[10,9951,2446],{},[14,9953,22],{"id":22},[10,9955,9956],{},[26,9957],{"alt":2453,"src":2454},[10,9959,2457],{},[14,9961,44],{"id":44},[46,9963,9964,9970,9978],{},[49,9965,9966,2467,9968,2471],{},[34,9967,2466],{},[34,9969,2470],{},[49,9971,9972,2477,9974,2481,9976,2485],{},[34,9973,2476],{},[34,9975,2480],{},[34,9977,2484],{},[49,9979,2488],{},[14,9981,82],{"id":82},[10,9983,85],{},[87,9985,9986],{"className":89,"code":2495,"language":91,"meta":92,"style":92},[34,9987,9988,9992,9996,10000,10004,10008,10012,10016],{"__ignoreMap":92},[96,9989,9990],{"class":98,"line":99},[96,9991,2502],{},[96,9993,9994],{"class":98,"line":105},[96,9995,2507],{},[96,9997,9998],{"class":98,"line":111},[96,9999,2512],{},[96,10001,10002],{"class":98,"line":118},[96,10003,115],{"emptyLinePlaceholder":114},[96,10005,10006],{"class":98,"line":124},[96,10007,2521],{},[96,10009,10010],{"class":98,"line":130},[96,10011,2526],{},[96,10013,10014],{"class":98,"line":136},[96,10015,2531],{},[96,10017,10018],{"class":98,"line":142},[96,10019,2536],{},[10,10021,148],{},[87,10023,10025],{"className":10024,"code":2542,"language":154,"meta":92},[152],[34,10026,2542],{"__ignoreMap":92},[10,10028,159],{},[14,10030,162],{"id":162},[164,10032,10033,10037],{},[49,10034,10035,2556],{},[34,10036,2555],{},[49,10038,10039,2562],{},[34,10040,2561],{},[14,10042,208],{"id":208},[46,10044,10045,10049],{},[49,10046,2569,10047,403],{},[34,10048,2572],{},[49,10050,2575],{},[14,10052,225],{"id":225},[164,10054,10055,10057],{},[49,10056,2582],{},[49,10058,2585],{},[10,10060,244],{},[14,10062,247],{"id":247},[10,10064,2592],{},[252,10066,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10068},[10069,10070,10071,10072,10073,10074,10075,10076],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":2436,"description":2441},[267,2612,2613],{"id":2616,"title":2617,"body":10081,"category":267,"cover":268,"description":2622,"extension":269,"meta":10218,"navigation":114,"path":2798,"pinned":272,"publishedAt":273,"seo":10219,"slug":2800,"stem":2801,"summary":2802,"tags":10220,"updatedAt":273,"visible":114,"__hash__":2806},{"type":7,"value":10082,"toc":10206},[10083,10085,10087,10089,10091,10095,10101,10103,10111,10113,10115,10139,10141,10146,10148,10150,10168,10170,10172,10176,10178,10180,10186,10188,10198,10200,10202,10204],[10,10084,2622],{},[14,10086,16],{"id":16},[10,10088,2627],{},[14,10090,22],{"id":22},[10,10092,10093],{},[26,10094],{"alt":2634,"src":2635},[10,10096,2638,10097,2642,10099,403],{},[34,10098,2641],{},[34,10100,2645],{},[14,10102,44],{"id":44},[46,10104,10105,10107,10109],{},[49,10106,2652],{},[49,10108,2655],{},[49,10110,2658],{},[14,10112,82],{"id":82},[10,10114,85],{},[87,10116,10117],{"className":89,"code":2665,"language":91,"meta":92,"style":92},[34,10118,10119,10123,10127,10131,10135],{"__ignoreMap":92},[96,10120,10121],{"class":98,"line":99},[96,10122,2672],{},[96,10124,10125],{"class":98,"line":105},[96,10126,2677],{},[96,10128,10129],{"class":98,"line":111},[96,10130,2682],{},[96,10132,10133],{"class":98,"line":118},[96,10134,2687],{},[96,10136,10137],{"class":98,"line":124},[96,10138,2692],{},[10,10140,148],{},[87,10142,10144],{"className":10143,"code":2698,"language":154,"meta":92},[152],[34,10145,2698],{"__ignoreMap":92},[10,10147,159],{},[14,10149,162],{"id":162},[164,10151,10152,10160],{},[49,10153,2709,10154,2712,10156,2716,10158,2720],{},[34,10155,267],{},[34,10157,2715],{},[34,10159,2719],{},[49,10161,10162,2726,10164,2730,10166,2734],{},[34,10163,2725],{},[34,10165,2729],{},[34,10167,2733],{},[186,10169,188],{"id":188},[10,10171,2739],{},[10,10173,10174],{},[26,10175],{"alt":2744,"src":2745},[10,10177,2748],{},[14,10179,208],{"id":208},[46,10181,10182,10184],{},[49,10183,2755],{},[49,10185,2758],{},[14,10187,225],{"id":225},[164,10189,10190,10196],{},[49,10191,2765,10192,2769,10194,403],{},[34,10193,2768],{},[34,10195,2772],{},[49,10197,2775],{},[10,10199,244],{},[14,10201,247],{"id":247},[10,10203,2782],{},[252,10205,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10207},[10208,10209,10210,10211,10212,10215,10216,10217],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":10213},[10214],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":2617,"description":2622},[267,2804,2805],{"id":4,"title":5,"body":10222,"category":267,"cover":268,"description":12,"extension":269,"meta":10387,"navigation":114,"path":271,"pinned":272,"publishedAt":273,"seo":10388,"slug":275,"stem":276,"summary":277,"tags":10389,"updatedAt":273,"visible":114,"__hash__":281},{"type":7,"value":10223,"toc":10375},[10224,10226,10228,10230,10232,10236,10242,10244,10264,10266,10268,10304,10306,10311,10313,10315,10329,10331,10333,10337,10343,10345,10355,10357,10367,10369,10371,10373],[10,10225,12],{},[14,10227,16],{"id":16},[10,10229,19],{},[14,10231,22],{"id":22},[10,10233,10234],{},[26,10235],{"alt":28,"src":29},[10,10237,32,10238,37,10240,41],{},[34,10239,36],{},[34,10241,40],{},[14,10243,44],{"id":44},[46,10245,10246,10254,10262],{},[49,10247,10248,54,10250,58,10252,62],{},[34,10249,53],{},[34,10251,57],{},[34,10253,61],{},[49,10255,10256,68,10258,72,10260,76],{},[34,10257,67],{},[34,10259,71],{},[34,10261,75],{},[49,10263,79],{},[14,10265,82],{"id":82},[10,10267,85],{},[87,10269,10270],{"className":89,"code":90,"language":91,"meta":92,"style":92},[34,10271,10272,10276,10280,10284,10288,10292,10296,10300],{"__ignoreMap":92},[96,10273,10274],{"class":98,"line":99},[96,10275,102],{},[96,10277,10278],{"class":98,"line":105},[96,10279,108],{},[96,10281,10282],{"class":98,"line":111},[96,10283,115],{"emptyLinePlaceholder":114},[96,10285,10286],{"class":98,"line":118},[96,10287,121],{},[96,10289,10290],{"class":98,"line":124},[96,10291,127],{},[96,10293,10294],{"class":98,"line":130},[96,10295,133],{},[96,10297,10298],{"class":98,"line":136},[96,10299,139],{},[96,10301,10302],{"class":98,"line":142},[96,10303,145],{},[10,10305,148],{},[87,10307,10309],{"className":10308,"code":153,"language":154,"meta":92},[152],[34,10310,153],{"__ignoreMap":92},[10,10312,159],{},[14,10314,162],{"id":162},[164,10316,10317,10323],{},[49,10318,10319,171,10321,175],{},[34,10320,170],{},[34,10322,174],{},[49,10324,10325,181,10327,184],{},[34,10326,180],{},[34,10328,75],{},[186,10330,188],{"id":188},[10,10332,191],{},[10,10334,10335],{},[26,10336],{"alt":196,"src":197},[10,10338,10339,202,10341,205],{},[34,10340,67],{},[34,10342,71],{},[14,10344,208],{"id":208},[46,10346,10347,10353],{},[49,10348,213,10349,216,10351,219],{},[34,10350,61],{},[34,10352,53],{},[49,10354,222],{},[14,10356,225],{"id":225},[164,10358,10359,10363],{},[49,10360,230,10361,234],{},[34,10362,233],{},[49,10364,237,10365,241],{},[34,10366,240],{},[10,10368,244],{},[14,10370,247],{"id":247},[10,10372,250],{},[252,10374,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10376},[10377,10378,10379,10380,10381,10384,10385,10386],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":10382},[10383],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5,"description":12},[267,279,280],{"id":2977,"title":2978,"body":10391,"category":267,"cover":268,"description":2983,"extension":269,"meta":10524,"navigation":114,"path":3152,"pinned":272,"publishedAt":273,"seo":10525,"slug":3154,"stem":3155,"summary":3156,"tags":10526,"updatedAt":273,"visible":114,"__hash__":3159},{"type":7,"value":10392,"toc":10514},[10393,10395,10397,10399,10401,10405,10415,10417,10427,10429,10431,10459,10461,10466,10468,10470,10484,10486,10494,10496,10506,10508,10510,10512],[10,10394,2983],{},[14,10396,16],{"id":16},[10,10398,2988],{},[14,10400,22],{"id":22},[10,10402,10403],{},[26,10404],{"alt":2995,"src":2996},[10,10406,10407,3002,10409,3006,10411,3010,10413,3014],{},[34,10408,3001],{},[34,10410,3005],{},[34,10412,3009],{},[34,10414,3013],{},[14,10416,44],{"id":44},[46,10418,10419,10421,10425],{},[49,10420,3021],{},[49,10422,10423,3026],{},[34,10424,3013],{},[49,10426,3029],{},[14,10428,82],{"id":82},[10,10430,85],{},[87,10432,10433],{"className":89,"code":3036,"language":91,"meta":92,"style":92},[34,10434,10435,10439,10443,10447,10451,10455],{"__ignoreMap":92},[96,10436,10437],{"class":98,"line":99},[96,10438,3043],{},[96,10440,10441],{"class":98,"line":105},[96,10442,3048],{},[96,10444,10445],{"class":98,"line":111},[96,10446,3053],{},[96,10448,10449],{"class":98,"line":118},[96,10450,115],{"emptyLinePlaceholder":114},[96,10452,10453],{"class":98,"line":124},[96,10454,3062],{},[96,10456,10457],{"class":98,"line":130},[96,10458,3067],{},[10,10460,148],{},[87,10462,10464],{"className":10463,"code":3073,"language":154,"meta":92},[152],[34,10465,3073],{"__ignoreMap":92},[10,10467,159],{},[14,10469,162],{"id":162},[164,10471,10472,10478],{},[49,10473,3084,10474,3087,10476,3091],{},[34,10475,3001],{},[34,10477,3090],{},[49,10479,10480,3097,10482,3101],{},[34,10481,3096],{},[34,10483,3100],{},[14,10485,208],{"id":208},[46,10487,10488,10492],{},[49,10489,3108,10490,3112],{},[34,10491,3111],{},[49,10493,3115],{},[14,10495,225],{"id":225},[164,10497,10498,10500],{},[49,10499,3122],{},[49,10501,1760,10502,3128,10504,3131],{},[34,10503,3127],{},[34,10505,3013],{},[10,10507,244],{},[14,10509,247],{"id":247},[10,10511,3138],{},[252,10513,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10515},[10516,10517,10518,10519,10520,10521,10522,10523],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":2978,"description":2983},[267,2386,3158],{"id":3161,"title":3162,"body":10528,"category":267,"cover":268,"description":3167,"extension":269,"meta":10657,"navigation":114,"path":3328,"pinned":272,"publishedAt":273,"seo":10658,"slug":3330,"stem":3331,"summary":3332,"tags":10659,"updatedAt":273,"visible":114,"__hash__":3336},{"type":7,"value":10529,"toc":10647},[10530,10532,10534,10536,10538,10542,10546,10548,10558,10560,10562,10594,10596,10601,10603,10605,10617,10619,10629,10631,10639,10641,10643,10645],[10,10531,3167],{},[14,10533,16],{"id":16},[10,10535,3172],{},[14,10537,22],{"id":22},[10,10539,10540],{},[26,10541],{"alt":3179,"src":3180},[10,10543,3183,10544,3187],{},[34,10545,3186],{},[14,10547,44],{"id":44},[46,10549,10550,10552,10554],{},[49,10551,3194],{},[49,10553,3197],{},[49,10555,3200,10556,403],{},[34,10557,3203],{},[14,10559,82],{"id":82},[10,10561,85],{},[87,10563,10564],{"className":89,"code":3210,"language":91,"meta":92,"style":92},[34,10565,10566,10570,10574,10578,10582,10586,10590],{"__ignoreMap":92},[96,10567,10568],{"class":98,"line":99},[96,10569,3217],{},[96,10571,10572],{"class":98,"line":105},[96,10573,3222],{},[96,10575,10576],{"class":98,"line":111},[96,10577,115],{"emptyLinePlaceholder":114},[96,10579,10580],{"class":98,"line":118},[96,10581,3231],{},[96,10583,10584],{"class":98,"line":124},[96,10585,3236],{},[96,10587,10588],{"class":98,"line":130},[96,10589,3241],{},[96,10591,10592],{"class":98,"line":136},[96,10593,3246],{},[10,10595,148],{},[87,10597,10599],{"className":10598,"code":3252,"language":154,"meta":92},[152],[34,10600,3252],{"__ignoreMap":92},[10,10602,159],{},[14,10604,162],{"id":162},[164,10606,10607,10609],{},[49,10608,3263],{},[49,10610,10611,3269,10613,3273,10615,3277],{},[34,10612,3268],{},[34,10614,3272],{},[34,10616,3276],{},[14,10618,208],{"id":208},[46,10620,10621,10627],{},[49,10622,3284,10623,3288,10625,403],{},[34,10624,3287],{},[34,10626,3291],{},[49,10628,3294],{},[14,10630,225],{"id":225},[164,10632,10633,10635],{},[49,10634,3301],{},[49,10636,3304,10637,3307],{},[34,10638,3276],{},[10,10640,244],{},[14,10642,247],{"id":247},[10,10644,3314],{},[252,10646,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10648},[10649,10650,10651,10652,10653,10654,10655,10656],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":3162,"description":3167},[267,3334,3335],{"id":3338,"title":3339,"body":10661,"category":267,"cover":268,"description":3344,"extension":269,"meta":10780,"navigation":114,"path":3486,"pinned":272,"publishedAt":273,"seo":10781,"slug":3488,"stem":3489,"summary":3490,"tags":10782,"updatedAt":273,"visible":114,"__hash__":3493},{"type":7,"value":10662,"toc":10770},[10663,10665,10667,10669,10671,10675,10677,10679,10687,10689,10691,10719,10721,10726,10728,10730,10740,10742,10750,10752,10762,10764,10766,10768],[10,10664,3344],{},[14,10666,16],{"id":16},[10,10668,3349],{},[14,10670,22],{"id":22},[10,10672,10673],{},[26,10674],{"alt":3356,"src":3357},[10,10676,3360],{},[14,10678,44],{"id":44},[46,10680,10681,10683,10685],{},[49,10682,3367],{},[49,10684,3370],{},[49,10686,3373],{},[14,10688,82],{"id":82},[10,10690,85],{},[87,10692,10693],{"className":89,"code":3380,"language":91,"meta":92,"style":92},[34,10694,10695,10699,10703,10707,10711,10715],{"__ignoreMap":92},[96,10696,10697],{"class":98,"line":99},[96,10698,3387],{},[96,10700,10701],{"class":98,"line":105},[96,10702,3392],{},[96,10704,10705],{"class":98,"line":111},[96,10706,3397],{},[96,10708,10709],{"class":98,"line":118},[96,10710,115],{"emptyLinePlaceholder":114},[96,10712,10713],{"class":98,"line":124},[96,10714,3406],{},[96,10716,10717],{"class":98,"line":130},[96,10718,3411],{},[10,10720,148],{},[87,10722,10724],{"className":10723,"code":3417,"language":154,"meta":92},[152],[34,10725,3417],{"__ignoreMap":92},[10,10727,159],{},[14,10729,162],{"id":162},[164,10731,10732,10736],{},[49,10733,10734,3431],{},[34,10735,3430],{},[49,10737,10738,3437],{},[34,10739,3436],{},[14,10741,208],{"id":208},[46,10743,10744,10748],{},[49,10745,3444,10746,3448],{},[34,10747,3447],{},[49,10749,3451],{},[14,10751,225],{"id":225},[164,10753,10754,10756],{},[49,10755,3458],{},[49,10757,2213,10758,2216,10760,3465],{},[34,10759,3447],{},[34,10761,3436],{},[10,10763,244],{},[14,10765,247],{"id":247},[10,10767,3472],{},[252,10769,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10771},[10772,10773,10774,10775,10776,10777,10778,10779],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":3339,"description":3344},[267,3492,3335],{"id":3495,"title":3496,"body":10784,"category":267,"cover":268,"description":3501,"extension":269,"meta":10909,"navigation":114,"path":3657,"pinned":272,"publishedAt":273,"seo":10910,"slug":3659,"stem":3660,"summary":3661,"tags":10911,"updatedAt":273,"visible":114,"__hash__":3664},{"type":7,"value":10785,"toc":10899},[10786,10788,10790,10792,10794,10798,10804,10806,10816,10818,10820,10848,10850,10855,10857,10859,10869,10871,10883,10885,10891,10893,10895,10897],[10,10787,3501],{},[14,10789,16],{"id":16},[10,10791,3506],{},[14,10793,22],{"id":22},[10,10795,10796],{},[26,10797],{"alt":3513,"src":3514},[10,10799,3517,10800,3521,10802,3524],{},[34,10801,3520],{},[34,10803,2286],{},[14,10805,44],{"id":44},[46,10807,10808,10810,10814],{},[49,10809,3531],{},[49,10811,2379,10812,3537],{},[34,10813,3536],{},[49,10815,3540],{},[14,10817,82],{"id":82},[10,10819,85],{},[87,10821,10822],{"className":89,"code":3547,"language":91,"meta":92,"style":92},[34,10823,10824,10828,10832,10836,10840,10844],{"__ignoreMap":92},[96,10825,10826],{"class":98,"line":99},[96,10827,3554],{},[96,10829,10830],{"class":98,"line":105},[96,10831,3559],{},[96,10833,10834],{"class":98,"line":111},[96,10835,115],{"emptyLinePlaceholder":114},[96,10837,10838],{"class":98,"line":118},[96,10839,3568],{},[96,10841,10842],{"class":98,"line":124},[96,10843,3573],{},[96,10845,10846],{"class":98,"line":130},[96,10847,3578],{},[10,10849,148],{},[87,10851,10853],{"className":10852,"code":3584,"language":154,"meta":92},[152],[34,10854,3584],{"__ignoreMap":92},[10,10856,159],{},[14,10858,162],{"id":162},[164,10860,10861,10863],{},[49,10862,3595],{},[49,10864,3598,10865,3601,10867,3605],{},[34,10866,2286],{},[34,10868,3604],{},[14,10870,208],{"id":208},[46,10872,10873,10877],{},[49,10874,3612,10875,3616],{},[34,10876,3615],{},[49,10878,3619,10879,3623,10881,403],{},[34,10880,3622],{},[34,10882,3626],{},[14,10884,225],{"id":225},[164,10886,10887,10889],{},[49,10888,3633],{},[49,10890,3636],{},[10,10892,244],{},[14,10894,247],{"id":247},[10,10896,3643],{},[252,10898,254],{},{"title":92,"searchDepth":105,"depth":105,"links":10900},[10901,10902,10903,10904,10905,10906,10907,10908],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":3496,"description":3501},[267,3663,3335],{"id":3666,"title":3667,"body":10913,"category":267,"cover":268,"description":3672,"extension":269,"meta":11036,"navigation":114,"path":3822,"pinned":272,"publishedAt":273,"seo":11037,"slug":3824,"stem":3825,"summary":3826,"tags":11038,"updatedAt":273,"visible":114,"__hash__":3829},{"type":7,"value":10914,"toc":11026},[10915,10917,10919,10921,10923,10927,10929,10931,10943,10945,10947,10975,10977,10982,10984,10986,10996,10998,11008,11010,11018,11020,11022,11024],[10,10916,3672],{},[14,10918,16],{"id":16},[10,10920,3677],{},[14,10922,22],{"id":22},[10,10924,10925],{},[26,10926],{"alt":3684,"src":3685},[10,10928,3688],{},[14,10930,44],{"id":44},[46,10932,10933,10935,10937],{},[49,10934,3695],{},[49,10936,3698],{},[49,10938,3701,10939,3705,10941,3709],{},[34,10940,3704],{},[34,10942,3708],{},[14,10944,82],{"id":82},[10,10946,85],{},[87,10948,10949],{"className":89,"code":3716,"language":91,"meta":92,"style":92},[34,10950,10951,10955,10959,10963,10967,10971],{"__ignoreMap":92},[96,10952,10953],{"class":98,"line":99},[96,10954,3723],{},[96,10956,10957],{"class":98,"line":105},[96,10958,3728],{},[96,10960,10961],{"class":98,"line":111},[96,10962,115],{"emptyLinePlaceholder":114},[96,10964,10965],{"class":98,"line":118},[96,10966,3737],{},[96,10968,10969],{"class":98,"line":124},[96,10970,3742],{},[96,10972,10973],{"class":98,"line":130},[96,10974,3747],{},[10,10976,148],{},[87,10978,10980],{"className":10979,"code":3753,"language":154,"meta":92},[152],[34,10981,3753],{"__ignoreMap":92},[10,10983,159],{},[14,10985,162],{"id":162},[164,10987,10988,10990],{},[49,10989,3764],{},[49,10991,10992,3770,10994,3774],{},[34,10993,3769],{},[34,10995,3773],{},[14,10997,208],{"id":208},[46,10999,11000,11006],{},[49,11001,2379,11002,3783,11004,403],{},[34,11003,3708],{},[34,11005,3704],{},[49,11007,3788],{},[14,11009,225],{"id":225},[164,11011,11012,11016],{},[49,11013,3795,11014,3798],{},[34,11015,3704],{},[49,11017,3801],{},[10,11019,244],{},[14,11021,247],{"id":247},[10,11023,3808],{},[252,11025,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11027},[11028,11029,11030,11031,11032,11033,11034,11035],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":3667,"description":3672},[267,3828,3335],{"id":3831,"title":3832,"body":11040,"category":267,"cover":268,"description":3837,"extension":269,"meta":11199,"navigation":114,"path":4036,"pinned":272,"publishedAt":273,"seo":11200,"slug":4038,"stem":4039,"summary":4040,"tags":11201,"updatedAt":273,"visible":114,"__hash__":4044},{"type":7,"value":11041,"toc":11187},[11042,11044,11046,11048,11050,11054,11060,11062,11074,11076,11078,11118,11120,11125,11127,11129,11143,11145,11147,11151,11153,11155,11165,11167,11179,11181,11183,11185],[10,11043,3837],{},[14,11045,16],{"id":16},[10,11047,3842],{},[14,11049,22],{"id":22},[10,11051,11052],{},[26,11053],{"alt":3849,"src":3850},[10,11055,11056,3856,11058,3860],{},[34,11057,3855],{},[34,11059,3859],{},[14,11061,44],{"id":44},[46,11063,11064,11070,11072],{},[49,11065,11066,3869,11068,3873],{},[34,11067,53],{},[34,11069,3872],{},[49,11071,3876],{},[49,11073,3879],{},[14,11075,82],{"id":82},[10,11077,85],{},[87,11079,11080],{"className":89,"code":3886,"language":91,"meta":92,"style":92},[34,11081,11082,11086,11090,11094,11098,11102,11106,11110,11114],{"__ignoreMap":92},[96,11083,11084],{"class":98,"line":99},[96,11085,3893],{},[96,11087,11088],{"class":98,"line":105},[96,11089,3898],{},[96,11091,11092],{"class":98,"line":111},[96,11093,3903],{},[96,11095,11096],{"class":98,"line":118},[96,11097,115],{"emptyLinePlaceholder":114},[96,11099,11100],{"class":98,"line":124},[96,11101,3912],{},[96,11103,11104],{"class":98,"line":130},[96,11105,3917],{},[96,11107,11108],{"class":98,"line":136},[96,11109,3922],{},[96,11111,11112],{"class":98,"line":142},[96,11113,3927],{},[96,11115,11116],{"class":98,"line":3930},[96,11117,3933],{},[10,11119,148],{},[87,11121,11123],{"className":11122,"code":3939,"language":154,"meta":92},[152],[34,11124,3939],{"__ignoreMap":92},[10,11126,159],{},[14,11128,162],{"id":162},[164,11130,11131,11135],{},[49,11132,11133,3953],{},[34,11134,3952],{},[49,11136,11137,3959,11139,3963,11141,3967],{},[34,11138,3958],{},[34,11140,3962],{},[34,11142,3966],{},[186,11144,188],{"id":188},[10,11146,3972],{},[10,11148,11149],{},[26,11150],{"alt":3977,"src":3978},[10,11152,3981],{},[14,11154,208],{"id":208},[46,11156,11157,11163],{},[49,11158,3988,11159,3991,11161,403],{},[34,11160,53],{},[34,11162,3872],{},[49,11164,3996],{},[14,11166,225],{"id":225},[164,11168,11169,11171],{},[49,11170,4003],{},[49,11172,2379,11173,4009,11175,1197,11177,403],{},[34,11174,4008],{},[34,11176,3872],{},[34,11178,53],{},[10,11180,244],{},[14,11182,247],{"id":247},[10,11184,4020],{},[252,11186,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11188},[11189,11190,11191,11192,11193,11196,11197,11198],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":11194},[11195],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":3832,"description":3837},[267,4042,4043],{"id":4046,"title":4047,"body":11203,"category":267,"cover":268,"description":4052,"extension":269,"meta":11375,"navigation":114,"path":4266,"pinned":272,"publishedAt":273,"seo":11376,"slug":4268,"stem":4269,"summary":4270,"tags":11377,"updatedAt":273,"visible":114,"__hash__":4273},{"type":7,"value":11204,"toc":11362},[11205,11207,11209,11211,11213,11217,11225,11227,11235,11237,11239,11283,11285,11290,11292,11294,11306,11308,11310,11314,11320,11322,11324,11328,11332,11334,11346,11348,11354,11356,11358,11360],[10,11206,4052],{},[14,11208,16],{"id":16},[10,11210,4057],{},[14,11212,22],{"id":22},[10,11214,11215],{},[26,11216],{"alt":4064,"src":4065},[10,11218,11219,2297,11221,2297,11223,4075],{},[34,11220,1196],{},[34,11222,4072],{},[34,11224,1200],{},[14,11226,44],{"id":44},[46,11228,11229,11231,11233],{},[49,11230,4082],{},[49,11232,4085],{},[49,11234,4088],{},[14,11236,82],{"id":82},[10,11238,85],{},[87,11240,11241],{"className":89,"code":4095,"language":91,"meta":92,"style":92},[34,11242,11243,11247,11251,11255,11259,11263,11267,11271,11275,11279],{"__ignoreMap":92},[96,11244,11245],{"class":98,"line":99},[96,11246,4102],{},[96,11248,11249],{"class":98,"line":105},[96,11250,115],{"emptyLinePlaceholder":114},[96,11252,11253],{"class":98,"line":111},[96,11254,4111],{},[96,11256,11257],{"class":98,"line":118},[96,11258,4116],{},[96,11260,11261],{"class":98,"line":124},[96,11262,4121],{},[96,11264,11265],{"class":98,"line":130},[96,11266,4126],{},[96,11268,11269],{"class":98,"line":136},[96,11270,1186],{},[96,11272,11273],{"class":98,"line":142},[96,11274,4135],{},[96,11276,11277],{"class":98,"line":3930},[96,11278,115],{"emptyLinePlaceholder":114},[96,11280,11281],{"class":98,"line":4142},[96,11282,4145],{},[10,11284,148],{},[87,11286,11288],{"className":11287,"code":4151,"language":154,"meta":92},[152],[34,11289,4151],{"__ignoreMap":92},[10,11291,159],{},[14,11293,162],{"id":162},[164,11295,11296,11300],{},[49,11297,4162,11298,4166],{},[34,11299,4165],{},[49,11301,11302,4172,11304,4175],{},[34,11303,4171],{},[34,11305,1200],{},[186,11307,188],{"id":188},[10,11309,4180],{},[10,11311,11312],{},[26,11313],{"alt":4185,"src":4186},[10,11315,11316,4191,11318,4194],{},[34,11317,4165],{},[34,11319,4171],{},[186,11321,188],{"id":4197},[10,11323,4200],{},[10,11325,11326],{},[26,11327],{"alt":4205,"src":4206},[10,11329,4209,11330,4212],{},[34,11331,1196],{},[14,11333,208],{"id":208},[46,11335,11336,11340],{},[49,11337,4219,11338,4222],{},[34,11339,4171],{},[49,11341,4225,11342,4228,11344,4232],{},[34,11343,1196],{},[34,11345,4231],{},[14,11347,225],{"id":225},[164,11349,11350,11352],{},[49,11351,4239],{},[49,11353,4242],{},[10,11355,244],{},[14,11357,247],{"id":247},[10,11359,4249],{},[252,11361,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11363},[11364,11365,11366,11367,11368,11372,11373,11374],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":11369},[11370,11371],{"id":188,"depth":111,"text":188},{"id":4197,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":4047,"description":4052},[267,1196,4272],{"id":4275,"title":4276,"body":11379,"category":267,"cover":268,"description":4281,"extension":269,"meta":11516,"navigation":114,"path":4448,"pinned":272,"publishedAt":273,"seo":11517,"slug":4450,"stem":4451,"summary":4452,"tags":11518,"updatedAt":273,"visible":114,"__hash__":4455},{"type":7,"value":11380,"toc":11504},[11381,11383,11385,11387,11389,11393,11397,11399,11409,11411,11413,11445,11447,11452,11454,11456,11466,11468,11470,11474,11478,11480,11486,11488,11496,11498,11500,11502],[10,11382,4281],{},[14,11384,16],{"id":16},[10,11386,4286],{},[14,11388,22],{"id":22},[10,11390,11391],{},[26,11392],{"alt":4293,"src":4294},[10,11394,11395,4300],{},[34,11396,4299],{},[14,11398,44],{"id":44},[46,11400,11401,11403,11405],{},[49,11402,4307],{},[49,11404,4310],{},[49,11406,4313,11407,4317],{},[34,11408,4316],{},[14,11410,82],{"id":82},[10,11412,85],{},[87,11414,11415],{"className":89,"code":4324,"language":91,"meta":92,"style":92},[34,11416,11417,11421,11425,11429,11433,11437,11441],{"__ignoreMap":92},[96,11418,11419],{"class":98,"line":99},[96,11420,4331],{},[96,11422,11423],{"class":98,"line":105},[96,11424,115],{"emptyLinePlaceholder":114},[96,11426,11427],{"class":98,"line":111},[96,11428,4340],{},[96,11430,11431],{"class":98,"line":118},[96,11432,4345],{},[96,11434,11435],{"class":98,"line":124},[96,11436,4350],{},[96,11438,11439],{"class":98,"line":130},[96,11440,115],{"emptyLinePlaceholder":114},[96,11442,11443],{"class":98,"line":136},[96,11444,4359],{},[10,11446,148],{},[87,11448,11450],{"className":11449,"code":4365,"language":154,"meta":92},[152],[34,11451,4365],{"__ignoreMap":92},[10,11453,159],{},[14,11455,162],{"id":162},[164,11457,11458,11462],{},[49,11459,4376,11460,4380],{},[34,11461,4379],{},[49,11463,4383,11464,4386],{},[34,11465,4379],{},[186,11467,188],{"id":188},[10,11469,4391],{},[10,11471,11472],{},[26,11473],{"alt":4396,"src":4397},[10,11475,4400,11476,4403],{},[34,11477,4379],{},[14,11479,208],{"id":208},[46,11481,11482,11484],{},[49,11483,4410],{},[49,11485,4413],{},[14,11487,225],{"id":225},[164,11489,11490,11494],{},[49,11491,2379,11492,4422],{},[34,11493,4299],{},[49,11495,4425],{},[10,11497,244],{},[14,11499,247],{"id":247},[10,11501,4432],{},[252,11503,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11505},[11506,11507,11508,11509,11510,11513,11514,11515],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":11511},[11512],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":4276,"description":4281},[267,4299,4454],{"id":4457,"title":4458,"body":11520,"category":267,"cover":268,"description":4463,"extension":269,"meta":11645,"navigation":114,"path":4612,"pinned":272,"publishedAt":273,"seo":11646,"slug":4614,"stem":4615,"summary":4616,"tags":11647,"updatedAt":273,"visible":114,"__hash__":4619},{"type":7,"value":11521,"toc":11635},[11522,11524,11526,11528,11530,11534,11538,11540,11550,11552,11554,11586,11588,11593,11595,11597,11609,11611,11617,11619,11627,11629,11631,11633],[10,11523,4463],{},[14,11525,16],{"id":16},[10,11527,4468],{},[14,11529,22],{"id":22},[10,11531,11532],{},[26,11533],{"alt":4475,"src":4476},[10,11535,11536,4481],{},[34,11537,4316],{},[14,11539,44],{"id":44},[46,11541,11542,11546,11548],{},[49,11543,11544,4491],{},[34,11545,4490],{},[49,11547,4494],{},[49,11549,4497],{},[14,11551,82],{"id":82},[10,11553,85],{},[87,11555,11556],{"className":89,"code":4504,"language":91,"meta":92,"style":92},[34,11557,11558,11562,11566,11570,11574,11578,11582],{"__ignoreMap":92},[96,11559,11560],{"class":98,"line":99},[96,11561,4511],{},[96,11563,11564],{"class":98,"line":105},[96,11565,115],{"emptyLinePlaceholder":114},[96,11567,11568],{"class":98,"line":111},[96,11569,4520],{},[96,11571,11572],{"class":98,"line":118},[96,11573,4525],{},[96,11575,11576],{"class":98,"line":124},[96,11577,115],{"emptyLinePlaceholder":114},[96,11579,11580],{"class":98,"line":130},[96,11581,4534],{},[96,11583,11584],{"class":98,"line":136},[96,11585,4539],{},[10,11587,148],{},[87,11589,11591],{"className":11590,"code":4545,"language":154,"meta":92},[152],[34,11592,4545],{"__ignoreMap":92},[10,11594,159],{},[14,11596,162],{"id":162},[164,11598,11599,11605],{},[49,11600,4556,11601,4559,11603,4563],{},[34,11602,4316],{},[34,11604,4562],{},[49,11606,11607,4568],{},[34,11608,4490],{},[14,11610,208],{"id":208},[46,11612,11613,11615],{},[49,11614,4575],{},[49,11616,4578],{},[14,11618,225],{"id":225},[164,11620,11621,11623],{},[49,11622,4585],{},[49,11624,2379,11625,4591],{},[34,11626,4590],{},[10,11628,244],{},[14,11630,247],{"id":247},[10,11632,4598],{},[252,11634,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11636},[11637,11638,11639,11640,11641,11642,11643,11644],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":4458,"description":4463},[267,4316,4618],{"id":4621,"title":4622,"body":11649,"category":267,"cover":268,"description":4627,"extension":269,"meta":11794,"navigation":114,"path":4802,"pinned":272,"publishedAt":273,"seo":11795,"slug":4804,"stem":4805,"summary":4806,"tags":11796,"updatedAt":273,"visible":114,"__hash__":4808},{"type":7,"value":11650,"toc":11784},[11651,11653,11655,11657,11659,11663,11669,11671,11685,11687,11689,11733,11735,11740,11742,11744,11754,11756,11768,11770,11776,11778,11780,11782],[10,11652,4627],{},[14,11654,16],{"id":16},[10,11656,4632],{},[14,11658,22],{"id":22},[10,11660,11661],{},[26,11662],{"alt":4639,"src":4640},[10,11664,11665,4646,11667,4650],{},[34,11666,4645],{},[34,11668,4649],{},[14,11670,44],{"id":44},[46,11672,11673,11675,11681],{},[49,11674,4657],{},[49,11676,11677,4662,11679,4665],{},[34,11678,4645],{},[34,11680,4299],{},[49,11682,4668,11683,4671],{},[34,11684,4649],{},[14,11686,82],{"id":82},[10,11688,85],{},[87,11690,11691],{"className":89,"code":4678,"language":91,"meta":92,"style":92},[34,11692,11693,11697,11701,11705,11709,11713,11717,11721,11725,11729],{"__ignoreMap":92},[96,11694,11695],{"class":98,"line":99},[96,11696,4685],{},[96,11698,11699],{"class":98,"line":105},[96,11700,115],{"emptyLinePlaceholder":114},[96,11702,11703],{"class":98,"line":111},[96,11704,4694],{},[96,11706,11707],{"class":98,"line":118},[96,11708,4699],{},[96,11710,11711],{"class":98,"line":124},[96,11712,4704],{},[96,11714,11715],{"class":98,"line":130},[96,11716,4709],{},[96,11718,11719],{"class":98,"line":136},[96,11720,4714],{},[96,11722,11723],{"class":98,"line":142},[96,11724,4539],{},[96,11726,11727],{"class":98,"line":3930},[96,11728,115],{"emptyLinePlaceholder":114},[96,11730,11731],{"class":98,"line":4142},[96,11732,4727],{},[10,11734,148],{},[87,11736,11738],{"className":11737,"code":4733,"language":154,"meta":92},[152],[34,11739,4733],{"__ignoreMap":92},[10,11741,159],{},[14,11743,162],{"id":162},[164,11745,11746,11750],{},[49,11747,4744,11748,4747],{},[34,11749,4645],{},[49,11751,4750,11752,4753],{},[34,11753,4649],{},[14,11755,208],{"id":208},[46,11757,11758,11762],{},[49,11759,3444,11760,4762],{},[34,11761,4645],{},[49,11763,4765,11764,4768,11766,4771],{},[34,11765,4299],{},[34,11767,4645],{},[14,11769,225],{"id":225},[164,11771,11772,11774],{},[49,11773,4778],{},[49,11775,4781],{},[10,11777,244],{},[14,11779,247],{"id":247},[10,11781,4788],{},[252,11783,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11785},[11786,11787,11788,11789,11790,11791,11792,11793],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":4622,"description":4627},[267,4649,4645],{"id":4810,"title":4811,"body":11798,"category":267,"cover":268,"description":4816,"extension":269,"meta":11937,"navigation":114,"path":4988,"pinned":272,"publishedAt":273,"seo":11938,"slug":4990,"stem":4991,"summary":4992,"tags":11939,"updatedAt":273,"visible":114,"__hash__":4996},{"type":7,"value":11799,"toc":11925},[11800,11802,11804,11806,11808,11812,11814,11816,11832,11834,11836,11864,11866,11871,11873,11875,11887,11889,11891,11895,11897,11899,11909,11911,11917,11919,11921,11923],[10,11801,4816],{},[14,11803,16],{"id":16},[10,11805,4821],{},[14,11807,22],{"id":22},[10,11809,11810],{},[26,11811],{"alt":4828,"src":4829},[10,11813,4832],{},[14,11815,44],{"id":44},[46,11817,11818,11820,11822],{},[49,11819,4839],{},[49,11821,4842],{},[49,11823,4845,11824,2297,11826,4852,11828,2297,11830,403],{},[34,11825,4848],{},[34,11827,4851],{},[34,11829,4855],{},[34,11831,4858],{},[14,11833,82],{"id":82},[10,11835,85],{},[87,11837,11838],{"className":89,"code":4865,"language":91,"meta":92,"style":92},[34,11839,11840,11844,11848,11852,11856,11860],{"__ignoreMap":92},[96,11841,11842],{"class":98,"line":99},[96,11843,4872],{},[96,11845,11846],{"class":98,"line":105},[96,11847,115],{"emptyLinePlaceholder":114},[96,11849,11850],{"class":98,"line":111},[96,11851,4881],{},[96,11853,11854],{"class":98,"line":118},[96,11855,4886],{},[96,11857,11858],{"class":98,"line":124},[96,11859,4891],{},[96,11861,11862],{"class":98,"line":130},[96,11863,4896],{},[10,11865,148],{},[87,11867,11869],{"className":11868,"code":4902,"language":154,"meta":92},[152],[34,11870,4902],{"__ignoreMap":92},[10,11872,159],{},[14,11874,162],{"id":162},[164,11876,11877,11885],{},[49,11878,4913,11879,4916,11881,1197,11883,403],{},[34,11880,4848],{},[34,11882,4919],{},[34,11884,4922],{},[49,11886,4925],{},[186,11888,188],{"id":188},[10,11890,4930],{},[10,11892,11893],{},[26,11894],{"alt":4935,"src":4936},[10,11896,4939],{},[14,11898,208],{"id":208},[46,11900,11901,11907],{},[49,11902,4946,11903,37,11905,4952],{},[34,11904,4949],{},[34,11906,4855],{},[49,11908,4955],{},[14,11910,225],{"id":225},[164,11912,11913,11915],{},[49,11914,4962],{},[49,11916,4965],{},[10,11918,244],{},[14,11920,247],{"id":247},[10,11922,4972],{},[252,11924,254],{},{"title":92,"searchDepth":105,"depth":105,"links":11926},[11927,11928,11929,11930,11931,11934,11935,11936],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":11932},[11933],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":4811,"description":4816},[267,4994,4995],{"id":4998,"title":4999,"body":11941,"category":267,"cover":268,"description":5004,"extension":269,"meta":12058,"navigation":114,"path":5143,"pinned":272,"publishedAt":273,"seo":12059,"slug":5145,"stem":5146,"summary":5147,"tags":12060,"updatedAt":273,"visible":114,"__hash__":5151},{"type":7,"value":11942,"toc":12048},[11943,11945,11947,11949,11951,11955,11957,11959,11967,11969,11971,12003,12005,12010,12012,12014,12022,12024,12032,12034,12040,12042,12044,12046],[10,11944,5004],{},[14,11946,16],{"id":16},[10,11948,5009],{},[14,11950,22],{"id":22},[10,11952,11953],{},[26,11954],{"alt":5016,"src":5017},[10,11956,5020],{},[14,11958,44],{"id":44},[46,11960,11961,11963,11965],{},[49,11962,5027],{},[49,11964,5030],{},[49,11966,5033],{},[14,11968,82],{"id":82},[10,11970,85],{},[87,11972,11973],{"className":89,"code":5040,"language":91,"meta":92,"style":92},[34,11974,11975,11979,11983,11987,11991,11995,11999],{"__ignoreMap":92},[96,11976,11977],{"class":98,"line":99},[96,11978,5047],{},[96,11980,11981],{"class":98,"line":105},[96,11982,115],{"emptyLinePlaceholder":114},[96,11984,11985],{"class":98,"line":111},[96,11986,5056],{},[96,11988,11989],{"class":98,"line":118},[96,11990,5061],{},[96,11992,11993],{"class":98,"line":124},[96,11994,115],{"emptyLinePlaceholder":114},[96,11996,11997],{"class":98,"line":130},[96,11998,5070],{},[96,12000,12001],{"class":98,"line":136},[96,12002,5075],{},[10,12004,148],{},[87,12006,12008],{"className":12007,"code":5081,"language":154,"meta":92},[152],[34,12009,5081],{"__ignoreMap":92},[10,12011,159],{},[14,12013,162],{"id":162},[164,12015,12016,12018],{},[49,12017,5092],{},[49,12019,5095,12020,5099],{},[34,12021,5098],{},[14,12023,208],{"id":208},[46,12025,12026,12030],{},[49,12027,5106,12028,5109],{},[34,12029,4316],{},[49,12031,5112],{},[14,12033,225],{"id":225},[164,12035,12036,12038],{},[49,12037,5119],{},[49,12039,5122],{},[10,12041,244],{},[14,12043,247],{"id":247},[10,12045,5129],{},[252,12047,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12049},[12050,12051,12052,12053,12054,12055,12056,12057],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":4999,"description":5004},[267,5149,5150],{"id":5153,"title":5154,"body":12062,"category":267,"cover":268,"description":5159,"extension":269,"meta":12181,"navigation":114,"path":5303,"pinned":272,"publishedAt":273,"seo":12182,"slug":5305,"stem":5306,"summary":5307,"tags":12183,"updatedAt":273,"visible":114,"__hash__":5311},{"type":7,"value":12063,"toc":12171},[12064,12066,12068,12070,12072,12076,12078,12080,12088,12090,12092,12124,12126,12131,12133,12135,12145,12147,12153,12155,12163,12165,12167,12169],[10,12065,5159],{},[14,12067,16],{"id":16},[10,12069,5164],{},[14,12071,22],{"id":22},[10,12073,12074],{},[26,12075],{"alt":5171,"src":5172},[10,12077,5175],{},[14,12079,44],{"id":44},[46,12081,12082,12084,12086],{},[49,12083,5182],{},[49,12085,5185],{},[49,12087,5188],{},[14,12089,82],{"id":82},[10,12091,85],{},[87,12093,12094],{"className":89,"code":5195,"language":91,"meta":92,"style":92},[34,12095,12096,12100,12104,12108,12112,12116,12120],{"__ignoreMap":92},[96,12097,12098],{"class":98,"line":99},[96,12099,5202],{},[96,12101,12102],{"class":98,"line":105},[96,12103,5207],{},[96,12105,12106],{"class":98,"line":111},[96,12107,5212],{},[96,12109,12110],{"class":98,"line":118},[96,12111,115],{"emptyLinePlaceholder":114},[96,12113,12114],{"class":98,"line":124},[96,12115,5221],{},[96,12117,12118],{"class":98,"line":130},[96,12119,5226],{},[96,12121,12122],{"class":98,"line":136},[96,12123,5231],{},[10,12125,148],{},[87,12127,12129],{"className":12128,"code":5237,"language":154,"meta":92},[152],[34,12130,5237],{"__ignoreMap":92},[10,12132,159],{},[14,12134,162],{"id":162},[164,12136,12137,12141],{},[49,12138,979,12139,5251],{},[34,12140,5250],{},[49,12142,5254,12143,5258],{},[34,12144,5257],{},[14,12146,208],{"id":208},[46,12148,12149,12151],{},[49,12150,5265],{},[49,12152,5268],{},[14,12154,225],{"id":225},[164,12156,12157,12161],{},[49,12158,5275,12159,5279],{},[34,12160,5278],{},[49,12162,5282],{},[10,12164,244],{},[14,12166,247],{"id":247},[10,12168,5289],{},[252,12170,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12172},[12173,12174,12175,12176,12177,12178,12179,12180],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5154,"description":5159},[267,5309,5310],{"id":5313,"title":5314,"body":12185,"category":267,"cover":268,"description":5319,"extension":269,"meta":12330,"navigation":114,"path":5500,"pinned":272,"publishedAt":273,"seo":12331,"slug":5502,"stem":5503,"summary":5504,"tags":12332,"updatedAt":273,"visible":114,"__hash__":5508},{"type":7,"value":12186,"toc":12318},[12187,12189,12191,12193,12195,12199,12203,12205,12217,12219,12221,12249,12251,12256,12258,12260,12274,12276,12278,12282,12290,12292,12302,12304,12310,12312,12314,12316],[10,12188,5319],{},[14,12190,16],{"id":16},[10,12192,5324],{},[14,12194,22],{"id":22},[10,12196,12197],{},[26,12198],{"alt":5331,"src":5332},[10,12200,5335,12201,5339],{},[34,12202,5338],{},[14,12204,44],{"id":44},[46,12206,12207,12209,12211],{},[49,12208,5346],{},[49,12210,5349],{},[49,12212,5352,12213,5355,12215,403],{},[34,12214,5338],{},[34,12216,5358],{},[14,12218,82],{"id":82},[10,12220,85],{},[87,12222,12223],{"className":89,"code":5365,"language":91,"meta":92,"style":92},[34,12224,12225,12229,12233,12237,12241,12245],{"__ignoreMap":92},[96,12226,12227],{"class":98,"line":99},[96,12228,5372],{},[96,12230,12231],{"class":98,"line":105},[96,12232,5377],{},[96,12234,12235],{"class":98,"line":111},[96,12236,5382],{},[96,12238,12239],{"class":98,"line":118},[96,12240,115],{"emptyLinePlaceholder":114},[96,12242,12243],{"class":98,"line":124},[96,12244,5391],{},[96,12246,12247],{"class":98,"line":130},[96,12248,5396],{},[10,12250,148],{},[87,12252,12254],{"className":12253,"code":5402,"language":154,"meta":92},[152],[34,12255,5402],{"__ignoreMap":92},[10,12257,159],{},[14,12259,162],{"id":162},[164,12261,12262,12268],{},[49,12263,5413,12264,2297,12266,5419],{},[34,12265,5416],{},[34,12267,4379],{},[49,12269,12270,5425,12272,5429],{},[34,12271,5424],{},[34,12273,5428],{},[186,12275,188],{"id":188},[10,12277,5434],{},[10,12279,12280],{},[26,12281],{"alt":5439,"src":5440},[10,12283,12284,2297,12286,1197,12288,5450],{},[34,12285,5416],{},[34,12287,4379],{},[34,12289,5449],{},[14,12291,208],{"id":208},[46,12293,12294,12298],{},[49,12295,5457,12296,5461],{},[34,12297,5460],{},[49,12299,5464,12300,5467],{},[34,12301,5449],{},[14,12303,225],{"id":225},[164,12305,12306,12308],{},[49,12307,5474],{},[49,12309,5477],{},[10,12311,244],{},[14,12313,247],{"id":247},[10,12315,5484],{},[252,12317,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12319},[12320,12321,12322,12323,12324,12327,12328,12329],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":12325},[12326],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5314,"description":5319},[267,5506,5507],{"id":5510,"title":5511,"body":12334,"category":267,"cover":268,"description":5516,"extension":269,"meta":12483,"navigation":114,"path":5697,"pinned":272,"publishedAt":273,"seo":12484,"slug":5699,"stem":5700,"summary":5701,"tags":12485,"updatedAt":273,"visible":114,"__hash__":5705},{"type":7,"value":12335,"toc":12471},[12336,12338,12340,12342,12344,12348,12350,12352,12364,12366,12368,12412,12414,12419,12421,12423,12435,12437,12439,12443,12445,12447,12455,12457,12463,12465,12467,12469],[10,12337,5516],{},[14,12339,16],{"id":16},[10,12341,5521],{},[14,12343,22],{"id":22},[10,12345,12346],{},[26,12347],{"alt":5528,"src":5529},[10,12349,5532],{},[14,12351,44],{"id":44},[46,12353,12354,12356,12360],{},[49,12355,5539],{},[49,12357,12358,5545],{},[34,12359,5544],{},[49,12361,12362,5551],{},[34,12363,5550],{},[14,12365,82],{"id":82},[10,12367,85],{},[87,12369,12370],{"className":89,"code":5558,"language":91,"meta":92,"style":92},[34,12371,12372,12376,12380,12384,12388,12392,12396,12400,12404,12408],{"__ignoreMap":92},[96,12373,12374],{"class":98,"line":99},[96,12375,5565],{},[96,12377,12378],{"class":98,"line":105},[96,12379,5570],{},[96,12381,12382],{"class":98,"line":111},[96,12383,115],{"emptyLinePlaceholder":114},[96,12385,12386],{"class":98,"line":118},[96,12387,5579],{},[96,12389,12390],{"class":98,"line":124},[96,12391,5584],{},[96,12393,12394],{"class":98,"line":130},[96,12395,115],{"emptyLinePlaceholder":114},[96,12397,12398],{"class":98,"line":136},[96,12399,5593],{},[96,12401,12402],{"class":98,"line":142},[96,12403,5598],{},[96,12405,12406],{"class":98,"line":3930},[96,12407,115],{"emptyLinePlaceholder":114},[96,12409,12410],{"class":98,"line":4142},[96,12411,5607],{},[10,12413,148],{},[87,12415,12417],{"className":12416,"code":5613,"language":154,"meta":92},[152],[34,12418,5613],{"__ignoreMap":92},[10,12420,159],{},[14,12422,162],{"id":162},[164,12424,12425,12429],{},[49,12426,5624,12427,5628],{},[34,12428,5627],{},[49,12430,12431,5634,12433,403],{},[34,12432,5633],{},[34,12434,5637],{},[186,12436,188],{"id":188},[10,12438,5642],{},[10,12440,12441],{},[26,12442],{"alt":5647,"src":5648},[10,12444,5651],{},[14,12446,208],{"id":208},[46,12448,12449,12453],{},[49,12450,5658,12451,5661],{},[34,12452,5358],{},[49,12454,5664],{},[14,12456,225],{"id":225},[164,12458,12459,12461],{},[49,12460,5671],{},[49,12462,5674],{},[10,12464,244],{},[14,12466,247],{"id":247},[10,12468,5681],{},[252,12470,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12472},[12473,12474,12475,12476,12477,12480,12481,12482],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":12478},[12479],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5511,"description":5516},[267,5703,5704],{"id":5707,"title":5708,"body":12487,"category":267,"cover":268,"description":5713,"extension":269,"meta":12648,"navigation":114,"path":5911,"pinned":272,"publishedAt":273,"seo":12649,"slug":5913,"stem":5914,"summary":5915,"tags":12650,"updatedAt":273,"visible":114,"__hash__":5919},{"type":7,"value":12488,"toc":12636},[12489,12491,12493,12495,12497,12501,12503,12505,12517,12519,12521,12573,12575,12580,12582,12584,12602,12604,12606,12610,12612,12614,12620,12622,12628,12630,12632,12634],[10,12490,5713],{},[14,12492,16],{"id":16},[10,12494,5718],{},[14,12496,22],{"id":22},[10,12498,12499],{},[26,12500],{"alt":5725,"src":5726},[10,12502,5729],{},[14,12504,44],{"id":44},[46,12506,12507,12509,12511],{},[49,12508,5736],{},[49,12510,5739],{},[49,12512,12513,2216,12515,5748],{},[34,12514,5744],{},[34,12516,5747],{},[14,12518,82],{"id":82},[10,12520,85],{},[87,12522,12523],{"className":89,"code":5755,"language":91,"meta":92,"style":92},[34,12524,12525,12529,12533,12537,12541,12545,12549,12553,12557,12561,12565,12569],{"__ignoreMap":92},[96,12526,12527],{"class":98,"line":99},[96,12528,5762],{},[96,12530,12531],{"class":98,"line":105},[96,12532,115],{"emptyLinePlaceholder":114},[96,12534,12535],{"class":98,"line":111},[96,12536,5771],{},[96,12538,12539],{"class":98,"line":118},[96,12540,5776],{},[96,12542,12543],{"class":98,"line":124},[96,12544,115],{"emptyLinePlaceholder":114},[96,12546,12547],{"class":98,"line":130},[96,12548,5785],{},[96,12550,12551],{"class":98,"line":136},[96,12552,5790],{},[96,12554,12555],{"class":98,"line":142},[96,12556,5795],{},[96,12558,12559],{"class":98,"line":3930},[96,12560,115],{"emptyLinePlaceholder":114},[96,12562,12563],{"class":98,"line":4142},[96,12564,5804],{},[96,12566,12567],{"class":98,"line":5807},[96,12568,115],{"emptyLinePlaceholder":114},[96,12570,12571],{"class":98,"line":5812},[96,12572,5815],{},[10,12574,148],{},[87,12576,12578],{"className":12577,"code":5821,"language":154,"meta":92},[152],[34,12579,5821],{"__ignoreMap":92},[10,12581,159],{},[14,12583,162],{"id":162},[164,12585,12586,12596],{},[49,12587,12588,5835,12590,5839,12592,5842,12594,5846],{},[34,12589,5834],{},[34,12591,5838],{},[34,12593,5627],{},[34,12595,5845],{},[49,12597,12598,5851,12600,5854],{},[34,12599,4562],{},[34,12601,2248],{},[186,12603,188],{"id":188},[10,12605,5859],{},[10,12607,12608],{},[26,12609],{"alt":5864,"src":5865},[10,12611,5868],{},[14,12613,208],{"id":208},[46,12615,12616,12618],{},[49,12617,5875],{},[49,12619,5878],{},[14,12621,225],{"id":225},[164,12623,12624,12626],{},[49,12625,5885],{},[49,12627,5888],{},[10,12629,244],{},[14,12631,247],{"id":247},[10,12633,5895],{},[252,12635,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12637},[12638,12639,12640,12641,12642,12645,12646,12647],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":12643},[12644],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5708,"description":5713},[267,5917,5918],{"id":5921,"title":5922,"body":12652,"category":267,"cover":268,"description":5927,"extension":269,"meta":12775,"navigation":114,"path":6078,"pinned":272,"publishedAt":273,"seo":12776,"slug":6080,"stem":6081,"summary":6082,"tags":12777,"updatedAt":273,"visible":114,"__hash__":6086},{"type":7,"value":12653,"toc":12765},[12654,12656,12658,12660,12662,12666,12668,12670,12684,12686,12688,12716,12718,12723,12725,12727,12737,12739,12747,12749,12757,12759,12761,12763],[10,12655,5927],{},[14,12657,16],{"id":16},[10,12659,5932],{},[14,12661,22],{"id":22},[10,12663,12664],{},[26,12665],{"alt":5939,"src":5940},[10,12667,5943],{},[14,12669,44],{"id":44},[46,12671,12672,12674,12676],{},[49,12673,5950],{},[49,12675,5953],{},[49,12677,5956,12678,2297,12680,2297,12682,5964],{},[34,12679,2300],{},[34,12681,2466],{},[34,12683,5963],{},[14,12685,82],{"id":82},[10,12687,85],{},[87,12689,12690],{"className":89,"code":5971,"language":91,"meta":92,"style":92},[34,12691,12692,12696,12700,12704,12708,12712],{"__ignoreMap":92},[96,12693,12694],{"class":98,"line":99},[96,12695,5978],{},[96,12697,12698],{"class":98,"line":105},[96,12699,5983],{},[96,12701,12702],{"class":98,"line":111},[96,12703,5988],{},[96,12705,12706],{"class":98,"line":118},[96,12707,115],{"emptyLinePlaceholder":114},[96,12709,12710],{"class":98,"line":124},[96,12711,5997],{},[96,12713,12714],{"class":98,"line":130},[96,12715,6002],{},[10,12717,148],{},[87,12719,12721],{"className":12720,"code":6008,"language":154,"meta":92},[152],[34,12722,6008],{"__ignoreMap":92},[10,12724,159],{},[14,12726,162],{"id":162},[164,12728,12729,12735],{},[49,12730,6019,12731,6023,12733,6026],{},[34,12732,6022],{},[34,12734,2286],{},[49,12736,6029],{},[14,12738,208],{"id":208},[46,12740,12741,12745],{},[49,12742,6036,12743,6040],{},[34,12744,6039],{},[49,12746,6043],{},[14,12748,225],{"id":225},[164,12750,12751,12753],{},[49,12752,6050],{},[49,12754,6053,12755,6057],{},[34,12756,6056],{},[10,12758,244],{},[14,12760,247],{"id":247},[10,12762,6064],{},[252,12764,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12766},[12767,12768,12769,12770,12771,12772,12773,12774],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":5922,"description":5927},[267,6084,6085],{"id":6088,"title":6089,"body":12779,"category":267,"cover":268,"description":6094,"extension":269,"meta":12956,"navigation":114,"path":6322,"pinned":272,"publishedAt":273,"seo":12957,"slug":6324,"stem":6325,"summary":6326,"tags":12958,"updatedAt":273,"visible":114,"__hash__":6330},{"type":7,"value":12780,"toc":12944},[12781,12783,12785,12789,12791,12795,12801,12803,12815,12817,12821,12845,12849,12865,12871,12873,12878,12880,12882,12898,12900,12902,12906,12910,12912,12924,12926,12936,12938,12940,12942],[10,12782,6094],{},[14,12784,16],{"id":16},[10,12786,6099,12787,6102],{},[336,12788,6022],{},[14,12790,22],{"id":22},[10,12792,12793],{},[26,12794],{"alt":6109,"src":6110},[10,12796,6113,12797,6117,12799,6121],{},[34,12798,6116],{},[34,12800,6120],{},[14,12802,44],{"id":44},[46,12804,12805,12809,12811],{},[49,12806,6128,12807,6131],{},[34,12808,1211],{},[49,12810,6134],{},[49,12812,6137,12813,6141],{},[34,12814,6140],{},[14,12816,82],{"id":82},[10,12818,6146,12819,6150],{},[34,12820,6149],{},[87,12822,12823],{"className":89,"code":6153,"language":91,"meta":92,"style":92},[34,12824,12825,12829,12833,12837,12841],{"__ignoreMap":92},[96,12826,12827],{"class":98,"line":99},[96,12828,6160],{},[96,12830,12831],{"class":98,"line":105},[96,12832,6165],{},[96,12834,12835],{"class":98,"line":111},[96,12836,115],{"emptyLinePlaceholder":114},[96,12838,12839],{"class":98,"line":118},[96,12840,6174],{},[96,12842,12843],{"class":98,"line":124},[96,12844,6179],{},[10,12846,6182,12847,6186],{},[34,12848,6185],{},[87,12850,12851],{"className":89,"code":6189,"language":91,"meta":92,"style":92},[34,12852,12853,12857,12861],{"__ignoreMap":92},[96,12854,12855],{"class":98,"line":99},[96,12856,6196],{},[96,12858,12859],{"class":98,"line":105},[96,12860,115],{"emptyLinePlaceholder":114},[96,12862,12863],{"class":98,"line":111},[96,12864,6205],{},[10,12866,6208,12867,1197,12869,403],{},[34,12868,6211],{},[34,12870,6214],{},[10,12872,148],{},[87,12874,12876],{"className":12875,"code":6220,"language":154,"meta":92},[152],[34,12877,6220],{"__ignoreMap":92},[10,12879,159],{},[14,12881,162],{"id":162},[164,12883,12884,12890],{},[49,12885,6231,12886,6234,12888,6238],{},[34,12887,6149],{},[34,12889,6237],{},[49,12891,12892,6243,12894,6246,12896,6249],{},[34,12893,6185],{},[34,12895,6149],{},[34,12897,6185],{},[186,12899,188],{"id":188},[10,12901,6254],{},[10,12903,12904],{},[26,12905],{"alt":6259,"src":6260},[10,12907,6263,12908,6266],{},[34,12909,6237],{},[14,12911,208],{"id":208},[46,12913,12914,12920],{},[49,12915,6273,12916,1197,12918,403],{},[34,12917,6149],{},[34,12919,6185],{},[49,12921,6280,12922,6284],{},[34,12923,6283],{},[14,12925,225],{"id":225},[164,12927,12928,12932],{},[49,12929,2394,12930,6294],{},[34,12931,6293],{},[49,12933,6297,12934,403],{},[34,12935,6116],{},[10,12937,244],{},[14,12939,247],{"id":247},[10,12941,6306],{},[252,12943,254],{},{"title":92,"searchDepth":105,"depth":105,"links":12945},[12946,12947,12948,12949,12950,12953,12954,12955],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":12951},[12952],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":6089,"description":6094},[267,6328,6329],{"id":6332,"title":6333,"body":12960,"category":267,"cover":268,"description":6338,"extension":269,"meta":13099,"navigation":114,"path":6504,"pinned":272,"publishedAt":273,"seo":13100,"slug":6506,"stem":6507,"summary":6508,"tags":13101,"updatedAt":273,"visible":114,"__hash__":6511},{"type":7,"value":12961,"toc":13089},[12962,12964,12966,12968,12970,12974,12976,12978,12988,12990,12992,13032,13034,13039,13041,13043,13061,13063,13071,13073,13081,13083,13085,13087],[10,12963,6338],{},[14,12965,16],{"id":16},[10,12967,6343],{},[14,12969,22],{"id":22},[10,12971,12972],{},[26,12973],{"alt":6350,"src":6351},[10,12975,6354],{},[14,12977,44],{"id":44},[46,12979,12980,12984,12986],{},[49,12981,12982,6364],{},[34,12983,6363],{},[49,12985,6367],{},[49,12987,6370],{},[14,12989,82],{"id":82},[10,12991,1614],{},[87,12993,12994],{"className":632,"code":6377,"language":634,"meta":92,"style":92},[34,12995,12996,13006,13012,13018,13028],{"__ignoreMap":92},[96,12997,12998,13000,13002,13004],{"class":98,"line":99},[96,12999,732],{"class":641},[96,13001,674],{"class":644},[96,13003,6388],{"class":677},[96,13005,6391],{"class":677},[96,13007,13008,13010],{"class":98,"line":105},[96,13009,6396],{"class":644},[96,13011,6399],{"class":677},[96,13013,13014,13016],{"class":98,"line":111},[96,13015,91],{"class":641},[96,13017,645],{"class":644},[96,13019,13020,13022,13024,13026],{"class":98,"line":118},[96,13021,91],{"class":641},[96,13023,674],{"class":644},[96,13025,678],{"class":677},[96,13027,645],{"class":644},[96,13029,13030],{"class":98,"line":124},[96,13031,6420],{"class":641},[10,13033,148],{},[87,13035,13037],{"className":13036,"code":6426,"language":154,"meta":92},[152],[34,13038,6426],{"__ignoreMap":92},[10,13040,159],{},[14,13042,162],{"id":162},[164,13044,13045,13051],{},[49,13046,13047,6440,13049,6443],{},[34,13048,6439],{},[34,13050,732],{},[49,13052,6446,13053,2216,13055,6452,13057,3705,13059,6458],{},[34,13054,91],{},[34,13056,6451],{},[34,13058,6363],{},[34,13060,6457],{},[14,13062,208],{"id":208},[46,13064,13065,13067],{},[49,13066,6465],{},[49,13068,3444,13069,6470],{},[34,13070,6363],{},[14,13072,225],{"id":225},[164,13074,13075,13079],{},[49,13076,6477,13077,403],{},[34,13078,6480],{},[49,13080,6483],{},[10,13082,244],{},[14,13084,247],{"id":247},[10,13086,6490],{},[252,13088,1698],{},{"title":92,"searchDepth":105,"depth":105,"links":13090},[13091,13092,13093,13094,13095,13096,13097,13098],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":6333,"description":6338},[267,6510,302],{"id":6513,"title":6514,"body":13103,"category":267,"cover":268,"description":6519,"extension":269,"meta":13256,"navigation":114,"path":6708,"pinned":272,"publishedAt":273,"seo":13257,"slug":6710,"stem":6711,"summary":6712,"tags":13258,"updatedAt":273,"visible":114,"__hash__":6716},{"type":7,"value":13104,"toc":13246},[13105,13107,13109,13111,13113,13117,13123,13125,13141,13143,13145,13189,13191,13196,13198,13200,13212,13214,13228,13230,13238,13240,13242,13244],[10,13106,6519],{},[14,13108,16],{"id":16},[10,13110,6524],{},[14,13112,22],{"id":22},[10,13114,13115],{},[26,13116],{"alt":6531,"src":6532},[10,13118,13119,6538,13121,6541],{},[34,13120,6537],{},[34,13122,2476],{},[14,13124,44],{"id":44},[46,13126,13127,13129,13137],{},[49,13128,6548],{},[49,13130,13131,2297,13133,2297,13135,6560],{},[34,13132,6553],{},[34,13134,6556],{},[34,13136,6559],{},[49,13138,6563,13139,6567],{},[34,13140,6566],{},[14,13142,82],{"id":82},[10,13144,85],{},[87,13146,13147],{"className":89,"code":6574,"language":91,"meta":92,"style":92},[34,13148,13149,13153,13157,13161,13165,13169,13173,13177,13181,13185],{"__ignoreMap":92},[96,13150,13151],{"class":98,"line":99},[96,13152,6581],{},[96,13154,13155],{"class":98,"line":105},[96,13156,115],{"emptyLinePlaceholder":114},[96,13158,13159],{"class":98,"line":111},[96,13160,6590],{},[96,13162,13163],{"class":98,"line":118},[96,13164,6595],{},[96,13166,13167],{"class":98,"line":124},[96,13168,6600],{},[96,13170,13171],{"class":98,"line":130},[96,13172,115],{"emptyLinePlaceholder":114},[96,13174,13175],{"class":98,"line":136},[96,13176,6609],{},[96,13178,13179],{"class":98,"line":142},[96,13180,6614],{},[96,13182,13183],{"class":98,"line":3930},[96,13184,6619],{},[96,13186,13187],{"class":98,"line":4142},[96,13188,6624],{},[10,13190,148],{},[87,13192,13194],{"className":13193,"code":6630,"language":154,"meta":92},[152],[34,13195,6630],{"__ignoreMap":92},[10,13197,159],{},[14,13199,162],{"id":162},[164,13201,13202,13206],{},[49,13203,13204,6644],{},[34,13205,6643],{},[49,13207,2379,13208,6649,13210,6652],{},[34,13209,2476],{},[34,13211,6537],{},[14,13213,208],{"id":208},[46,13215,13216,13222],{},[49,13217,3444,13218,6661,13220,6664],{},[34,13219,6537],{},[34,13221,6553],{},[49,13223,6667,13224,37,13226,6673],{},[34,13225,2476],{},[34,13227,6672],{},[14,13229,225],{"id":225},[164,13231,13232,13236],{},[49,13233,6680,13234,6684],{},[34,13235,6683],{},[49,13237,6687],{},[10,13239,244],{},[14,13241,247],{"id":247},[10,13243,6694],{},[252,13245,254],{},{"title":92,"searchDepth":105,"depth":105,"links":13247},[13248,13249,13250,13251,13252,13253,13254,13255],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":6514,"description":6519},[267,6714,6715],{"id":6718,"title":6719,"body":13260,"category":267,"cover":268,"description":6724,"extension":269,"meta":13407,"navigation":114,"path":6903,"pinned":272,"publishedAt":273,"seo":13408,"slug":6905,"stem":6906,"summary":6907,"tags":13409,"updatedAt":273,"visible":114,"__hash__":6911},{"type":7,"value":13261,"toc":13397},[13262,13264,13266,13268,13270,13274,13276,13278,13296,13298,13300,13348,13350,13355,13357,13359,13367,13369,13379,13381,13389,13391,13393,13395],[10,13263,6724],{},[14,13265,16],{"id":16},[10,13267,6729],{},[14,13269,22],{"id":22},[10,13271,13272],{},[26,13273],{"alt":6736,"src":6737},[10,13275,6740],{},[14,13277,44],{"id":44},[46,13279,13280,13284,13290],{},[49,13281,13282,6750],{},[34,13283,6749],{},[49,13285,13286,6756,13288,403],{},[34,13287,6755],{},[34,13289,6759],{},[49,13291,6762,13292,6766,13294,6770],{},[34,13293,6765],{},[34,13295,6769],{},[14,13297,82],{"id":82},[10,13299,85],{},[87,13301,13302],{"className":89,"code":6777,"language":91,"meta":92,"style":92},[34,13303,13304,13308,13312,13316,13320,13324,13328,13332,13336,13340,13344],{"__ignoreMap":92},[96,13305,13306],{"class":98,"line":99},[96,13307,6581],{},[96,13309,13310],{"class":98,"line":105},[96,13311,115],{"emptyLinePlaceholder":114},[96,13313,13314],{"class":98,"line":111},[96,13315,6792],{},[96,13317,13318],{"class":98,"line":118},[96,13319,6797],{},[96,13321,13322],{"class":98,"line":124},[96,13323,6802],{},[96,13325,13326],{"class":98,"line":130},[96,13327,6807],{},[96,13329,13330],{"class":98,"line":136},[96,13331,115],{"emptyLinePlaceholder":114},[96,13333,13334],{"class":98,"line":142},[96,13335,6816],{},[96,13337,13338],{"class":98,"line":3930},[96,13339,6821],{},[96,13341,13342],{"class":98,"line":4142},[96,13343,6826],{},[96,13345,13346],{"class":98,"line":5807},[96,13347,6831],{},[10,13349,148],{},[87,13351,13353],{"className":13352,"code":6837,"language":154,"meta":92},[152],[34,13354,6837],{"__ignoreMap":92},[10,13356,159],{},[14,13358,162],{"id":162},[164,13360,13361,13365],{},[49,13362,6848,13363,6851],{},[34,13364,6765],{},[49,13366,6854],{},[14,13368,208],{"id":208},[46,13370,13371,13375],{},[49,13372,2379,13373,6863],{},[34,13374,6749],{},[49,13376,6866,13377,403],{},[34,13378,6869],{},[14,13380,225],{"id":225},[164,13382,13383,13385],{},[49,13384,6876],{},[49,13386,6879,13387,6882],{},[34,13388,377],{},[10,13390,244],{},[14,13392,247],{"id":247},[10,13394,6889],{},[252,13396,254],{},{"title":92,"searchDepth":105,"depth":105,"links":13398},[13399,13400,13401,13402,13403,13404,13405,13406],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":6719,"description":6724},[267,6909,6910],{"id":6913,"title":6914,"body":13411,"category":267,"cover":268,"description":6919,"extension":269,"meta":13554,"navigation":114,"path":7087,"pinned":272,"publishedAt":273,"seo":13555,"slug":7089,"stem":7090,"summary":7091,"tags":13556,"updatedAt":273,"visible":114,"__hash__":7095},{"type":7,"value":13412,"toc":13544},[13413,13415,13417,13419,13421,13425,13431,13433,13443,13445,13447,13499,13501,13506,13508,13510,13520,13522,13528,13530,13536,13538,13540,13542],[10,13414,6919],{},[14,13416,16],{"id":16},[10,13418,6924],{},[14,13420,22],{"id":22},[10,13422,13423],{},[26,13424],{"alt":6931,"src":6932},[10,13426,13427,6938,13429,6942],{},[34,13428,6937],{},[34,13430,6941],{},[14,13432,44],{"id":44},[46,13434,13435,13437,13441],{},[49,13436,6949],{},[49,13438,13439,6955],{},[34,13440,6954],{},[49,13442,6958],{},[14,13444,82],{"id":82},[10,13446,85],{},[87,13448,13449],{"className":89,"code":6965,"language":91,"meta":92,"style":92},[34,13450,13451,13455,13459,13463,13467,13471,13475,13479,13483,13487,13491,13495],{"__ignoreMap":92},[96,13452,13453],{"class":98,"line":99},[96,13454,6972],{},[96,13456,13457],{"class":98,"line":105},[96,13458,115],{"emptyLinePlaceholder":114},[96,13460,13461],{"class":98,"line":111},[96,13462,6981],{},[96,13464,13465],{"class":98,"line":118},[96,13466,115],{"emptyLinePlaceholder":114},[96,13468,13469],{"class":98,"line":124},[96,13470,6990],{},[96,13472,13473],{"class":98,"line":130},[96,13474,6995],{},[96,13476,13477],{"class":98,"line":136},[96,13478,6807],{},[96,13480,13481],{"class":98,"line":142},[96,13482,115],{"emptyLinePlaceholder":114},[96,13484,13485],{"class":98,"line":3930},[96,13486,7008],{},[96,13488,13489],{"class":98,"line":4142},[96,13490,7013],{},[96,13492,13493],{"class":98,"line":5807},[96,13494,6826],{},[96,13496,13497],{"class":98,"line":5812},[96,13498,7022],{},[10,13500,148],{},[87,13502,13504],{"className":13503,"code":7028,"language":154,"meta":92},[152],[34,13505,7028],{"__ignoreMap":92},[10,13507,159],{},[14,13509,162],{"id":162},[164,13511,13512,13516],{},[49,13513,13514,7041],{},[34,13515,6937],{},[49,13517,13518,7046],{},[34,13519,6941],{},[14,13521,208],{"id":208},[46,13523,13524,13526],{},[49,13525,7053],{},[49,13527,7056],{},[14,13529,225],{"id":225},[164,13531,13532,13534],{},[49,13533,7063],{},[49,13535,7066],{},[10,13537,244],{},[14,13539,247],{"id":247},[10,13541,7073],{},[252,13543,254],{},{"title":92,"searchDepth":105,"depth":105,"links":13545},[13546,13547,13548,13549,13550,13551,13552,13553],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":6914,"description":6919},[267,7093,7094],{"id":7097,"title":7098,"body":13558,"category":267,"cover":268,"description":7103,"extension":269,"meta":13709,"navigation":114,"path":7288,"pinned":272,"publishedAt":273,"seo":13710,"slug":7290,"stem":7291,"summary":7292,"tags":13711,"updatedAt":273,"visible":114,"__hash__":7296},{"type":7,"value":13559,"toc":13699},[13560,13562,13564,13566,13568,13572,13576,13578,13592,13594,13596,13648,13650,13655,13657,13659,13671,13673,13683,13685,13691,13693,13695,13697],[10,13561,7103],{},[14,13563,16],{"id":16},[10,13565,7108],{},[14,13567,22],{"id":22},[10,13569,13570],{},[26,13571],{"alt":7115,"src":7116},[10,13573,13574,7122],{},[34,13575,7121],{},[14,13577,44],{"id":44},[46,13579,13580,13586,13590],{},[49,13581,2379,13582,7132,13584,7136],{},[34,13583,7131],{},[34,13585,7135],{},[49,13587,7139,13588,7143],{},[34,13589,7142],{},[49,13591,7146],{},[14,13593,82],{"id":82},[10,13595,85],{},[87,13597,13598],{"className":89,"code":7153,"language":91,"meta":92,"style":92},[34,13599,13600,13604,13608,13612,13616,13620,13624,13628,13632,13636,13640,13644],{"__ignoreMap":92},[96,13601,13602],{"class":98,"line":99},[96,13603,7160],{},[96,13605,13606],{"class":98,"line":105},[96,13607,115],{"emptyLinePlaceholder":114},[96,13609,13610],{"class":98,"line":111},[96,13611,7169],{},[96,13613,13614],{"class":98,"line":118},[96,13615,7174],{},[96,13617,13618],{"class":98,"line":124},[96,13619,7179],{},[96,13621,13622],{"class":98,"line":130},[96,13623,7184],{},[96,13625,13626],{"class":98,"line":136},[96,13627,7189],{},[96,13629,13630],{"class":98,"line":142},[96,13631,115],{"emptyLinePlaceholder":114},[96,13633,13634],{"class":98,"line":3930},[96,13635,7198],{},[96,13637,13638],{"class":98,"line":4142},[96,13639,7203],{},[96,13641,13642],{"class":98,"line":5807},[96,13643,7208],{},[96,13645,13646],{"class":98,"line":5812},[96,13647,7213],{},[10,13649,148],{},[87,13651,13653],{"className":13652,"code":7219,"language":154,"meta":92},[152],[34,13654,7219],{"__ignoreMap":92},[10,13656,159],{},[14,13658,162],{"id":162},[164,13660,13661,13667],{},[49,13662,13663,7233,13665,7236],{},[34,13664,7232],{},[34,13666,7142],{},[49,13668,13669,7241],{},[34,13670,7121],{},[14,13672,208],{"id":208},[46,13674,13675,13677],{},[49,13676,7248],{},[49,13678,7251,13679,7254,13681,7257],{},[34,13680,7131],{},[34,13682,7135],{},[14,13684,225],{"id":225},[164,13686,13687,13689],{},[49,13688,7264],{},[49,13690,7267],{},[10,13692,244],{},[14,13694,247],{"id":247},[10,13696,7274],{},[252,13698,254],{},{"title":92,"searchDepth":105,"depth":105,"links":13700},[13701,13702,13703,13704,13705,13706,13707,13708],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":7098,"description":7103},[267,7294,7295],{"id":7298,"title":7299,"body":13713,"category":267,"cover":268,"description":7304,"extension":269,"meta":13927,"navigation":114,"path":7578,"pinned":272,"publishedAt":273,"seo":13928,"slug":7580,"stem":7581,"summary":7582,"tags":13929,"updatedAt":273,"visible":114,"__hash__":7586},{"type":7,"value":13714,"toc":13914},[13715,13717,13719,13721,13723,13727,13733,13735,13747,13749,13751,13811,13813,13818,13820,13822,13840,13842,13850,13854,13862,13864,13868,13872,13878,13880,13890,13892,13906,13908,13910,13912],[10,13716,7304],{},[14,13718,16],{"id":16},[10,13720,7309],{},[14,13722,22],{"id":22},[10,13724,13725],{},[26,13726],{"alt":7316,"src":7317},[10,13728,7320,13729,7324,13731,7328],{},[34,13730,7323],{},[34,13732,7327],{},[14,13734,44],{"id":44},[46,13736,13737,13741,13745],{},[49,13738,7335,13739,7338],{},[34,13740,7323],{},[49,13742,13743,7344],{},[34,13744,7343],{},[49,13746,7347],{},[14,13748,82],{"id":82},[10,13750,85],{},[87,13752,13753],{"className":89,"code":7354,"language":91,"meta":92,"style":92},[34,13754,13755,13759,13763,13767,13771,13775,13779,13783,13787,13791,13795,13799,13803,13807],{"__ignoreMap":92},[96,13756,13757],{"class":98,"line":99},[96,13758,7361],{},[96,13760,13761],{"class":98,"line":105},[96,13762,7366],{},[96,13764,13765],{"class":98,"line":111},[96,13766,7371],{},[96,13768,13769],{"class":98,"line":118},[96,13770,7376],{},[96,13772,13773],{"class":98,"line":124},[96,13774,7381],{},[96,13776,13777],{"class":98,"line":130},[96,13778,115],{"emptyLinePlaceholder":114},[96,13780,13781],{"class":98,"line":136},[96,13782,7390],{},[96,13784,13785],{"class":98,"line":142},[96,13786,7395],{},[96,13788,13789],{"class":98,"line":3930},[96,13790,7400],{},[96,13792,13793],{"class":98,"line":4142},[96,13794,7405],{},[96,13796,13797],{"class":98,"line":5807},[96,13798,1186],{},[96,13800,13801],{"class":98,"line":5812},[96,13802,7414],{},[96,13804,13805],{"class":98,"line":7417},[96,13806,7420],{},[96,13808,13809],{"class":98,"line":7423},[96,13810,7426],{},[10,13812,148],{},[87,13814,13816],{"className":13815,"code":7432,"language":154,"meta":92},[152],[34,13817,7432],{"__ignoreMap":92},[10,13819,159],{},[14,13821,162],{"id":162},[164,13823,13824,13832],{},[49,13825,13826,7445,13828,7448,13830,7452],{},[34,13827,3013],{},[34,13829,7343],{},[34,13831,7451],{},[49,13833,7455,13834,7458,13836,7461,13838,403],{},[34,13835,7323],{},[34,13837,1200],{},[34,13839,7327],{},[186,13841,188],{"id":188},[10,13843,13844,2297,13846,1197,13848,7474],{},[34,13845,7323],{},[34,13847,1200],{},[34,13849,7327],{},[10,13851,13852],{},[26,13853],{"alt":7479,"src":7480},[10,13855,13856,7485,13858,7488,13860,7491],{},[34,13857,7323],{},[34,13859,1200],{},[34,13861,7327],{},[186,13863,188],{"id":4197},[10,13865,13866,7499],{},[34,13867,7498],{},[10,13869,13870],{},[26,13871],{"alt":7504,"src":7505},[10,13873,7508,13874,7511,13876,7514],{},[34,13875,7498],{},[34,13877,1200],{},[14,13879,208],{"id":208},[46,13881,13882,13886],{},[49,13883,7521,13884,7525],{},[34,13885,7524],{},[49,13887,7528,13888,7531],{},[34,13889,7498],{},[14,13891,225],{"id":225},[164,13893,13894,13902],{},[49,13895,7538,13896,7542,13898,1197,13900,403],{},[34,13897,7541],{},[34,13899,7545],{},[34,13901,7548],{},[49,13903,7551,13904,7554],{},[34,13905,6759],{},[10,13907,244],{},[14,13909,247],{"id":247},[10,13911,7561],{},[252,13913,254],{},{"title":92,"searchDepth":105,"depth":105,"links":13915},[13916,13917,13918,13919,13920,13924,13925,13926],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":13921},[13922,13923],{"id":188,"depth":111,"text":188},{"id":4197,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":7299,"description":7304},[267,7584,7585],{"id":7588,"title":7589,"body":13931,"category":267,"cover":268,"description":7594,"extension":269,"meta":14082,"navigation":114,"path":7771,"pinned":272,"publishedAt":273,"seo":14083,"slug":7773,"stem":7774,"summary":7775,"tags":14084,"updatedAt":273,"visible":114,"__hash__":7778},{"type":7,"value":13932,"toc":14072},[13933,13935,13937,13939,13941,13945,13949,13951,13963,13965,13967,14015,14017,14022,14024,14026,14036,14038,14048,14050,14064,14066,14068,14070],[10,13934,7594],{},[14,13936,16],{"id":16},[10,13938,7599],{},[14,13940,22],{"id":22},[10,13942,13943],{},[26,13944],{"alt":7606,"src":7607},[10,13946,7610,13947,7613],{},[34,13948,6769],{},[14,13950,44],{"id":44},[46,13952,13953,13957,13961],{},[49,13954,13955,7622],{},[34,13956,6769],{},[49,13958,13959,7628],{},[34,13960,7627],{},[49,13962,7631],{},[14,13964,82],{"id":82},[10,13966,85],{},[87,13968,13969],{"className":89,"code":7638,"language":91,"meta":92,"style":92},[34,13970,13971,13975,13979,13983,13987,13991,13995,13999,14003,14007,14011],{"__ignoreMap":92},[96,13972,13973],{"class":98,"line":99},[96,13974,6581],{},[96,13976,13977],{"class":98,"line":105},[96,13978,115],{"emptyLinePlaceholder":114},[96,13980,13981],{"class":98,"line":111},[96,13982,6792],{},[96,13984,13985],{"class":98,"line":118},[96,13986,115],{"emptyLinePlaceholder":114},[96,13988,13989],{"class":98,"line":124},[96,13990,7661],{},[96,13992,13993],{"class":98,"line":130},[96,13994,7666],{},[96,13996,13997],{"class":98,"line":136},[96,13998,115],{"emptyLinePlaceholder":114},[96,14000,14001],{"class":98,"line":142},[96,14002,7675],{},[96,14004,14005],{"class":98,"line":3930},[96,14006,7680],{},[96,14008,14009],{"class":98,"line":4142},[96,14010,115],{"emptyLinePlaceholder":114},[96,14012,14013],{"class":98,"line":5807},[96,14014,7689],{},[10,14016,148],{},[87,14018,14020],{"className":14019,"code":7695,"language":154,"meta":92},[152],[34,14021,7695],{"__ignoreMap":92},[10,14023,159],{},[14,14025,162],{"id":162},[164,14027,14028,14034],{},[49,14029,7610,14030,7708,14032,403],{},[34,14031,6769],{},[34,14033,7711],{},[49,14035,7714],{},[14,14037,208],{"id":208},[46,14039,14040,14044],{},[49,14041,4765,14042,7723],{},[34,14043,6769],{},[49,14045,7726,14046,7729],{},[34,14047,6769],{},[14,14049,225],{"id":225},[164,14051,14052,14058],{},[49,14053,7736,14054,7740,14056,403],{},[34,14055,7739],{},[34,14057,6769],{},[49,14059,4765,14060,7747,14062,403],{},[34,14061,6769],{},[34,14063,7750],{},[10,14065,244],{},[14,14067,247],{"id":247},[10,14069,7757],{},[252,14071,254],{},{"title":92,"searchDepth":105,"depth":105,"links":14073},[14074,14075,14076,14077,14078,14079,14080,14081],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":7589,"description":7594},[267,6769,7777],{"id":7780,"title":7781,"body":14086,"category":267,"cover":268,"description":7786,"extension":269,"meta":14257,"navigation":114,"path":7999,"pinned":272,"publishedAt":273,"seo":14258,"slug":8001,"stem":8002,"summary":8003,"tags":14259,"updatedAt":273,"visible":114,"__hash__":8007},{"type":7,"value":14087,"toc":14245},[14088,14090,14092,14094,14096,14100,14102,14104,14116,14118,14120,14176,14178,14183,14185,14187,14203,14205,14207,14211,14217,14219,14227,14229,14237,14239,14241,14243],[10,14089,7786],{},[14,14091,16],{"id":16},[10,14093,7791],{},[14,14095,22],{"id":22},[10,14097,14098],{},[26,14099],{"alt":7798,"src":7799},[10,14101,7802],{},[14,14103,44],{"id":44},[46,14105,14106,14110,14114],{},[49,14107,14108,7812],{},[34,14109,7811],{},[49,14111,14112,7818],{},[34,14113,7817],{},[49,14115,7821],{},[14,14117,82],{"id":82},[10,14119,85],{},[87,14121,14122],{"className":89,"code":7828,"language":91,"meta":92,"style":92},[34,14123,14124,14128,14132,14136,14140,14144,14148,14152,14156,14160,14164,14168,14172],{"__ignoreMap":92},[96,14125,14126],{"class":98,"line":99},[96,14127,7835],{},[96,14129,14130],{"class":98,"line":105},[96,14131,7840],{},[96,14133,14134],{"class":98,"line":111},[96,14135,7845],{},[96,14137,14138],{"class":98,"line":118},[96,14139,7850],{},[96,14141,14142],{"class":98,"line":124},[96,14143,115],{"emptyLinePlaceholder":114},[96,14145,14146],{"class":98,"line":130},[96,14147,7859],{},[96,14149,14150],{"class":98,"line":136},[96,14151,7864],{},[96,14153,14154],{"class":98,"line":142},[96,14155,7869],{},[96,14157,14158],{"class":98,"line":3930},[96,14159,7874],{},[96,14161,14162],{"class":98,"line":4142},[96,14163,115],{"emptyLinePlaceholder":114},[96,14165,14166],{"class":98,"line":5807},[96,14167,7883],{},[96,14169,14170],{"class":98,"line":5812},[96,14171,7888],{},[96,14173,14174],{"class":98,"line":7417},[96,14175,7893],{},[10,14177,148],{},[87,14179,14181],{"className":14180,"code":7899,"language":154,"meta":92},[152],[34,14182,7899],{"__ignoreMap":92},[10,14184,159],{},[14,14186,162],{"id":162},[164,14188,14189,14195],{},[49,14190,7910,14191,7914,14193,7917],{},[34,14192,7913],{},[34,14194,7817],{},[49,14196,14197,7923,14199,7927,14201,7930],{},[34,14198,7922],{},[34,14200,7926],{},[34,14202,7811],{},[186,14204,188],{"id":188},[10,14206,7935],{},[10,14208,14209],{},[26,14210],{"alt":7940,"src":7941},[10,14212,7944,14213,1197,14215,7950],{},[34,14214,4562],{},[34,14216,7949],{},[14,14218,208],{"id":208},[46,14220,14221,14225],{},[49,14222,7957,14223,7960],{},[34,14224,7811],{},[49,14226,7963],{},[14,14228,225],{"id":225},[164,14230,14231,14235],{},[49,14232,5275,14233,7973],{},[34,14234,7972],{},[49,14236,7976],{},[10,14238,244],{},[14,14240,247],{"id":247},[10,14242,7983],{},[252,14244,254],{},{"title":92,"searchDepth":105,"depth":105,"links":14246},[14247,14248,14249,14250,14251,14254,14255,14256],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":14252},[14253],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":7781,"description":7786},[267,8005,8006],{"id":8009,"title":8010,"body":14261,"category":267,"cover":268,"description":8015,"extension":269,"meta":14408,"navigation":114,"path":8194,"pinned":272,"publishedAt":273,"seo":14409,"slug":8196,"stem":8197,"summary":8198,"tags":14410,"updatedAt":273,"visible":114,"__hash__":8202},{"type":7,"value":14262,"toc":14398},[14263,14265,14267,14269,14271,14275,14277,14279,14287,14289,14291,14347,14349,14354,14356,14358,14370,14372,14378,14380,14390,14392,14394,14396],[10,14264,8015],{},[14,14266,16],{"id":16},[10,14268,8020],{},[14,14270,22],{"id":22},[10,14272,14273],{},[26,14274],{"alt":8027,"src":8028},[10,14276,8031],{},[14,14278,44],{"id":44},[46,14280,14281,14283,14285],{},[49,14282,8038],{},[49,14284,8041],{},[49,14286,8044],{},[14,14288,82],{"id":82},[10,14290,85],{},[87,14292,14293],{"className":89,"code":8051,"language":91,"meta":92,"style":92},[34,14294,14295,14299,14303,14307,14311,14315,14319,14323,14327,14331,14335,14339,14343],{"__ignoreMap":92},[96,14296,14297],{"class":98,"line":99},[96,14298,8058],{},[96,14300,14301],{"class":98,"line":105},[96,14302,8063],{},[96,14304,14305],{"class":98,"line":111},[96,14306,8068],{},[96,14308,14309],{"class":98,"line":118},[96,14310,115],{"emptyLinePlaceholder":114},[96,14312,14313],{"class":98,"line":124},[96,14314,8077],{},[96,14316,14317],{"class":98,"line":130},[96,14318,8082],{},[96,14320,14321],{"class":98,"line":136},[96,14322,8087],{},[96,14324,14325],{"class":98,"line":142},[96,14326,115],{"emptyLinePlaceholder":114},[96,14328,14329],{"class":98,"line":3930},[96,14330,8096],{},[96,14332,14333],{"class":98,"line":4142},[96,14334,8101],{},[96,14336,14337],{"class":98,"line":5807},[96,14338,115],{"emptyLinePlaceholder":114},[96,14340,14341],{"class":98,"line":5812},[96,14342,8110],{},[96,14344,14345],{"class":98,"line":7417},[96,14346,8115],{},[10,14348,148],{},[87,14350,14352],{"className":14351,"code":8121,"language":154,"meta":92},[152],[34,14353,8121],{"__ignoreMap":92},[10,14355,159],{},[14,14357,162],{"id":162},[164,14359,14360,14366],{},[49,14361,14362,8135,14364,8139],{},[34,14363,8134],{},[34,14365,8138],{},[49,14367,8142,14368,8146],{},[34,14369,8145],{},[14,14371,208],{"id":208},[46,14373,14374,14376],{},[49,14375,8153],{},[49,14377,8156],{},[14,14379,225],{"id":225},[164,14381,14382,14388],{},[49,14383,8163,14384,8167,14386,403],{},[34,14385,8166],{},[34,14387,8170],{},[49,14389,8173],{},[10,14391,244],{},[14,14393,247],{"id":247},[10,14395,8180],{},[252,14397,254],{},{"title":92,"searchDepth":105,"depth":105,"links":14399},[14400,14401,14402,14403,14404,14405,14406,14407],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":8010,"description":8015},[267,8200,8201],{"id":8204,"title":8205,"body":14412,"category":267,"cover":268,"description":8210,"extension":269,"meta":14575,"navigation":114,"path":8414,"pinned":272,"publishedAt":273,"seo":14576,"slug":8416,"stem":8417,"summary":8418,"tags":14577,"updatedAt":273,"visible":114,"__hash__":8422},{"type":7,"value":14413,"toc":14563},[14414,14416,14418,14420,14422,14426,14430,14432,14448,14450,14452,14496,14498,14503,14505,14507,14521,14523,14527,14531,14535,14537,14543,14545,14555,14557,14559,14561],[10,14415,8210],{},[14,14417,16],{"id":16},[10,14419,8215],{},[14,14421,22],{"id":22},[10,14423,14424],{},[26,14425],{"alt":8222,"src":8223},[10,14427,8226,14428,8230],{},[34,14429,8229],{},[14,14431,44],{"id":44},[46,14433,14434,14440,14446],{},[49,14435,14436,8240,14438,8244],{},[34,14437,8239],{},[34,14439,8243],{},[49,14441,8247,14442,8251,14444,8254],{},[34,14443,8250],{},[34,14445,4316],{},[49,14447,8257],{},[14,14449,82],{"id":82},[10,14451,85],{},[87,14453,14454],{"className":89,"code":8264,"language":91,"meta":92,"style":92},[34,14455,14456,14460,14464,14468,14472,14476,14480,14484,14488,14492],{"__ignoreMap":92},[96,14457,14458],{"class":98,"line":99},[96,14459,8271],{},[96,14461,14462],{"class":98,"line":105},[96,14463,8276],{},[96,14465,14466],{"class":98,"line":111},[96,14467,8281],{},[96,14469,14470],{"class":98,"line":118},[96,14471,8286],{},[96,14473,14474],{"class":98,"line":124},[96,14475,8291],{},[96,14477,14478],{"class":98,"line":130},[96,14479,115],{"emptyLinePlaceholder":114},[96,14481,14482],{"class":98,"line":136},[96,14483,8300],{},[96,14485,14486],{"class":98,"line":142},[96,14487,8305],{},[96,14489,14490],{"class":98,"line":3930},[96,14491,8305],{},[96,14493,14494],{"class":98,"line":4142},[96,14495,8305],{},[10,14497,148],{},[87,14499,14501],{"className":14500,"code":8319,"language":154,"meta":92},[152],[34,14502,8319],{"__ignoreMap":92},[10,14504,159],{},[14,14506,162],{"id":162},[164,14508,14509,14513],{},[49,14510,7910,14511,8333],{},[34,14512,8332],{},[49,14514,8336,14515,8339,14517,8342,14519,8346],{},[34,14516,8243],{},[34,14518,8229],{},[34,14520,8345],{},[186,14522,188],{"id":188},[10,14524,8351,14525,8354],{},[34,14526,8243],{},[10,14528,14529],{},[26,14530],{"alt":8359,"src":8360},[10,14532,8363,14533,8366],{},[34,14534,8229],{},[14,14536,208],{"id":208},[46,14538,14539,14541],{},[49,14540,8373],{},[49,14542,8376],{},[14,14544,225],{"id":225},[164,14546,14547,14549],{},[49,14548,8383],{},[49,14550,3988,14551,8388,14553,8391],{},[34,14552,4316],{},[34,14554,8243],{},[10,14556,244],{},[14,14558,247],{"id":247},[10,14560,8398],{},[252,14562,254],{},{"title":92,"searchDepth":105,"depth":105,"links":14564},[14565,14566,14567,14568,14569,14572,14573,14574],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":14570},[14571],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":8205,"description":8210},[267,8420,8421],{"id":8424,"title":8425,"body":14579,"category":267,"cover":268,"description":8430,"extension":269,"meta":14762,"navigation":114,"path":8655,"pinned":272,"publishedAt":273,"seo":14763,"slug":8657,"stem":8658,"summary":8659,"tags":14764,"updatedAt":273,"visible":114,"__hash__":8662},{"type":7,"value":14580,"toc":14750},[14581,14583,14585,14587,14589,14593,14595,14597,14611,14613,14615,14683,14685,14690,14692,14694,14708,14710,14712,14716,14722,14724,14732,14734,14742,14744,14746,14748],[10,14582,8430],{},[14,14584,16],{"id":16},[10,14586,8435],{},[14,14588,22],{"id":22},[10,14590,14591],{},[26,14592],{"alt":8442,"src":8443},[10,14594,8446],{},[14,14596,44],{"id":44},[46,14598,14599,14605,14607],{},[49,14600,14601,8456,14603,403],{},[34,14602,8455],{},[34,14604,8459],{},[49,14606,8462],{},[49,14608,14609,8468],{},[34,14610,8467],{},[14,14612,82],{"id":82},[10,14614,85],{},[87,14616,14617],{"className":89,"code":8475,"language":91,"meta":92,"style":92},[34,14618,14619,14623,14627,14631,14635,14639,14643,14647,14651,14655,14659,14663,14667,14671,14675,14679],{"__ignoreMap":92},[96,14620,14621],{"class":98,"line":99},[96,14622,8482],{},[96,14624,14625],{"class":98,"line":105},[96,14626,115],{"emptyLinePlaceholder":114},[96,14628,14629],{"class":98,"line":111},[96,14630,8491],{},[96,14632,14633],{"class":98,"line":118},[96,14634,8496],{},[96,14636,14637],{"class":98,"line":124},[96,14638,8501],{},[96,14640,14641],{"class":98,"line":130},[96,14642,8506],{},[96,14644,14645],{"class":98,"line":136},[96,14646,8511],{},[96,14648,14649],{"class":98,"line":142},[96,14650,8516],{},[96,14652,14653],{"class":98,"line":3930},[96,14654,8521],{},[96,14656,14657],{"class":98,"line":4142},[96,14658,8526],{},[96,14660,14661],{"class":98,"line":5807},[96,14662,115],{"emptyLinePlaceholder":114},[96,14664,14665],{"class":98,"line":5812},[96,14666,8535],{},[96,14668,14669],{"class":98,"line":7417},[96,14670,6160],{},[96,14672,14673],{"class":98,"line":7423},[96,14674,6165],{},[96,14676,14677],{"class":98,"line":8546},[96,14678,115],{"emptyLinePlaceholder":114},[96,14680,14681],{"class":98,"line":8551},[96,14682,8554],{},[10,14684,148],{},[87,14686,14688],{"className":14687,"code":8560,"language":154,"meta":92},[152],[34,14689,8560],{"__ignoreMap":92},[10,14691,159],{},[14,14693,162],{"id":162},[164,14695,14696,14706],{},[49,14697,8571,14698,8575,14700,8579,14702,8583,14704,403],{},[34,14699,8574],{},[34,14701,8578],{},[34,14703,8582],{},[34,14705,8574],{},[49,14707,8588],{},[186,14709,188],{"id":188},[10,14711,8593],{},[10,14713,14714],{},[26,14715],{"alt":8598,"src":8599},[10,14717,14718,8604,14720,403],{},[34,14719,8455],{},[34,14721,8459],{},[14,14723,208],{"id":208},[46,14725,14726,14730],{},[49,14727,8613,14728,403],{},[34,14729,5358],{},[49,14731,8618],{},[14,14733,225],{"id":225},[164,14735,14736,14738],{},[49,14737,8625],{},[49,14739,8628,14740,8632],{},[34,14741,8631],{},[10,14743,244],{},[14,14745,247],{"id":247},[10,14747,8639],{},[252,14749,254],{},{"title":92,"searchDepth":105,"depth":105,"links":14751},[14752,14753,14754,14755,14756,14759,14760,14761],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":14757},[14758],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":8425,"description":8430},[267,8661,5309],{"id":8664,"title":8665,"body":14766,"category":267,"cover":268,"description":8670,"extension":269,"meta":14925,"navigation":114,"path":8858,"pinned":272,"publishedAt":273,"seo":14926,"slug":8860,"stem":8861,"summary":8862,"tags":14927,"updatedAt":273,"visible":114,"__hash__":8866},{"type":7,"value":14767,"toc":14913},[14768,14770,14772,14774,14776,14780,14782,14784,14792,14794,14796,14860,14862,14867,14869,14871,14879,14881,14883,14887,14889,14891,14897,14899,14905,14907,14909,14911],[10,14769,8670],{},[14,14771,16],{"id":16},[10,14773,8675],{},[14,14775,22],{"id":22},[10,14777,14778],{},[26,14779],{"alt":8682,"src":8683},[10,14781,8686],{},[14,14783,44],{"id":44},[46,14785,14786,14788,14790],{},[49,14787,8693],{},[49,14789,8696],{},[49,14791,8699],{},[14,14793,82],{"id":82},[10,14795,85],{},[87,14797,14798],{"className":89,"code":8706,"language":91,"meta":92,"style":92},[34,14799,14800,14804,14808,14812,14816,14820,14824,14828,14832,14836,14840,14844,14848,14852,14856],{"__ignoreMap":92},[96,14801,14802],{"class":98,"line":99},[96,14803,8713],{},[96,14805,14806],{"class":98,"line":105},[96,14807,8718],{},[96,14809,14810],{"class":98,"line":111},[96,14811,115],{"emptyLinePlaceholder":114},[96,14813,14814],{"class":98,"line":118},[96,14815,8727],{},[96,14817,14818],{"class":98,"line":124},[96,14819,115],{"emptyLinePlaceholder":114},[96,14821,14822],{"class":98,"line":130},[96,14823,8736],{},[96,14825,14826],{"class":98,"line":136},[96,14827,8741],{},[96,14829,14830],{"class":98,"line":142},[96,14831,8746],{},[96,14833,14834],{"class":98,"line":3930},[96,14835,115],{"emptyLinePlaceholder":114},[96,14837,14838],{"class":98,"line":4142},[96,14839,8755],{},[96,14841,14842],{"class":98,"line":5807},[96,14843,8760],{},[96,14845,14846],{"class":98,"line":5812},[96,14847,8765],{},[96,14849,14850],{"class":98,"line":7417},[96,14851,115],{"emptyLinePlaceholder":114},[96,14853,14854],{"class":98,"line":7423},[96,14855,6174],{},[96,14857,14858],{"class":98,"line":8546},[96,14859,8778],{},[10,14861,148],{},[87,14863,14865],{"className":14864,"code":8784,"language":154,"meta":92},[152],[34,14866,8784],{"__ignoreMap":92},[10,14868,159],{},[14,14870,162],{"id":162},[164,14872,14873,14877],{},[49,14874,14875,8798],{},[34,14876,8797],{},[49,14878,8801],{},[186,14880,188],{"id":188},[10,14882,8806],{},[10,14884,14885],{},[26,14886],{"alt":8811,"src":8812},[10,14888,8815],{},[14,14890,208],{"id":208},[46,14892,14893,14895],{},[49,14894,8822],{},[49,14896,8825],{},[14,14898,225],{"id":225},[164,14900,14901,14903],{},[49,14902,8832],{},[49,14904,8835],{},[10,14906,244],{},[14,14908,247],{"id":247},[10,14910,8842],{},[252,14912,254],{},{"title":92,"searchDepth":105,"depth":105,"links":14914},[14915,14916,14917,14918,14919,14922,14923,14924],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":14920},[14921],{"id":188,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":8665,"description":8670},[267,8864,8865],{"id":8868,"title":8869,"body":14929,"category":267,"cover":268,"description":8874,"extension":269,"meta":15167,"navigation":114,"path":9175,"pinned":272,"publishedAt":273,"seo":15168,"slug":9177,"stem":9178,"summary":9179,"tags":15169,"updatedAt":273,"visible":114,"__hash__":9183},{"type":7,"value":14930,"toc":15154},[14931,14933,14935,14937,14939,14943,14945,14947,14957,14959,14961,15077,15079,15084,15086,15088,15098,15100,15102,15106,15108,15110,15112,15116,15120,15122,15130,15132,15146,15148,15150,15152],[10,14932,8874],{},[14,14934,16],{"id":16},[10,14936,8879],{},[14,14938,22],{"id":22},[10,14940,14941],{},[26,14942],{"alt":8886,"src":8887},[10,14944,8890],{},[14,14946,44],{"id":44},[46,14948,14949,14951,14953],{},[49,14950,8897],{},[49,14952,8900],{},[49,14954,8903,14955,8907],{},[34,14956,8906],{},[14,14958,82],{"id":82},[10,14960,85],{},[87,14962,14963],{"className":89,"code":8914,"language":91,"meta":92,"style":92},[34,14964,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041,15045,15049,15053,15057,15061,15065,15069,15073],{"__ignoreMap":92},[96,14966,14967],{"class":98,"line":99},[96,14968,6972],{},[96,14970,14971],{"class":98,"line":105},[96,14972,6581],{},[96,14974,14975],{"class":98,"line":111},[96,14976,115],{"emptyLinePlaceholder":114},[96,14978,14979],{"class":98,"line":118},[96,14980,8933],{},[96,14982,14983],{"class":98,"line":124},[96,14984,8938],{},[96,14986,14987],{"class":98,"line":130},[96,14988,8943],{},[96,14990,14991],{"class":98,"line":136},[96,14992,8948],{},[96,14994,14995],{"class":98,"line":142},[96,14996,115],{"emptyLinePlaceholder":114},[96,14998,14999],{"class":98,"line":3930},[96,15000,8957],{},[96,15002,15003],{"class":98,"line":4142},[96,15004,8962],{},[96,15006,15007],{"class":98,"line":5807},[96,15008,8967],{},[96,15010,15011],{"class":98,"line":5812},[96,15012,8972],{},[96,15014,15015],{"class":98,"line":7417},[96,15016,8977],{},[96,15018,15019],{"class":98,"line":7423},[96,15020,115],{"emptyLinePlaceholder":114},[96,15022,15023],{"class":98,"line":8546},[96,15024,8986],{},[96,15026,15027],{"class":98,"line":8551},[96,15028,8991],{},[96,15030,15031],{"class":98,"line":8994},[96,15032,8997],{},[96,15034,15035],{"class":98,"line":9000},[96,15036,115],{"emptyLinePlaceholder":114},[96,15038,15039],{"class":98,"line":9005},[96,15040,9008],{},[96,15042,15043],{"class":98,"line":9011},[96,15044,115],{"emptyLinePlaceholder":114},[96,15046,15047],{"class":98,"line":9016},[96,15048,7390],{},[96,15050,15051],{"class":98,"line":9021},[96,15052,9024],{},[96,15054,15055],{"class":98,"line":9027},[96,15056,9030],{},[96,15058,15059],{"class":98,"line":9033},[96,15060,9036],{},[96,15062,15063],{"class":98,"line":9039},[96,15064,7400],{},[96,15066,15067],{"class":98,"line":9044},[96,15068,9047],{},[96,15070,15071],{"class":98,"line":9050},[96,15072,1186],{},[96,15074,15075],{"class":98,"line":9055},[96,15076,9058],{},[10,15078,148],{},[87,15080,15082],{"className":15081,"code":9064,"language":154,"meta":92},[152],[34,15083,9064],{"__ignoreMap":92},[10,15085,159],{},[14,15087,162],{"id":162},[164,15089,15090,15094],{},[49,15091,9075,15092,9078],{},[34,15093,8906],{},[49,15095,15096,9083],{},[34,15097,8138],{},[186,15099,188],{"id":188},[10,15101,9088],{},[10,15103,15104],{},[26,15105],{"alt":9093,"src":9094},[10,15107,9097],{},[186,15109,188],{"id":4197},[10,15111,9102],{},[10,15113,15114],{},[26,15115],{"alt":9107,"src":9108},[10,15117,9111,15118,9115],{},[34,15119,9114],{},[14,15121,208],{"id":208},[46,15123,15124,15126],{},[49,15125,9122],{},[49,15127,9125,15128,9128],{},[34,15129,9114],{},[14,15131,225],{"id":225},[164,15133,15134,15138,15140],{},[49,15135,9135,15136,9138],{},[34,15137,9114],{},[49,15139,9141],{},[49,15141,9144,15142,9148,15144,9151],{},[34,15143,9147],{},[34,15145,6116],{},[10,15147,244],{},[14,15149,247],{"id":247},[10,15151,9158],{},[252,15153,254],{},{"title":92,"searchDepth":105,"depth":105,"links":15155},[15156,15157,15158,15159,15160,15164,15165,15166],{"id":16,"depth":105,"text":16},{"id":22,"depth":105,"text":22},{"id":44,"depth":105,"text":44},{"id":82,"depth":105,"text":82},{"id":162,"depth":105,"text":162,"children":15161},[15162,15163],{"id":188,"depth":111,"text":188},{"id":4197,"depth":111,"text":188},{"id":208,"depth":105,"text":208},{"id":225,"depth":105,"text":225},{"id":247,"depth":105,"text":247},{},{"title":8869,"description":8874},[267,9181,9182],{"id":1096,"title":1097,"body":15171,"category":267,"cover":1105,"description":92,"extension":269,"meta":15407,"navigation":114,"path":1422,"pinned":272,"publishedAt":1423,"seo":15408,"slug":1425,"stem":1426,"summary":1427,"tags":15409,"updatedAt":1423,"visible":114,"__hash__":1431},{"type":7,"value":15172,"toc":15392},[15173,15177,15179,15181,15183,15185,15205,15207,15212,15214,15216,15244,15250,15252,15256,15258,15278,15280,15290,15292,15294,15296,15298,15300,15302,15304,15306,15308,15328,15330,15332,15336,15338,15340,15342,15344,15348,15350,15368,15370,15372,15374,15376,15378,15380,15382,15384,15386,15388,15390],[10,15174,15175],{},[26,15176],{"alt":1104,"src":1105},[10,15178,1108],{},[10,15180,1111],{},[14,15182,1115],{"id":1114},[10,15184,1118],{},[87,15186,15187],{"className":89,"code":1121,"language":91,"meta":92,"style":92},[34,15188,15189,15193,15197,15201],{"__ignoreMap":92},[96,15190,15191],{"class":98,"line":99},[96,15192,1128],{},[96,15194,15195],{"class":98,"line":105},[96,15196,1133],{},[96,15198,15199],{"class":98,"line":111},[96,15200,115],{"emptyLinePlaceholder":114},[96,15202,15203],{"class":98,"line":118},[96,15204,1142],{},[10,15206,1145],{},[87,15208,15210],{"className":15209,"code":1149,"language":154,"meta":92},[152],[34,15211,1149],{"__ignoreMap":92},[10,15213,1154],{},[10,15215,1157],{},[87,15217,15218],{"className":89,"code":1160,"language":91,"meta":92,"style":92},[34,15219,15220,15224,15228,15232,15236,15240],{"__ignoreMap":92},[96,15221,15222],{"class":98,"line":99},[96,15223,1167],{},[96,15225,15226],{"class":98,"line":105},[96,15227,115],{"emptyLinePlaceholder":114},[96,15229,15230],{"class":98,"line":111},[96,15231,1176],{},[96,15233,15234],{"class":98,"line":118},[96,15235,1181],{},[96,15237,15238],{"class":98,"line":124},[96,15239,1186],{},[96,15241,15242],{"class":98,"line":130},[96,15243,1191],{},[10,15245,15246,1197,15248,1201],{},[34,15247,1196],{},[34,15249,1200],{},[14,15251,1205],{"id":1204},[10,15253,1208,15254,1212],{},[34,15255,1211],{},[10,15257,1215],{},[87,15259,15260],{"className":89,"code":1218,"language":91,"meta":92,"style":92},[34,15261,15262,15266,15270,15274],{"__ignoreMap":92},[96,15263,15264],{"class":98,"line":99},[96,15265,1225],{},[96,15267,15268],{"class":98,"line":105},[96,15269,1230],{},[96,15271,15272],{"class":98,"line":111},[96,15273,1235],{},[96,15275,15276],{"class":98,"line":118},[96,15277,1240],{},[10,15279,1243],{},[87,15281,15282],{"className":632,"code":1246,"language":634,"meta":92,"style":92},[34,15283,15284],{"__ignoreMap":92},[96,15285,15286,15288],{"class":98,"line":99},[96,15287,732],{"class":641},[96,15289,1255],{"class":677},[10,15291,1258],{},[14,15293,1262],{"id":1261},[186,15295,1265],{"id":1265},[10,15297,1268],{},[186,15299,1271],{"id":1271},[10,15301,1274],{},[186,15303,1277],{"id":1277},[10,15305,1280],{},[10,15307,1283],{},[87,15309,15310],{"className":89,"code":1286,"language":91,"meta":92,"style":92},[34,15311,15312,15316,15320,15324],{"__ignoreMap":92},[96,15313,15314],{"class":98,"line":99},[96,15315,1293],{},[96,15317,15318],{"class":98,"line":105},[96,15319,115],{"emptyLinePlaceholder":114},[96,15321,15322],{"class":98,"line":111},[96,15323,1302],{},[96,15325,15326],{"class":98,"line":118},[96,15327,1307],{},[10,15329,1310],{},[186,15331,1313],{"id":1313},[10,15333,1316,15334,1319],{},[34,15335,302],{},[10,15337,1322],{},[186,15339,1325],{"id":1325},[10,15341,1328],{},[14,15343,1332],{"id":1331},[10,15345,15346],{},[26,15347],{"alt":1337,"src":1338},[10,15349,1341],{},[46,15351,15352,15354,15356,15358,15360,15362,15364,15366],{},[49,15353,1346],{},[49,15355,1349],{},[49,15357,1352],{},[49,15359,1355],{},[49,15361,1358],{},[49,15363,1361],{},[49,15365,1364],{},[49,15367,1367],{},[10,15369,1370],{},[14,15371,1374],{"id":1373},[10,15373,1377],{},[10,15375,1380],{},[14,15377,1384],{"id":1383},[10,15379,1387],{},[10,15381,1390],{},[10,15383,1393],{},[14,15385,1396],{"id":1396},[10,15387,1399],{},[10,15389,1402],{},[252,15391,1405],{},{"title":92,"searchDepth":105,"depth":105,"links":15393},[15394,15395,15396,15403,15404,15405,15406],{"id":1114,"depth":105,"text":1115},{"id":1204,"depth":105,"text":1205},{"id":1261,"depth":105,"text":1262,"children":15397},[15398,15399,15400,15401,15402],{"id":1265,"depth":111,"text":1265},{"id":1271,"depth":111,"text":1271},{"id":1277,"depth":111,"text":1277},{"id":1313,"depth":111,"text":1313},{"id":1325,"depth":111,"text":1325},{"id":1331,"depth":105,"text":1332},{"id":1373,"depth":105,"text":1374},{"id":1383,"depth":105,"text":1384},{"id":1396,"depth":105,"text":1396},{},{"title":1097,"description":92},[267,1429,1430],{"id":284,"title":285,"body":15411,"category":267,"cover":268,"description":92,"extension":269,"meta":15990,"navigation":114,"path":1085,"pinned":272,"publishedAt":1086,"seo":15991,"slug":1088,"stem":1089,"summary":1090,"tags":15992,"updatedAt":1086,"visible":114,"__hash__":1094},{"type":7,"value":15412,"toc":15966},[15413,15415,15417,15419,15423,15425,15427,15451,15463,15465,15467,15472,15476,15480,15492,15496,15500,15504,15506,15540,15542,15546,15550,15552,15574,15604,15616,15626,15634,15636,15642,15652,15654,15659,15663,15665,15679,15685,15705,15707,15709,15711,15721,15725,15727,15736,15740,15742,15744,15764,15768,15770,15772,15774,15776,15796,15798,15800,15802,15828,15830,15846,15848,15864,15868,15870,15872,15892,15894,15896,15898,15902,15912,15914,15916,15918,15928,15936,15938,15940,15954,15964],[14,15414,290],{"id":290},[10,15416,293],{},[10,15418,296],{},[10,15420,299,15421,303],{},[34,15422,302],{},[14,15424,306],{"id":306},[10,15426,309],{},[311,15428,15429,15431],{},[10,15430,315],{},[311,15432,15433,15439,15441,15445,15447],{},[10,15434,320,15435,324,15437,328],{},[34,15436,323],{},[34,15438,327],{},[10,15440,331],{},[10,15442,334,15443,339],{},[336,15444,338],{},[10,15446,342],{},[10,15448,15449],{},[26,15450],{"alt":347,"src":348},[311,15452,15453,15455],{},[10,15454,353],{},[311,15456,15457,15459],{},[10,15458,358],{},[10,15460,15461],{},[26,15462],{"alt":363,"src":364},[14,15464,368],{"id":367},[186,15466,372],{"id":371},[10,15468,375,15469,383],{},[377,15470,382],{"href":379,"rel":15471},[381],[311,15473,15474],{},[10,15475,388],{},[10,15477,15478],{},[26,15479],{"alt":393,"src":394},[46,15481,15482,15486,15490],{},[49,15483,399,15484,403],{},[336,15485,402],{},[49,15487,406,15488,403],{},[336,15489,409],{},[49,15491,412],{},[10,15493,15494],{},[26,15495],{"alt":417,"src":418},[311,15497,15498],{},[10,15499,423],{},[10,15501,15502],{},[26,15503],{"alt":428,"src":429},[186,15505,433],{"id":432},[311,15507,15508,15512,15516,15536],{},[311,15509,15510],{},[10,15511,440],{},[10,15513,443,15514,447],{},[336,15515,446],{},[87,15517,15518],{"className":89,"code":450,"language":91,"meta":92,"style":92},[34,15519,15520,15524,15528,15532],{"__ignoreMap":92},[96,15521,15522],{"class":98,"line":99},[96,15523,457],{},[96,15525,15526],{"class":98,"line":105},[96,15527,462],{},[96,15529,15530],{"class":98,"line":111},[96,15531,467],{},[96,15533,15534],{"class":98,"line":118},[96,15535,472],{},[10,15537,475,15538,479],{},[336,15539,478],{},[10,15541,482],{},[10,15543,485,15544,488],{},[34,15545,91],{},[10,15547,15548],{},[26,15549],{"alt":493,"src":494},[10,15551,497],{},[311,15553,15554,15556,15560],{},[10,15555,502],{},[10,15557,15558],{},[336,15559,507],{},[311,15561,15562,15566,15570],{},[10,15563,512,15564,515],{},[34,15565,91],{},[10,15567,518,15568,521],{},[34,15569,91],{},[10,15571,524,15572,528],{},[336,15573,527],{},[311,15575,15576,15578,15582],{},[10,15577,533],{},[10,15579,15580],{},[336,15581,538],{},[311,15583,15584,15590,15598,15600],{},[10,15585,15586,546,15588,550],{},[34,15587,545],{},[34,15589,549],{},[10,15591,553,15592,556,15594,560,15596,564],{},[34,15593,545],{},[336,15595,559],{},[336,15597,563],{},[10,15599,567],{},[10,15601,15602,573],{},[336,15603,572],{},[311,15605,15606,15608],{},[10,15607,578],{},[311,15609,15610,15614],{},[10,15611,583,15612,587],{},[336,15613,586],{},[10,15615,590],{},[311,15617,15618,15622],{},[10,15619,595,15620],{},[336,15621,598],{},[10,15623,15624],{},[26,15625],{"alt":603,"src":604},[311,15627,15628,15630],{},[10,15629,609],{},[10,15631,15632],{},[26,15633],{"alt":603,"src":614},[186,15635,618],{"id":617},[10,15637,621,15638,625,15640,629],{},[34,15639,624],{},[34,15641,628],{},[87,15643,15644],{"className":632,"code":633,"language":634,"meta":92,"style":92},[34,15645,15646],{"__ignoreMap":92},[96,15647,15648,15650],{"class":98,"line":99},[96,15649,91],{"class":641},[96,15651,645],{"class":644},[10,15653,648],{},[87,15655,15657],{"className":15656,"code":652,"language":154,"meta":92},[152],[34,15658,652],{"__ignoreMap":92},[10,15660,15661],{},[26,15662],{"alt":603,"src":659},[10,15664,662],{},[87,15666,15667],{"className":632,"code":665,"language":634,"meta":92,"style":92},[34,15668,15669],{"__ignoreMap":92},[96,15670,15671,15673,15675,15677],{"class":98,"line":99},[96,15672,91],{"class":641},[96,15674,674],{"class":644},[96,15676,678],{"class":677},[96,15678,645],{"class":644},[10,15680,683,15681,686,15683,690],{},[34,15682,91],{},[34,15684,689],{},[87,15686,15687],{"className":632,"code":693,"language":634,"meta":92,"style":92},[34,15688,15689,15695],{"__ignoreMap":92},[96,15690,15691,15693],{"class":98,"line":99},[96,15692,549],{"class":641},[96,15694,645],{"class":644},[96,15696,15697,15699,15701,15703],{"class":98,"line":105},[96,15698,549],{"class":641},[96,15700,674],{"class":644},[96,15702,678],{"class":677},[96,15704,645],{"class":644},[14,15706,715],{"id":714},[186,15708,719],{"id":718},[10,15710,722],{},[87,15712,15713],{"className":632,"code":725,"language":634,"meta":92,"style":92},[34,15714,15715],{"__ignoreMap":92},[96,15716,15717,15719],{"class":98,"line":99},[96,15718,732],{"class":641},[96,15720,645],{"class":644},[10,15722,737,15723,741],{},[34,15724,740],{},[186,15726,745],{"id":744},[10,15728,375,15729,753,15732,403,15734,760],{},[377,15730,752],{"href":750,"rel":15731},[381],[336,15733,756],{},[34,15735,759],{},[10,15737,763,15738,767],{},[34,15739,766],{},[186,15741,771],{"id":770},[10,15743,774],{},[87,15745,15746],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,15747,15748,15754],{"__ignoreMap":92},[96,15749,15750,15752],{"class":98,"line":99},[96,15751,732],{"class":641},[96,15753,645],{"class":644},[96,15755,15756,15758,15760,15762],{"class":98,"line":105},[96,15757,732],{"class":641},[96,15759,674],{"class":644},[96,15761,678],{"class":677},[96,15763,645],{"class":644},[10,15765,798,15766,801],{},[34,15767,732],{},[14,15769,805],{"id":804},[10,15771,808],{},[186,15773,812],{"id":811},[10,15775,815],{},[87,15777,15778],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,15779,15780,15786],{"__ignoreMap":92},[96,15781,15782,15784],{"class":98,"line":99},[96,15783,732],{"class":641},[96,15785,645],{"class":644},[96,15787,15788,15790,15792,15794],{"class":98,"line":105},[96,15789,732],{"class":641},[96,15791,674],{"class":644},[96,15793,678],{"class":677},[96,15795,645],{"class":644},[10,15797,838],{},[186,15799,842],{"id":841},[10,15801,845],{},[87,15803,15804],{"className":632,"code":848,"language":634,"meta":92,"style":92},[34,15805,15806,15814],{"__ignoreMap":92},[96,15807,15808,15810,15812],{"class":98,"line":99},[96,15809,855],{"class":641},[96,15811,858],{"class":677},[96,15813,861],{"class":677},[96,15815,15816,15818,15820,15822,15824,15826],{"class":98,"line":105},[96,15817,855],{"class":641},[96,15819,858],{"class":677},[96,15821,870],{"class":677},[96,15823,873],{"class":677},[96,15825,876],{"class":677},[96,15827,879],{"class":677},[10,15829,882],{},[87,15831,15832],{"className":632,"code":885,"language":634,"meta":92,"style":92},[34,15833,15834],{"__ignoreMap":92},[96,15835,15836,15838,15840,15842,15844],{"class":98,"line":99},[96,15837,855],{"class":641},[96,15839,894],{"class":677},[96,15841,870],{"class":677},[96,15843,873],{"class":677},[96,15845,901],{"class":677},[10,15847,904],{},[87,15849,15850],{"className":632,"code":907,"language":634,"meta":92,"style":92},[34,15851,15852],{"__ignoreMap":92},[96,15853,15854,15856,15858,15860,15862],{"class":98,"line":99},[96,15855,855],{"class":641},[96,15857,916],{"class":677},[96,15859,919],{"class":644},[96,15861,922],{"class":677},[96,15863,925],{"class":677},[10,15865,15866,930],{},[34,15867,855],{},[186,15869,934],{"id":933},[10,15871,937],{},[87,15873,15874],{"className":632,"code":777,"language":634,"meta":92,"style":92},[34,15875,15876,15882],{"__ignoreMap":92},[96,15877,15878,15880],{"class":98,"line":99},[96,15879,732],{"class":641},[96,15881,645],{"class":644},[96,15883,15884,15886,15888,15890],{"class":98,"line":105},[96,15885,732],{"class":641},[96,15887,674],{"class":644},[96,15889,678],{"class":677},[96,15891,645],{"class":644},[10,15893,960],{},[14,15895,963],{"id":963},[186,15897,967],{"id":966},[10,15899,970,15900,974],{},[34,15901,973],{},[164,15903,15904,15908,15910],{},[49,15905,979,15906,982],{},[34,15907,689],{},[49,15909,985],{},[49,15911,988],{},[10,15913,991],{},[186,15915,995],{"id":994},[10,15917,998],{},[87,15919,15920],{"className":632,"code":725,"language":634,"meta":92,"style":92},[34,15921,15922],{"__ignoreMap":92},[96,15923,15924,15926],{"class":98,"line":99},[96,15925,732],{"class":641},[96,15927,645],{"class":644},[10,15929,1011,15930,1014,15932,1017,15934,403],{},[34,15931,732],{},[34,15933,91],{},[34,15935,732],{},[186,15937,1023],{"id":1022},[10,15939,1026],{},[87,15941,15942],{"className":632,"code":1029,"language":634,"meta":92,"style":92},[34,15943,15944],{"__ignoreMap":92},[96,15945,15946,15948,15950,15952],{"class":98,"line":99},[96,15947,732],{"class":641},[96,15949,674],{"class":644},[96,15951,678],{"class":677},[96,15953,645],{"class":644},[10,15955,1044,15956,1047,15958,37,15960,1052,15962,1056],{},[34,15957,732],{},[34,15959,91],{},[34,15961,549],{},[34,15963,1055],{},[252,15965,1059],{},{"title":92,"searchDepth":105,"depth":105,"links":15967},[15968,15969,15970,15975,15980,15985],{"id":290,"depth":105,"text":290},{"id":306,"depth":105,"text":306},{"id":367,"depth":105,"text":368,"children":15971},[15972,15973,15974],{"id":371,"depth":111,"text":372},{"id":432,"depth":111,"text":433},{"id":617,"depth":111,"text":618},{"id":714,"depth":105,"text":715,"children":15976},[15977,15978,15979],{"id":718,"depth":111,"text":719},{"id":744,"depth":111,"text":745},{"id":770,"depth":111,"text":771},{"id":804,"depth":105,"text":805,"children":15981},[15982,15983,15984],{"id":811,"depth":111,"text":812},{"id":841,"depth":111,"text":842},{"id":933,"depth":111,"text":934},{"id":963,"depth":105,"text":963,"children":15986},[15987,15988,15989],{"id":966,"depth":111,"text":967},{"id":994,"depth":111,"text":995},{"id":1022,"depth":111,"text":1023},{},{"title":285,"description":92},[267,1092,1093],1786973364506]