[{"data":1,"prerenderedAt":15947},["ShallowReactive",2],{"post-python-function-basics":3,"sidebar-posts":208,"post-related-source":9138},{"id":4,"title":5,"body":6,"category":193,"cover":194,"description":12,"extension":195,"meta":196,"navigation":90,"path":197,"pinned":198,"publishedAt":199,"seo":200,"slug":201,"stem":202,"summary":203,"tags":204,"updatedAt":199,"visible":90,"__hash__":207},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":8,"toc":183},"minimark",[9,13,17,20,23,30,33,36,49,52,55,110,113,121,124,127,144,147,155,158,170,173,176,179],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[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\u002F22-function-call.svg",[10,31,32],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"函数名描述动作，使用小写字母和下划线。",[40,44,45],{},"函数定义要先执行，之后才能调用。",[40,47,48],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,50,51],{"id":51},"跟着示例运行",[10,53,54],{},"把下面代码保存到本课脚本并运行：",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-python shiki shiki-themes github-dark","def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n","python","",[63,64,65,73,79,85,92,98,104],"code",{"__ignoreMap":61},[66,67,70],"span",{"class":68,"line":69},"line",1,[66,71,72],{},"def show_progress():\n",[66,74,76],{"class":68,"line":75},2,[66,77,78],{},"    print(\"正在学习函数\")\n",[66,80,82],{"class":68,"line":81},3,[66,83,84],{},"    print(\"本节完成 50%\")\n",[66,86,88],{"class":68,"line":87},4,[66,89,91],{"emptyLinePlaceholder":90},true,"\n",[66,93,95],{"class":68,"line":94},5,[66,96,97],{},"print(\"调用前\")\n",[66,99,101],{"class":68,"line":100},6,[66,102,103],{},"show_progress()\n",[66,105,107],{"class":68,"line":106},7,[66,108,109],{},"print(\"调用后\")\n",[10,111,112],{},"预期结果：",[56,114,119],{"className":115,"code":117,"language":118,"meta":61},[116],"language-text","调用前\n正在学习函数\n本节完成 50%\n调用后\n","text",[63,120,117],{"__ignoreMap":61},[10,122,123],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,125,126],{"id":126},"按执行顺序拆开看",[128,129,130,137],"ol",{},[40,131,132,133,136],{},"执行 ",[63,134,135],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,138,139,140,143],{},"运行到 ",[63,141,142],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,145,146],{"id":146},"初学者容易混淆的地方",[37,148,149,152],{},[40,150,151],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,153,154],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,156,157],{"id":157},"练习",[128,159,160,167],{},[40,161,162,163,166],{},"定义 ",[63,164,165],{},"show_plan()"," 输出两行学习计划。",[40,168,169],{},"连续调用同一个函数两次，观察执行顺序。",[10,171,172],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,174,175],{"id":175},"本篇边界",[10,177,178],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,181,182],"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":61,"searchDepth":75,"depth":75,"links":184},[185,186,187,188,189,190,191,192],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",false,"2026-08-17",{"title":5,"description":12},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[193,205,206],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",[209,1022,1359,1493,1645,1824,2012,2177,2361,2543,2736,2967,3151,3328,3485,3656,3821,4036,4265,4447,4611,4800,4988,5143,5266,5463,5660,5874,6041,6285,6466,6671,6866,7050,7251,7541,7733,7962,8157,8377,8617,8821],{"id":210,"title":211,"body":212,"category":193,"cover":194,"description":61,"extension":195,"meta":1011,"navigation":90,"path":1012,"pinned":198,"publishedAt":1013,"seo":1014,"slug":1015,"stem":1016,"summary":1017,"tags":1018,"updatedAt":1013,"visible":90,"__hash__":1021},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":213,"toc":987},[214,217,220,223,230,233,236,275,291,295,300,311,316,322,340,346,351,357,361,407,410,416,422,425,456,501,518,532,542,546,557,573,576,582,587,590,608,618,639,643,647,650,662,669,673,688,695,699,702,723,729,733,736,740,743,763,766,770,773,807,810,829,832,853,858,862,865,885,888,891,895,902,915,918,922,925,935,946,950,953,968,984],[14,215,216],{"id":216},"引言",[10,218,219],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,221,222],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,224,225,226,229],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[63,227,228],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,231,232],{"id":232},"扫盲",[10,234,235],{},"那么这里有几个概念：",[237,238,239,242],"blockquote",{},[10,240,241],{},"为什么需要安装python解释器？",[237,243,244,255,258,266,269],{},[10,245,246,247,250,251,254],{},"我们写的代码，电脑其实看不懂，电脑只认识",[63,248,249],{},"0","和",[63,252,253],{},"1","组成的机器指令。",[10,256,257],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,259,260,261,265],{},"这样，我们就能用",[262,263,264],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,267,268],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,270,271],{},[26,272],{"alt":273,"src":274},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[237,276,277,280],{},[10,278,279],{},"pip又是什么？",[237,281,282,285],{},[10,283,284],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,286,287],{},[26,288],{"alt":289,"src":290},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,292,294],{"id":293},"windows-安装","Windows 安装",[296,297,299],"h3",{"id":298},"_1-下载官方安装程序","1. 下载官方安装程序",[10,301,302,303,310],{},"打开 ",[304,305,309],"a",{"href":306,"rel":307},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[308],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[237,312,313],{},[10,314,315],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,317,318],{},[26,319],{"alt":320,"src":321},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,323,324,331,337],{},[40,325,326,327,330],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[262,328,329],{},"Windows installer (64-bit)","。",[40,332,333,334,330],{},"搭载 ARM 处理器的 Windows 设备选择 ",[262,335,336],{},"Windows installer (ARM64)",[40,338,339],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,341,342],{},[26,343],{"alt":344,"src":345},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[237,347,348],{},[10,349,350],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,352,353],{},[26,354],{"alt":355,"src":356},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[296,358,360],{"id":359},"_2-安装并加入-path","2. 安装并加入 PATH",[237,362,363,368,375,400],{},[237,364,365],{},[10,366,367],{},"PATH 环境变量",[10,369,370,371,374],{},"Windows 有一个特殊的变量叫 ",[262,372,373],{},"PATH","，它里面存了一串文件夹路径，比如：",[56,376,378],{"className":58,"code":377,"language":60,"meta":61,"style":61},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[63,379,380,385,390,395],{"__ignoreMap":61},[66,381,382],{"class":68,"line":69},[66,383,384],{},"D:\\Python313\\\n",[66,386,387],{"class":68,"line":75},[66,388,389],{},"D:\\Python313\\Scripts\\\n",[66,391,392],{"class":68,"line":81},[66,393,394],{},"C:\\Windows\\System32\\\n",[66,396,397],{"class":68,"line":87},[66,398,399],{},"...\n",[10,401,402,403,406],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[262,404,405],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,408,409],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,411,412,413,415],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[63,414,60],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,417,418],{},[26,419],{"alt":420,"src":421},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,423,424],{},"对安装界面最底部的两个勾选项分别解释 :",[237,426,427,430,435],{},[10,428,429],{},"Add python.exe to PATH",[10,431,432],{},[262,433,434],{},"把 Python 添加到系统环境变量",[237,436,437,443,449],{},[10,438,439,440,442],{},"勾选后，你可以在命令行任意位置直接输入 ",[63,441,60],{}," 就能运行",[10,444,445,446,448],{},"不勾选的话，命令行输入 ",[63,447,60],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,450,451,452,455],{},"必须",[262,453,454],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[237,457,458,461,466],{},[10,459,460],{},"Use admin privileges when installing py.exe",[10,462,463],{},[262,464,465],{},"使用管理员权限安装 py.exe（Python 启动器）",[237,467,468,478,492,495],{},[10,469,470,473,474,477],{},[63,471,472],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[63,475,476],{},"py"," 来启动 Python。",[10,479,480,481,483,484,487,488,491],{},"勾选后，",[63,482,472],{}," 会安装到",[262,485,486],{},"系统级目录","，电脑上",[262,489,490],{},"所有用户账户","都能用",[10,493,494],{},"不勾选，只有当前用户能用",[10,496,497,500],{},[262,498,499],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[237,502,503,506],{},[10,504,505],{},"操作建议",[237,507,508,515],{},[10,509,510,511,514],{},"两个都勾上之后，再点 ",[262,512,513],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,516,517],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[237,519,520,526],{},[10,521,522,523],{},"Python 安装的",[262,524,525],{},"可选功能页",[10,527,528],{},[26,529],{"alt":530,"src":531},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[237,533,534,537],{},[10,535,536],{},"高级选项页",[10,538,539],{},[26,540],{"alt":530,"src":541},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[296,543,545],{"id":544},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,547,548,549,552,553,556],{},"按 ",[63,550,551],{},"Win + R","，输入 ",[63,554,555],{},"cmd"," 并回车，然后执行：",[56,558,562],{"className":559,"code":560,"language":561,"meta":61,"style":61},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[63,563,564],{"__ignoreMap":61},[66,565,566,569],{"class":68,"line":69},[66,567,60],{"class":568},"svObZ",[66,570,572],{"class":571},"sDLfK"," --version\n",[10,574,575],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[56,577,580],{"className":578,"code":579,"language":118,"meta":61},[116],"Python 3.x.x\n",[63,581,579],{"__ignoreMap":61},[10,583,584],{},[26,585],{"alt":530,"src":586},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,588,589],{},"继续检查 pip：",[56,591,593],{"className":559,"code":592,"language":561,"meta":61,"style":61},"python -m pip --version\n",[63,594,595],{"__ignoreMap":61},[66,596,597,599,602,606],{"class":68,"line":69},[66,598,60],{"class":568},[66,600,601],{"class":571}," -m",[66,603,605],{"class":604},"sU2Wk"," pip",[66,607,572],{"class":571},[10,609,610,611,613,614,617],{},"如果 ",[63,612,60],{}," 无法识别，但 ",[63,615,616],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[56,619,621],{"className":559,"code":620,"language":561,"meta":61,"style":61},"py --version\npy -m pip --version\n",[63,622,623,629],{"__ignoreMap":61},[66,624,625,627],{"class":68,"line":69},[66,626,476],{"class":568},[66,628,572],{"class":571},[66,630,631,633,635,637],{"class":68,"line":75},[66,632,476],{"class":568},[66,634,601],{"class":571},[66,636,605],{"class":604},[66,638,572],{"class":571},[14,640,642],{"id":641},"macos-安装","macOS 安装",[296,644,646],{"id":645},"_1-先检查现有环境","1. 先检查现有环境",[10,648,649],{},"打开“终端”应用，执行：",[56,651,653],{"className":559,"code":652,"language":561,"meta":61,"style":61},"python3 --version\n",[63,654,655],{"__ignoreMap":61},[66,656,657,660],{"class":68,"line":69},[66,658,659],{"class":568},"python3",[66,661,572],{"class":571},[10,663,664,665,668],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[63,666,667],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[296,670,672],{"id":671},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,674,302,675,680,681,330,684,687],{},[304,676,679],{"href":677,"rel":678},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[308],"Python macOS 下载页","，下载当前稳定版的 ",[262,682,683],{},"macOS 64-bit universal2 installer",[63,685,686],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,689,690,691,694],{},"下载完成后打开 ",[63,692,693],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[296,696,698],{"id":697},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,700,701],{},"安装完成后重新打开终端，执行：",[56,703,705],{"className":559,"code":704,"language":561,"meta":61,"style":61},"python3 --version\npython3 -m pip --version\n",[63,706,707,713],{"__ignoreMap":61},[66,708,709,711],{"class":68,"line":69},[66,710,659],{"class":568},[66,712,572],{"class":571},[66,714,715,717,719,721],{"class":68,"line":75},[66,716,659],{"class":568},[66,718,601],{"class":571},[66,720,605],{"class":604},[66,722,572],{"class":571},[10,724,725,726,728],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[63,727,659],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,730,732],{"id":731},"linux-安装","Linux 安装",[10,734,735],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[296,737,739],{"id":738},"_1-检查是否已经安装","1. 检查是否已经安装",[10,741,742],{},"打开终端，执行：",[56,744,745],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,746,747,753],{"__ignoreMap":61},[66,748,749,751],{"class":68,"line":69},[66,750,659],{"class":568},[66,752,572],{"class":571},[66,754,755,757,759,761],{"class":68,"line":75},[66,756,659],{"class":568},[66,758,601],{"class":571},[66,760,605],{"class":604},[66,762,572],{"class":571},[10,764,765],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[296,767,769],{"id":768},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,771,772],{},"Ubuntu 或 Debian：",[56,774,776],{"className":559,"code":775,"language":561,"meta":61,"style":61},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[63,777,778,789],{"__ignoreMap":61},[66,779,780,783,786],{"class":68,"line":69},[66,781,782],{"class":568},"sudo",[66,784,785],{"class":604}," apt",[66,787,788],{"class":604}," update\n",[66,790,791,793,795,798,801,804],{"class":68,"line":75},[66,792,782],{"class":568},[66,794,785],{"class":604},[66,796,797],{"class":604}," install",[66,799,800],{"class":604}," python3",[66,802,803],{"class":604}," python3-pip",[66,805,806],{"class":604}," python3-venv\n",[10,808,809],{},"Fedora：",[56,811,813],{"className":559,"code":812,"language":561,"meta":61,"style":61},"sudo dnf install python3 python3-pip\n",[63,814,815],{"__ignoreMap":61},[66,816,817,819,822,824,826],{"class":68,"line":69},[66,818,782],{"class":568},[66,820,821],{"class":604}," dnf",[66,823,797],{"class":604},[66,825,800],{"class":604},[66,827,828],{"class":604}," python3-pip\n",[10,830,831],{},"Arch Linux：",[56,833,835],{"className":559,"code":834,"language":561,"meta":61,"style":61},"sudo pacman -S python python-pip\n",[63,836,837],{"__ignoreMap":61},[66,838,839,841,844,847,850],{"class":68,"line":69},[66,840,782],{"class":568},[66,842,843],{"class":604}," pacman",[66,845,846],{"class":571}," -S",[66,848,849],{"class":604}," python",[66,851,852],{"class":604}," python-pip\n",[10,854,855,857],{},[63,856,782],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[296,859,861],{"id":860},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,863,864],{},"安装结束后执行：",[56,866,867],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,868,869,875],{"__ignoreMap":61},[66,870,871,873],{"class":68,"line":69},[66,872,659],{"class":568},[66,874,572],{"class":571},[66,876,877,879,881,883],{"class":68,"line":75},[66,878,659],{"class":568},[66,880,601],{"class":571},[66,882,605],{"class":604},[66,884,572],{"class":571},[10,886,887],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,889,890],{"id":890},"常见问题",[296,892,894],{"id":893},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,896,897,898,901],{},"先关闭当前命令提示符并重新打开，再执行 ",[63,899,900],{},"python --version","。如果仍然失败，按下面的顺序检查：",[128,903,904,909,912],{},[40,905,132,906,908],{},[63,907,616],{},"，确认 Python Launcher 是否可用。",[40,910,911],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,913,914],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,916,917],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[296,919,921],{"id":920},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,923,924],{},"先尝试：",[56,926,927],{"className":559,"code":652,"language":561,"meta":61,"style":61},[63,928,929],{"__ignoreMap":61},[66,930,931,933],{"class":68,"line":69},[66,932,659],{"class":568},[66,934,572],{"class":571},[10,936,937,938,940,941,943,944,330],{},"在这两个系统中，只有 ",[63,939,659],{}," 命令而没有 ",[63,942,60],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[63,945,659],{},[296,947,949],{"id":948},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,951,952],{},"先使用模块方式检查：",[56,954,956],{"className":559,"code":955,"language":561,"meta":61,"style":61},"python3 -m pip --version\n",[63,957,958],{"__ignoreMap":61},[66,959,960,962,964,966],{"class":68,"line":69},[66,961,659],{"class":568},[66,963,601],{"class":571},[66,965,605],{"class":604},[66,967,572],{"class":571},[10,969,970,971,973,974,976,977,979,980,983],{},"Windows 用户将命令中的 ",[63,972,659],{}," 换成 ",[63,975,60],{}," 或 ",[63,978,476],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[63,981,982],{},"python3-pip","；不要直接使用其他系统的安装命令。",[180,985,986],{},"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":61,"searchDepth":75,"depth":75,"links":988},[989,990,991,996,1001,1006],{"id":216,"depth":75,"text":216},{"id":232,"depth":75,"text":232},{"id":293,"depth":75,"text":294,"children":992},[993,994,995],{"id":298,"depth":81,"text":299},{"id":359,"depth":81,"text":360},{"id":544,"depth":81,"text":545},{"id":641,"depth":75,"text":642,"children":997},[998,999,1000],{"id":645,"depth":81,"text":646},{"id":671,"depth":81,"text":672},{"id":697,"depth":81,"text":698},{"id":731,"depth":75,"text":732,"children":1002},[1003,1004,1005],{"id":738,"depth":81,"text":739},{"id":768,"depth":81,"text":769},{"id":860,"depth":81,"text":861},{"id":890,"depth":75,"text":890,"children":1007},[1008,1009,1010],{"id":893,"depth":81,"text":894},{"id":920,"depth":81,"text":921},{"id":948,"depth":81,"text":949},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":211,"description":61},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[193,1019,1020],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1023,"title":1024,"body":1025,"category":193,"cover":1032,"description":61,"extension":195,"meta":1348,"navigation":90,"path":1349,"pinned":198,"publishedAt":1350,"seo":1351,"slug":1352,"stem":1353,"summary":1354,"tags":1355,"updatedAt":1350,"visible":90,"__hash__":1358},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1026,"toc":1333},[1027,1033,1036,1039,1043,1046,1070,1073,1079,1082,1085,1119,1129,1133,1140,1143,1168,1171,1183,1186,1190,1193,1196,1199,1202,1205,1208,1211,1235,1238,1241,1247,1250,1253,1256,1260,1266,1269,1295,1298,1302,1305,1308,1312,1315,1318,1321,1324,1327,1330],[10,1028,1029],{},[26,1030],{"alt":1031,"src":1032},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1034,1035],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1037,1038],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1040,1042],{"id":1041},"python-代码是什么样的","Python 代码是什么样的",[10,1044,1045],{},"下面是一段简单的 Python 代码：",[56,1047,1049],{"className":58,"code":1048,"language":60,"meta":61,"style":61},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[63,1050,1051,1056,1061,1065],{"__ignoreMap":61},[66,1052,1053],{"class":68,"line":69},[66,1054,1055],{},"name = \"Python\"\n",[66,1057,1058],{"class":68,"line":75},[66,1059,1060],{},"year = 2026\n",[66,1062,1063],{"class":68,"line":81},[66,1064,91],{"emptyLinePlaceholder":90},[66,1066,1067],{"class":68,"line":87},[66,1068,1069],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1071,1072],{},"运行结果：",[56,1074,1077],{"className":1075,"code":1076,"language":118,"meta":61},[116],"正在学习 Python，当前年份是 2026\n",[63,1078,1076],{"__ignoreMap":61},[10,1080,1081],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1083,1084],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[56,1086,1088],{"className":58,"code":1087,"language":60,"meta":61,"style":61},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[63,1089,1090,1095,1099,1104,1109,1114],{"__ignoreMap":61},[66,1091,1092],{"class":68,"line":69},[66,1093,1094],{},"score = 85\n",[66,1096,1097],{"class":68,"line":75},[66,1098,91],{"emptyLinePlaceholder":90},[66,1100,1101],{"class":68,"line":81},[66,1102,1103],{},"if score >= 60:\n",[66,1105,1106],{"class":68,"line":87},[66,1107,1108],{},"    print(\"成绩合格\")\n",[66,1110,1111],{"class":68,"line":94},[66,1112,1113],{},"else:\n",[66,1115,1116],{"class":68,"line":100},[66,1117,1118],{},"    print(\"需要继续学习\")\n",[10,1120,1121,1124,1125,1128],{},[63,1122,1123],{},"if"," 和 ",[63,1126,1127],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1130,1132],{"id":1131},"python-如何运行代码","Python 如何运行代码",[10,1134,1135,1136,1139],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[63,1137,1138],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1141,1142],{},"交互式环境适合快速验证一个表达式：",[56,1144,1146],{"className":58,"code":1145,"language":60,"meta":61,"style":61},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[63,1147,1148,1153,1158,1163],{"__ignoreMap":61},[66,1149,1150],{"class":68,"line":69},[66,1151,1152],{},">>> 10 + 20\n",[66,1154,1155],{"class":68,"line":75},[66,1156,1157],{},"30\n",[66,1159,1160],{"class":68,"line":81},[66,1161,1162],{},">>> \"Python\".lower()\n",[66,1164,1165],{"class":68,"line":87},[66,1166,1167],{},"'python'\n",[10,1169,1170],{},"需要保存和重复运行的程序，则可以写入文件：",[56,1172,1174],{"className":559,"code":1173,"language":561,"meta":61,"style":61},"python3 hello.py\n",[63,1175,1176],{"__ignoreMap":61},[66,1177,1178,1180],{"class":68,"line":69},[66,1179,659],{"class":568},[66,1181,1182],{"class":604}," hello.py\n",[10,1184,1185],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1187,1189],{"id":1188},"python-的特点","Python 的特点",[296,1191,1192],{"id":1192},"语法相对简洁",[10,1194,1195],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[296,1197,1198],{"id":1198},"支持多种编程方式",[10,1200,1201],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[296,1203,1204],{"id":1204},"标准库比较完整",[10,1206,1207],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1209,1210],{},"例如，获取当前时间：",[56,1212,1214],{"className":58,"code":1213,"language":60,"meta":61,"style":61},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[63,1215,1216,1221,1225,1230],{"__ignoreMap":61},[66,1217,1218],{"class":68,"line":69},[66,1219,1220],{},"from datetime import datetime\n",[66,1222,1223],{"class":68,"line":75},[66,1224,91],{"emptyLinePlaceholder":90},[66,1226,1227],{"class":68,"line":81},[66,1228,1229],{},"now = datetime.now()\n",[66,1231,1232],{"class":68,"line":87},[66,1233,1234],{},"print(now)\n",[10,1236,1237],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[296,1239,1240],{"id":1240},"第三方工具丰富",[10,1242,1243,1244,1246],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[63,1245,228],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1248,1249],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[296,1251,1252],{"id":1252},"支持多个操作系统",[10,1254,1255],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1257,1259],{"id":1258},"python-可以做什么","Python 可以做什么",[10,1261,1262],{},[26,1263],{"alt":1264,"src":1265},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1267,1268],{},"Python 的应用范围比较广，常见方向包括：",[37,1270,1271,1274,1277,1280,1283,1286,1289,1292],{},[40,1272,1273],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1275,1276],{},"开发网站后端和 API 服务；",[40,1278,1279],{},"进行数据清洗、统计分析和图表展示；",[40,1281,1282],{},"编写网络爬虫和信息采集工具；",[40,1284,1285],{},"开发自动化测试程序；",[40,1287,1288],{},"进行机器学习和人工智能开发；",[40,1290,1291],{},"编写运维、监控和辅助开发工具；",[40,1293,1294],{},"开发部分桌面应用和插件。",[10,1296,1297],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1299,1301],{"id":1300},"python-的发展","Python 的发展",[10,1303,1304],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1306,1307],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1309,1311],{"id":1310},"python-也有局限","Python 也有局限",[10,1313,1314],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1316,1317],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1319,1320],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1322,1323],{"id":1323},"写在最后",[10,1325,1326],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1328,1329],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[180,1331,1332],{},"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":61,"searchDepth":75,"depth":75,"links":1334},[1335,1336,1337,1344,1345,1346,1347],{"id":1041,"depth":75,"text":1042},{"id":1131,"depth":75,"text":1132},{"id":1188,"depth":75,"text":1189,"children":1338},[1339,1340,1341,1342,1343],{"id":1192,"depth":81,"text":1192},{"id":1198,"depth":81,"text":1198},{"id":1204,"depth":81,"text":1204},{"id":1240,"depth":81,"text":1240},{"id":1252,"depth":81,"text":1252},{"id":1258,"depth":75,"text":1259},{"id":1300,"depth":75,"text":1301},{"id":1310,"depth":75,"text":1311},{"id":1323,"depth":75,"text":1323},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1024,"description":61},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[193,1356,1357],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1360,"title":1361,"body":1362,"category":193,"cover":194,"description":1366,"extension":195,"meta":1484,"navigation":90,"path":1485,"pinned":198,"publishedAt":199,"seo":1486,"slug":1487,"stem":1488,"summary":1489,"tags":1490,"updatedAt":199,"visible":90,"__hash__":1492},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1363,"toc":1474},[1364,1367,1369,1372,1374,1380,1385,1387,1401,1403,1405,1414,1416,1422,1424,1426,1442,1444,1455,1457,1465,1467,1469,1472],[10,1365,1366],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1368,16],{"id":16},[10,1370,1371],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1373,22],{"id":22},[10,1375,1376],{},[26,1377],{"alt":1378,"src":1379},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1381,1382,1384],{},[63,1383,1138],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1386,35],{"id":35},[37,1388,1389,1395,1398],{},[40,1390,1391,1392,1394],{},"源代码是人编写的文本，通常保存在 ",[63,1393,1138],{}," 文件中。",[40,1396,1397],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1399,1400],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1402,51],{"id":51},[10,1404,54],{},[56,1406,1408],{"className":58,"code":1407,"language":60,"meta":61,"style":61},"print(\"你好，Python\")\n",[63,1409,1410],{"__ignoreMap":61},[66,1411,1412],{"class":68,"line":69},[66,1413,1407],{},[10,1415,112],{},[56,1417,1420],{"className":1418,"code":1419,"language":118,"meta":61},[116],"你好，Python\n",[63,1421,1419],{"__ignoreMap":61},[10,1423,123],{},[14,1425,126],{"id":126},[128,1427,1428,1435],{},[40,1429,1430,1431,1434],{},"终端启动解释器后，解释器读取 ",[63,1432,1433],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1436,1437,1438,1441],{},"字符串对象先准备好，再交给 ",[63,1439,1440],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1443,146],{"id":146},[37,1445,1446,1449],{},[40,1447,1448],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1450,1451,1452,1454],{},"认为 ",[63,1453,1138],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1456,157],{"id":157},[128,1458,1459,1462],{},[40,1460,1461],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1463,1464],{},"把示例文字改成自己的学习目标并重新运行。",[10,1466,172],{},[14,1468,175],{"id":175},[10,1470,1471],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,1473,182],{},{"title":61,"searchDepth":75,"depth":75,"links":1475},[1476,1477,1478,1479,1480,1481,1482,1483],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1361,"description":1366},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[193,1356,1491],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1494,"title":1495,"body":1496,"category":193,"cover":194,"description":1500,"extension":195,"meta":1636,"navigation":90,"path":1637,"pinned":198,"publishedAt":199,"seo":1638,"slug":1639,"stem":1640,"summary":1641,"tags":1642,"updatedAt":199,"visible":90,"__hash__":1644},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1497,"toc":1626},[1498,1501,1503,1506,1508,1514,1520,1522,1537,1539,1542,1562,1564,1570,1572,1574,1587,1589,1603,1605,1616,1618,1620,1623],[10,1499,1500],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1502,16],{"id":16},[10,1504,1505],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1507,22],{"id":22},[10,1509,1510],{},[26,1511],{"alt":1512,"src":1513},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1515,1516,1517,1519],{},"终端收到 ",[63,1518,659],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1521,35],{"id":35},[37,1523,1524,1527,1530],{},[40,1525,1526],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1528,1529],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1531,1532,1533,1536],{},"检查 pip 时使用 ",[63,1534,1535],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1538,51],{"id":51},[10,1540,1541],{},"在 macOS 终端执行：",[56,1543,1544],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,1545,1546,1552],{"__ignoreMap":61},[66,1547,1548,1550],{"class":68,"line":69},[66,1549,659],{"class":568},[66,1551,572],{"class":571},[66,1553,1554,1556,1558,1560],{"class":68,"line":75},[66,1555,659],{"class":568},[66,1557,601],{"class":571},[66,1559,605],{"class":604},[66,1561,572],{"class":571},[10,1563,112],{},[56,1565,1568],{"className":1566,"code":1567,"language":118,"meta":61},[116],"Python 3.14.x\npip 版本信息与安装路径\n",[63,1569,1567],{"__ignoreMap":61},[10,1571,123],{},[14,1573,126],{"id":126},[128,1575,1576,1582],{},[40,1577,1578,1581],{},[63,1579,1580],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1583,1584,1586],{},[63,1585,667],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1588,146],{"id":146},[37,1590,1591,1597],{},[40,1592,1593,1594,1596],{},"看到系统已有 ",[63,1595,659],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1598,1599,1600,1602],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[63,1601,659],{},"，不修改系统自带工具。",[14,1604,157],{"id":157},[128,1606,1607,1613],{},[40,1608,132,1609,1612],{},[63,1610,1611],{},"which python3","，记录当前解释器路径。",[40,1614,1615],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1617,172],{},[14,1619,175],{"id":175},[10,1621,1622],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,1624,1625],{},"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":61,"searchDepth":75,"depth":75,"links":1627},[1628,1629,1630,1631,1632,1633,1634,1635],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1495,"description":1500},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[193,1643,1019],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1646,"title":1647,"body":1648,"category":193,"cover":194,"description":1813,"extension":195,"meta":1814,"navigation":90,"path":1815,"pinned":198,"publishedAt":199,"seo":1816,"slug":1817,"stem":1818,"summary":1819,"tags":1820,"updatedAt":199,"visible":90,"__hash__":1823},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1649,"toc":1803},[1650,1656,1658,1661,1663,1669,1672,1674,1698,1700,1702,1729,1731,1737,1739,1741,1759,1761,1775,1777,1791,1793,1795,1801],[10,1651,1652,1653,1655],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[63,1654,1138],{}," 脚本。",[14,1657,16],{"id":16},[10,1659,1660],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1662,22],{"id":22},[10,1664,1665],{},[26,1666],{"alt":1667,"src":1668},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1670,1671],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1673,35],{"id":35},[37,1675,1676,1685,1692],{},[40,1677,1678,1679,1681,1682,330],{},"在终端输入 ",[63,1680,659],{}," 进入 REPL，提示符通常是 ",[63,1683,1684],{},">>>",[40,1686,1687,1688,1691],{},"输入 ",[63,1689,1690],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1693,1694,1695,1697],{},"需要保存、复查或多次运行的代码应写入 ",[63,1696,1138],{}," 文件。",[14,1699,51],{"id":51},[10,1701,54],{},[56,1703,1707],{"className":1704,"code":1705,"language":1706,"meta":61,"style":61},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[63,1708,1709,1714,1719,1724],{"__ignoreMap":61},[66,1710,1711],{"class":68,"line":69},[66,1712,1713],{},">>> 2 + 3\n",[66,1715,1716],{"class":68,"line":75},[66,1717,1718],{},"5\n",[66,1720,1721],{"class":68,"line":81},[66,1722,1723],{},">>> \"python\".upper()\n",[66,1725,1726],{"class":68,"line":87},[66,1727,1728],{},"'PYTHON'\n",[10,1730,112],{},[56,1732,1735],{"className":1733,"code":1734,"language":118,"meta":61},[116],"REPL 会直接显示表达式结果\n",[63,1736,1734],{"__ignoreMap":61},[10,1738,123],{},[14,1740,126],{"id":126},[128,1742,1743,1753],{},[40,1744,1745,1746,1749,1750,330],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[63,1747,1748],{},"2 + 3"," 能直接看到 ",[63,1751,1752],{},"5",[40,1754,1755,1756,1758],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[63,1757,1440],{}," 才会写到标准输出。",[14,1760,146],{"id":146},[37,1762,1763,1772],{},[40,1764,1765,1766,1768,1769,1771],{},"把提示符 ",[63,1767,1684],{}," 复制进 ",[63,1770,1138],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1773,1774],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1776,157],{"id":157},[128,1778,1779,1785],{},[40,1780,1781,1782,330],{},"在 REPL 计算 ",[63,1783,1784],{},"12 * 8",[40,1786,1787,1788,1790],{},"把同一表达式写入脚本；观察脚本中不调用 ",[63,1789,1440],{}," 时是否显示结果。",[10,1792,172],{},[14,1794,175],{"id":175},[10,1796,1797,1798,1800],{},"本篇目标是根据任务选择 REPL 或 ",[63,1799,1138],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,1802,182],{},{"title":61,"searchDepth":75,"depth":75,"links":1804},[1805,1806,1807,1808,1809,1810,1811,1812],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1647,"description":1813},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[193,1821,1822],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1825,"title":1826,"body":1827,"category":193,"cover":194,"description":1831,"extension":195,"meta":2002,"navigation":90,"path":2003,"pinned":198,"publishedAt":199,"seo":2004,"slug":2005,"stem":2006,"summary":2007,"tags":2008,"updatedAt":199,"visible":90,"__hash__":2011},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1828,"toc":1992},[1829,1832,1834,1837,1839,1845,1851,1853,1871,1873,1875,1920,1922,1928,1930,1932,1954,1956,1968,1970,1982,1984,1986,1989],[10,1830,1831],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1833,16],{"id":16},[10,1835,1836],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1838,22],{"id":22},[10,1840,1841],{},[26,1842],{"alt":1843,"src":1844},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1846,1847,1850],{},[63,1848,1849],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1852,35],{"id":35},[37,1854,1855,1858,1868],{},[40,1856,1857],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1859,1860,1863,1864,1867],{},[63,1861,1862],{},"pwd"," 显示当前目录，",[63,1865,1866],{},"ls"," 显示目录里的文件。",[40,1869,1870],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1872,51],{"id":51},[10,1874,1541],{},[56,1876,1878],{"className":559,"code":1877,"language":561,"meta":61,"style":61},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[63,1879,1880,1888,1895,1900,1914],{"__ignoreMap":61},[66,1881,1882,1885],{"class":68,"line":69},[66,1883,1884],{"class":568},"mkdir",[66,1886,1887],{"class":604}," python-study\n",[66,1889,1890,1893],{"class":68,"line":75},[66,1891,1892],{"class":571},"cd",[66,1894,1887],{"class":604},[66,1896,1897],{"class":68,"line":81},[66,1898,1899],{"class":571},"pwd\n",[66,1901,1902,1905,1908,1912],{"class":68,"line":87},[66,1903,1904],{"class":571},"printf",[66,1906,1907],{"class":604}," 'print(\"项目已经运行\")\\n'",[66,1909,1911],{"class":1910},"snl16"," >",[66,1913,1182],{"class":604},[66,1915,1916,1918],{"class":68,"line":94},[66,1917,659],{"class":568},[66,1919,1182],{"class":604},[10,1921,112],{},[56,1923,1926],{"className":1924,"code":1925,"language":118,"meta":61},[116],"项目已经运行\n",[63,1927,1925],{"__ignoreMap":61},[10,1929,123],{},[14,1931,126],{"id":126},[128,1933,1934,1945],{},[40,1935,1936,1938,1939,1941,1942,1944],{},[63,1937,1884],{}," 创建目录，",[63,1940,1892],{}," 改变终端当前目录，",[63,1943,1862],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1946,1947,1949,1950,1953],{},[63,1948,1849],{}," 会在当前目录寻找 ",[63,1951,1952],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1955,146],{"id":146},[37,1957,1958,1965],{},[40,1959,1960,1961,1124,1963,330],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[63,1962,1862],{},[63,1964,1866],{},[40,1966,1967],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1969,157],{"id":157},[128,1971,1972,1979],{},[40,1973,1974,1975,1978],{},"新建 ",[63,1976,1977],{},"lesson01.py"," 并输出课程编号。",[40,1980,1981],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1983,172],{},[14,1985,175],{"id":175},[10,1987,1988],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,1990,1991],{},"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":61,"searchDepth":75,"depth":75,"links":1993},[1994,1995,1996,1997,1998,1999,2000,2001],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1826,"description":1831},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[193,2009,2010],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2013,"title":2014,"body":2015,"category":193,"cover":194,"description":2019,"extension":195,"meta":2167,"navigation":90,"path":2168,"pinned":198,"publishedAt":199,"seo":2169,"slug":2170,"stem":2171,"summary":2172,"tags":2173,"updatedAt":199,"visible":90,"__hash__":2176},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2016,"toc":2157},[2017,2020,2022,2025,2027,2033,2044,2046,2066,2068,2070,2090,2092,2098,2100,2102,2121,2123,2131,2133,2148,2150,2152,2155],[10,2018,2019],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2021,16],{"id":16},[10,2023,2024],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2026,22],{"id":22},[10,2028,2029],{},[26,2030],{"alt":2031,"src":2032},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2034,2035,2036,330,2038,2041,2042,330],{},"Python 先计算表达式，再把得到的对象交给 ",[63,2037,1440],{},[63,2039,2040],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[63,2043,1748],{},[14,2045,35],{"id":35},[37,2047,2048,2054,2063],{},[40,2049,2050,2053],{},[63,2051,2052],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2055,2056,2059,2060,330],{},[63,2057,2058],{},"7 + 5"," 是表达式，运行时先求值得到 ",[63,2061,2062],{},"12",[40,2064,2065],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2067,51],{"id":51},[10,2069,54],{},[56,2071,2073],{"className":58,"code":2072,"language":60,"meta":61,"style":61},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[63,2074,2075,2080,2085],{"__ignoreMap":61},[66,2076,2077],{"class":68,"line":69},[66,2078,2079],{},"print(42)\n",[66,2081,2082],{"class":68,"line":75},[66,2083,2084],{},"print(7 + 5)\n",[66,2086,2087],{"class":68,"line":81},[66,2088,2089],{},"print(\"Python 基础课\")\n",[10,2091,112],{},[56,2093,2096],{"className":2094,"code":2095,"language":118,"meta":61},[116],"42\n12\nPython 基础课\n",[63,2097,2095],{"__ignoreMap":61},[10,2099,123],{},[14,2101,126],{"id":126},[128,2103,2104,2112],{},[40,2105,2106,2109,2110,330],{},[63,2107,2108],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[63,2111,2062],{},[40,2113,2114,2116,2117,2120],{},[63,2115,1440],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[63,2118,2119],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2122,146],{"id":146},[37,2124,2125,2128],{},[40,2126,2127],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2129,2130],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2132,157],{"id":157},[128,2134,2135,2138],{},[40,2136,2137],{},"分别输出一个整数、一个小数和一段文本。",[40,2139,2140,2141,2143,2144,2147],{},"比较 ",[63,2142,2040],{}," 与 ",[63,2145,2146],{},"print(\"2 + 3\")"," 的结果。",[10,2149,172],{},[14,2151,175],{"id":175},[10,2153,2154],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,2156,182],{},{"title":61,"searchDepth":75,"depth":75,"links":2158},[2159,2160,2161,2162,2163,2164,2165,2166],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2014,"description":2019},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[193,2174,2175],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2178,"title":2179,"body":2180,"category":193,"cover":194,"description":2184,"extension":195,"meta":2351,"navigation":90,"path":2352,"pinned":198,"publishedAt":199,"seo":2353,"slug":2354,"stem":2355,"summary":2356,"tags":2357,"updatedAt":199,"visible":90,"__hash__":2360},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2181,"toc":2341},[2182,2185,2187,2190,2192,2198,2201,2203,2229,2231,2233,2261,2263,2269,2271,2273,2297,2299,2315,2317,2332,2334,2336,2339],[10,2183,2184],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2186,16],{"id":16},[10,2188,2189],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2191,22],{"id":22},[10,2193,2194],{},[26,2195],{"alt":2196,"src":2197},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2199,2200],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2202,35],{"id":35},[37,2204,2205,2208,2218],{},[40,2206,2207],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2209,2210,2211,2143,2214,2217],{},"变量名区分大小写，",[63,2212,2213],{},"score",[63,2215,2216],{},"Score"," 是两个名字。",[40,2219,2220,2221,2224,2225,2228],{},"使用能表达含义的名称；不要用 ",[63,2222,2223],{},"list","、",[63,2226,2227],{},"str"," 等内置名称作为普通变量名。",[14,2230,51],{"id":51},[10,2232,54],{},[56,2234,2236],{"className":58,"code":2235,"language":60,"meta":61,"style":61},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[63,2237,2238,2243,2248,2252,2257],{"__ignoreMap":61},[66,2239,2240],{"class":68,"line":69},[66,2241,2242],{},"score = 90\n",[66,2244,2245],{"class":68,"line":75},[66,2246,2247],{},"print(score)\n",[66,2249,2250],{"class":68,"line":81},[66,2251,91],{"emptyLinePlaceholder":90},[66,2253,2254],{"class":68,"line":87},[66,2255,2256],{},"score = 95\n",[66,2258,2259],{"class":68,"line":94},[66,2260,2247],{},[10,2262,112],{},[56,2264,2267],{"className":2265,"code":2266,"language":118,"meta":61},[116],"90\n95\n",[63,2268,2266],{"__ignoreMap":61},[10,2270,123],{},[14,2272,126],{"id":126},[128,2274,2275,2284],{},[40,2276,132,2277,2280,2281,2283],{},[63,2278,2279],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[63,2282,2213],{}," 再绑定到它。",[40,2285,132,2286,2289,2290,2293,2294,330],{},[63,2287,2288],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[63,2291,2292],{},"90"," 没有被改造成 ",[63,2295,2296],{},"95",[14,2298,146],{"id":146},[37,2300,2301,2304],{},[40,2302,2303],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2305,2306,2307,2224,2309,2224,2311,2314],{},"使用 ",[63,2308,2223],{},[63,2310,2227],{},[63,2312,2313],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2316,157],{"id":157},[128,2318,2319,2329],{},[40,2320,2321,2322,1124,2325,2328],{},"创建 ",[63,2323,2324],{},"course_name",[63,2326,2327],{},"lesson_count"," 两个变量并输出。",[40,2330,2331],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2333,172],{},[14,2335,175],{"id":175},[10,2337,2338],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,2340,182],{},{"title":61,"searchDepth":75,"depth":75,"links":2342},[2343,2344,2345,2346,2347,2348,2349,2350],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2179,"description":2184},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[193,2358,2359],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2362,"title":2363,"body":2364,"category":193,"cover":194,"description":2368,"extension":195,"meta":2533,"navigation":90,"path":2534,"pinned":198,"publishedAt":199,"seo":2535,"slug":2536,"stem":2537,"summary":2538,"tags":2539,"updatedAt":199,"visible":90,"__hash__":2542},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2365,"toc":2523},[2366,2369,2371,2374,2376,2382,2385,2387,2416,2418,2420,2465,2467,2473,2475,2477,2491,2493,2504,2506,2514,2516,2518,2521],[10,2367,2368],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2370,16],{"id":16},[10,2372,2373],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2375,22],{"id":22},[10,2377,2378],{},[26,2379],{"alt":2380,"src":2381},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2383,2384],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2386,35],{"id":35},[37,2388,2389,2399,2413],{},[40,2390,2391,2394,2395,2398],{},[63,2392,2393],{},"int"," 表示整数，",[63,2396,2397],{},"float"," 表示浮点数。",[40,2400,2401,2404,2405,2408,2409,2412],{},[63,2402,2403],{},"\u002F"," 总是进行真除法；",[63,2406,2407],{},"\u002F\u002F"," 是向下取整除法，",[63,2410,2411],{},"%"," 得到余数。",[40,2414,2415],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2417,51],{"id":51},[10,2419,54],{},[56,2421,2423],{"className":58,"code":2422,"language":60,"meta":61,"style":61},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[63,2424,2425,2430,2435,2440,2444,2449,2454,2459],{"__ignoreMap":61},[66,2426,2427],{"class":68,"line":69},[66,2428,2429],{},"price = 25\n",[66,2431,2432],{"class":68,"line":75},[66,2433,2434],{},"count = 4\n",[66,2436,2437],{"class":68,"line":81},[66,2438,2439],{},"discount = 0.9\n",[66,2441,2442],{"class":68,"line":87},[66,2443,91],{"emptyLinePlaceholder":90},[66,2445,2446],{"class":68,"line":94},[66,2447,2448],{},"total = price * count * discount\n",[66,2450,2451],{"class":68,"line":100},[66,2452,2453],{},"average = total \u002F count\n",[66,2455,2456],{"class":68,"line":106},[66,2457,2458],{},"print(total)\n",[66,2460,2462],{"class":68,"line":2461},8,[66,2463,2464],{},"print(average)\n",[10,2466,112],{},[56,2468,2471],{"className":2469,"code":2470,"language":118,"meta":61},[116],"90.0\n22.5\n",[63,2472,2470],{"__ignoreMap":61},[10,2474,123],{},[14,2476,126],{"id":126},[128,2478,2479,2485],{},[40,2480,2481,2484],{},[63,2482,2483],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2486,2487,2490],{},[63,2488,2489],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2492,146],{"id":146},[37,2494,2495,2501],{},[40,2496,2497,2498,330],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[63,2499,2500],{},"decimal.Decimal",[40,2502,2503],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2505,157],{"id":157},[128,2507,2508,2511],{},[40,2509,2510],{},"计算 137 除以 10 的商和余数。",[40,2512,2513],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2515,172],{},[14,2517,175],{"id":175},[10,2519,2520],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,2522,182],{},{"title":61,"searchDepth":75,"depth":75,"links":2524},[2525,2526,2527,2528,2529,2530,2531,2532],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2363,"description":2368},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[193,2540,2541],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2544,"title":2545,"body":2546,"category":193,"cover":194,"description":2550,"extension":195,"meta":2726,"navigation":90,"path":2727,"pinned":198,"publishedAt":199,"seo":2728,"slug":2729,"stem":2730,"summary":2731,"tags":2732,"updatedAt":199,"visible":90,"__hash__":2735},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2547,"toc":2714},[2548,2551,2553,2556,2558,2564,2574,2576,2587,2589,2591,2621,2623,2629,2631,2633,2663,2666,2669,2675,2678,2680,2688,2690,2705,2707,2709,2712],[10,2549,2550],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2552,16],{"id":16},[10,2554,2555],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2557,22],{"id":22},[10,2559,2560],{},[26,2561],{"alt":2562,"src":2563},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2565,2566,2567,2570,2571,330],{},"切片 ",[63,2568,2569],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[63,2572,2573],{},"stop - start",[14,2575,35],{"id":35},[37,2577,2578,2581,2584],{},[40,2579,2580],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2582,2583],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2585,2586],{},"切片会创建新的字符串，不会修改原字符串。",[14,2588,51],{"id":51},[10,2590,54],{},[56,2592,2594],{"className":58,"code":2593,"language":60,"meta":61,"style":61},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[63,2595,2596,2601,2606,2611,2616],{"__ignoreMap":61},[66,2597,2598],{"class":68,"line":69},[66,2599,2600],{},"language = \"Python\"\n",[66,2602,2603],{"class":68,"line":75},[66,2604,2605],{},"print(language[0])\n",[66,2607,2608],{"class":68,"line":81},[66,2609,2610],{},"print(language[-1])\n",[66,2612,2613],{"class":68,"line":87},[66,2614,2615],{},"print(language[0:3])\n",[66,2617,2618],{"class":68,"line":94},[66,2619,2620],{},"print(language + \" 3.14\")\n",[10,2622,112],{},[56,2624,2627],{"className":2625,"code":2626,"language":118,"meta":61},[116],"P\nn\nPyt\nPython 3.14\n",[63,2628,2626],{"__ignoreMap":61},[10,2630,123],{},[14,2632,126],{"id":126},[128,2634,2635,2649],{},[40,2636,2637,2638,2640,2641,2644,2645,2648],{},"字符串 ",[63,2639,193],{}," 的正索引从 ",[63,2642,2643],{},"P"," 的 0 开始，负索引从末尾 ",[63,2646,2647],{},"n"," 的 -1 开始。",[40,2650,2651,2654,2655,2658,2659,2662],{},[63,2652,2653],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[63,2656,2657],{},"Pyt","；索引 3 的 ",[63,2660,2661],{},"h"," 不在结果中。",[296,2664,2665],{"id":2665},"再看一个具体细节",[10,2667,2668],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2670,2671],{},[26,2672],{"alt":2673,"src":2674},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2676,2677],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2679,146],{"id":146},[37,2681,2682,2685],{},[40,2683,2684],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2686,2687],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2689,157],{"id":157},[128,2691,2692,2702],{},[40,2693,2694,2695,2698,2699,330],{},"从 ",[63,2696,2697],{},"\"programming\""," 中切出 ",[63,2700,2701],{},"\"gram\"",[40,2703,2704],{},"使用负索引取得字符串倒数第二个字符。",[10,2706,172],{},[14,2708,175],{"id":175},[10,2710,2711],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,2713,182],{},{"title":61,"searchDepth":75,"depth":75,"links":2715},[2716,2717,2718,2719,2720,2723,2724,2725],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":2721},[2722],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2545,"description":2550},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[193,2733,2734],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2737,"title":2738,"body":2739,"category":193,"cover":194,"description":2743,"extension":195,"meta":2957,"navigation":90,"path":2958,"pinned":198,"publishedAt":199,"seo":2959,"slug":2960,"stem":2961,"summary":2962,"tags":2963,"updatedAt":199,"visible":90,"__hash__":2966},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2740,"toc":2945},[2741,2744,2746,2749,2751,2757,2767,2769,2802,2804,2806,2850,2852,2858,2860,2862,2883,2885,2888,2894,2902,2904,2918,2920,2936,2938,2940,2943],[10,2742,2743],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2745,16],{"id":16},[10,2747,2748],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2750,22],{"id":22},[10,2752,2753],{},[26,2754],{"alt":2755,"src":2756},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2758,2759,2760,976,2763,2766],{},"比较表达式先产生 ",[63,2761,2762],{},"True",[63,2764,2765],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2768,35],{"id":35},[37,2770,2771,2785,2799],{},[40,2772,2773,2776,2777,2780,2781,2784],{},[63,2774,2775],{},"=="," 判断是否相等，",[63,2778,2779],{},"!="," 判断是否不等；单个 ",[63,2782,2783],{},"="," 是赋值。",[40,2786,2787,2790,2791,2794,2795,2798],{},[63,2788,2789],{},"and"," 要求两侧都为真，",[63,2792,2793],{},"or"," 只需一侧为真，",[63,2796,2797],{},"not"," 取反。",[40,2800,2801],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2803,51],{"id":51},[10,2805,54],{},[56,2807,2809],{"className":58,"code":2808,"language":60,"meta":61,"style":61},"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",[63,2810,2811,2816,2821,2825,2830,2835,2840,2845],{"__ignoreMap":61},[66,2812,2813],{"class":68,"line":69},[66,2814,2815],{},"age = 20\n",[66,2817,2818],{"class":68,"line":75},[66,2819,2820],{},"has_ticket = True\n",[66,2822,2823],{"class":68,"line":81},[66,2824,91],{"emptyLinePlaceholder":90},[66,2826,2827],{"class":68,"line":87},[66,2828,2829],{},"is_adult = age >= 18\n",[66,2831,2832],{"class":68,"line":94},[66,2833,2834],{},"can_enter = is_adult and has_ticket\n",[66,2836,2837],{"class":68,"line":100},[66,2838,2839],{},"print(is_adult)\n",[66,2841,2842],{"class":68,"line":106},[66,2843,2844],{},"print(can_enter)\n",[66,2846,2847],{"class":68,"line":2461},[66,2848,2849],{},"print(not has_ticket)\n",[10,2851,112],{},[56,2853,2856],{"className":2854,"code":2855,"language":118,"meta":61},[116],"True\nTrue\nFalse\n",[63,2857,2855],{"__ignoreMap":61},[10,2859,123],{},[14,2861,126],{"id":126},[128,2863,2864,2874],{},[40,2865,2866,2869,2870,2873],{},[63,2867,2868],{},"age >= 18"," 先产生布尔值并绑定给 ",[63,2871,2872],{},"is_adult","，这一步没有任何分支跳转。",[40,2875,2876,2879,2880,2882],{},[63,2877,2878],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[63,2881,2797],{}," 只对紧随其后的值取反。",[296,2884,2665],{"id":2665},[10,2886,2887],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2889,2890],{},[26,2891],{"alt":2892,"src":2893},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2895,2896,2898,2899,2901],{},[63,2897,2789],{}," 只有“真、真”得到真；",[63,2900,2793],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2903,146],{"id":146},[37,2905,2906,2915],{},[40,2907,2908,2909,2911,2912,2914],{},"用单个等号判断相等。",[63,2910,2783],{}," 是赋值，",[63,2913,2775],{}," 才是相等比较。",[40,2916,2917],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2919,157],{"id":157},[128,2921,2922,2929],{},[40,2923,2924,2925,2928],{},"判断数字 ",[63,2926,2927],{},"15"," 是否同时大于 10 且小于 20。",[40,2930,2931,2932,2935],{},"分别修改年龄和票据状态，记录 ",[63,2933,2934],{},"can_enter"," 的四种组合结果。",[10,2937,172],{},[14,2939,175],{"id":175},[10,2941,2942],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,2944,182],{},{"title":61,"searchDepth":75,"depth":75,"links":2946},[2947,2948,2949,2950,2951,2954,2955,2956],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":2952},[2953],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2738,"description":2743},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[193,2964,2965],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2968,"title":2969,"body":2970,"category":193,"cover":194,"description":2974,"extension":195,"meta":3142,"navigation":90,"path":3143,"pinned":198,"publishedAt":199,"seo":3144,"slug":3145,"stem":3146,"summary":3147,"tags":3148,"updatedAt":199,"visible":90,"__hash__":3150},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2971,"toc":3132},[2972,2975,2977,2980,2982,2988,3006,3008,3021,3023,3025,3059,3061,3067,3069,3071,3093,3095,3107,3109,3123,3125,3127,3130],[10,2973,2974],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2976,16],{"id":16},[10,2978,2979],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2981,22],{"id":22},[10,2983,2984],{},[26,2985],{"alt":2986,"src":2987},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2989,2990,2993,2994,2997,2998,3001,3002,3005],{},[63,2991,2992],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[63,2995,2996],{},"18","，程序首先得到的也是 ",[63,2999,3000],{},"\"18\"","，需要 ",[63,3003,3004],{},"int()"," 后才能按整数参与计算。",[14,3007,35],{"id":35},[37,3009,3010,3013,3018],{},[40,3011,3012],{},"提示文字应告诉用户需要输入什么。",[40,3014,3015,3017],{},[63,3016,3004],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3019,3020],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3022,51],{"id":51},[10,3024,54],{},[56,3026,3028],{"className":58,"code":3027,"language":60,"meta":61,"style":61},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[63,3029,3030,3035,3040,3045,3049,3054],{"__ignoreMap":61},[66,3031,3032],{"class":68,"line":69},[66,3033,3034],{},"name = input(\"请输入姓名：\")\n",[66,3036,3037],{"class":68,"line":75},[66,3038,3039],{},"age_text = input(\"请输入年龄：\")\n",[66,3041,3042],{"class":68,"line":81},[66,3043,3044],{},"age = int(age_text)\n",[66,3046,3047],{"class":68,"line":87},[66,3048,91],{"emptyLinePlaceholder":90},[66,3050,3051],{"class":68,"line":94},[66,3052,3053],{},"print(\"你好，\" + name)\n",[66,3055,3056],{"class":68,"line":100},[66,3057,3058],{},"print(age + 1)\n",[10,3060,112],{},[56,3062,3065],{"className":3063,"code":3064,"language":118,"meta":61},[116],"根据输入显示姓名，并输出下一年的年龄\n",[63,3066,3064],{"__ignoreMap":61},[10,3068,123],{},[14,3070,126],{"id":126},[128,3072,3073,3083],{},[40,3074,3075,3076,3078,3079,3082],{},"两次 ",[63,3077,2992],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[63,3080,3081],{},"age_text"," 用来提醒这仍是文本。",[40,3084,3085,3088,3089,3092],{},[63,3086,3087],{},"int(age_text)"," 创建整数对象，后面的 ",[63,3090,3091],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3094,146],{"id":146},[37,3096,3097,3104],{},[40,3098,3099,3100,3103],{},"直接计算 ",[63,3101,3102],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3105,3106],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3108,157],{"id":157},[128,3110,3111,3114],{},[40,3112,3113],{},"接收两个整数并输出它们的和。",[40,3115,1687,3116,3119,3120,3122],{},[63,3117,3118],{},"18.5"," 给 ",[63,3121,3004],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3124,172],{},[14,3126,175],{"id":175},[10,3128,3129],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,3131,182],{},{"title":61,"searchDepth":75,"depth":75,"links":3133},[3134,3135,3136,3137,3138,3139,3140,3141],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2969,"description":2974},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[193,2313,3149],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3152,"title":3153,"body":3154,"category":193,"cover":194,"description":3158,"extension":195,"meta":3318,"navigation":90,"path":3319,"pinned":198,"publishedAt":199,"seo":3320,"slug":3321,"stem":3322,"summary":3323,"tags":3324,"updatedAt":199,"visible":90,"__hash__":3327},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3155,"toc":3308},[3156,3159,3161,3164,3166,3172,3179,3181,3195,3197,3199,3238,3240,3246,3248,3250,3269,3271,3286,3288,3299,3301,3303,3306],[10,3157,3158],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3160,16],{"id":16},[10,3162,3163],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3165,22],{"id":22},[10,3167,3168],{},[26,3169],{"alt":3170,"src":3171},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3173,3174,3175,3178],{},"列表为元素维护从 0 开始的位置索引。修改 ",[63,3176,3177],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3180,35],{"id":35},[37,3182,3183,3186,3189],{},[40,3184,3185],{},"列表使用方括号，元素之间用逗号分隔。",[40,3187,3188],{},"列表可变，可以替换、追加和删除元素。",[40,3190,3191,3192,330],{},"访问不存在的索引会产生 ",[63,3193,3194],{},"IndexError",[14,3196,51],{"id":51},[10,3198,54],{},[56,3200,3202],{"className":58,"code":3201,"language":60,"meta":61,"style":61},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[63,3203,3204,3209,3214,3218,3223,3228,3233],{"__ignoreMap":61},[66,3205,3206],{"class":68,"line":69},[66,3207,3208],{},"scores = [82, 90, 76]\n",[66,3210,3211],{"class":68,"line":75},[66,3212,3213],{},"print(scores[0])\n",[66,3215,3216],{"class":68,"line":81},[66,3217,91],{"emptyLinePlaceholder":90},[66,3219,3220],{"class":68,"line":87},[66,3221,3222],{},"scores[1] = 95\n",[66,3224,3225],{"class":68,"line":94},[66,3226,3227],{},"scores.append(88)\n",[66,3229,3230],{"class":68,"line":100},[66,3231,3232],{},"print(scores)\n",[66,3234,3235],{"class":68,"line":106},[66,3236,3237],{},"print(len(scores))\n",[10,3239,112],{},[56,3241,3244],{"className":3242,"code":3243,"language":118,"meta":61},[116],"82\n[82, 95, 76, 88]\n4\n",[63,3245,3243],{"__ignoreMap":61},[10,3247,123],{},[14,3249,126],{"id":126},[128,3251,3252,3255],{},[40,3253,3254],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3256,3257,3260,3261,3264,3265,3268],{},[63,3258,3259],{},"scores[1] = 95"," 替换第二个位置，",[63,3262,3263],{},"append(88)"," 在末尾增加新位置，",[63,3266,3267],{},"len()"," 因而从 3 变为 4。",[14,3270,146],{"id":146},[37,3272,3273,3283],{},[40,3274,3275,3276,3279,3280,330],{},"访问 ",[63,3277,3278],{},"scores[len(scores)]","。最后一个合法正索引是 ",[63,3281,3282],{},"len(scores) - 1",[40,3284,3285],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3287,157],{"id":157},[128,3289,3290,3293],{},[40,3291,3292],{},"建立三项学习任务列表，再追加第四项。",[40,3294,3295,3296,3298],{},"修改第二项，并用 ",[63,3297,3267],{}," 检查元素数量。",[10,3300,172],{},[14,3302,175],{"id":175},[10,3304,3305],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,3307,182],{},{"title":61,"searchDepth":75,"depth":75,"links":3309},[3310,3311,3312,3313,3314,3315,3316,3317],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3153,"description":3158},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[193,3325,3326],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3329,"title":3330,"body":3331,"category":193,"cover":194,"description":3335,"extension":195,"meta":3476,"navigation":90,"path":3477,"pinned":198,"publishedAt":199,"seo":3478,"slug":3479,"stem":3480,"summary":3481,"tags":3482,"updatedAt":199,"visible":90,"__hash__":3484},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3332,"toc":3466},[3333,3336,3338,3341,3343,3349,3352,3354,3365,3367,3369,3403,3405,3411,3413,3415,3429,3431,3443,3445,3457,3459,3461,3464],[10,3334,3335],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3337,16],{"id":16},[10,3339,3340],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3342,22],{"id":22},[10,3344,3345],{},[26,3346],{"alt":3347,"src":3348},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3350,3351],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3353,35],{"id":35},[37,3355,3356,3359,3362],{},[40,3357,3358],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3360,3361],{},"只有一个元素的元组必须保留尾随逗号。",[40,3363,3364],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3366,51],{"id":51},[10,3368,54],{},[56,3370,3372],{"className":58,"code":3371,"language":60,"meta":61,"style":61},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[63,3373,3374,3379,3384,3389,3393,3398],{"__ignoreMap":61},[66,3375,3376],{"class":68,"line":69},[66,3377,3378],{},"point = (120, 80)\n",[66,3380,3381],{"class":68,"line":75},[66,3382,3383],{},"print(point[0])\n",[66,3385,3386],{"class":68,"line":81},[66,3387,3388],{},"print(point[1])\n",[66,3390,3391],{"class":68,"line":87},[66,3392,91],{"emptyLinePlaceholder":90},[66,3394,3395],{"class":68,"line":94},[66,3396,3397],{},"single = (5,)\n",[66,3399,3400],{"class":68,"line":100},[66,3401,3402],{},"print(single)\n",[10,3404,112],{},[56,3406,3409],{"className":3407,"code":3408,"language":118,"meta":61},[116],"120\n80\n(5,)\n",[63,3410,3408],{"__ignoreMap":61},[10,3412,123],{},[14,3414,126],{"id":126},[128,3416,3417,3423],{},[40,3418,3419,3422],{},[63,3420,3421],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3424,3425,3428],{},[63,3426,3427],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3430,146],{"id":146},[37,3432,3433,3440],{},[40,3434,3435,3436,3439],{},"把 ",[63,3437,3438],{},"(5)"," 当作元组，实际它仍是整数。",[40,3441,3442],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3444,157],{"id":157},[128,3446,3447,3450],{},[40,3448,3449],{},"用元组表示宽度和高度。",[40,3451,2140,3452,2143,3454,3456],{},[63,3453,3438],{},[63,3455,3427],{}," 的类型。",[10,3458,172],{},[14,3460,175],{"id":175},[10,3462,3463],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,3465,182],{},{"title":61,"searchDepth":75,"depth":75,"links":3467},[3468,3469,3470,3471,3472,3473,3474,3475],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3330,"description":3335},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[193,3483,3326],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3486,"title":3487,"body":3488,"category":193,"cover":194,"description":3492,"extension":195,"meta":3647,"navigation":90,"path":3648,"pinned":198,"publishedAt":199,"seo":3649,"slug":3650,"stem":3651,"summary":3652,"tags":3653,"updatedAt":199,"visible":90,"__hash__":3655},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3489,"toc":3637},[3490,3493,3495,3498,3500,3506,3516,3518,3532,3534,3536,3570,3572,3578,3580,3582,3597,3599,3618,3620,3628,3630,3632,3635],[10,3491,3492],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3494,16],{"id":16},[10,3496,3497],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3499,22],{"id":22},[10,3501,3502],{},[26,3503],{"alt":3504,"src":3505},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3507,3508,3509,3512,3513,3515],{},"字典通过键定位值，不使用连续位置表达含义。",[63,3510,3511],{},"student[\"score\"]"," 读取的是键 ",[63,3514,2213],{}," 对应的值，而不是“第几个元素”。",[14,3517,35],{"id":35},[37,3519,3520,3523,3529],{},[40,3521,3522],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3524,2306,3525,3528],{},[63,3526,3527],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3530,3531],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3533,51],{"id":51},[10,3535,54],{},[56,3537,3539],{"className":58,"code":3538,"language":60,"meta":61,"style":61},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[63,3540,3541,3546,3551,3555,3560,3565],{"__ignoreMap":61},[66,3542,3543],{"class":68,"line":69},[66,3544,3545],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[66,3547,3548],{"class":68,"line":75},[66,3549,3550],{},"print(student[\"name\"])\n",[66,3552,3553],{"class":68,"line":81},[66,3554,91],{"emptyLinePlaceholder":90},[66,3556,3557],{"class":68,"line":87},[66,3558,3559],{},"student[\"score\"] = 95\n",[66,3561,3562],{"class":68,"line":94},[66,3563,3564],{},"student[\"city\"] = \"郑州\"\n",[66,3566,3567],{"class":68,"line":100},[66,3568,3569],{},"print(student)\n",[10,3571,112],{},[56,3573,3576],{"className":3574,"code":3575,"language":118,"meta":61},[116],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[63,3577,3575],{"__ignoreMap":61},[10,3579,123],{},[14,3581,126],{"id":126},[128,3583,3584,3587],{},[40,3585,3586],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3588,3589,3590,3592,3593,3596],{},"给已有键 ",[63,3591,2213],{}," 赋值会更新映射，给新键 ",[63,3594,3595],{},"city"," 赋值会增加映射。",[14,3598,146],{"id":146},[37,3600,3601,3608],{},[40,3602,3603,3604,3607],{},"按位置理解字典并尝试 ",[63,3605,3606],{},"student[0]","，而实际键是字符串。",[40,3609,3610,3611,3614,3615,330],{},"直接读取不确定存在的键并忽略 ",[63,3612,3613],{},"KeyError","；后续可根据场景使用成员检查或 ",[63,3616,3617],{},"get()",[14,3619,157],{"id":157},[128,3621,3622,3625],{},[40,3623,3624],{},"建立一本书的标题、作者和页数字典。",[40,3626,3627],{},"添加分类键，再修改页数。",[10,3629,172],{},[14,3631,175],{"id":175},[10,3633,3634],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,3636,182],{},{"title":61,"searchDepth":75,"depth":75,"links":3638},[3639,3640,3641,3642,3643,3644,3645,3646],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3487,"description":3492},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[193,3654,3326],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3657,"title":3658,"body":3659,"category":193,"cover":194,"description":3663,"extension":195,"meta":3812,"navigation":90,"path":3813,"pinned":198,"publishedAt":199,"seo":3814,"slug":3815,"stem":3816,"summary":3817,"tags":3818,"updatedAt":199,"visible":90,"__hash__":3820},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3660,"toc":3802},[3661,3664,3666,3669,3671,3677,3680,3682,3701,3703,3705,3739,3741,3747,3749,3751,3766,3768,3780,3782,3793,3795,3797,3800],[10,3662,3663],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3665,16],{"id":16},[10,3667,3668],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3670,22],{"id":22},[10,3672,3673],{},[26,3674],{"alt":3675,"src":3676},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3678,3679],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3681,35],{"id":35},[37,3683,3684,3687,3690],{},[40,3685,3686],{},"集合中的元素不重复。",[40,3688,3689],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3691,3692,3693,3696,3697,3700],{},"创建空集合必须写 ",[63,3694,3695],{},"set()","；",[63,3698,3699],{},"{}"," 创建的是空字典。",[14,3702,51],{"id":51},[10,3704,54],{},[56,3706,3708],{"className":58,"code":3707,"language":60,"meta":61,"style":61},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[63,3709,3710,3715,3720,3724,3729,3734],{"__ignoreMap":61},[66,3711,3712],{"class":68,"line":69},[66,3713,3714],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[66,3716,3717],{"class":68,"line":75},[66,3718,3719],{},"right = {\"Python\", \"Docker\"}\n",[66,3721,3722],{"class":68,"line":81},[66,3723,91],{"emptyLinePlaceholder":90},[66,3725,3726],{"class":68,"line":87},[66,3727,3728],{},"print(left & right)\n",[66,3730,3731],{"class":68,"line":94},[66,3732,3733],{},"print(left | right)\n",[66,3735,3736],{"class":68,"line":100},[66,3737,3738],{},"print(\"Git\" in left)\n",[10,3740,112],{},[56,3742,3745],{"className":3743,"code":3744,"language":118,"meta":61},[116],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[63,3746,3744],{"__ignoreMap":61},[10,3748,123],{},[14,3750,126],{"id":126},[128,3752,3753,3756],{},[40,3754,3755],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3757,3758,3761,3762,3765],{},[63,3759,3760],{},"&"," 计算交集，",[63,3763,3764],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3767,146],{"id":146},[37,3769,3770,3777],{},[40,3771,2306,3772,3774,3775,330],{},[63,3773,3699],{}," 创建空集合，实际得到空字典；空集合应写 ",[63,3776,3695],{},[40,3778,3779],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3781,157],{"id":157},[128,3783,3784,3790],{},[40,3785,3786,3787,3789],{},"把包含重复标签的列表交给 ",[63,3788,3695],{}," 去重。",[40,3791,3792],{},"计算两组课程标签的交集和差集。",[10,3794,172],{},[14,3796,175],{"id":175},[10,3798,3799],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,3801,182],{},{"title":61,"searchDepth":75,"depth":75,"links":3803},[3804,3805,3806,3807,3808,3809,3810,3811],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3658,"description":3663},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[193,3819,3326],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3822,"title":3823,"body":3824,"category":193,"cover":194,"description":3828,"extension":195,"meta":4026,"navigation":90,"path":4027,"pinned":198,"publishedAt":199,"seo":4028,"slug":4029,"stem":4030,"summary":4031,"tags":4032,"updatedAt":199,"visible":90,"__hash__":4035},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3825,"toc":4014},[3826,3829,3831,3834,3836,3842,3852,3854,3871,3873,3875,3925,3927,3933,3935,3937,3959,3961,3964,3970,3973,3975,3988,3990,4005,4007,4009,4012],[10,3827,3828],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3830,16],{"id":16},[10,3832,3833],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3835,22],{"id":22},[10,3837,3838],{},[26,3839],{"alt":3840,"src":3841},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3843,3844,3847,3848,3851],{},[63,3845,3846],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[63,3849,3850],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3853,35],{"id":35},[37,3855,3856,3865,3868],{},[40,3857,3858,3860,3861,3864],{},[63,3859,2775],{}," 比较内容是否相等，",[63,3862,3863],{},"is"," 比较是否为同一个对象。",[40,3866,3867],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3869,3870],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3872,51],{"id":51},[10,3874,54],{},[56,3876,3878],{"className":58,"code":3877,"language":60,"meta":61,"style":61},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[63,3879,3880,3885,3890,3895,3899,3904,3909,3914,3919],{"__ignoreMap":61},[66,3881,3882],{"class":68,"line":69},[66,3883,3884],{},"tasks = [\"变量\", \"字符串\"]\n",[66,3886,3887],{"class":68,"line":75},[66,3888,3889],{},"shared = tasks\n",[66,3891,3892],{"class":68,"line":81},[66,3893,3894],{},"backup = tasks.copy()\n",[66,3896,3897],{"class":68,"line":87},[66,3898,91],{"emptyLinePlaceholder":90},[66,3900,3901],{"class":68,"line":94},[66,3902,3903],{},"tasks.append(\"列表\")\n",[66,3905,3906],{"class":68,"line":100},[66,3907,3908],{},"print(shared)\n",[66,3910,3911],{"class":68,"line":106},[66,3912,3913],{},"print(backup)\n",[66,3915,3916],{"class":68,"line":2461},[66,3917,3918],{},"print(tasks is shared)\n",[66,3920,3922],{"class":68,"line":3921},9,[66,3923,3924],{},"print(tasks is backup)\n",[10,3926,112],{},[56,3928,3931],{"className":3929,"code":3930,"language":118,"meta":61},[116],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[63,3932,3930],{"__ignoreMap":61},[10,3934,123],{},[14,3936,126],{"id":126},[128,3938,3939,3945],{},[40,3940,3941,3944],{},[63,3942,3943],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3946,3947,3950,3951,3954,3955,3958],{},[63,3948,3949],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[63,3952,3953],{},"shared"," 能观察到变化，",[63,3956,3957],{},"backup"," 不会。",[296,3960,2665],{"id":2665},[10,3962,3963],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3965,3966],{},[26,3967],{"alt":3968,"src":3969},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3971,3972],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3974,146],{"id":146},[37,3976,3977,3985],{},[40,3978,3979,3980,3982,3983,330],{},"用 ",[63,3981,2775],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[63,3984,3863],{},[40,3986,3987],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3989,157],{"id":157},[128,3991,3992,3995],{},[40,3993,3994],{},"让两个变量引用同一个字典并修改其中一个。",[40,3996,2306,3997,4000,4001,1124,4003,330],{},[63,3998,3999],{},"copy()"," 创建外层副本，再比较 ",[63,4002,3863],{},[63,4004,2775],{},[10,4006,172],{},[14,4008,175],{"id":175},[10,4010,4011],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,4013,182],{},{"title":61,"searchDepth":75,"depth":75,"links":4015},[4016,4017,4018,4019,4020,4023,4024,4025],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":4021},[4022],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3823,"description":3828},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[193,4033,4034],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4037,"title":4038,"body":4039,"category":193,"cover":194,"description":4043,"extension":195,"meta":4256,"navigation":90,"path":4257,"pinned":198,"publishedAt":199,"seo":4258,"slug":4259,"stem":4260,"summary":4261,"tags":4262,"updatedAt":199,"visible":90,"__hash__":4264},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4040,"toc":4243},[4041,4044,4046,4049,4051,4057,4067,4069,4080,4082,4084,4137,4139,4145,4147,4149,4167,4169,4172,4178,4186,4189,4192,4198,4204,4206,4224,4226,4234,4236,4238,4241],[10,4042,4043],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4045,16],{"id":16},[10,4047,4048],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4050,22],{"id":22},[10,4052,4053],{},[26,4054],{"alt":4055,"src":4056},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4058,4059,2224,4061,2224,4064,4066],{},[63,4060,1123],{},[63,4062,4063],{},"elif",[63,4065,1127],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4068,35],{"id":35},[37,4070,4071,4074,4077],{},[40,4072,4073],{},"冒号表示接下来开始一个代码块。",[40,4075,4076],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4078,4079],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4081,51],{"id":51},[10,4083,54],{},[56,4085,4087],{"className":58,"code":4086,"language":60,"meta":61,"style":61},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[63,4088,4089,4094,4098,4103,4108,4113,4118,4122,4127,4131],{"__ignoreMap":61},[66,4090,4091],{"class":68,"line":69},[66,4092,4093],{},"score = int(input(\"请输入分数：\"))\n",[66,4095,4096],{"class":68,"line":75},[66,4097,91],{"emptyLinePlaceholder":90},[66,4099,4100],{"class":68,"line":81},[66,4101,4102],{},"if score >= 90:\n",[66,4104,4105],{"class":68,"line":87},[66,4106,4107],{},"    level = \"优秀\"\n",[66,4109,4110],{"class":68,"line":94},[66,4111,4112],{},"elif score >= 60:\n",[66,4114,4115],{"class":68,"line":100},[66,4116,4117],{},"    level = \"合格\"\n",[66,4119,4120],{"class":68,"line":106},[66,4121,1113],{},[66,4123,4124],{"class":68,"line":2461},[66,4125,4126],{},"    level = \"需要继续学习\"\n",[66,4128,4129],{"class":68,"line":3921},[66,4130,91],{"emptyLinePlaceholder":90},[66,4132,4134],{"class":68,"line":4133},10,[66,4135,4136],{},"print(level)\n",[10,4138,112],{},[56,4140,4143],{"className":4141,"code":4142,"language":118,"meta":61},[116],"输入 85 时输出：合格\n",[63,4144,4142],{"__ignoreMap":61},[10,4146,123],{},[14,4148,126],{"id":126},[128,4150,4151,4158],{},[40,4152,4153,4154,4157],{},"输入先转换为整数，程序从 ",[63,4155,4156],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4159,4160,4163,4164,4166],{},[63,4161,4162],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[63,4165,1127],{}," 被跳过；最终三个分支只会选择一个。",[296,4168,2665],{"id":2665},[10,4170,4171],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4173,4174],{},[26,4175],{"alt":4176,"src":4177},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4179,4180,4182,4183,4185],{},[63,4181,4156],{}," 必须放在 ",[63,4184,4162],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[296,4187,2665],{"id":4188},"再看一个具体细节-1",[10,4190,4191],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4193,4194],{},[26,4195],{"alt":4196,"src":4197},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4199,4200,4201,4203],{},"同一缩进层级属于同一个代码块；回到 ",[63,4202,1123],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4205,146],{"id":146},[37,4207,4208,4214],{},[40,4209,4210,4211,4213],{},"先写 ",[63,4212,4162],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4215,4216,4217,4219,4220,4223],{},"混用多个独立 ",[63,4218,1123],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[63,4221,4222],{},"if\u002Felif\u002Felse"," 链。",[14,4225,157],{"id":157},[128,4227,4228,4231],{},[40,4229,4230],{},"根据温度输出“冷、适中、热”三个等级。",[40,4232,4233],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4235,172],{},[14,4237,175],{"id":175},[10,4239,4240],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,4242,182],{},{"title":61,"searchDepth":75,"depth":75,"links":4244},[4245,4246,4247,4248,4249,4253,4254,4255],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":4250},[4251,4252],{"id":2665,"depth":81,"text":2665},{"id":4188,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4038,"description":4043},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[193,1123,4263],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4266,"title":4267,"body":4268,"category":193,"cover":194,"description":4272,"extension":195,"meta":4438,"navigation":90,"path":4439,"pinned":198,"publishedAt":199,"seo":4440,"slug":4441,"stem":4442,"summary":4443,"tags":4444,"updatedAt":199,"visible":90,"__hash__":4446},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4269,"toc":4426},[4270,4273,4275,4278,4280,4286,4292,4294,4309,4311,4313,4351,4353,4359,4361,4363,4378,4380,4383,4389,4395,4397,4405,4407,4417,4419,4421,4424],[10,4271,4272],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4274,16],{"id":16},[10,4276,4277],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4279,22],{"id":22},[10,4281,4282],{},[26,4283],{"alt":4284,"src":4285},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4287,4288,4291],{},[63,4289,4290],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4293,35],{"id":35},[37,4295,4296,4299,4302],{},[40,4297,4298],{},"进入循环前先准备参与条件判断的状态。",[40,4300,4301],{},"循环体中必须有机会让条件变为假。",[40,4303,4304,4305,4308],{},"能够预先确定遍历对象时，后续介绍的 ",[63,4306,4307],{},"for"," 通常更直接。",[14,4310,51],{"id":51},[10,4312,54],{},[56,4314,4316],{"className":58,"code":4315,"language":60,"meta":61,"style":61},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[63,4317,4318,4323,4327,4332,4337,4342,4346],{"__ignoreMap":61},[66,4319,4320],{"class":68,"line":69},[66,4321,4322],{},"count = 1\n",[66,4324,4325],{"class":68,"line":75},[66,4326,91],{"emptyLinePlaceholder":90},[66,4328,4329],{"class":68,"line":81},[66,4330,4331],{},"while count \u003C= 3:\n",[66,4333,4334],{"class":68,"line":87},[66,4335,4336],{},"    print(\"第\", count, \"次练习\")\n",[66,4338,4339],{"class":68,"line":94},[66,4340,4341],{},"    count = count + 1\n",[66,4343,4344],{"class":68,"line":100},[66,4345,91],{"emptyLinePlaceholder":90},[66,4347,4348],{"class":68,"line":106},[66,4349,4350],{},"print(\"练习结束\")\n",[10,4352,112],{},[56,4354,4357],{"className":4355,"code":4356,"language":118,"meta":61},[116],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[63,4358,4356],{"__ignoreMap":61},[10,4360,123],{},[14,4362,126],{"id":126},[128,4364,4365,4372],{},[40,4366,4367,4368,4371],{},"进入循环前 ",[63,4369,4370],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4373,4374,4375,4377],{},"循环体末尾把 ",[63,4376,4370],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[296,4379,2665],{"id":2665},[10,4381,4382],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4384,4385],{},[26,4386],{"alt":4387,"src":4388},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4390,4391,4392,4394],{},"第4次检查时 ",[63,4393,4370],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4396,146],{"id":146},[37,4398,4399,4402],{},[40,4400,4401],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4403,4404],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4406,157],{"id":157},[128,4408,4409,4414],{},[40,4410,2306,4411,4413],{},[63,4412,4290],{}," 输出 1 到 5。",[40,4415,4416],{},"计算 1 到 10 的累加和。",[10,4418,172],{},[14,4420,175],{"id":175},[10,4422,4423],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,4425,182],{},{"title":61,"searchDepth":75,"depth":75,"links":4427},[4428,4429,4430,4431,4432,4435,4436,4437],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":4433},[4434],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4267,"description":4272},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[193,4290,4445],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4448,"title":4449,"body":4450,"category":193,"cover":194,"description":4454,"extension":195,"meta":4602,"navigation":90,"path":4603,"pinned":198,"publishedAt":199,"seo":4604,"slug":4605,"stem":4606,"summary":4607,"tags":4608,"updatedAt":199,"visible":90,"__hash__":4610},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4451,"toc":4592},[4452,4455,4457,4460,4462,4468,4473,4475,4489,4491,4493,4531,4533,4539,4541,4543,4560,4562,4570,4572,4583,4585,4587,4590],[10,4453,4454],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4456,16],{"id":16},[10,4458,4459],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4461,22],{"id":22},[10,4463,4464],{},[26,4465],{"alt":4466,"src":4467},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4469,4470,4472],{},[63,4471,4307],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4474,35],{"id":35},[37,4476,4477,4483,4486],{},[40,4478,4479,4482],{},[63,4480,4481],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4484,4485],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4487,4488],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4490,51],{"id":51},[10,4492,54],{},[56,4494,4496],{"className":58,"code":4495,"language":60,"meta":61,"style":61},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[63,4497,4498,4503,4507,4512,4517,4521,4526],{"__ignoreMap":61},[66,4499,4500],{"class":68,"line":69},[66,4501,4502],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[66,4504,4505],{"class":68,"line":75},[66,4506,91],{"emptyLinePlaceholder":90},[66,4508,4509],{"class":68,"line":81},[66,4510,4511],{},"for course in courses:\n",[66,4513,4514],{"class":68,"line":87},[66,4515,4516],{},"    print(course)\n",[66,4518,4519],{"class":68,"line":94},[66,4520,91],{"emptyLinePlaceholder":90},[66,4522,4523],{"class":68,"line":100},[66,4524,4525],{},"for number in range(1, 4):\n",[66,4527,4528],{"class":68,"line":106},[66,4529,4530],{},"    print(number)\n",[10,4532,112],{},[56,4534,4537],{"className":4535,"code":4536,"language":118,"meta":61},[116],"变量\n字符串\n列表\n1\n2\n3\n",[63,4538,4536],{"__ignoreMap":61},[10,4540,123],{},[14,4542,126],{"id":126},[128,4544,4545,4555],{},[40,4546,4547,4548,4550,4551,4554],{},"第一个 ",[63,4549,4307],{}," 依次从列表取得字符串，循环变量 ",[63,4552,4553],{},"course"," 每轮重新绑定。",[40,4556,4557,4559],{},[63,4558,4481],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4561,146],{"id":146},[37,4563,4564,4567],{},[40,4565,4566],{},"只需要元素却手工维护索引，增加越界风险。",[40,4568,4569],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4571,157],{"id":157},[128,4573,4574,4577],{},[40,4575,4576],{},"逐项输出一个字符串中的字符。",[40,4578,2306,4579,4582],{},[63,4580,4581],{},"range()"," 输出 2、4、6、8。",[10,4584,172],{},[14,4586,175],{"id":175},[10,4588,4589],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,4591,182],{},{"title":61,"searchDepth":75,"depth":75,"links":4593},[4594,4595,4596,4597,4598,4599,4600,4601],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4449,"description":4454},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[193,4307,4609],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4612,"title":4613,"body":4614,"category":193,"cover":194,"description":4618,"extension":195,"meta":4792,"navigation":90,"path":4793,"pinned":198,"publishedAt":199,"seo":4794,"slug":4795,"stem":4796,"summary":4797,"tags":4798,"updatedAt":199,"visible":90,"__hash__":4799},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4615,"toc":4782},[4616,4619,4621,4624,4626,4632,4642,4644,4663,4665,4667,4719,4721,4727,4729,4731,4745,4747,4763,4765,4773,4775,4777,4780],[10,4617,4618],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4620,16],{"id":16},[10,4622,4623],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4625,22],{"id":22},[10,4627,4628],{},[26,4629],{"alt":4630,"src":4631},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4633,4634,4637,4638,4641],{},[63,4635,4636],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[63,4639,4640],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4643,35],{"id":35},[37,4645,4646,4649,4657],{},[40,4647,4648],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4650,4651,4653,4654,4656],{},[63,4652,4636],{}," 前要确认不会跳过 ",[63,4655,4290],{}," 循环中的状态更新。",[40,4658,4659,4660,4662],{},"多层嵌套中 ",[63,4661,4640],{}," 只结束它所在的最内层循环。",[14,4664,51],{"id":51},[10,4666,54],{},[56,4668,4670],{"className":58,"code":4669,"language":60,"meta":61,"style":61},"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",[63,4671,4672,4677,4681,4686,4691,4696,4701,4706,4710,4714],{"__ignoreMap":61},[66,4673,4674],{"class":68,"line":69},[66,4675,4676],{},"numbers = [3, -1, 0, 8, 12]\n",[66,4678,4679],{"class":68,"line":75},[66,4680,91],{"emptyLinePlaceholder":90},[66,4682,4683],{"class":68,"line":81},[66,4684,4685],{},"for number in numbers:\n",[66,4687,4688],{"class":68,"line":87},[66,4689,4690],{},"    if number \u003C 0:\n",[66,4692,4693],{"class":68,"line":94},[66,4694,4695],{},"        continue\n",[66,4697,4698],{"class":68,"line":100},[66,4699,4700],{},"    if number == 0:\n",[66,4702,4703],{"class":68,"line":106},[66,4704,4705],{},"        break\n",[66,4707,4708],{"class":68,"line":2461},[66,4709,4530],{},[66,4711,4712],{"class":68,"line":3921},[66,4713,91],{"emptyLinePlaceholder":90},[66,4715,4716],{"class":68,"line":4133},[66,4717,4718],{},"print(\"循环结束\")\n",[10,4720,112],{},[56,4722,4725],{"className":4723,"code":4724,"language":118,"meta":61},[116],"3\n循环结束\n",[63,4726,4724],{"__ignoreMap":61},[10,4728,123],{},[14,4730,126],{"id":126},[128,4732,4733,4739],{},[40,4734,4735,4736,4738],{},"遇到 -1 时 ",[63,4737,4636],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4740,4741,4742,4744],{},"遇到 0 时 ",[63,4743,4640],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4746,146],{"id":146},[37,4748,4749,4754],{},[40,4750,3435,4751,4753],{},[63,4752,4636],{}," 当作结束循环，实际它只跳到下一轮。",[40,4755,4756,4757,4759,4760,4762],{},"在 ",[63,4758,4290],{}," 中把状态更新放在可能被 ",[63,4761,4636],{}," 跳过的位置，造成无限循环。",[14,4764,157],{"id":157},[128,4766,4767,4770],{},[40,4768,4769],{},"跳过列表中的空字符串并输出其他内容。",[40,4771,4772],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4774,172],{},[14,4776,175],{"id":175},[10,4778,4779],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,4781,182],{},{"title":61,"searchDepth":75,"depth":75,"links":4783},[4784,4785,4786,4787,4788,4789,4790,4791],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4613,"description":4618},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[193,4640,4636],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4801,"title":4802,"body":4803,"category":193,"cover":194,"description":4807,"extension":195,"meta":4978,"navigation":90,"path":4979,"pinned":198,"publishedAt":199,"seo":4980,"slug":4981,"stem":4982,"summary":4983,"tags":4984,"updatedAt":199,"visible":90,"__hash__":4987},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4804,"toc":4966},[4805,4808,4810,4813,4815,4821,4824,4826,4850,4852,4854,4888,4890,4896,4898,4900,4917,4919,4922,4928,4931,4933,4947,4949,4957,4959,4961,4964],[10,4806,4807],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4809,16],{"id":16},[10,4811,4812],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4814,22],{"id":22},[10,4816,4817],{},[26,4818],{"alt":4819,"src":4820},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4822,4823],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4825,35],{"id":35},[37,4827,4828,4831,4834],{},[40,4829,4830],{},"每增加一层嵌套，阅读成本都会上升。",[40,4832,4833],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4835,4836,4837,2224,4840,4843,4844,2224,4847,330],{},"变量名使用 ",[63,4838,4839],{},"row",[63,4841,4842],{},"cell"," 等层级含义，避免全部写成 ",[63,4845,4846],{},"i",[63,4848,4849],{},"j",[14,4851,51],{"id":51},[10,4853,54],{},[56,4855,4857],{"className":58,"code":4856,"language":60,"meta":61,"style":61},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[63,4858,4859,4864,4868,4873,4878,4883],{"__ignoreMap":61},[66,4860,4861],{"class":68,"line":69},[66,4862,4863],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[66,4865,4866],{"class":68,"line":75},[66,4867,91],{"emptyLinePlaceholder":90},[66,4869,4870],{"class":68,"line":81},[66,4871,4872],{},"for row in table:\n",[66,4874,4875],{"class":68,"line":87},[66,4876,4877],{},"    for cell in row:\n",[66,4879,4880],{"class":68,"line":94},[66,4881,4882],{},"        print(cell)\n",[66,4884,4885],{"class":68,"line":100},[66,4886,4887],{},"    print(\"一行结束\")\n",[10,4889,112],{},[56,4891,4894],{"className":4892,"code":4893,"language":118,"meta":61},[116],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[63,4895,4893],{"__ignoreMap":61},[10,4897,123],{},[14,4899,126],{"id":126},[128,4901,4902,4914],{},[40,4903,4904,4905,4907,4908,1124,4911,330],{},"外层变量 ",[63,4906,4839],{}," 先引用第一行列表，内层才依次处理 ",[63,4909,4910],{},"A1",[63,4912,4913],{},"A2",[40,4915,4916],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[296,4918,2665],{"id":2665},[10,4920,4921],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4923,4924],{},[26,4925],{"alt":4926,"src":4927},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4929,4930],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4932,146],{"id":146},[37,4934,4935,4944],{},[40,4936,4937,4938,976,4941,4943],{},"把两层循环变量都叫 ",[63,4939,4940],{},"item",[63,4942,4846],{},"，难以确认当前层级。",[40,4945,4946],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4948,157],{"id":157},[128,4950,4951,4954],{},[40,4952,4953],{},"打印一个 2×3 数字表。",[40,4955,4956],{},"在内层增加条件，只输出大于 3 的元素。",[10,4958,172],{},[14,4960,175],{"id":175},[10,4962,4963],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,4965,182],{},{"title":61,"searchDepth":75,"depth":75,"links":4967},[4968,4969,4970,4971,4972,4975,4976,4977],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":4973},[4974],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4802,"description":4807},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[193,4985,4986],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4989,"title":4990,"body":4991,"category":193,"cover":194,"description":4995,"extension":195,"meta":5133,"navigation":90,"path":5134,"pinned":198,"publishedAt":199,"seo":5135,"slug":5136,"stem":5137,"summary":5138,"tags":5139,"updatedAt":199,"visible":90,"__hash__":5142},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4992,"toc":5123},[4993,4996,4998,5001,5003,5009,5012,5014,5025,5027,5029,5067,5069,5075,5077,5079,5091,5093,5104,5106,5114,5116,5118,5121],[10,4994,4995],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4997,16],{"id":16},[10,4999,5000],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5002,22],{"id":22},[10,5004,5005],{},[26,5006],{"alt":5007,"src":5008},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5010,5011],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5013,35],{"id":35},[37,5015,5016,5019,5022],{},[40,5017,5018],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5020,5021],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5023,5024],{},"推导式创建新列表，不修改输入列表。",[14,5026,51],{"id":51},[10,5028,54],{},[56,5030,5032],{"className":58,"code":5031,"language":60,"meta":61,"style":61},"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",[63,5033,5034,5039,5043,5048,5053,5057,5062],{"__ignoreMap":61},[66,5035,5036],{"class":68,"line":69},[66,5037,5038],{},"numbers = [1, 2, 3, 4, 5]\n",[66,5040,5041],{"class":68,"line":75},[66,5042,91],{"emptyLinePlaceholder":90},[66,5044,5045],{"class":68,"line":81},[66,5046,5047],{},"squares = [number * number for number in numbers]\n",[66,5049,5050],{"class":68,"line":87},[66,5051,5052],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[66,5054,5055],{"class":68,"line":94},[66,5056,91],{"emptyLinePlaceholder":90},[66,5058,5059],{"class":68,"line":100},[66,5060,5061],{},"print(squares)\n",[66,5063,5064],{"class":68,"line":106},[66,5065,5066],{},"print(even_squares)\n",[10,5068,112],{},[56,5070,5073],{"className":5071,"code":5072,"language":118,"meta":61},[116],"[1, 4, 9, 16, 25]\n[4, 16]\n",[63,5074,5072],{"__ignoreMap":61},[10,5076,123],{},[14,5078,126],{"id":126},[128,5080,5081,5084],{},[40,5082,5083],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5085,5086,5087,5090],{},"第二条先用 ",[63,5088,5089],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5092,146],{"id":146},[37,5094,5095,5101],{},[40,5096,5097,5098,5100],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[63,5099,4307],{}," 开始找输入。",[40,5102,5103],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5105,157],{"id":157},[128,5107,5108,5111],{},[40,5109,5110],{},"把字符串列表转换为长度列表。",[40,5112,5113],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5115,172],{},[14,5117,175],{"id":175},[10,5119,5120],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,5122,182],{},{"title":61,"searchDepth":75,"depth":75,"links":5124},[5125,5126,5127,5128,5129,5130,5131,5132],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4990,"description":4995},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[193,5140,5141],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":4,"title":5,"body":5144,"category":193,"cover":194,"description":12,"extension":195,"meta":5263,"navigation":90,"path":197,"pinned":198,"publishedAt":199,"seo":5264,"slug":201,"stem":202,"summary":203,"tags":5265,"updatedAt":199,"visible":90,"__hash__":207},{"type":7,"value":5145,"toc":5253},[5146,5148,5150,5152,5154,5158,5160,5162,5170,5172,5174,5206,5208,5213,5215,5217,5227,5229,5235,5237,5245,5247,5249,5251],[10,5147,12],{},[14,5149,16],{"id":16},[10,5151,19],{},[14,5153,22],{"id":22},[10,5155,5156],{},[26,5157],{"alt":28,"src":29},[10,5159,32],{},[14,5161,35],{"id":35},[37,5163,5164,5166,5168],{},[40,5165,42],{},[40,5167,45],{},[40,5169,48],{},[14,5171,51],{"id":51},[10,5173,54],{},[56,5175,5176],{"className":58,"code":59,"language":60,"meta":61,"style":61},[63,5177,5178,5182,5186,5190,5194,5198,5202],{"__ignoreMap":61},[66,5179,5180],{"class":68,"line":69},[66,5181,72],{},[66,5183,5184],{"class":68,"line":75},[66,5185,78],{},[66,5187,5188],{"class":68,"line":81},[66,5189,84],{},[66,5191,5192],{"class":68,"line":87},[66,5193,91],{"emptyLinePlaceholder":90},[66,5195,5196],{"class":68,"line":94},[66,5197,97],{},[66,5199,5200],{"class":68,"line":100},[66,5201,103],{},[66,5203,5204],{"class":68,"line":106},[66,5205,109],{},[10,5207,112],{},[56,5209,5211],{"className":5210,"code":117,"language":118,"meta":61},[116],[63,5212,117],{"__ignoreMap":61},[10,5214,123],{},[14,5216,126],{"id":126},[128,5218,5219,5223],{},[40,5220,132,5221,136],{},[63,5222,135],{},[40,5224,139,5225,143],{},[63,5226,142],{},[14,5228,146],{"id":146},[37,5230,5231,5233],{},[40,5232,151],{},[40,5234,154],{},[14,5236,157],{"id":157},[128,5238,5239,5243],{},[40,5240,162,5241,166],{},[63,5242,165],{},[40,5244,169],{},[10,5246,172],{},[14,5248,175],{"id":175},[10,5250,178],{},[180,5252,182],{},{"title":61,"searchDepth":75,"depth":75,"links":5254},[5255,5256,5257,5258,5259,5260,5261,5262],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":5,"description":12},[193,205,206],{"id":5267,"title":5268,"body":5269,"category":193,"cover":194,"description":5273,"extension":195,"meta":5453,"navigation":90,"path":5454,"pinned":198,"publishedAt":199,"seo":5455,"slug":5456,"stem":5457,"summary":5458,"tags":5459,"updatedAt":199,"visible":90,"__hash__":5462},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5270,"toc":5441},[5271,5274,5276,5279,5281,5287,5294,5296,5313,5315,5317,5351,5353,5359,5361,5363,5384,5386,5389,5395,5405,5407,5422,5424,5432,5434,5436,5439],[10,5272,5273],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5275,16],{"id":16},[10,5277,5278],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5280,22],{"id":22},[10,5282,5283],{},[26,5284],{"alt":5285,"src":5286},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5288,5289,5290,5293],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[63,5291,5292],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5295,35],{"id":35},[37,5297,5298,5301,5304],{},[40,5299,5300],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5302,5303],{},"局部变量默认只在函数内部可见。",[40,5305,5306,5307,5309,5310,330],{},"没有显式 ",[63,5308,5292],{}," 的函数会返回 ",[63,5311,5312],{},"None",[14,5314,51],{"id":51},[10,5316,54],{},[56,5318,5320],{"className":58,"code":5319,"language":60,"meta":61,"style":61},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[63,5321,5322,5327,5332,5337,5341,5346],{"__ignoreMap":61},[66,5323,5324],{"class":68,"line":69},[66,5325,5326],{},"def calculate_total(price, count):\n",[66,5328,5329],{"class":68,"line":75},[66,5330,5331],{},"    total = price * count\n",[66,5333,5334],{"class":68,"line":81},[66,5335,5336],{},"    return total\n",[66,5338,5339],{"class":68,"line":87},[66,5340,91],{"emptyLinePlaceholder":90},[66,5342,5343],{"class":68,"line":94},[66,5344,5345],{},"result = calculate_total(25, 4)\n",[66,5347,5348],{"class":68,"line":100},[66,5349,5350],{},"print(result)\n",[10,5352,112],{},[56,5354,5357],{"className":5355,"code":5356,"language":118,"meta":61},[116],"100\n",[63,5358,5356],{"__ignoreMap":61},[10,5360,123],{},[14,5362,126],{"id":126},[128,5364,5365,5374],{},[40,5366,5367,5368,2224,5371,5373],{},"调用时 25 和 4 分别绑定到 ",[63,5369,5370],{},"price",[63,5372,4370],{},"，它们只在本次函数调用的局部范围中使用。",[40,5375,5376,5379,5380,5383],{},[63,5377,5378],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[63,5381,5382],{},"result"," 并输出。",[296,5385,2665],{"id":2665},[10,5387,5388],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5390,5391],{},[26,5392],{"alt":5393,"src":5394},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5396,5397,2224,5399,1124,5401,5404],{},[63,5398,5370],{},[63,5400,4370],{},[63,5402,5403],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5406,146],{"id":146},[37,5408,5409,5416],{},[40,5410,5411,5412,5415],{},"在函数内部只 ",[63,5413,5414],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5417,5418,5419,5421],{},"试图在函数外直接访问局部变量 ",[63,5420,5403],{},"，它的名字只在调用期间的局部作用域存在。",[14,5423,157],{"id":157},[128,5425,5426,5429],{},[40,5427,5428],{},"编写计算长方形面积的函数。",[40,5430,5431],{},"让函数返回结果后在调用方加上单位再输出。",[10,5433,172],{},[14,5435,175],{"id":175},[10,5437,5438],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,5440,182],{},{"title":61,"searchDepth":75,"depth":75,"links":5442},[5443,5444,5445,5446,5447,5450,5451,5452],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":5448},[5449],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5268,"description":5273},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[193,5460,5461],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5464,"title":5465,"body":5466,"category":193,"cover":194,"description":5470,"extension":195,"meta":5650,"navigation":90,"path":5651,"pinned":198,"publishedAt":199,"seo":5652,"slug":5653,"stem":5654,"summary":5655,"tags":5656,"updatedAt":199,"visible":90,"__hash__":5659},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5467,"toc":5638},[5468,5471,5473,5476,5478,5484,5487,5489,5506,5508,5510,5562,5564,5570,5572,5574,5592,5594,5597,5603,5606,5608,5619,5621,5629,5631,5633,5636],[10,5469,5470],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5472,16],{"id":16},[10,5474,5475],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5477,22],{"id":22},[10,5479,5480],{},[26,5481],{"alt":5482,"src":5483},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5485,5486],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5488,35],{"id":35},[37,5490,5491,5494,5500],{},[40,5492,5493],{},"必需参数应放在有默认值的参数之前。",[40,5495,5496,5499],{},[63,5497,5498],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5501,5502,5505],{},[63,5503,5504],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5507,51],{"id":51},[10,5509,54],{},[56,5511,5513],{"className":58,"code":5512,"language":60,"meta":61,"style":61},"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",[63,5514,5515,5520,5525,5529,5534,5539,5543,5548,5553,5557],{"__ignoreMap":61},[66,5516,5517],{"class":68,"line":69},[66,5518,5519],{},"def build_title(name, level=\"基础\"):\n",[66,5521,5522],{"class":68,"line":75},[66,5523,5524],{},"    return name + \"｜\" + level\n",[66,5526,5527],{"class":68,"line":81},[66,5528,91],{"emptyLinePlaceholder":90},[66,5530,5531],{"class":68,"line":87},[66,5532,5533],{},"print(build_title(\"Python\"))\n",[66,5535,5536],{"class":68,"line":94},[66,5537,5538],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[66,5540,5541],{"class":68,"line":100},[66,5542,91],{"emptyLinePlaceholder":90},[66,5544,5545],{"class":68,"line":106},[66,5546,5547],{},"def total(*numbers):\n",[66,5549,5550],{"class":68,"line":2461},[66,5551,5552],{},"    return sum(numbers)\n",[66,5554,5555],{"class":68,"line":3921},[66,5556,91],{"emptyLinePlaceholder":90},[66,5558,5559],{"class":68,"line":4133},[66,5560,5561],{},"print(total(10, 20, 30))\n",[10,5563,112],{},[56,5565,5568],{"className":5566,"code":5567,"language":118,"meta":61},[116],"Python｜基础\n异常处理｜进阶\n60\n",[63,5569,5567],{"__ignoreMap":61},[10,5571,123],{},[14,5573,126],{"id":126},[128,5575,5576,5583],{},[40,5577,5578,5579,5582],{},"第一次调用只提供必需参数，",[63,5580,5581],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5584,5585,5588,5589,330],{},[63,5586,5587],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[63,5590,5591],{},"sum()",[296,5593,2665],{"id":2665},[10,5595,5596],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5598,5599],{},[26,5600],{"alt":5601,"src":5602},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5604,5605],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5607,146],{"id":146},[37,5609,5610,5616],{},[40,5611,5612,5613,5615],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[63,5614,5312],{}," 再在函数内创建。",[40,5617,5618],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5620,157],{"id":157},[128,5622,5623,5626],{},[40,5624,5625],{},"给问候函数增加默认称呼。",[40,5627,5628],{},"编写接收任意数量分数并返回总分的函数。",[10,5630,172],{},[14,5632,175],{"id":175},[10,5634,5635],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,5637,182],{},{"title":61,"searchDepth":75,"depth":75,"links":5639},[5640,5641,5642,5643,5644,5647,5648,5649],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":5645},[5646],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5465,"description":5470},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[193,5657,5658],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5661,"title":5662,"body":5663,"category":193,"cover":194,"description":5667,"extension":195,"meta":5864,"navigation":90,"path":5865,"pinned":198,"publishedAt":199,"seo":5866,"slug":5867,"stem":5868,"summary":5869,"tags":5870,"updatedAt":199,"visible":90,"__hash__":5873},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5664,"toc":5852},[5665,5668,5670,5673,5675,5681,5684,5686,5703,5705,5707,5770,5772,5778,5780,5782,5809,5811,5814,5820,5823,5825,5833,5835,5843,5845,5847,5850],[10,5666,5667],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5669,16],{"id":16},[10,5671,5672],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5674,22],{"id":22},[10,5676,5677],{},[26,5678],{"alt":5679,"src":5680},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5682,5683],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5685,35],{"id":35},[37,5687,5688,5691,5694],{},[40,5689,5690],{},"函数内部赋值默认创建局部变量。",[40,5692,5693],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5695,5696,2143,5699,5702],{},[63,5697,5698],{},"global",[63,5700,5701],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5704,51],{"id":51},[10,5706,54],{},[56,5708,5710],{"className":58,"code":5709,"language":60,"meta":61,"style":61},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[63,5711,5712,5717,5721,5726,5731,5735,5740,5745,5750,5754,5759,5764],{"__ignoreMap":61},[66,5713,5714],{"class":68,"line":69},[66,5715,5716],{},"course = \"Python\"\n",[66,5718,5719],{"class":68,"line":75},[66,5720,91],{"emptyLinePlaceholder":90},[66,5722,5723],{"class":68,"line":81},[66,5724,5725],{},"def outer():\n",[66,5727,5728],{"class":68,"line":87},[66,5729,5730],{},"    level = \"基础\"\n",[66,5732,5733],{"class":68,"line":94},[66,5734,91],{"emptyLinePlaceholder":90},[66,5736,5737],{"class":68,"line":100},[66,5738,5739],{},"    def show():\n",[66,5741,5742],{"class":68,"line":106},[66,5743,5744],{},"        lesson = \"作用域\"\n",[66,5746,5747],{"class":68,"line":2461},[66,5748,5749],{},"        print(course, level, lesson)\n",[66,5751,5752],{"class":68,"line":3921},[66,5753,91],{"emptyLinePlaceholder":90},[66,5755,5756],{"class":68,"line":4133},[66,5757,5758],{},"    show()\n",[66,5760,5762],{"class":68,"line":5761},11,[66,5763,91],{"emptyLinePlaceholder":90},[66,5765,5767],{"class":68,"line":5766},12,[66,5768,5769],{},"outer()\n",[10,5771,112],{},[56,5773,5776],{"className":5774,"code":5775,"language":118,"meta":61},[116],"Python 基础 作用域\n",[63,5777,5775],{"__ignoreMap":61},[10,5779,123],{},[14,5781,126],{"id":126},[128,5783,5784,5801],{},[40,5785,5786,5789,5790,5793,5794,5796,5797,5800],{},[63,5787,5788],{},"show()"," 中查找 ",[63,5791,5792],{},"lesson"," 时先在局部找到，查找 ",[63,5795,5581],{}," 时到外层 ",[63,5798,5799],{},"outer()"," 找到。",[40,5802,5803,5805,5806,5808],{},[63,5804,4553],{}," 在局部和外层都不存在，继续到模块全局找到；",[63,5807,2175],{}," 最后在内置作用域找到。",[296,5810,2665],{"id":2665},[10,5812,5813],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5815,5816],{},[26,5817],{"alt":5818,"src":5819},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5821,5822],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5824,146],{"id":146},[37,5826,5827,5830],{},[40,5828,5829],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5831,5832],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5834,157],{"id":157},[128,5836,5837,5840],{},[40,5838,5839],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5841,5842],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5844,172],{},[14,5846,175],{"id":175},[10,5848,5849],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,5851,182],{},{"title":61,"searchDepth":75,"depth":75,"links":5853},[5854,5855,5856,5857,5858,5861,5862,5863],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":5859},[5860],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5662,"description":5667},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[193,5871,5872],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5875,"title":5876,"body":5877,"category":193,"cover":194,"description":5881,"extension":195,"meta":6031,"navigation":90,"path":6032,"pinned":198,"publishedAt":199,"seo":6033,"slug":6034,"stem":6035,"summary":6036,"tags":6037,"updatedAt":199,"visible":90,"__hash__":6040},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5878,"toc":6021},[5879,5882,5884,5887,5889,5895,5898,5900,5919,5921,5923,5957,5959,5965,5967,5969,5984,5986,5998,6000,6012,6014,6016,6019],[10,5880,5881],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5883,16],{"id":16},[10,5885,5886],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5888,22],{"id":22},[10,5890,5891],{},[26,5892],{"alt":5893,"src":5894},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5896,5897],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5899,35],{"id":35},[37,5901,5902,5905,5908],{},[40,5903,5904],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5906,5907],{},"注解表达接口意图，不代替输入校验和测试。",[40,5909,5910,5911,2224,5913,2224,5915,5918],{},"基础注解优先使用 ",[63,5912,2227],{},[63,5914,2393],{},[63,5916,5917],{},"list[str]"," 等直接写法。",[14,5920,51],{"id":51},[10,5922,54],{},[56,5924,5926],{"className":58,"code":5925,"language":60,"meta":61,"style":61},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[63,5927,5928,5933,5938,5943,5947,5952],{"__ignoreMap":61},[66,5929,5930],{"class":68,"line":69},[66,5931,5932],{},"def format_score(name: str, score: int) -> str:\n",[66,5934,5935],{"class":68,"line":75},[66,5936,5937],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[66,5939,5940],{"class":68,"line":81},[66,5941,5942],{},"    return name + \"：\" + str(score)\n",[66,5944,5945],{"class":68,"line":87},[66,5946,91],{"emptyLinePlaceholder":90},[66,5948,5949],{"class":68,"line":94},[66,5950,5951],{},"print(format_score(\"小郑\", 95))\n",[66,5953,5954],{"class":68,"line":100},[66,5955,5956],{},"print(format_score.__doc__)\n",[10,5958,112],{},[56,5960,5963],{"className":5961,"code":5962,"language":118,"meta":61},[116],"小郑：95\n返回带姓名的分数文本。\n",[63,5964,5962],{"__ignoreMap":61},[10,5966,123],{},[14,5968,126],{"id":126},[128,5970,5971,5981],{},[40,5972,5973,5974,5977,5978,5980],{},"函数签名说明 ",[63,5975,5976],{},"name"," 预期为字符串、",[63,5979,2213],{}," 预期为整数，返回值预期为字符串。",[40,5982,5983],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5985,146],{"id":146},[37,5987,5988,5995],{},[40,5989,5990,5991,5994],{},"认为加了 ",[63,5992,5993],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,5996,5997],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,5999,157],{"id":157},[128,6001,6002,6005],{},[40,6003,6004],{},"为面积函数补充参数和返回值注解。",[40,6006,6007,6008,6011],{},"通过 ",[63,6009,6010],{},"函数名.__doc__"," 查看文档字符串。",[10,6013,172],{},[14,6015,175],{"id":175},[10,6017,6018],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,6020,182],{},{"title":61,"searchDepth":75,"depth":75,"links":6022},[6023,6024,6025,6026,6027,6028,6029,6030],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5876,"description":5881},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[193,6038,6039],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6042,"title":6043,"body":6044,"category":193,"cover":194,"description":6048,"extension":195,"meta":6275,"navigation":90,"path":6276,"pinned":198,"publishedAt":199,"seo":6277,"slug":6278,"stem":6279,"summary":6280,"tags":6281,"updatedAt":199,"visible":90,"__hash__":6284},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6045,"toc":6263},[6046,6049,6051,6057,6059,6065,6076,6078,6096,6098,6105,6134,6141,6160,6169,6171,6177,6179,6181,6204,6206,6209,6215,6221,6223,6239,6241,6254,6256,6258,6261],[10,6047,6048],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6050,16],{"id":16},[10,6052,6053,6054,6056],{},"本篇只处理“模块、import 与 ",[262,6055,5976],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6058,22],{"id":22},[10,6060,6061],{},[26,6062],{"alt":6063,"src":6064},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6066,6067,6068,6071,6072,6075],{},"同一个文件直接运行时 ",[63,6069,6070],{},"__name__"," 等于 ",[63,6073,6074],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6077,35],{"id":35},[37,6079,6080,6086,6089],{},[40,6081,6082,6083,6085],{},"一个 ",[63,6084,1138],{}," 文件就是一个模块。",[40,6087,6088],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6090,6091,6092,6095],{},"避免使用 ",[63,6093,6094],{},"from module import *","，它会让名字来源不清楚。",[14,6097,51],{"id":51},[10,6099,6100,6101,6104],{},"先在同一个目录中创建两个文件。把函数放进 ",[63,6102,6103],{},"calculator.py","：",[56,6106,6108],{"className":58,"code":6107,"language":60,"meta":61,"style":61},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[63,6109,6110,6115,6120,6124,6129],{"__ignoreMap":61},[66,6111,6112],{"class":68,"line":69},[66,6113,6114],{},"def add(left, right):\n",[66,6116,6117],{"class":68,"line":75},[66,6118,6119],{},"    return left + right\n",[66,6121,6122],{"class":68,"line":81},[66,6123,91],{"emptyLinePlaceholder":90},[66,6125,6126],{"class":68,"line":87},[66,6127,6128],{},"if __name__ == \"__main__\":\n",[66,6130,6131],{"class":68,"line":94},[66,6132,6133],{},"    print(add(2, 3))\n",[10,6135,6136,6137,6140],{},"再创建 ",[63,6138,6139],{},"app.py","，从模块中导入函数：",[56,6142,6144],{"className":58,"code":6143,"language":60,"meta":61,"style":61},"from calculator import add\n\nprint(add(10, 20))\n",[63,6145,6146,6151,6155],{"__ignoreMap":61},[66,6147,6148],{"class":68,"line":69},[66,6149,6150],{},"from calculator import add\n",[66,6152,6153],{"class":68,"line":75},[66,6154,91],{"emptyLinePlaceholder":90},[66,6156,6157],{"class":68,"line":81},[66,6158,6159],{},"print(add(10, 20))\n",[10,6161,6162,6163,1124,6166,330],{},"分别执行 ",[63,6164,6165],{},"python3 calculator.py",[63,6167,6168],{},"python3 app.py",[10,6170,112],{},[56,6172,6175],{"className":6173,"code":6174,"language":118,"meta":61},[116],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[63,6176,6174],{"__ignoreMap":61},[10,6178,123],{},[14,6180,126],{"id":126},[128,6182,6183,6193],{},[40,6184,6185,6186,6188,6189,6192],{},"直接运行 ",[63,6187,6103],{}," 时，模块名是 ",[63,6190,6191],{},"__main__","，入口代码输出 5。",[40,6194,6195,6197,6198,6200,6201,6203],{},[63,6196,6139],{}," 导入模块时，",[63,6199,6103],{}," 的函数定义会执行，但入口判断为假；随后 ",[63,6202,6139],{}," 调用函数输出 30。",[296,6205,2665],{"id":2665},[10,6207,6208],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6210,6211],{},[26,6212],{"alt":6213,"src":6214},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6216,6217,6218,6220],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[63,6219,6191],{}," 保护下的演示代码。",[14,6222,146],{"id":146},[37,6224,6225,6232],{},[40,6226,6227,6228,1124,6230,330],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[63,6229,6103],{},[63,6231,6139],{},[40,6233,6234,6235,6238],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[63,6236,6237],{},"json.py","，导致导入目标被遮蔽。",[14,6240,157],{"id":157},[128,6242,6243,6249],{},[40,6244,2321,6245,6248],{},[63,6246,6247],{},"text_tools.py"," 并导出一个格式化函数。",[40,6250,6251,6252,330],{},"分别直接运行模块和从另一个脚本导入，输出 ",[63,6253,6070],{},[10,6255,172],{},[14,6257,175],{"id":175},[10,6259,6260],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,6262,182],{},{"title":61,"searchDepth":75,"depth":75,"links":6264},[6265,6266,6267,6268,6269,6272,6273,6274],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":6270},[6271],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6043,"description":6048},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[193,6282,6283],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6286,"title":6287,"body":6288,"category":193,"cover":194,"description":6292,"extension":195,"meta":6457,"navigation":90,"path":6458,"pinned":198,"publishedAt":199,"seo":6459,"slug":6460,"stem":6461,"summary":6462,"tags":6463,"updatedAt":199,"visible":90,"__hash__":6465},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6289,"toc":6447},[6290,6293,6295,6298,6300,6306,6309,6311,6325,6327,6329,6375,6377,6383,6385,6387,6413,6415,6425,6427,6438,6440,6442,6445],[10,6291,6292],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6294,16],{"id":16},[10,6296,6297],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6299,22],{"id":22},[10,6301,6302],{},[26,6303],{"alt":6304,"src":6305},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6307,6308],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6310,35],{"id":35},[37,6312,6313,6319,6322],{},[40,6314,6315,6318],{},[63,6316,6317],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6320,6321],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6323,6324],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6326,51],{"id":51},[10,6328,1541],{},[56,6330,6332],{"className":559,"code":6331,"language":561,"meta":61,"style":61},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[63,6333,6334,6346,6354,6360,6370],{"__ignoreMap":61},[66,6335,6336,6338,6340,6343],{"class":68,"line":69},[66,6337,659],{"class":568},[66,6339,601],{"class":571},[66,6341,6342],{"class":604}," venv",[66,6344,6345],{"class":604}," .venv\n",[66,6347,6348,6351],{"class":68,"line":75},[66,6349,6350],{"class":571},"source",[66,6352,6353],{"class":604}," .venv\u002Fbin\u002Factivate\n",[66,6355,6356,6358],{"class":68,"line":81},[66,6357,60],{"class":568},[66,6359,572],{"class":571},[66,6361,6362,6364,6366,6368],{"class":68,"line":87},[66,6363,60],{"class":568},[66,6365,601],{"class":571},[66,6367,605],{"class":604},[66,6369,572],{"class":571},[66,6371,6372],{"class":68,"line":94},[66,6373,6374],{"class":568},"deactivate\n",[10,6376,112],{},[56,6378,6381],{"className":6379,"code":6380,"language":118,"meta":61},[116],"Python 和 pip 的路径应指向当前项目的 .venv\n",[63,6382,6380],{"__ignoreMap":61},[10,6384,123],{},[14,6386,126],{"id":126},[128,6388,6389,6398],{},[40,6390,6391,6394,6395,6397],{},[63,6392,6393],{},"venv"," 根据当前 ",[63,6396,659],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6399,6400,6401,2143,6403,6406,6407,3696,6409,6412],{},"激活后 ",[63,6402,60],{},[63,6404,6405],{},"python -m pip"," 优先指向 ",[63,6408,6317],{},[63,6410,6411],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6414,146],{"id":146},[37,6416,6417,6420],{},[40,6418,6419],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6421,3435,6422,6424],{},[63,6423,6317],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6426,157],{"id":157},[128,6428,6429,6435],{},[40,6430,6431,6432,330],{},"创建虚拟环境并记录激活前后的 ",[63,6433,6434],{},"which python",[40,6436,6437],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6439,172],{},[14,6441,175],{"id":175},[10,6443,6444],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,6446,1625],{},{"title":61,"searchDepth":75,"depth":75,"links":6448},[6449,6450,6451,6452,6453,6454,6455,6456],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6287,"description":6292},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[193,6464,228],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6467,"title":6468,"body":6469,"category":193,"cover":194,"description":6473,"extension":195,"meta":6661,"navigation":90,"path":6662,"pinned":198,"publishedAt":199,"seo":6663,"slug":6664,"stem":6665,"summary":6666,"tags":6667,"updatedAt":199,"visible":90,"__hash__":6670},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6470,"toc":6651},[6471,6474,6476,6479,6481,6487,6496,6498,6522,6524,6526,6579,6581,6587,6589,6591,6607,6609,6628,6630,6642,6644,6646,6649],[10,6472,6473],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6475,16],{"id":16},[10,6477,6478],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6480,22],{"id":22},[10,6482,6483],{},[26,6484],{"alt":6485,"src":6486},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6488,6489,6492,6493,6495],{},[63,6490,6491],{},"Path"," 使用 ",[63,6494,2403],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6497,35],{"id":35},[37,6499,6500,6503,6515],{},[40,6501,6502],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6504,6505,2224,6508,2224,6511,6514],{},[63,6506,6507],{},"exists()",[63,6509,6510],{},"is_file()",[63,6512,6513],{},"is_dir()"," 检查真实文件系统状态。",[40,6516,6517,6518,6521],{},"创建目录前明确目标；",[63,6519,6520],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6523,51],{"id":51},[10,6525,54],{},[56,6527,6529],{"className":58,"code":6528,"language":60,"meta":61,"style":61},"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",[63,6530,6531,6536,6540,6545,6550,6555,6559,6564,6569,6574],{"__ignoreMap":61},[66,6532,6533],{"class":68,"line":69},[66,6534,6535],{},"from pathlib import Path\n",[66,6537,6538],{"class":68,"line":75},[66,6539,91],{"emptyLinePlaceholder":90},[66,6541,6542],{"class":68,"line":81},[66,6543,6544],{},"project = Path.cwd()\n",[66,6546,6547],{"class":68,"line":87},[66,6548,6549],{},"data_dir = project \u002F \"data\"\n",[66,6551,6552],{"class":68,"line":94},[66,6553,6554],{},"file_path = data_dir \u002F \"records.json\"\n",[66,6556,6557],{"class":68,"line":100},[66,6558,91],{"emptyLinePlaceholder":90},[66,6560,6561],{"class":68,"line":106},[66,6562,6563],{},"print(project)\n",[66,6565,6566],{"class":68,"line":2461},[66,6567,6568],{},"print(file_path.name)\n",[66,6570,6571],{"class":68,"line":3921},[66,6572,6573],{},"print(file_path.suffix)\n",[66,6575,6576],{"class":68,"line":4133},[66,6577,6578],{},"print(file_path.exists())\n",[10,6580,112],{},[56,6582,6585],{"className":6583,"code":6584,"language":118,"meta":61},[116],"显示当前项目路径、records.json、.json 和存在状态\n",[63,6586,6584],{"__ignoreMap":61},[10,6588,123],{},[14,6590,126],{"id":126},[128,6592,6593,6599],{},[40,6594,6595,6598],{},[63,6596,6597],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6600,2306,6601,6603,6604,6606],{},[63,6602,2403],{}," 组合路径片段只创建新的 ",[63,6605,6491],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6608,146],{"id":146},[37,6610,6611,6619],{},[40,6612,3435,6613,6615,6616,6618],{},[63,6614,6491],{}," 对象存在当成真实文件存在，仍需调用 ",[63,6617,6507],{}," 等方法确认。",[40,6620,6621,6622,976,6624,6627],{},"手工拼接 ",[63,6623,2403],{},[63,6625,6626],{},"\\"," 分隔符，降低跨平台可读性。",[14,6629,157],{"id":157},[128,6631,6632,6639],{},[40,6633,6634,6635,6638],{},"组合 ",[63,6636,6637],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6640,6641],{},"输出路径的父目录、文件名和扩展名。",[10,6643,172],{},[14,6645,175],{"id":175},[10,6647,6648],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,6650,182],{},{"title":61,"searchDepth":75,"depth":75,"links":6652},[6653,6654,6655,6656,6657,6658,6659,6660],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6468,"description":6473},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[193,6668,6669],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6672,"title":6673,"body":6674,"category":193,"cover":194,"description":6678,"extension":195,"meta":6856,"navigation":90,"path":6857,"pinned":198,"publishedAt":199,"seo":6858,"slug":6859,"stem":6860,"summary":6861,"tags":6862,"updatedAt":199,"visible":90,"__hash__":6865},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6675,"toc":6846},[6676,6679,6681,6684,6686,6692,6695,6697,6725,6727,6729,6786,6788,6794,6796,6798,6809,6811,6824,6826,6837,6839,6841,6844],[10,6677,6678],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6680,16],{"id":16},[10,6682,6683],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6685,22],{"id":22},[10,6687,6688],{},[26,6689],{"alt":6690,"src":6691},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6693,6694],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6696,35],{"id":35},[37,6698,6699,6705,6714],{},[40,6700,6701,6704],{},[63,6702,6703],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6706,6707,6710,6711,330],{},[63,6708,6709],{},"r"," 模式读取不存在文件会产生 ",[63,6712,6713],{},"FileNotFoundError",[40,6715,6716,6717,6720,6721,6724],{},"本篇显式调用 ",[63,6718,6719],{},"close()","；第 34 篇会用 ",[63,6722,6723],{},"with"," 更可靠地管理关闭动作。",[14,6726,51],{"id":51},[10,6728,54],{},[56,6730,6732],{"className":58,"code":6731,"language":60,"meta":61,"style":61},"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",[63,6733,6734,6738,6742,6747,6752,6757,6762,6766,6771,6776,6781],{"__ignoreMap":61},[66,6735,6736],{"class":68,"line":69},[66,6737,6535],{},[66,6739,6740],{"class":68,"line":75},[66,6741,91],{"emptyLinePlaceholder":90},[66,6743,6744],{"class":68,"line":81},[66,6745,6746],{},"file_path = Path(\"notes.txt\")\n",[66,6748,6749],{"class":68,"line":87},[66,6750,6751],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[66,6753,6754],{"class":68,"line":94},[66,6755,6756],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[66,6758,6759],{"class":68,"line":100},[66,6760,6761],{},"writer.close()\n",[66,6763,6764],{"class":68,"line":106},[66,6765,91],{"emptyLinePlaceholder":90},[66,6767,6768],{"class":68,"line":2461},[66,6769,6770],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[66,6772,6773],{"class":68,"line":3921},[66,6774,6775],{},"content = reader.read()\n",[66,6777,6778],{"class":68,"line":4133},[66,6779,6780],{},"reader.close()\n",[66,6782,6783],{"class":68,"line":5761},[66,6784,6785],{},"print(content)\n",[10,6787,112],{},[56,6789,6792],{"className":6790,"code":6791,"language":118,"meta":61},[116],"变量\n循环\n函数\n",[63,6793,6791],{"__ignoreMap":61},[10,6795,123],{},[14,6797,126],{"id":126},[128,6799,6800,6806],{},[40,6801,6802,6803,6805],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[63,6804,6719],{}," 确保缓冲内容交给文件系统。",[40,6807,6808],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6810,146],{"id":146},[37,6812,6813,6818],{},[40,6814,2306,6815,6817],{},[63,6816,6703],{}," 模式打开重要文件却未确认覆盖风险。",[40,6819,6820,6821,330],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[63,6822,6823],{},"encoding=\"utf-8\"",[14,6825,157],{"id":157},[128,6827,6828,6831],{},[40,6829,6830],{},"写入三行学习记录并读取。",[40,6832,6833,6834,6836],{},"改用 ",[63,6835,304],{}," 模式追加一行，确认原内容仍保留。",[10,6838,172],{},[14,6840,175],{"id":175},[10,6842,6843],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,6845,182],{},{"title":61,"searchDepth":75,"depth":75,"links":6847},[6848,6849,6850,6851,6852,6853,6854,6855],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6673,"description":6678},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[193,6863,6864],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6867,"title":6868,"body":6869,"category":193,"cover":194,"description":6873,"extension":195,"meta":7040,"navigation":90,"path":7041,"pinned":198,"publishedAt":199,"seo":7042,"slug":7043,"stem":7044,"summary":7045,"tags":7046,"updatedAt":199,"visible":90,"__hash__":7049},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6870,"toc":7030},[6871,6874,6876,6879,6881,6887,6897,6899,6913,6915,6917,6977,6979,6985,6987,6989,7001,7003,7011,7013,7021,7023,7025,7028],[10,6872,6873],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6875,16],{"id":16},[10,6877,6878],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6880,22],{"id":22},[10,6882,6883],{},[26,6884],{"alt":6885,"src":6886},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6888,6889,6892,6893,6896],{},[63,6890,6891],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[63,6894,6895],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6898,35],{"id":35},[37,6900,6901,6904,6910],{},[40,6902,6903],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6905,6906,6909],{},[63,6907,6908],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6911,6912],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6914,51],{"id":51},[10,6916,54],{},[56,6918,6920],{"className":58,"code":6919,"language":60,"meta":61,"style":61},"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",[63,6921,6922,6927,6931,6936,6940,6945,6950,6954,6958,6963,6968,6972],{"__ignoreMap":61},[66,6923,6924],{"class":68,"line":69},[66,6925,6926],{},"import json\n",[66,6928,6929],{"class":68,"line":75},[66,6930,91],{"emptyLinePlaceholder":90},[66,6932,6933],{"class":68,"line":81},[66,6934,6935],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[66,6937,6938],{"class":68,"line":87},[66,6939,91],{"emptyLinePlaceholder":90},[66,6941,6942],{"class":68,"line":94},[66,6943,6944],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[66,6946,6947],{"class":68,"line":100},[66,6948,6949],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[66,6951,6952],{"class":68,"line":106},[66,6953,6761],{},[66,6955,6956],{"class":68,"line":2461},[66,6957,91],{"emptyLinePlaceholder":90},[66,6959,6960],{"class":68,"line":3921},[66,6961,6962],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[66,6964,6965],{"class":68,"line":4133},[66,6966,6967],{},"loaded = json.load(reader)\n",[66,6969,6970],{"class":68,"line":5761},[66,6971,6780],{},[66,6973,6974],{"class":68,"line":5766},[66,6975,6976],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6978,112],{},[56,6980,6983],{"className":6981,"code":6982,"language":118,"meta":61},[116],"Python 60\n",[63,6984,6982],{"__ignoreMap":61},[10,6986,123],{},[14,6988,126],{"id":126},[128,6990,6991,6996],{},[40,6992,6993,6995],{},[63,6994,6891],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,6997,6998,7000],{},[63,6999,6895],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7002,146],{"id":146},[37,7004,7005,7008],{},[40,7006,7007],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7009,7010],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7012,157],{"id":157},[128,7014,7015,7018],{},[40,7016,7017],{},"保存包含两条学习记录的列表。",[40,7019,7020],{},"读取后修改进度，再重新写回文件。",[10,7022,172],{},[14,7024,175],{"id":175},[10,7026,7027],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,7029,182],{},{"title":61,"searchDepth":75,"depth":75,"links":7031},[7032,7033,7034,7035,7036,7037,7038,7039],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6868,"description":6873},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[193,7047,7048],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7051,"title":7052,"body":7053,"category":193,"cover":194,"description":7057,"extension":195,"meta":7241,"navigation":90,"path":7242,"pinned":198,"publishedAt":199,"seo":7243,"slug":7244,"stem":7245,"summary":7246,"tags":7247,"updatedAt":199,"visible":90,"__hash__":7250},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7054,"toc":7231},[7055,7058,7060,7063,7065,7071,7077,7079,7101,7103,7105,7168,7170,7176,7178,7180,7196,7198,7212,7214,7222,7224,7226,7229],[10,7056,7057],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7059,16],{"id":16},[10,7061,7062],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7064,22],{"id":22},[10,7066,7067],{},[26,7068],{"alt":7069,"src":7070},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7072,7073,7076],{},[63,7074,7075],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7078,35],{"id":35},[37,7080,7081,7091,7098],{},[40,7082,2306,7083,7086,7087,7090],{},[63,7084,7085],{},"newline=\"\""," 让 ",[63,7088,7089],{},"csv"," 模块正确处理换行。",[40,7092,7093,7094,7097],{},"字段顺序由 ",[63,7095,7096],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7099,7100],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7102,51],{"id":51},[10,7104,54],{},[56,7106,7108],{"className":58,"code":7107,"language":60,"meta":61,"style":61},"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",[63,7109,7110,7115,7119,7124,7129,7134,7139,7144,7148,7153,7158,7163],{"__ignoreMap":61},[66,7111,7112],{"class":68,"line":69},[66,7113,7114],{},"import csv\n",[66,7116,7117],{"class":68,"line":75},[66,7118,91],{"emptyLinePlaceholder":90},[66,7120,7121],{"class":68,"line":81},[66,7122,7123],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[66,7125,7126],{"class":68,"line":87},[66,7127,7128],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[66,7130,7131],{"class":68,"line":94},[66,7132,7133],{},"writer.writeheader()\n",[66,7135,7136],{"class":68,"line":100},[66,7137,7138],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[66,7140,7141],{"class":68,"line":106},[66,7142,7143],{},"writer_file.close()\n",[66,7145,7146],{"class":68,"line":2461},[66,7147,91],{"emptyLinePlaceholder":90},[66,7149,7150],{"class":68,"line":3921},[66,7151,7152],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[66,7154,7155],{"class":68,"line":4133},[66,7156,7157],{},"for row in csv.DictReader(reader_file):\n",[66,7159,7160],{"class":68,"line":5761},[66,7161,7162],{},"    print(row[\"name\"], row[\"score\"])\n",[66,7164,7165],{"class":68,"line":5766},[66,7166,7167],{},"reader_file.close()\n",[10,7169,112],{},[56,7171,7174],{"className":7172,"code":7173,"language":118,"meta":61},[116],"小郑 95\n",[63,7175,7173],{"__ignoreMap":61},[10,7177,123],{},[14,7179,126],{"id":126},[128,7181,7182,7191],{},[40,7183,7184,7187,7188,7190],{},[63,7185,7186],{},"DictWriter"," 按 ",[63,7189,7096],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7192,7193,7195],{},[63,7194,7075],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7197,146],{"id":146},[37,7199,7200,7203],{},[40,7201,7202],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7204,7205,7206,7208,7209,7211],{},"在 macOS 以外环境忽略 ",[63,7207,7085],{}," 可能出现额外空行；统一交给 ",[63,7210,7089],{}," 模块管理换行。",[14,7213,157],{"id":157},[128,7215,7216,7219],{},[40,7217,7218],{},"写入三名学习者的课程和分数。",[40,7220,7221],{},"读取 CSV 后把分数字符串转换为整数。",[10,7223,172],{},[14,7225,175],{"id":175},[10,7227,7228],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,7230,182],{},{"title":61,"searchDepth":75,"depth":75,"links":7232},[7233,7234,7235,7236,7237,7238,7239,7240],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7052,"description":7057},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[193,7248,7249],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7252,"title":7253,"body":7254,"category":193,"cover":194,"description":7258,"extension":195,"meta":7531,"navigation":90,"path":7532,"pinned":198,"publishedAt":199,"seo":7533,"slug":7534,"stem":7535,"summary":7536,"tags":7537,"updatedAt":199,"visible":90,"__hash__":7540},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7255,"toc":7518},[7256,7259,7261,7264,7266,7272,7283,7285,7302,7304,7306,7381,7383,7389,7391,7393,7418,7420,7429,7435,7446,7448,7454,7460,7469,7471,7486,7488,7509,7511,7513,7516],[10,7257,7258],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7260,16],{"id":16},[10,7262,7263],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7265,22],{"id":22},[10,7267,7268],{},[26,7269],{"alt":7270,"src":7271},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7273,7274,7275,7278,7279,7282],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[63,7276,7277],{},"except","；无论是否异常，",[63,7280,7281],{},"finally"," 都会在离开结构前执行。",[14,7284,35],{"id":35},[37,7286,7287,7293,7299],{},[40,7288,7289,7290,7292],{},"只捕获能够处理的具体异常，不使用空的 ",[63,7291,7277],{}," 吞掉全部错误。",[40,7294,7295,7298],{},[63,7296,7297],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7300,7301],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7303,51],{"id":51},[10,7305,54],{},[56,7307,7309],{"className":58,"code":7308,"language":60,"meta":61,"style":61},"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",[63,7310,7311,7316,7321,7326,7331,7336,7340,7345,7350,7355,7360,7364,7369,7375],{"__ignoreMap":61},[66,7312,7313],{"class":68,"line":69},[66,7314,7315],{},"def parse_age(text):\n",[66,7317,7318],{"class":68,"line":75},[66,7319,7320],{},"    age = int(text)\n",[66,7322,7323],{"class":68,"line":81},[66,7324,7325],{},"    if age \u003C 0:\n",[66,7327,7328],{"class":68,"line":87},[66,7329,7330],{},"        raise ValueError(\"年龄不能为负数\")\n",[66,7332,7333],{"class":68,"line":94},[66,7334,7335],{},"    return age\n",[66,7337,7338],{"class":68,"line":100},[66,7339,91],{"emptyLinePlaceholder":90},[66,7341,7342],{"class":68,"line":106},[66,7343,7344],{},"try:\n",[66,7346,7347],{"class":68,"line":2461},[66,7348,7349],{},"    age = parse_age(\"18\")\n",[66,7351,7352],{"class":68,"line":3921},[66,7353,7354],{},"except ValueError as error:\n",[66,7356,7357],{"class":68,"line":4133},[66,7358,7359],{},"    print(\"输入错误：\", error)\n",[66,7361,7362],{"class":68,"line":5761},[66,7363,1113],{},[66,7365,7366],{"class":68,"line":5766},[66,7367,7368],{},"    print(\"年龄：\", age)\n",[66,7370,7372],{"class":68,"line":7371},13,[66,7373,7374],{},"finally:\n",[66,7376,7378],{"class":68,"line":7377},14,[66,7379,7380],{},"    print(\"处理结束\")\n",[10,7382,112],{},[56,7384,7387],{"className":7385,"code":7386,"language":118,"meta":61},[116],"年龄： 18\n处理结束\n",[63,7388,7386],{"__ignoreMap":61},[10,7390,123],{},[14,7392,126],{"id":126},[128,7394,7395,7407],{},[40,7396,7397,7399,7400,7402,7403,7406],{},[63,7398,3004],{}," 或主动 ",[63,7401,7297],{}," 都可能产生 ",[63,7404,7405],{},"ValueError","，控制流立即离开当前正常路径。",[40,7408,7409,7410,7412,7413,7415,7416,330],{},"有异常时进入匹配的 ",[63,7411,7277],{},"；没有异常时执行 ",[63,7414,1127],{},"；两种情况最后都会执行 ",[63,7417,7281],{},[296,7419,2665],{"id":2665},[10,7421,7422,2224,7424,1124,7426,7428],{},[63,7423,7277],{},[63,7425,1127],{},[63,7427,7281],{}," 的职责不同，不能只看它们出现的顺序。",[10,7430,7431],{},[26,7432],{"alt":7433,"src":7434},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7436,7437,7439,7440,7442,7443,7445],{},[63,7438,7277],{}," 处理匹配异常，",[63,7441,1127],{}," 只在无异常时运行，",[63,7444,7281],{}," 负责两条路径都需要的清理动作。",[296,7447,2665],{"id":4188},[10,7449,7450,7453],{},[63,7451,7452],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7455,7456],{},[26,7457],{"alt":7458,"src":7459},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7461,7462,7463,7465,7466,7468],{},"只把可能产生预期异常的操作放进 ",[63,7464,7452],{},"，后续正常业务放进 ",[63,7467,1127],{},"，错误边界会更清楚。",[14,7470,146],{"id":146},[37,7472,7473,7480],{},[40,7474,7475,7476,7479],{},"使用裸 ",[63,7477,7478],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7481,7482,7483,7485],{},"把整个程序包在一个巨大 ",[63,7484,7452],{}," 中，无法判断究竟哪一步允许失败。",[14,7487,157],{"id":157},[128,7489,7490,7503],{},[40,7491,7492,7493,7496,7497,1124,7500,330],{},"让 ",[63,7494,7495],{},"parse_age"," 分别处理 ",[63,7498,7499],{},"\"abc\"",[63,7501,7502],{},"\"-1\"",[40,7504,7505,7506,7508],{},"为文件读取捕获 ",[63,7507,6713],{}," 并给出清晰提示。",[10,7510,172],{},[14,7512,175],{"id":175},[10,7514,7515],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,7517,182],{},{"title":61,"searchDepth":75,"depth":75,"links":7519},[7520,7521,7522,7523,7524,7528,7529,7530],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":7525},[7526,7527],{"id":2665,"depth":81,"text":2665},{"id":4188,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7253,"description":7258},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[193,7538,7539],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7542,"title":7543,"body":7544,"category":193,"cover":194,"description":7548,"extension":195,"meta":7724,"navigation":90,"path":7725,"pinned":198,"publishedAt":199,"seo":7726,"slug":7727,"stem":7728,"summary":7729,"tags":7730,"updatedAt":199,"visible":90,"__hash__":7732},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7545,"toc":7714},[7546,7549,7551,7554,7556,7562,7568,7570,7586,7588,7590,7644,7646,7652,7654,7656,7669,7671,7684,7686,7705,7707,7709,7712],[10,7547,7548],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7550,16],{"id":16},[10,7552,7553],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7555,22],{"id":22},[10,7557,7558],{},[26,7559],{"alt":7560,"src":7561},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7563,7564,7565,7567],{},"进入 ",[63,7566,6723],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7569,35],{"id":35},[37,7571,7572,7577,7583],{},[40,7573,7574,7576],{},[63,7575,6723],{}," 把资源获取和释放配成一个清晰边界。",[40,7578,7579,7582],{},[63,7580,7581],{},"as file"," 得到的是上下文返回的资源对象。",[40,7584,7585],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7587,51],{"id":51},[10,7589,54],{},[56,7591,7593],{"className":58,"code":7592,"language":60,"meta":61,"style":61},"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",[63,7594,7595,7599,7603,7607,7611,7616,7621,7625,7630,7635,7639],{"__ignoreMap":61},[66,7596,7597],{"class":68,"line":69},[66,7598,6535],{},[66,7600,7601],{"class":68,"line":75},[66,7602,91],{"emptyLinePlaceholder":90},[66,7604,7605],{"class":68,"line":81},[66,7606,6746],{},[66,7608,7609],{"class":68,"line":87},[66,7610,91],{"emptyLinePlaceholder":90},[66,7612,7613],{"class":68,"line":94},[66,7614,7615],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[66,7617,7618],{"class":68,"line":100},[66,7619,7620],{},"    file.write(\"上下文管理器\\n\")\n",[66,7622,7623],{"class":68,"line":106},[66,7624,91],{"emptyLinePlaceholder":90},[66,7626,7627],{"class":68,"line":2461},[66,7628,7629],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[66,7631,7632],{"class":68,"line":3921},[66,7633,7634],{},"    print(file.read())\n",[66,7636,7637],{"class":68,"line":4133},[66,7638,91],{"emptyLinePlaceholder":90},[66,7640,7641],{"class":68,"line":5761},[66,7642,7643],{},"print(file.closed)\n",[10,7645,112],{},[56,7647,7650],{"className":7648,"code":7649,"language":118,"meta":61},[116],"上下文管理器\n\nTrue\n",[63,7651,7649],{"__ignoreMap":61},[10,7653,123],{},[14,7655,126],{"id":126},[128,7657,7658,7666],{},[40,7659,7564,7660,7662,7663,330],{},[63,7661,6723],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[63,7664,7665],{},"file",[40,7667,7668],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7670,146],{"id":146},[37,7672,7673,7678],{},[40,7674,4756,7675,7677],{},[63,7676,6723],{}," 代码块外继续读写已经关闭的文件对象。",[40,7679,7680,7681,7683],{},"误以为 ",[63,7682,6723],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7685,157],{"id":157},[128,7687,7688,7697],{},[40,7689,7690,7691,7694,7695,330],{},"把第 30 篇的手动 ",[63,7692,7693],{},"open\u002Fclose"," 改写为 ",[63,7696,6723],{},[40,7698,4756,7699,7701,7702,330],{},[63,7700,6723],{}," 块后检查 ",[63,7703,7704],{},"file.closed",[10,7706,172],{},[14,7708,175],{"id":175},[10,7710,7711],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,7713,182],{},{"title":61,"searchDepth":75,"depth":75,"links":7715},[7716,7717,7718,7719,7720,7721,7722,7723],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7543,"description":7548},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[193,6723,7731],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7734,"title":7735,"body":7736,"category":193,"cover":194,"description":7740,"extension":195,"meta":7952,"navigation":90,"path":7953,"pinned":198,"publishedAt":199,"seo":7954,"slug":7955,"stem":7956,"summary":7957,"tags":7958,"updatedAt":199,"visible":90,"__hash__":7961},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7737,"toc":7940},[7738,7741,7743,7746,7748,7754,7757,7759,7776,7778,7780,7848,7850,7856,7858,7860,7885,7887,7890,7896,7905,7907,7918,7920,7931,7933,7935,7938],[10,7739,7740],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7742,16],{"id":16},[10,7744,7745],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7747,22],{"id":22},[10,7749,7750],{},[26,7751],{"alt":7752,"src":7753},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7755,7756],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7758,35],{"id":35},[37,7760,7761,7767,7773],{},[40,7762,7763,7766],{},[63,7764,7765],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7768,7769,7772],{},[63,7770,7771],{},"__init__"," 在实例创建过程中初始化属性。",[40,7774,7775],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7777,51],{"id":51},[10,7779,54],{},[56,7781,7783],{"className":58,"code":7782,"language":60,"meta":61,"style":61},"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",[63,7784,7785,7790,7795,7800,7805,7809,7814,7819,7824,7829,7833,7838,7843],{"__ignoreMap":61},[66,7786,7787],{"class":68,"line":69},[66,7788,7789],{},"class LearningRecord:\n",[66,7791,7792],{"class":68,"line":75},[66,7793,7794],{},"    def __init__(self, course, progress=0):\n",[66,7796,7797],{"class":68,"line":81},[66,7798,7799],{},"        self.course = course\n",[66,7801,7802],{"class":68,"line":87},[66,7803,7804],{},"        self.progress = progress\n",[66,7806,7807],{"class":68,"line":94},[66,7808,91],{"emptyLinePlaceholder":90},[66,7810,7811],{"class":68,"line":100},[66,7812,7813],{},"    def advance(self, amount):\n",[66,7815,7816],{"class":68,"line":106},[66,7817,7818],{},"        self.progress = self.progress + amount\n",[66,7820,7821],{"class":68,"line":2461},[66,7822,7823],{},"        if self.progress > 100:\n",[66,7825,7826],{"class":68,"line":3921},[66,7827,7828],{},"            self.progress = 100\n",[66,7830,7831],{"class":68,"line":4133},[66,7832,91],{"emptyLinePlaceholder":90},[66,7834,7835],{"class":68,"line":5761},[66,7836,7837],{},"record = LearningRecord(\"Python\", 40)\n",[66,7839,7840],{"class":68,"line":5766},[66,7841,7842],{},"record.advance(15)\n",[66,7844,7845],{"class":68,"line":7371},[66,7846,7847],{},"print(record.course, record.progress)\n",[10,7849,112],{},[56,7851,7854],{"className":7852,"code":7853,"language":118,"meta":61},[116],"Python 55\n",[63,7855,7853],{"__ignoreMap":61},[10,7857,123],{},[14,7859,126],{"id":126},[128,7861,7862,7872],{},[40,7863,7864,7865,7868,7869,7871],{},"调用 ",[63,7866,7867],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[63,7870,7771],{}," 把课程和进度保存在该实例属性中。",[40,7873,7874,7877,7878,7881,7882,7884],{},[63,7875,7876],{},"record.advance(15)"," 自动把 ",[63,7879,7880],{},"record"," 作为 ",[63,7883,7765],{},"，方法更新同一实例的进度并限制上限。",[296,7886,2665],{"id":2665},[10,7888,7889],{},"类是共同定义，实例则各自保存状态。",[10,7891,7892],{},[26,7893],{"alt":7894,"src":7895},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7897,7898,7899,1124,7901,7904],{},"两个实例共享同一套方法定义，但 ",[63,7900,4553],{},[63,7902,7903],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7906,146],{"id":146},[37,7908,7909,7915],{},[40,7910,7911,7912,7914],{},"调用实例方法时手工再传一次 ",[63,7913,7765],{},"。通过实例调用时 Python 会自动绑定。",[40,7916,7917],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7919,157],{"id":157},[128,7921,7922,7928],{},[40,7923,162,7924,7927],{},[63,7925,7926],{},"Book"," 类，保存标题和阅读页数。",[40,7929,7930],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7932,172],{},[14,7934,175],{"id":175},[10,7936,7937],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,7939,182],{},{"title":61,"searchDepth":75,"depth":75,"links":7941},[7942,7943,7944,7945,7946,7949,7950,7951],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":7947},[7948],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7735,"description":7740},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[193,7959,7960],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7963,"title":7964,"body":7965,"category":193,"cover":194,"description":7969,"extension":195,"meta":8147,"navigation":90,"path":8148,"pinned":198,"publishedAt":199,"seo":8149,"slug":8150,"stem":8151,"summary":8152,"tags":8153,"updatedAt":199,"visible":90,"__hash__":8156},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7966,"toc":8137},[7967,7970,7972,7975,7977,7983,7986,7988,7999,8001,8003,8070,8072,8078,8080,8082,8101,8103,8111,8113,8128,8130,8132,8135],[10,7968,7969],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7971,16],{"id":16},[10,7973,7974],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7976,22],{"id":22},[10,7978,7979],{},[26,7980],{"alt":7981,"src":7982},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7984,7985],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7987,35],{"id":35},[37,7989,7990,7993,7996],{},[40,7991,7992],{},"封装让对象通过方法维护自己的有效状态。",[40,7994,7995],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,7997,7998],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8000,51],{"id":51},[10,8002,54],{},[56,8004,8006],{"className":58,"code":8005,"language":60,"meta":61,"style":61},"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",[63,8007,8008,8013,8018,8023,8027,8032,8037,8042,8046,8051,8056,8060,8065],{"__ignoreMap":61},[66,8009,8010],{"class":68,"line":69},[66,8011,8012],{},"class Storage:\n",[66,8014,8015],{"class":68,"line":75},[66,8016,8017],{},"    def save(self, text):\n",[66,8019,8020],{"class":68,"line":81},[66,8021,8022],{},"        print(\"保存：\", text)\n",[66,8024,8025],{"class":68,"line":87},[66,8026,91],{"emptyLinePlaceholder":90},[66,8028,8029],{"class":68,"line":94},[66,8030,8031],{},"class LearningService:\n",[66,8033,8034],{"class":68,"line":100},[66,8035,8036],{},"    def __init__(self, storage):\n",[66,8038,8039],{"class":68,"line":106},[66,8040,8041],{},"        self.storage = storage\n",[66,8043,8044],{"class":68,"line":2461},[66,8045,91],{"emptyLinePlaceholder":90},[66,8047,8048],{"class":68,"line":3921},[66,8049,8050],{},"    def finish_lesson(self, title):\n",[66,8052,8053],{"class":68,"line":4133},[66,8054,8055],{},"        self.storage.save(title)\n",[66,8057,8058],{"class":68,"line":5761},[66,8059,91],{"emptyLinePlaceholder":90},[66,8061,8062],{"class":68,"line":5766},[66,8063,8064],{},"service = LearningService(Storage())\n",[66,8066,8067],{"class":68,"line":7371},[66,8068,8069],{},"service.finish_lesson(\"异常处理\")\n",[10,8071,112],{},[56,8073,8076],{"className":8074,"code":8075,"language":118,"meta":61},[116],"保存： 异常处理\n",[63,8077,8075],{"__ignoreMap":61},[10,8079,123],{},[14,8081,126],{"id":126},[128,8083,8084,8094],{},[40,8085,8086,8089,8090,8093],{},[63,8087,8088],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[63,8091,8092],{},"save()"," 的协作对象。",[40,8095,8096,8097,8100],{},"调用业务方法时，服务把保存动作委托给 ",[63,8098,8099],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8102,146],{"id":146},[37,8104,8105,8108],{},[40,8106,8107],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8109,8110],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8112,157],{"id":157},[128,8114,8115,8125],{},[40,8116,8117,8118,8121,8122,330],{},"用组合让 ",[63,8119,8120],{},"OrderService"," 使用一个 ",[63,8123,8124],{},"Notifier",[40,8126,8127],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8129,172],{},[14,8131,175],{"id":175},[10,8133,8134],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,8136,182],{},{"title":61,"searchDepth":75,"depth":75,"links":8138},[8139,8140,8141,8142,8143,8144,8145,8146],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7964,"description":7969},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[193,8154,8155],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8158,"title":8159,"body":8160,"category":193,"cover":194,"description":8164,"extension":195,"meta":8367,"navigation":90,"path":8368,"pinned":198,"publishedAt":199,"seo":8369,"slug":8370,"stem":8371,"summary":8372,"tags":8373,"updatedAt":199,"visible":90,"__hash__":8376},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8161,"toc":8355},[8162,8165,8167,8170,8172,8178,8185,8187,8212,8214,8216,8268,8270,8276,8278,8280,8301,8303,8309,8315,8321,8323,8331,8333,8346,8348,8350,8353],[10,8163,8164],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8166,16],{"id":16},[10,8168,8169],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8171,22],{"id":22},[10,8173,8174],{},[26,8175],{"alt":8176,"src":8177},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8179,8180,8181,8184],{},"生成器运行到 ",[63,8182,8183],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8186,35],{"id":35},[37,8188,8189,8199,8209],{},[40,8190,8191,8194,8195,8198],{},[63,8192,8193],{},"iter()"," 从可迭代对象取得迭代器，",[63,8196,8197],{},"next()"," 请求下一个值。",[40,8200,8201,8202,8205,8206,8208],{},"没有更多值时迭代器抛出 ",[63,8203,8204],{},"StopIteration","，",[63,8207,4307],{}," 会自动处理。",[40,8210,8211],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8213,51],{"id":51},[10,8215,54],{},[56,8217,8219],{"className":58,"code":8218,"language":60,"meta":61,"style":61},"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",[63,8220,8221,8226,8231,8236,8241,8246,8250,8255,8260,8264],{"__ignoreMap":61},[66,8222,8223],{"class":68,"line":69},[66,8224,8225],{},"def countdown(start):\n",[66,8227,8228],{"class":68,"line":75},[66,8229,8230],{},"    current = start\n",[66,8232,8233],{"class":68,"line":81},[66,8234,8235],{},"    while current > 0:\n",[66,8237,8238],{"class":68,"line":87},[66,8239,8240],{},"        yield current\n",[66,8242,8243],{"class":68,"line":94},[66,8244,8245],{},"        current = current - 1\n",[66,8247,8248],{"class":68,"line":100},[66,8249,91],{"emptyLinePlaceholder":90},[66,8251,8252],{"class":68,"line":106},[66,8253,8254],{},"iterator = countdown(3)\n",[66,8256,8257],{"class":68,"line":2461},[66,8258,8259],{},"print(next(iterator))\n",[66,8261,8262],{"class":68,"line":3921},[66,8263,8259],{},[66,8265,8266],{"class":68,"line":4133},[66,8267,8259],{},[10,8269,112],{},[56,8271,8274],{"className":8272,"code":8273,"language":118,"meta":61},[116],"3\n2\n1\n",[63,8275,8273],{"__ignoreMap":61},[10,8277,123],{},[14,8279,126],{"id":126},[128,8281,8282,8288],{},[40,8283,7864,8284,8287],{},[63,8285,8286],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8289,8290,8291,8293,8294,8296,8297,8300],{},"每次 ",[63,8292,8197],{}," 运行到下一个 ",[63,8295,8183],{}," 并暂停，局部变量 ",[63,8298,8299],{},"current"," 和执行位置被保留。",[296,8302,2665],{"id":2665},[10,8304,8305,8306,8308],{},"生成器的暂停位置可以展开成多次 ",[63,8307,8197],{}," 的时间线。",[10,8310,8311],{},[26,8312],{"alt":8313,"src":8314},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8316,8317,8318,8320],{},"每次请求只推进到下一个 ",[63,8319,8183],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8322,146],{"id":146},[37,8324,8325,8328],{},[40,8326,8327],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8329,8330],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8332,157],{"id":157},[128,8334,8335,8338],{},[40,8336,8337],{},"编写产生 1 到指定上限偶数的生成器。",[40,8339,3979,8340,8342,8343,8345],{},[63,8341,4307],{}," 遍历生成器，比较手动 ",[63,8344,8197],{}," 的差异。",[10,8347,172],{},[14,8349,175],{"id":175},[10,8351,8352],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,8354,182],{},{"title":61,"searchDepth":75,"depth":75,"links":8356},[8357,8358,8359,8360,8361,8364,8365,8366],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":8362},[8363],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8159,"description":8164},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[193,8374,8375],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8378,"title":8379,"body":8380,"category":193,"cover":194,"description":8384,"extension":195,"meta":8608,"navigation":90,"path":8609,"pinned":198,"publishedAt":199,"seo":8610,"slug":8611,"stem":8612,"summary":8613,"tags":8614,"updatedAt":199,"visible":90,"__hash__":8616},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8381,"toc":8596},[8382,8385,8387,8390,8392,8398,8401,8403,8423,8425,8427,8509,8511,8517,8519,8521,8543,8545,8548,8554,8561,8563,8573,8575,8587,8589,8591,8594],[10,8383,8384],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8386,16],{"id":16},[10,8388,8389],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8391,22],{"id":22},[10,8393,8394],{},[26,8395],{"alt":8396,"src":8397},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8399,8400],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8402,35],{"id":35},[37,8404,8405,8414,8417],{},[40,8406,8407,8410,8411,330],{},[63,8408,8409],{},"@trace"," 等价于 ",[63,8412,8413],{},"add = trace(add)",[40,8415,8416],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8418,8419,8422],{},[63,8420,8421],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8424,51],{"id":51},[10,8426,54],{},[56,8428,8430],{"className":58,"code":8429,"language":60,"meta":61,"style":61},"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",[63,8431,8432,8437,8441,8446,8451,8456,8461,8466,8471,8476,8481,8485,8490,8494,8498,8503],{"__ignoreMap":61},[66,8433,8434],{"class":68,"line":69},[66,8435,8436],{},"from functools import wraps\n",[66,8438,8439],{"class":68,"line":75},[66,8440,91],{"emptyLinePlaceholder":90},[66,8442,8443],{"class":68,"line":81},[66,8444,8445],{},"def trace(function):\n",[66,8447,8448],{"class":68,"line":87},[66,8449,8450],{},"    @wraps(function)\n",[66,8452,8453],{"class":68,"line":94},[66,8454,8455],{},"    def wrapper(*args, **kwargs):\n",[66,8457,8458],{"class":68,"line":100},[66,8459,8460],{},"        print(\"开始：\", function.__name__)\n",[66,8462,8463],{"class":68,"line":106},[66,8464,8465],{},"        result = function(*args, **kwargs)\n",[66,8467,8468],{"class":68,"line":2461},[66,8469,8470],{},"        print(\"结束：\", function.__name__)\n",[66,8472,8473],{"class":68,"line":3921},[66,8474,8475],{},"        return result\n",[66,8477,8478],{"class":68,"line":4133},[66,8479,8480],{},"    return wrapper\n",[66,8482,8483],{"class":68,"line":5761},[66,8484,91],{"emptyLinePlaceholder":90},[66,8486,8487],{"class":68,"line":5766},[66,8488,8489],{},"@trace\n",[66,8491,8492],{"class":68,"line":7371},[66,8493,6114],{},[66,8495,8496],{"class":68,"line":7377},[66,8497,6119],{},[66,8499,8501],{"class":68,"line":8500},15,[66,8502,91],{"emptyLinePlaceholder":90},[66,8504,8506],{"class":68,"line":8505},16,[66,8507,8508],{},"print(add(2, 3))\n",[10,8510,112],{},[56,8512,8515],{"className":8513,"code":8514,"language":118,"meta":61},[116],"开始： add\n结束： add\n5\n",[63,8516,8514],{"__ignoreMap":61},[10,8518,123],{},[14,8520,126],{"id":126},[128,8522,8523,8540],{},[40,8524,8525,8526,8529,8530,8533,8534,8537,8538,330],{},"解释器执行定义时，把原 ",[63,8527,8528],{},"add"," 函数交给 ",[63,8531,8532],{},"trace","，返回的 ",[63,8535,8536],{},"wrapper"," 重新绑定到名字 ",[63,8539,8528],{},[40,8541,8542],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[296,8544,2665],{"id":2665},[10,8546,8547],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8549,8550],{},[26,8551],{"alt":8552,"src":8553},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8555,8556,8558,8559,330],{},[63,8557,8409],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[63,8560,8413],{},[14,8562,146],{"id":146},[37,8564,8565,8570],{},[40,8566,8567,8568,330],{},"包装函数忘记返回原函数结果，调用方得到 ",[63,8569,5312],{},[40,8571,8572],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8574,157],{"id":157},[128,8576,8577,8580],{},[40,8578,8579],{},"编写只记录调用次数的简单装饰器。",[40,8581,8582,8583,8586],{},"删除包装函数的 ",[63,8584,8585],{},"return result","，观察调用方得到什么。",[10,8588,172],{},[14,8590,175],{"id":175},[10,8592,8593],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,8595,182],{},{"title":61,"searchDepth":75,"depth":75,"links":8597},[8598,8599,8600,8601,8602,8605,8606,8607],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":8603},[8604],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8379,"description":8384},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[193,8615,205],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8618,"title":8619,"body":8620,"category":193,"cover":194,"description":8624,"extension":195,"meta":8811,"navigation":90,"path":8812,"pinned":198,"publishedAt":199,"seo":8813,"slug":8814,"stem":8815,"summary":8816,"tags":8817,"updatedAt":199,"visible":90,"__hash__":8820},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8621,"toc":8799},[8622,8625,8627,8630,8632,8638,8641,8643,8654,8656,8658,8733,8735,8741,8743,8745,8756,8758,8761,8767,8770,8772,8780,8782,8790,8792,8794,8797],[10,8623,8624],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8626,16],{"id":16},[10,8628,8629],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8631,22],{"id":22},[10,8633,8634],{},[26,8635],{"alt":8636,"src":8637},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8639,8640],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8642,35],{"id":35},[37,8644,8645,8648,8651],{},[40,8646,8647],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8649,8650],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8652,8653],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8655,51],{"id":51},[10,8657,54],{},[56,8659,8661],{"className":58,"code":8660,"language":60,"meta":61,"style":61},"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",[63,8662,8663,8668,8673,8677,8682,8686,8691,8696,8701,8705,8710,8715,8720,8724,8728],{"__ignoreMap":61},[66,8664,8665],{"class":68,"line":69},[66,8666,8667],{},"import logging\n",[66,8669,8670],{"class":68,"line":75},[66,8671,8672],{},"import unittest\n",[66,8674,8675],{"class":68,"line":81},[66,8676,91],{"emptyLinePlaceholder":90},[66,8678,8679],{"class":68,"line":87},[66,8680,8681],{},"logging.basicConfig(level=logging.INFO)\n",[66,8683,8684],{"class":68,"line":94},[66,8685,91],{"emptyLinePlaceholder":90},[66,8687,8688],{"class":68,"line":100},[66,8689,8690],{},"def clamp_progress(value):\n",[66,8692,8693],{"class":68,"line":106},[66,8694,8695],{},"    logging.info(\"检查进度：%s\", value)\n",[66,8697,8698],{"class":68,"line":2461},[66,8699,8700],{},"    return max(0, min(100, value))\n",[66,8702,8703],{"class":68,"line":3921},[66,8704,91],{"emptyLinePlaceholder":90},[66,8706,8707],{"class":68,"line":4133},[66,8708,8709],{},"class ProgressTest(unittest.TestCase):\n",[66,8711,8712],{"class":68,"line":5761},[66,8713,8714],{},"    def test_upper_limit(self):\n",[66,8716,8717],{"class":68,"line":5766},[66,8718,8719],{},"        self.assertEqual(clamp_progress(120), 100)\n",[66,8721,8722],{"class":68,"line":7371},[66,8723,91],{"emptyLinePlaceholder":90},[66,8725,8726],{"class":68,"line":7377},[66,8727,6128],{},[66,8729,8730],{"class":68,"line":8500},[66,8731,8732],{},"    unittest.main()\n",[10,8734,112],{},[56,8736,8739],{"className":8737,"code":8738,"language":118,"meta":61},[116],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[63,8740,8738],{"__ignoreMap":61},[10,8742,123],{},[14,8744,126],{"id":126},[128,8746,8747,8753],{},[40,8748,8749,8752],{},[63,8750,8751],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8754,8755],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[296,8757,2665],{"id":2665},[10,8759,8760],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8762,8763],{},[26,8764],{"alt":8765,"src":8766},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8768,8769],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8771,146],{"id":146},[37,8773,8774,8777],{},[40,8775,8776],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8778,8779],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8781,157],{"id":157},[128,8783,8784,8787],{},[40,8785,8786],{},"为负数进度增加测试。",[40,8788,8789],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8791,172],{},[14,8793,175],{"id":175},[10,8795,8796],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,8798,182],{},{"title":61,"searchDepth":75,"depth":75,"links":8800},[8801,8802,8803,8804,8805,8808,8809,8810],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":8806},[8807],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8619,"description":8624},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[193,8818,8819],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8822,"title":8823,"body":8824,"category":193,"cover":194,"description":8828,"extension":195,"meta":9128,"navigation":90,"path":9129,"pinned":198,"publishedAt":199,"seo":9130,"slug":9131,"stem":9132,"summary":9133,"tags":9134,"updatedAt":199,"visible":90,"__hash__":9137},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8825,"toc":9115},[8826,8829,8831,8834,8836,8842,8845,8847,8862,8864,8866,9013,9015,9021,9023,9025,9038,9040,9043,9049,9052,9054,9057,9063,9070,9072,9083,9085,9106,9108,9110,9113],[10,8827,8828],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8830,16],{"id":16},[10,8832,8833],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8835,22],{"id":22},[10,8837,8838],{},[26,8839],{"alt":8840,"src":8841},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8843,8844],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8846,35],{"id":35},[37,8848,8849,8852,8855],{},[40,8850,8851],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8853,8854],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8856,8857,8858,8861],{},"实际扩展前先为 ",[63,8859,8860],{},"add()"," 和存储边界补充测试。",[14,8863,51],{"id":51},[10,8865,54],{},[56,8867,8869],{"className":58,"code":8868,"language":60,"meta":61,"style":61},"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",[63,8870,8871,8875,8879,8883,8888,8893,8898,8903,8907,8912,8917,8922,8927,8932,8936,8941,8946,8952,8957,8963,8968,8973,8979,8985,8991,8996,9002,9007],{"__ignoreMap":61},[66,8872,8873],{"class":68,"line":69},[66,8874,6926],{},[66,8876,8877],{"class":68,"line":75},[66,8878,6535],{},[66,8880,8881],{"class":68,"line":81},[66,8882,91],{"emptyLinePlaceholder":90},[66,8884,8885],{"class":68,"line":87},[66,8886,8887],{},"class LearningRecords:\n",[66,8889,8890],{"class":68,"line":94},[66,8891,8892],{},"    def __init__(self, file_path):\n",[66,8894,8895],{"class":68,"line":100},[66,8896,8897],{},"        self.file_path = Path(file_path)\n",[66,8899,8900],{"class":68,"line":106},[66,8901,8902],{},"        self.items = []\n",[66,8904,8905],{"class":68,"line":2461},[66,8906,91],{"emptyLinePlaceholder":90},[66,8908,8909],{"class":68,"line":3921},[66,8910,8911],{},"    def add(self, title):\n",[66,8913,8914],{"class":68,"line":4133},[66,8915,8916],{},"        title = title.strip()\n",[66,8918,8919],{"class":68,"line":5761},[66,8920,8921],{},"        if not title:\n",[66,8923,8924],{"class":68,"line":5766},[66,8925,8926],{},"            raise ValueError(\"课程名称不能为空\")\n",[66,8928,8929],{"class":68,"line":7371},[66,8930,8931],{},"        self.items.append({\"title\": title, \"done\": False})\n",[66,8933,8934],{"class":68,"line":7377},[66,8935,91],{"emptyLinePlaceholder":90},[66,8937,8938],{"class":68,"line":8500},[66,8939,8940],{},"    def save(self):\n",[66,8942,8943],{"class":68,"line":8505},[66,8944,8945],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[66,8947,8949],{"class":68,"line":8948},17,[66,8950,8951],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[66,8953,8955],{"class":68,"line":8954},18,[66,8956,91],{"emptyLinePlaceholder":90},[66,8958,8960],{"class":68,"line":8959},19,[66,8961,8962],{},"records = LearningRecords(\"learning-records.json\")\n",[66,8964,8966],{"class":68,"line":8965},20,[66,8967,91],{"emptyLinePlaceholder":90},[66,8969,8971],{"class":68,"line":8970},21,[66,8972,7344],{},[66,8974,8976],{"class":68,"line":8975},22,[66,8977,8978],{},"    title = input(\"输入已学习课程：\")\n",[66,8980,8982],{"class":68,"line":8981},23,[66,8983,8984],{},"    records.add(title)\n",[66,8986,8988],{"class":68,"line":8987},24,[66,8989,8990],{},"    records.save()\n",[66,8992,8994],{"class":68,"line":8993},25,[66,8995,7354],{},[66,8997,8999],{"class":68,"line":8998},26,[66,9000,9001],{},"    print(\"无法保存：\", error)\n",[66,9003,9005],{"class":68,"line":9004},27,[66,9006,1113],{},[66,9008,9010],{"class":68,"line":9009},28,[66,9011,9012],{},"    print(\"已保存 1 条学习记录\")\n",[10,9014,112],{},[56,9016,9019],{"className":9017,"code":9018,"language":118,"meta":61},[116],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[63,9020,9018],{"__ignoreMap":61},[10,9022,123],{},[14,9024,126],{"id":126},[128,9026,9027,9033],{},[40,9028,9029,9030,9032],{},"输入层取得课程名后，",[63,9031,8860],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9034,9035,9037],{},[63,9036,8092],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[296,9039,2665],{"id":2665},[10,9041,9042],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9044,9045],{},[26,9046],{"alt":9047,"src":9048},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9050,9051],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[296,9053,2665],{"id":4188},[10,9055,9056],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9058,9059],{},[26,9060],{"alt":9061,"src":9062},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9064,9065,9066,9069],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[63,9067,9068],{},"load()"," 把文件状态恢复到内存。",[14,9071,146],{"id":146},[37,9073,9074,9077],{},[40,9075,9076],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9078,9079,9080,9082],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[63,9081,9068],{}," 是下一项必要扩展。",[14,9084,157],{"id":157},[128,9086,9087,9093,9096],{},[40,9088,9089,9090,9092],{},"增加 ",[63,9091,9068],{},"，文件不存在时从空列表开始。",[40,9094,9095],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9097,9098,9099,9102,9103,9105],{},"把输入循环放进 ",[63,9100,9101],{},"main()","，通过 ",[63,9104,6070],{}," 控制程序入口。",[10,9107,172],{},[14,9109,175],{"id":175},[10,9111,9112],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[180,9114,182],{},{"title":61,"searchDepth":75,"depth":75,"links":9116},[9117,9118,9119,9120,9121,9125,9126,9127],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":9122},[9123,9124],{"id":2665,"depth":81,"text":2665},{"id":4188,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8823,"description":8828},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[193,9135,9136],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9139,9242,9361,9492,9635,9760,9897,10034,10175,10344,10481,10614,10737,10866,10993,11156,11332,11473,11602,11751,11894,12015,12138,12287,12440,12605,12732,12913,13056,13213,13364,13511,13666,13884,14039,14214,14365,14532,14719,14882,15124,15364],{"id":1360,"title":1361,"body":9140,"category":193,"cover":194,"description":1366,"extension":195,"meta":9239,"navigation":90,"path":1485,"pinned":198,"publishedAt":199,"seo":9240,"slug":1487,"stem":1488,"summary":1489,"tags":9241,"updatedAt":199,"visible":90,"__hash__":1492},{"type":7,"value":9141,"toc":9229},[9142,9144,9146,9148,9150,9154,9158,9160,9170,9172,9174,9182,9184,9189,9191,9193,9203,9205,9213,9215,9221,9223,9225,9227],[10,9143,1366],{},[14,9145,16],{"id":16},[10,9147,1371],{},[14,9149,22],{"id":22},[10,9151,9152],{},[26,9153],{"alt":1378,"src":1379},[10,9155,9156,1384],{},[63,9157,1138],{},[14,9159,35],{"id":35},[37,9161,9162,9166,9168],{},[40,9163,1391,9164,1394],{},[63,9165,1138],{},[40,9167,1397],{},[40,9169,1400],{},[14,9171,51],{"id":51},[10,9173,54],{},[56,9175,9176],{"className":58,"code":1407,"language":60,"meta":61,"style":61},[63,9177,9178],{"__ignoreMap":61},[66,9179,9180],{"class":68,"line":69},[66,9181,1407],{},[10,9183,112],{},[56,9185,9187],{"className":9186,"code":1419,"language":118,"meta":61},[116],[63,9188,1419],{"__ignoreMap":61},[10,9190,123],{},[14,9192,126],{"id":126},[128,9194,9195,9199],{},[40,9196,1430,9197,1434],{},[63,9198,1433],{},[40,9200,1437,9201,1441],{},[63,9202,1440],{},[14,9204,146],{"id":146},[37,9206,9207,9209],{},[40,9208,1448],{},[40,9210,1451,9211,1454],{},[63,9212,1138],{},[14,9214,157],{"id":157},[128,9216,9217,9219],{},[40,9218,1461],{},[40,9220,1464],{},[10,9222,172],{},[14,9224,175],{"id":175},[10,9226,1471],{},[180,9228,182],{},{"title":61,"searchDepth":75,"depth":75,"links":9230},[9231,9232,9233,9234,9235,9236,9237,9238],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":1361,"description":1366},[193,1356,1491],{"id":1494,"title":1495,"body":9243,"category":193,"cover":194,"description":1500,"extension":195,"meta":9358,"navigation":90,"path":1637,"pinned":198,"publishedAt":199,"seo":9359,"slug":1639,"stem":1640,"summary":1641,"tags":9360,"updatedAt":199,"visible":90,"__hash__":1644},{"type":7,"value":9244,"toc":9348},[9245,9247,9249,9251,9253,9257,9261,9263,9273,9275,9277,9297,9299,9304,9306,9308,9318,9320,9330,9332,9340,9342,9344,9346],[10,9246,1500],{},[14,9248,16],{"id":16},[10,9250,1505],{},[14,9252,22],{"id":22},[10,9254,9255],{},[26,9256],{"alt":1512,"src":1513},[10,9258,1516,9259,1519],{},[63,9260,659],{},[14,9262,35],{"id":35},[37,9264,9265,9267,9269],{},[40,9266,1526],{},[40,9268,1529],{},[40,9270,1532,9271,1536],{},[63,9272,1535],{},[14,9274,51],{"id":51},[10,9276,1541],{},[56,9278,9279],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,9280,9281,9287],{"__ignoreMap":61},[66,9282,9283,9285],{"class":68,"line":69},[66,9284,659],{"class":568},[66,9286,572],{"class":571},[66,9288,9289,9291,9293,9295],{"class":68,"line":75},[66,9290,659],{"class":568},[66,9292,601],{"class":571},[66,9294,605],{"class":604},[66,9296,572],{"class":571},[10,9298,112],{},[56,9300,9302],{"className":9301,"code":1567,"language":118,"meta":61},[116],[63,9303,1567],{"__ignoreMap":61},[10,9305,123],{},[14,9307,126],{"id":126},[128,9309,9310,9314],{},[40,9311,9312,1581],{},[63,9313,1580],{},[40,9315,9316,1586],{},[63,9317,667],{},[14,9319,146],{"id":146},[37,9321,9322,9326],{},[40,9323,1593,9324,1596],{},[63,9325,659],{},[40,9327,1599,9328,1602],{},[63,9329,659],{},[14,9331,157],{"id":157},[128,9333,9334,9338],{},[40,9335,132,9336,1612],{},[63,9337,1611],{},[40,9339,1615],{},[10,9341,172],{},[14,9343,175],{"id":175},[10,9345,1622],{},[180,9347,1625],{},{"title":61,"searchDepth":75,"depth":75,"links":9349},[9350,9351,9352,9353,9354,9355,9356,9357],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":1495,"description":1500},[193,1643,1019],{"id":1646,"title":1647,"body":9362,"category":193,"cover":194,"description":1813,"extension":195,"meta":9489,"navigation":90,"path":1815,"pinned":198,"publishedAt":199,"seo":9490,"slug":1817,"stem":1818,"summary":1819,"tags":9491,"updatedAt":199,"visible":90,"__hash__":1823},{"type":7,"value":9363,"toc":9479},[9364,9368,9370,9372,9374,9378,9380,9382,9398,9400,9402,9422,9424,9429,9431,9433,9445,9447,9457,9459,9469,9471,9473,9477],[10,9365,1652,9366,1655],{},[63,9367,1138],{},[14,9369,16],{"id":16},[10,9371,1660],{},[14,9373,22],{"id":22},[10,9375,9376],{},[26,9377],{"alt":1667,"src":1668},[10,9379,1671],{},[14,9381,35],{"id":35},[37,9383,9384,9390,9394],{},[40,9385,1678,9386,1681,9388,330],{},[63,9387,659],{},[63,9389,1684],{},[40,9391,1687,9392,1691],{},[63,9393,1690],{},[40,9395,1694,9396,1697],{},[63,9397,1138],{},[14,9399,51],{"id":51},[10,9401,54],{},[56,9403,9404],{"className":1704,"code":1705,"language":1706,"meta":61,"style":61},[63,9405,9406,9410,9414,9418],{"__ignoreMap":61},[66,9407,9408],{"class":68,"line":69},[66,9409,1713],{},[66,9411,9412],{"class":68,"line":75},[66,9413,1718],{},[66,9415,9416],{"class":68,"line":81},[66,9417,1723],{},[66,9419,9420],{"class":68,"line":87},[66,9421,1728],{},[10,9423,112],{},[56,9425,9427],{"className":9426,"code":1734,"language":118,"meta":61},[116],[63,9428,1734],{"__ignoreMap":61},[10,9430,123],{},[14,9432,126],{"id":126},[128,9434,9435,9441],{},[40,9436,1745,9437,1749,9439,330],{},[63,9438,1748],{},[63,9440,1752],{},[40,9442,1755,9443,1758],{},[63,9444,1440],{},[14,9446,146],{"id":146},[37,9448,9449,9455],{},[40,9450,1765,9451,1768,9453,1771],{},[63,9452,1684],{},[63,9454,1138],{},[40,9456,1774],{},[14,9458,157],{"id":157},[128,9460,9461,9465],{},[40,9462,1781,9463,330],{},[63,9464,1784],{},[40,9466,1787,9467,1790],{},[63,9468,1440],{},[10,9470,172],{},[14,9472,175],{"id":175},[10,9474,1797,9475,1800],{},[63,9476,1138],{},[180,9478,182],{},{"title":61,"searchDepth":75,"depth":75,"links":9480},[9481,9482,9483,9484,9485,9486,9487,9488],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":1647,"description":1813},[193,1821,1822],{"id":1825,"title":1826,"body":9493,"category":193,"cover":194,"description":1831,"extension":195,"meta":9632,"navigation":90,"path":2003,"pinned":198,"publishedAt":199,"seo":9633,"slug":2005,"stem":2006,"summary":2007,"tags":9634,"updatedAt":199,"visible":90,"__hash__":2011},{"type":7,"value":9494,"toc":9622},[9495,9497,9499,9501,9503,9507,9511,9513,9525,9527,9529,9565,9567,9572,9574,9576,9592,9594,9604,9606,9614,9616,9618,9620],[10,9496,1831],{},[14,9498,16],{"id":16},[10,9500,1836],{},[14,9502,22],{"id":22},[10,9504,9505],{},[26,9506],{"alt":1843,"src":1844},[10,9508,9509,1850],{},[63,9510,1849],{},[14,9512,35],{"id":35},[37,9514,9515,9517,9523],{},[40,9516,1857],{},[40,9518,9519,1863,9521,1867],{},[63,9520,1862],{},[63,9522,1866],{},[40,9524,1870],{},[14,9526,51],{"id":51},[10,9528,1541],{},[56,9530,9531],{"className":559,"code":1877,"language":561,"meta":61,"style":61},[63,9532,9533,9539,9545,9549,9559],{"__ignoreMap":61},[66,9534,9535,9537],{"class":68,"line":69},[66,9536,1884],{"class":568},[66,9538,1887],{"class":604},[66,9540,9541,9543],{"class":68,"line":75},[66,9542,1892],{"class":571},[66,9544,1887],{"class":604},[66,9546,9547],{"class":68,"line":81},[66,9548,1899],{"class":571},[66,9550,9551,9553,9555,9557],{"class":68,"line":87},[66,9552,1904],{"class":571},[66,9554,1907],{"class":604},[66,9556,1911],{"class":1910},[66,9558,1182],{"class":604},[66,9560,9561,9563],{"class":68,"line":94},[66,9562,659],{"class":568},[66,9564,1182],{"class":604},[10,9566,112],{},[56,9568,9570],{"className":9569,"code":1925,"language":118,"meta":61},[116],[63,9571,1925],{"__ignoreMap":61},[10,9573,123],{},[14,9575,126],{"id":126},[128,9577,9578,9586],{},[40,9579,9580,1938,9582,1941,9584,1944],{},[63,9581,1884],{},[63,9583,1892],{},[63,9585,1862],{},[40,9587,9588,1949,9590,1953],{},[63,9589,1849],{},[63,9591,1952],{},[14,9593,146],{"id":146},[37,9595,9596,9602],{},[40,9597,1960,9598,1124,9600,330],{},[63,9599,1862],{},[63,9601,1866],{},[40,9603,1967],{},[14,9605,157],{"id":157},[128,9607,9608,9612],{},[40,9609,1974,9610,1978],{},[63,9611,1977],{},[40,9613,1981],{},[10,9615,172],{},[14,9617,175],{"id":175},[10,9619,1988],{},[180,9621,1991],{},{"title":61,"searchDepth":75,"depth":75,"links":9623},[9624,9625,9626,9627,9628,9629,9630,9631],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":1826,"description":1831},[193,2009,2010],{"id":2013,"title":2014,"body":9636,"category":193,"cover":194,"description":2019,"extension":195,"meta":9757,"navigation":90,"path":2168,"pinned":198,"publishedAt":199,"seo":9758,"slug":2170,"stem":2171,"summary":2172,"tags":9759,"updatedAt":199,"visible":90,"__hash__":2176},{"type":7,"value":9637,"toc":9747},[9638,9640,9642,9644,9646,9650,9658,9660,9674,9676,9678,9694,9696,9701,9703,9705,9719,9721,9727,9729,9739,9741,9743,9745],[10,9639,2019],{},[14,9641,16],{"id":16},[10,9643,2024],{},[14,9645,22],{"id":22},[10,9647,9648],{},[26,9649],{"alt":2031,"src":2032},[10,9651,2035,9652,330,9654,2041,9656,330],{},[63,9653,1440],{},[63,9655,2040],{},[63,9657,1748],{},[14,9659,35],{"id":35},[37,9661,9662,9666,9672],{},[40,9663,9664,2053],{},[63,9665,2052],{},[40,9667,9668,2059,9670,330],{},[63,9669,2058],{},[63,9671,2062],{},[40,9673,2065],{},[14,9675,51],{"id":51},[10,9677,54],{},[56,9679,9680],{"className":58,"code":2072,"language":60,"meta":61,"style":61},[63,9681,9682,9686,9690],{"__ignoreMap":61},[66,9683,9684],{"class":68,"line":69},[66,9685,2079],{},[66,9687,9688],{"class":68,"line":75},[66,9689,2084],{},[66,9691,9692],{"class":68,"line":81},[66,9693,2089],{},[10,9695,112],{},[56,9697,9699],{"className":9698,"code":2095,"language":118,"meta":61},[116],[63,9700,2095],{"__ignoreMap":61},[10,9702,123],{},[14,9704,126],{"id":126},[128,9706,9707,9713],{},[40,9708,9709,2109,9711,330],{},[63,9710,2108],{},[63,9712,2062],{},[40,9714,9715,2116,9717,2120],{},[63,9716,1440],{},[63,9718,2119],{},[14,9720,146],{"id":146},[37,9722,9723,9725],{},[40,9724,2127],{},[40,9726,2130],{},[14,9728,157],{"id":157},[128,9730,9731,9733],{},[40,9732,2137],{},[40,9734,2140,9735,2143,9737,2147],{},[63,9736,2040],{},[63,9738,2146],{},[10,9740,172],{},[14,9742,175],{"id":175},[10,9744,2154],{},[180,9746,182],{},{"title":61,"searchDepth":75,"depth":75,"links":9748},[9749,9750,9751,9752,9753,9754,9755,9756],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":2014,"description":2019},[193,2174,2175],{"id":2178,"title":2179,"body":9761,"category":193,"cover":194,"description":2184,"extension":195,"meta":9894,"navigation":90,"path":2352,"pinned":198,"publishedAt":199,"seo":9895,"slug":2354,"stem":2355,"summary":2356,"tags":9896,"updatedAt":199,"visible":90,"__hash__":2360},{"type":7,"value":9762,"toc":9884},[9763,9765,9767,9769,9771,9775,9777,9779,9795,9797,9799,9823,9825,9830,9832,9834,9850,9852,9864,9866,9876,9878,9880,9882],[10,9764,2184],{},[14,9766,16],{"id":16},[10,9768,2189],{},[14,9770,22],{"id":22},[10,9772,9773],{},[26,9774],{"alt":2196,"src":2197},[10,9776,2200],{},[14,9778,35],{"id":35},[37,9780,9781,9783,9789],{},[40,9782,2207],{},[40,9784,2210,9785,2143,9787,2217],{},[63,9786,2213],{},[63,9788,2216],{},[40,9790,2220,9791,2224,9793,2228],{},[63,9792,2223],{},[63,9794,2227],{},[14,9796,51],{"id":51},[10,9798,54],{},[56,9800,9801],{"className":58,"code":2235,"language":60,"meta":61,"style":61},[63,9802,9803,9807,9811,9815,9819],{"__ignoreMap":61},[66,9804,9805],{"class":68,"line":69},[66,9806,2242],{},[66,9808,9809],{"class":68,"line":75},[66,9810,2247],{},[66,9812,9813],{"class":68,"line":81},[66,9814,91],{"emptyLinePlaceholder":90},[66,9816,9817],{"class":68,"line":87},[66,9818,2256],{},[66,9820,9821],{"class":68,"line":94},[66,9822,2247],{},[10,9824,112],{},[56,9826,9828],{"className":9827,"code":2266,"language":118,"meta":61},[116],[63,9829,2266],{"__ignoreMap":61},[10,9831,123],{},[14,9833,126],{"id":126},[128,9835,9836,9842],{},[40,9837,132,9838,2280,9840,2283],{},[63,9839,2279],{},[63,9841,2213],{},[40,9843,132,9844,2289,9846,2293,9848,330],{},[63,9845,2288],{},[63,9847,2292],{},[63,9849,2296],{},[14,9851,146],{"id":146},[37,9853,9854,9856],{},[40,9855,2303],{},[40,9857,2306,9858,2224,9860,2224,9862,2314],{},[63,9859,2223],{},[63,9861,2227],{},[63,9863,2313],{},[14,9865,157],{"id":157},[128,9867,9868,9874],{},[40,9869,2321,9870,1124,9872,2328],{},[63,9871,2324],{},[63,9873,2327],{},[40,9875,2331],{},[10,9877,172],{},[14,9879,175],{"id":175},[10,9881,2338],{},[180,9883,182],{},{"title":61,"searchDepth":75,"depth":75,"links":9885},[9886,9887,9888,9889,9890,9891,9892,9893],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":2179,"description":2184},[193,2358,2359],{"id":2362,"title":2363,"body":9898,"category":193,"cover":194,"description":2368,"extension":195,"meta":10031,"navigation":90,"path":2534,"pinned":198,"publishedAt":199,"seo":10032,"slug":2536,"stem":2537,"summary":2538,"tags":10033,"updatedAt":199,"visible":90,"__hash__":2542},{"type":7,"value":9899,"toc":10021},[9900,9902,9904,9906,9908,9912,9914,9916,9934,9936,9938,9974,9976,9981,9983,9985,9995,9997,10005,10007,10013,10015,10017,10019],[10,9901,2368],{},[14,9903,16],{"id":16},[10,9905,2373],{},[14,9907,22],{"id":22},[10,9909,9910],{},[26,9911],{"alt":2380,"src":2381},[10,9913,2384],{},[14,9915,35],{"id":35},[37,9917,9918,9924,9932],{},[40,9919,9920,2394,9922,2398],{},[63,9921,2393],{},[63,9923,2397],{},[40,9925,9926,2404,9928,2408,9930,2412],{},[63,9927,2403],{},[63,9929,2407],{},[63,9931,2411],{},[40,9933,2415],{},[14,9935,51],{"id":51},[10,9937,54],{},[56,9939,9940],{"className":58,"code":2422,"language":60,"meta":61,"style":61},[63,9941,9942,9946,9950,9954,9958,9962,9966,9970],{"__ignoreMap":61},[66,9943,9944],{"class":68,"line":69},[66,9945,2429],{},[66,9947,9948],{"class":68,"line":75},[66,9949,2434],{},[66,9951,9952],{"class":68,"line":81},[66,9953,2439],{},[66,9955,9956],{"class":68,"line":87},[66,9957,91],{"emptyLinePlaceholder":90},[66,9959,9960],{"class":68,"line":94},[66,9961,2448],{},[66,9963,9964],{"class":68,"line":100},[66,9965,2453],{},[66,9967,9968],{"class":68,"line":106},[66,9969,2458],{},[66,9971,9972],{"class":68,"line":2461},[66,9973,2464],{},[10,9975,112],{},[56,9977,9979],{"className":9978,"code":2470,"language":118,"meta":61},[116],[63,9980,2470],{"__ignoreMap":61},[10,9982,123],{},[14,9984,126],{"id":126},[128,9986,9987,9991],{},[40,9988,9989,2484],{},[63,9990,2483],{},[40,9992,9993,2490],{},[63,9994,2489],{},[14,9996,146],{"id":146},[37,9998,9999,10003],{},[40,10000,2497,10001,330],{},[63,10002,2500],{},[40,10004,2503],{},[14,10006,157],{"id":157},[128,10008,10009,10011],{},[40,10010,2510],{},[40,10012,2513],{},[10,10014,172],{},[14,10016,175],{"id":175},[10,10018,2520],{},[180,10020,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10022},[10023,10024,10025,10026,10027,10028,10029,10030],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":2363,"description":2368},[193,2540,2541],{"id":2544,"title":2545,"body":10035,"category":193,"cover":194,"description":2550,"extension":195,"meta":10172,"navigation":90,"path":2727,"pinned":198,"publishedAt":199,"seo":10173,"slug":2729,"stem":2730,"summary":2731,"tags":10174,"updatedAt":199,"visible":90,"__hash__":2735},{"type":7,"value":10036,"toc":10160},[10037,10039,10041,10043,10045,10049,10055,10057,10065,10067,10069,10093,10095,10100,10102,10104,10122,10124,10126,10130,10132,10134,10140,10142,10152,10154,10156,10158],[10,10038,2550],{},[14,10040,16],{"id":16},[10,10042,2555],{},[14,10044,22],{"id":22},[10,10046,10047],{},[26,10048],{"alt":2562,"src":2563},[10,10050,2566,10051,2570,10053,330],{},[63,10052,2569],{},[63,10054,2573],{},[14,10056,35],{"id":35},[37,10058,10059,10061,10063],{},[40,10060,2580],{},[40,10062,2583],{},[40,10064,2586],{},[14,10066,51],{"id":51},[10,10068,54],{},[56,10070,10071],{"className":58,"code":2593,"language":60,"meta":61,"style":61},[63,10072,10073,10077,10081,10085,10089],{"__ignoreMap":61},[66,10074,10075],{"class":68,"line":69},[66,10076,2600],{},[66,10078,10079],{"class":68,"line":75},[66,10080,2605],{},[66,10082,10083],{"class":68,"line":81},[66,10084,2610],{},[66,10086,10087],{"class":68,"line":87},[66,10088,2615],{},[66,10090,10091],{"class":68,"line":94},[66,10092,2620],{},[10,10094,112],{},[56,10096,10098],{"className":10097,"code":2626,"language":118,"meta":61},[116],[63,10099,2626],{"__ignoreMap":61},[10,10101,123],{},[14,10103,126],{"id":126},[128,10105,10106,10114],{},[40,10107,2637,10108,2640,10110,2644,10112,2648],{},[63,10109,193],{},[63,10111,2643],{},[63,10113,2647],{},[40,10115,10116,2654,10118,2658,10120,2662],{},[63,10117,2653],{},[63,10119,2657],{},[63,10121,2661],{},[296,10123,2665],{"id":2665},[10,10125,2668],{},[10,10127,10128],{},[26,10129],{"alt":2673,"src":2674},[10,10131,2677],{},[14,10133,146],{"id":146},[37,10135,10136,10138],{},[40,10137,2684],{},[40,10139,2687],{},[14,10141,157],{"id":157},[128,10143,10144,10150],{},[40,10145,2694,10146,2698,10148,330],{},[63,10147,2697],{},[63,10149,2701],{},[40,10151,2704],{},[10,10153,172],{},[14,10155,175],{"id":175},[10,10157,2711],{},[180,10159,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10161},[10162,10163,10164,10165,10166,10169,10170,10171],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":10167},[10168],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":2545,"description":2550},[193,2733,2734],{"id":2737,"title":2738,"body":10176,"category":193,"cover":194,"description":2743,"extension":195,"meta":10341,"navigation":90,"path":2958,"pinned":198,"publishedAt":199,"seo":10342,"slug":2960,"stem":2961,"summary":2962,"tags":10343,"updatedAt":199,"visible":90,"__hash__":2966},{"type":7,"value":10177,"toc":10329},[10178,10180,10182,10184,10186,10190,10196,10198,10218,10220,10222,10258,10260,10265,10267,10269,10283,10285,10287,10291,10297,10299,10309,10311,10321,10323,10325,10327],[10,10179,2743],{},[14,10181,16],{"id":16},[10,10183,2748],{},[14,10185,22],{"id":22},[10,10187,10188],{},[26,10189],{"alt":2755,"src":2756},[10,10191,2759,10192,976,10194,2766],{},[63,10193,2762],{},[63,10195,2765],{},[14,10197,35],{"id":35},[37,10199,10200,10208,10216],{},[40,10201,10202,2776,10204,2780,10206,2784],{},[63,10203,2775],{},[63,10205,2779],{},[63,10207,2783],{},[40,10209,10210,2790,10212,2794,10214,2798],{},[63,10211,2789],{},[63,10213,2793],{},[63,10215,2797],{},[40,10217,2801],{},[14,10219,51],{"id":51},[10,10221,54],{},[56,10223,10224],{"className":58,"code":2808,"language":60,"meta":61,"style":61},[63,10225,10226,10230,10234,10238,10242,10246,10250,10254],{"__ignoreMap":61},[66,10227,10228],{"class":68,"line":69},[66,10229,2815],{},[66,10231,10232],{"class":68,"line":75},[66,10233,2820],{},[66,10235,10236],{"class":68,"line":81},[66,10237,91],{"emptyLinePlaceholder":90},[66,10239,10240],{"class":68,"line":87},[66,10241,2829],{},[66,10243,10244],{"class":68,"line":94},[66,10245,2834],{},[66,10247,10248],{"class":68,"line":100},[66,10249,2839],{},[66,10251,10252],{"class":68,"line":106},[66,10253,2844],{},[66,10255,10256],{"class":68,"line":2461},[66,10257,2849],{},[10,10259,112],{},[56,10261,10263],{"className":10262,"code":2855,"language":118,"meta":61},[116],[63,10264,2855],{"__ignoreMap":61},[10,10266,123],{},[14,10268,126],{"id":126},[128,10270,10271,10277],{},[40,10272,10273,2869,10275,2873],{},[63,10274,2868],{},[63,10276,2872],{},[40,10278,10279,2879,10281,2882],{},[63,10280,2878],{},[63,10282,2797],{},[296,10284,2665],{"id":2665},[10,10286,2887],{},[10,10288,10289],{},[26,10290],{"alt":2892,"src":2893},[10,10292,10293,2898,10295,2901],{},[63,10294,2789],{},[63,10296,2793],{},[14,10298,146],{"id":146},[37,10300,10301,10307],{},[40,10302,2908,10303,2911,10305,2914],{},[63,10304,2783],{},[63,10306,2775],{},[40,10308,2917],{},[14,10310,157],{"id":157},[128,10312,10313,10317],{},[40,10314,2924,10315,2928],{},[63,10316,2927],{},[40,10318,2931,10319,2935],{},[63,10320,2934],{},[10,10322,172],{},[14,10324,175],{"id":175},[10,10326,2942],{},[180,10328,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10330},[10331,10332,10333,10334,10335,10338,10339,10340],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":10336},[10337],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":2738,"description":2743},[193,2964,2965],{"id":2968,"title":2969,"body":10345,"category":193,"cover":194,"description":2974,"extension":195,"meta":10478,"navigation":90,"path":3143,"pinned":198,"publishedAt":199,"seo":10479,"slug":3145,"stem":3146,"summary":3147,"tags":10480,"updatedAt":199,"visible":90,"__hash__":3150},{"type":7,"value":10346,"toc":10468},[10347,10349,10351,10353,10355,10359,10369,10371,10381,10383,10385,10413,10415,10420,10422,10424,10438,10440,10448,10450,10460,10462,10464,10466],[10,10348,2974],{},[14,10350,16],{"id":16},[10,10352,2979],{},[14,10354,22],{"id":22},[10,10356,10357],{},[26,10358],{"alt":2986,"src":2987},[10,10360,10361,2993,10363,2997,10365,3001,10367,3005],{},[63,10362,2992],{},[63,10364,2996],{},[63,10366,3000],{},[63,10368,3004],{},[14,10370,35],{"id":35},[37,10372,10373,10375,10379],{},[40,10374,3012],{},[40,10376,10377,3017],{},[63,10378,3004],{},[40,10380,3020],{},[14,10382,51],{"id":51},[10,10384,54],{},[56,10386,10387],{"className":58,"code":3027,"language":60,"meta":61,"style":61},[63,10388,10389,10393,10397,10401,10405,10409],{"__ignoreMap":61},[66,10390,10391],{"class":68,"line":69},[66,10392,3034],{},[66,10394,10395],{"class":68,"line":75},[66,10396,3039],{},[66,10398,10399],{"class":68,"line":81},[66,10400,3044],{},[66,10402,10403],{"class":68,"line":87},[66,10404,91],{"emptyLinePlaceholder":90},[66,10406,10407],{"class":68,"line":94},[66,10408,3053],{},[66,10410,10411],{"class":68,"line":100},[66,10412,3058],{},[10,10414,112],{},[56,10416,10418],{"className":10417,"code":3064,"language":118,"meta":61},[116],[63,10419,3064],{"__ignoreMap":61},[10,10421,123],{},[14,10423,126],{"id":126},[128,10425,10426,10432],{},[40,10427,3075,10428,3078,10430,3082],{},[63,10429,2992],{},[63,10431,3081],{},[40,10433,10434,3088,10436,3092],{},[63,10435,3087],{},[63,10437,3091],{},[14,10439,146],{"id":146},[37,10441,10442,10446],{},[40,10443,3099,10444,3103],{},[63,10445,3102],{},[40,10447,3106],{},[14,10449,157],{"id":157},[128,10451,10452,10454],{},[40,10453,3113],{},[40,10455,1687,10456,3119,10458,3122],{},[63,10457,3118],{},[63,10459,3004],{},[10,10461,172],{},[14,10463,175],{"id":175},[10,10465,3129],{},[180,10467,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10469},[10470,10471,10472,10473,10474,10475,10476,10477],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":2969,"description":2974},[193,2313,3149],{"id":3152,"title":3153,"body":10482,"category":193,"cover":194,"description":3158,"extension":195,"meta":10611,"navigation":90,"path":3319,"pinned":198,"publishedAt":199,"seo":10612,"slug":3321,"stem":3322,"summary":3323,"tags":10613,"updatedAt":199,"visible":90,"__hash__":3327},{"type":7,"value":10483,"toc":10601},[10484,10486,10488,10490,10492,10496,10500,10502,10512,10514,10516,10548,10550,10555,10557,10559,10571,10573,10583,10585,10593,10595,10597,10599],[10,10485,3158],{},[14,10487,16],{"id":16},[10,10489,3163],{},[14,10491,22],{"id":22},[10,10493,10494],{},[26,10495],{"alt":3170,"src":3171},[10,10497,3174,10498,3178],{},[63,10499,3177],{},[14,10501,35],{"id":35},[37,10503,10504,10506,10508],{},[40,10505,3185],{},[40,10507,3188],{},[40,10509,3191,10510,330],{},[63,10511,3194],{},[14,10513,51],{"id":51},[10,10515,54],{},[56,10517,10518],{"className":58,"code":3201,"language":60,"meta":61,"style":61},[63,10519,10520,10524,10528,10532,10536,10540,10544],{"__ignoreMap":61},[66,10521,10522],{"class":68,"line":69},[66,10523,3208],{},[66,10525,10526],{"class":68,"line":75},[66,10527,3213],{},[66,10529,10530],{"class":68,"line":81},[66,10531,91],{"emptyLinePlaceholder":90},[66,10533,10534],{"class":68,"line":87},[66,10535,3222],{},[66,10537,10538],{"class":68,"line":94},[66,10539,3227],{},[66,10541,10542],{"class":68,"line":100},[66,10543,3232],{},[66,10545,10546],{"class":68,"line":106},[66,10547,3237],{},[10,10549,112],{},[56,10551,10553],{"className":10552,"code":3243,"language":118,"meta":61},[116],[63,10554,3243],{"__ignoreMap":61},[10,10556,123],{},[14,10558,126],{"id":126},[128,10560,10561,10563],{},[40,10562,3254],{},[40,10564,10565,3260,10567,3264,10569,3268],{},[63,10566,3259],{},[63,10568,3263],{},[63,10570,3267],{},[14,10572,146],{"id":146},[37,10574,10575,10581],{},[40,10576,3275,10577,3279,10579,330],{},[63,10578,3278],{},[63,10580,3282],{},[40,10582,3285],{},[14,10584,157],{"id":157},[128,10586,10587,10589],{},[40,10588,3292],{},[40,10590,3295,10591,3298],{},[63,10592,3267],{},[10,10594,172],{},[14,10596,175],{"id":175},[10,10598,3305],{},[180,10600,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10602},[10603,10604,10605,10606,10607,10608,10609,10610],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":3153,"description":3158},[193,3325,3326],{"id":3329,"title":3330,"body":10615,"category":193,"cover":194,"description":3335,"extension":195,"meta":10734,"navigation":90,"path":3477,"pinned":198,"publishedAt":199,"seo":10735,"slug":3479,"stem":3480,"summary":3481,"tags":10736,"updatedAt":199,"visible":90,"__hash__":3484},{"type":7,"value":10616,"toc":10724},[10617,10619,10621,10623,10625,10629,10631,10633,10641,10643,10645,10673,10675,10680,10682,10684,10694,10696,10704,10706,10716,10718,10720,10722],[10,10618,3335],{},[14,10620,16],{"id":16},[10,10622,3340],{},[14,10624,22],{"id":22},[10,10626,10627],{},[26,10628],{"alt":3347,"src":3348},[10,10630,3351],{},[14,10632,35],{"id":35},[37,10634,10635,10637,10639],{},[40,10636,3358],{},[40,10638,3361],{},[40,10640,3364],{},[14,10642,51],{"id":51},[10,10644,54],{},[56,10646,10647],{"className":58,"code":3371,"language":60,"meta":61,"style":61},[63,10648,10649,10653,10657,10661,10665,10669],{"__ignoreMap":61},[66,10650,10651],{"class":68,"line":69},[66,10652,3378],{},[66,10654,10655],{"class":68,"line":75},[66,10656,3383],{},[66,10658,10659],{"class":68,"line":81},[66,10660,3388],{},[66,10662,10663],{"class":68,"line":87},[66,10664,91],{"emptyLinePlaceholder":90},[66,10666,10667],{"class":68,"line":94},[66,10668,3397],{},[66,10670,10671],{"class":68,"line":100},[66,10672,3402],{},[10,10674,112],{},[56,10676,10678],{"className":10677,"code":3408,"language":118,"meta":61},[116],[63,10679,3408],{"__ignoreMap":61},[10,10681,123],{},[14,10683,126],{"id":126},[128,10685,10686,10690],{},[40,10687,10688,3422],{},[63,10689,3421],{},[40,10691,10692,3428],{},[63,10693,3427],{},[14,10695,146],{"id":146},[37,10697,10698,10702],{},[40,10699,3435,10700,3439],{},[63,10701,3438],{},[40,10703,3442],{},[14,10705,157],{"id":157},[128,10707,10708,10710],{},[40,10709,3449],{},[40,10711,2140,10712,2143,10714,3456],{},[63,10713,3438],{},[63,10715,3427],{},[10,10717,172],{},[14,10719,175],{"id":175},[10,10721,3463],{},[180,10723,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10725},[10726,10727,10728,10729,10730,10731,10732,10733],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":3330,"description":3335},[193,3483,3326],{"id":3486,"title":3487,"body":10738,"category":193,"cover":194,"description":3492,"extension":195,"meta":10863,"navigation":90,"path":3648,"pinned":198,"publishedAt":199,"seo":10864,"slug":3650,"stem":3651,"summary":3652,"tags":10865,"updatedAt":199,"visible":90,"__hash__":3655},{"type":7,"value":10739,"toc":10853},[10740,10742,10744,10746,10748,10752,10758,10760,10770,10772,10774,10802,10804,10809,10811,10813,10823,10825,10837,10839,10845,10847,10849,10851],[10,10741,3492],{},[14,10743,16],{"id":16},[10,10745,3497],{},[14,10747,22],{"id":22},[10,10749,10750],{},[26,10751],{"alt":3504,"src":3505},[10,10753,3508,10754,3512,10756,3515],{},[63,10755,3511],{},[63,10757,2213],{},[14,10759,35],{"id":35},[37,10761,10762,10764,10768],{},[40,10763,3522],{},[40,10765,2306,10766,3528],{},[63,10767,3527],{},[40,10769,3531],{},[14,10771,51],{"id":51},[10,10773,54],{},[56,10775,10776],{"className":58,"code":3538,"language":60,"meta":61,"style":61},[63,10777,10778,10782,10786,10790,10794,10798],{"__ignoreMap":61},[66,10779,10780],{"class":68,"line":69},[66,10781,3545],{},[66,10783,10784],{"class":68,"line":75},[66,10785,3550],{},[66,10787,10788],{"class":68,"line":81},[66,10789,91],{"emptyLinePlaceholder":90},[66,10791,10792],{"class":68,"line":87},[66,10793,3559],{},[66,10795,10796],{"class":68,"line":94},[66,10797,3564],{},[66,10799,10800],{"class":68,"line":100},[66,10801,3569],{},[10,10803,112],{},[56,10805,10807],{"className":10806,"code":3575,"language":118,"meta":61},[116],[63,10808,3575],{"__ignoreMap":61},[10,10810,123],{},[14,10812,126],{"id":126},[128,10814,10815,10817],{},[40,10816,3586],{},[40,10818,3589,10819,3592,10821,3596],{},[63,10820,2213],{},[63,10822,3595],{},[14,10824,146],{"id":146},[37,10826,10827,10831],{},[40,10828,3603,10829,3607],{},[63,10830,3606],{},[40,10832,3610,10833,3614,10835,330],{},[63,10834,3613],{},[63,10836,3617],{},[14,10838,157],{"id":157},[128,10840,10841,10843],{},[40,10842,3624],{},[40,10844,3627],{},[10,10846,172],{},[14,10848,175],{"id":175},[10,10850,3634],{},[180,10852,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10854},[10855,10856,10857,10858,10859,10860,10861,10862],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":3487,"description":3492},[193,3654,3326],{"id":3657,"title":3658,"body":10867,"category":193,"cover":194,"description":3663,"extension":195,"meta":10990,"navigation":90,"path":3813,"pinned":198,"publishedAt":199,"seo":10991,"slug":3815,"stem":3816,"summary":3817,"tags":10992,"updatedAt":199,"visible":90,"__hash__":3820},{"type":7,"value":10868,"toc":10980},[10869,10871,10873,10875,10877,10881,10883,10885,10897,10899,10901,10929,10931,10936,10938,10940,10950,10952,10962,10964,10972,10974,10976,10978],[10,10870,3663],{},[14,10872,16],{"id":16},[10,10874,3668],{},[14,10876,22],{"id":22},[10,10878,10879],{},[26,10880],{"alt":3675,"src":3676},[10,10882,3679],{},[14,10884,35],{"id":35},[37,10886,10887,10889,10891],{},[40,10888,3686],{},[40,10890,3689],{},[40,10892,3692,10893,3696,10895,3700],{},[63,10894,3695],{},[63,10896,3699],{},[14,10898,51],{"id":51},[10,10900,54],{},[56,10902,10903],{"className":58,"code":3707,"language":60,"meta":61,"style":61},[63,10904,10905,10909,10913,10917,10921,10925],{"__ignoreMap":61},[66,10906,10907],{"class":68,"line":69},[66,10908,3714],{},[66,10910,10911],{"class":68,"line":75},[66,10912,3719],{},[66,10914,10915],{"class":68,"line":81},[66,10916,91],{"emptyLinePlaceholder":90},[66,10918,10919],{"class":68,"line":87},[66,10920,3728],{},[66,10922,10923],{"class":68,"line":94},[66,10924,3733],{},[66,10926,10927],{"class":68,"line":100},[66,10928,3738],{},[10,10930,112],{},[56,10932,10934],{"className":10933,"code":3744,"language":118,"meta":61},[116],[63,10935,3744],{"__ignoreMap":61},[10,10937,123],{},[14,10939,126],{"id":126},[128,10941,10942,10944],{},[40,10943,3755],{},[40,10945,10946,3761,10948,3765],{},[63,10947,3760],{},[63,10949,3764],{},[14,10951,146],{"id":146},[37,10953,10954,10960],{},[40,10955,2306,10956,3774,10958,330],{},[63,10957,3699],{},[63,10959,3695],{},[40,10961,3779],{},[14,10963,157],{"id":157},[128,10965,10966,10970],{},[40,10967,3786,10968,3789],{},[63,10969,3695],{},[40,10971,3792],{},[10,10973,172],{},[14,10975,175],{"id":175},[10,10977,3799],{},[180,10979,182],{},{"title":61,"searchDepth":75,"depth":75,"links":10981},[10982,10983,10984,10985,10986,10987,10988,10989],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":3658,"description":3663},[193,3819,3326],{"id":3822,"title":3823,"body":10994,"category":193,"cover":194,"description":3828,"extension":195,"meta":11153,"navigation":90,"path":4027,"pinned":198,"publishedAt":199,"seo":11154,"slug":4029,"stem":4030,"summary":4031,"tags":11155,"updatedAt":199,"visible":90,"__hash__":4035},{"type":7,"value":10995,"toc":11141},[10996,10998,11000,11002,11004,11008,11014,11016,11028,11030,11032,11072,11074,11079,11081,11083,11097,11099,11101,11105,11107,11109,11119,11121,11133,11135,11137,11139],[10,10997,3828],{},[14,10999,16],{"id":16},[10,11001,3833],{},[14,11003,22],{"id":22},[10,11005,11006],{},[26,11007],{"alt":3840,"src":3841},[10,11009,11010,3847,11012,3851],{},[63,11011,3846],{},[63,11013,3850],{},[14,11015,35],{"id":35},[37,11017,11018,11024,11026],{},[40,11019,11020,3860,11022,3864],{},[63,11021,2775],{},[63,11023,3863],{},[40,11025,3867],{},[40,11027,3870],{},[14,11029,51],{"id":51},[10,11031,54],{},[56,11033,11034],{"className":58,"code":3877,"language":60,"meta":61,"style":61},[63,11035,11036,11040,11044,11048,11052,11056,11060,11064,11068],{"__ignoreMap":61},[66,11037,11038],{"class":68,"line":69},[66,11039,3884],{},[66,11041,11042],{"class":68,"line":75},[66,11043,3889],{},[66,11045,11046],{"class":68,"line":81},[66,11047,3894],{},[66,11049,11050],{"class":68,"line":87},[66,11051,91],{"emptyLinePlaceholder":90},[66,11053,11054],{"class":68,"line":94},[66,11055,3903],{},[66,11057,11058],{"class":68,"line":100},[66,11059,3908],{},[66,11061,11062],{"class":68,"line":106},[66,11063,3913],{},[66,11065,11066],{"class":68,"line":2461},[66,11067,3918],{},[66,11069,11070],{"class":68,"line":3921},[66,11071,3924],{},[10,11073,112],{},[56,11075,11077],{"className":11076,"code":3930,"language":118,"meta":61},[116],[63,11078,3930],{"__ignoreMap":61},[10,11080,123],{},[14,11082,126],{"id":126},[128,11084,11085,11089],{},[40,11086,11087,3944],{},[63,11088,3943],{},[40,11090,11091,3950,11093,3954,11095,3958],{},[63,11092,3949],{},[63,11094,3953],{},[63,11096,3957],{},[296,11098,2665],{"id":2665},[10,11100,3963],{},[10,11102,11103],{},[26,11104],{"alt":3968,"src":3969},[10,11106,3972],{},[14,11108,146],{"id":146},[37,11110,11111,11117],{},[40,11112,3979,11113,3982,11115,330],{},[63,11114,2775],{},[63,11116,3863],{},[40,11118,3987],{},[14,11120,157],{"id":157},[128,11122,11123,11125],{},[40,11124,3994],{},[40,11126,2306,11127,4000,11129,1124,11131,330],{},[63,11128,3999],{},[63,11130,3863],{},[63,11132,2775],{},[10,11134,172],{},[14,11136,175],{"id":175},[10,11138,4011],{},[180,11140,182],{},{"title":61,"searchDepth":75,"depth":75,"links":11142},[11143,11144,11145,11146,11147,11150,11151,11152],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":11148},[11149],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":3823,"description":3828},[193,4033,4034],{"id":4037,"title":4038,"body":11157,"category":193,"cover":194,"description":4043,"extension":195,"meta":11329,"navigation":90,"path":4257,"pinned":198,"publishedAt":199,"seo":11330,"slug":4259,"stem":4260,"summary":4261,"tags":11331,"updatedAt":199,"visible":90,"__hash__":4264},{"type":7,"value":11158,"toc":11316},[11159,11161,11163,11165,11167,11171,11179,11181,11189,11191,11193,11237,11239,11244,11246,11248,11260,11262,11264,11268,11274,11276,11278,11282,11286,11288,11300,11302,11308,11310,11312,11314],[10,11160,4043],{},[14,11162,16],{"id":16},[10,11164,4048],{},[14,11166,22],{"id":22},[10,11168,11169],{},[26,11170],{"alt":4055,"src":4056},[10,11172,11173,2224,11175,2224,11177,4066],{},[63,11174,1123],{},[63,11176,4063],{},[63,11178,1127],{},[14,11180,35],{"id":35},[37,11182,11183,11185,11187],{},[40,11184,4073],{},[40,11186,4076],{},[40,11188,4079],{},[14,11190,51],{"id":51},[10,11192,54],{},[56,11194,11195],{"className":58,"code":4086,"language":60,"meta":61,"style":61},[63,11196,11197,11201,11205,11209,11213,11217,11221,11225,11229,11233],{"__ignoreMap":61},[66,11198,11199],{"class":68,"line":69},[66,11200,4093],{},[66,11202,11203],{"class":68,"line":75},[66,11204,91],{"emptyLinePlaceholder":90},[66,11206,11207],{"class":68,"line":81},[66,11208,4102],{},[66,11210,11211],{"class":68,"line":87},[66,11212,4107],{},[66,11214,11215],{"class":68,"line":94},[66,11216,4112],{},[66,11218,11219],{"class":68,"line":100},[66,11220,4117],{},[66,11222,11223],{"class":68,"line":106},[66,11224,1113],{},[66,11226,11227],{"class":68,"line":2461},[66,11228,4126],{},[66,11230,11231],{"class":68,"line":3921},[66,11232,91],{"emptyLinePlaceholder":90},[66,11234,11235],{"class":68,"line":4133},[66,11236,4136],{},[10,11238,112],{},[56,11240,11242],{"className":11241,"code":4142,"language":118,"meta":61},[116],[63,11243,4142],{"__ignoreMap":61},[10,11245,123],{},[14,11247,126],{"id":126},[128,11249,11250,11254],{},[40,11251,4153,11252,4157],{},[63,11253,4156],{},[40,11255,11256,4163,11258,4166],{},[63,11257,4162],{},[63,11259,1127],{},[296,11261,2665],{"id":2665},[10,11263,4171],{},[10,11265,11266],{},[26,11267],{"alt":4176,"src":4177},[10,11269,11270,4182,11272,4185],{},[63,11271,4156],{},[63,11273,4162],{},[296,11275,2665],{"id":4188},[10,11277,4191],{},[10,11279,11280],{},[26,11281],{"alt":4196,"src":4197},[10,11283,4200,11284,4203],{},[63,11285,1123],{},[14,11287,146],{"id":146},[37,11289,11290,11294],{},[40,11291,4210,11292,4213],{},[63,11293,4162],{},[40,11295,4216,11296,4219,11298,4223],{},[63,11297,1123],{},[63,11299,4222],{},[14,11301,157],{"id":157},[128,11303,11304,11306],{},[40,11305,4230],{},[40,11307,4233],{},[10,11309,172],{},[14,11311,175],{"id":175},[10,11313,4240],{},[180,11315,182],{},{"title":61,"searchDepth":75,"depth":75,"links":11317},[11318,11319,11320,11321,11322,11326,11327,11328],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":11323},[11324,11325],{"id":2665,"depth":81,"text":2665},{"id":4188,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":4038,"description":4043},[193,1123,4263],{"id":4266,"title":4267,"body":11333,"category":193,"cover":194,"description":4272,"extension":195,"meta":11470,"navigation":90,"path":4439,"pinned":198,"publishedAt":199,"seo":11471,"slug":4441,"stem":4442,"summary":4443,"tags":11472,"updatedAt":199,"visible":90,"__hash__":4446},{"type":7,"value":11334,"toc":11458},[11335,11337,11339,11341,11343,11347,11351,11353,11363,11365,11367,11399,11401,11406,11408,11410,11420,11422,11424,11428,11432,11434,11440,11442,11450,11452,11454,11456],[10,11336,4272],{},[14,11338,16],{"id":16},[10,11340,4277],{},[14,11342,22],{"id":22},[10,11344,11345],{},[26,11346],{"alt":4284,"src":4285},[10,11348,11349,4291],{},[63,11350,4290],{},[14,11352,35],{"id":35},[37,11354,11355,11357,11359],{},[40,11356,4298],{},[40,11358,4301],{},[40,11360,4304,11361,4308],{},[63,11362,4307],{},[14,11364,51],{"id":51},[10,11366,54],{},[56,11368,11369],{"className":58,"code":4315,"language":60,"meta":61,"style":61},[63,11370,11371,11375,11379,11383,11387,11391,11395],{"__ignoreMap":61},[66,11372,11373],{"class":68,"line":69},[66,11374,4322],{},[66,11376,11377],{"class":68,"line":75},[66,11378,91],{"emptyLinePlaceholder":90},[66,11380,11381],{"class":68,"line":81},[66,11382,4331],{},[66,11384,11385],{"class":68,"line":87},[66,11386,4336],{},[66,11388,11389],{"class":68,"line":94},[66,11390,4341],{},[66,11392,11393],{"class":68,"line":100},[66,11394,91],{"emptyLinePlaceholder":90},[66,11396,11397],{"class":68,"line":106},[66,11398,4350],{},[10,11400,112],{},[56,11402,11404],{"className":11403,"code":4356,"language":118,"meta":61},[116],[63,11405,4356],{"__ignoreMap":61},[10,11407,123],{},[14,11409,126],{"id":126},[128,11411,11412,11416],{},[40,11413,4367,11414,4371],{},[63,11415,4370],{},[40,11417,4374,11418,4377],{},[63,11419,4370],{},[296,11421,2665],{"id":2665},[10,11423,4382],{},[10,11425,11426],{},[26,11427],{"alt":4387,"src":4388},[10,11429,4391,11430,4394],{},[63,11431,4370],{},[14,11433,146],{"id":146},[37,11435,11436,11438],{},[40,11437,4401],{},[40,11439,4404],{},[14,11441,157],{"id":157},[128,11443,11444,11448],{},[40,11445,2306,11446,4413],{},[63,11447,4290],{},[40,11449,4416],{},[10,11451,172],{},[14,11453,175],{"id":175},[10,11455,4423],{},[180,11457,182],{},{"title":61,"searchDepth":75,"depth":75,"links":11459},[11460,11461,11462,11463,11464,11467,11468,11469],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":11465},[11466],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":4267,"description":4272},[193,4290,4445],{"id":4448,"title":4449,"body":11474,"category":193,"cover":194,"description":4454,"extension":195,"meta":11599,"navigation":90,"path":4603,"pinned":198,"publishedAt":199,"seo":11600,"slug":4605,"stem":4606,"summary":4607,"tags":11601,"updatedAt":199,"visible":90,"__hash__":4610},{"type":7,"value":11475,"toc":11589},[11476,11478,11480,11482,11484,11488,11492,11494,11504,11506,11508,11540,11542,11547,11549,11551,11563,11565,11571,11573,11581,11583,11585,11587],[10,11477,4454],{},[14,11479,16],{"id":16},[10,11481,4459],{},[14,11483,22],{"id":22},[10,11485,11486],{},[26,11487],{"alt":4466,"src":4467},[10,11489,11490,4472],{},[63,11491,4307],{},[14,11493,35],{"id":35},[37,11495,11496,11500,11502],{},[40,11497,11498,4482],{},[63,11499,4481],{},[40,11501,4485],{},[40,11503,4488],{},[14,11505,51],{"id":51},[10,11507,54],{},[56,11509,11510],{"className":58,"code":4495,"language":60,"meta":61,"style":61},[63,11511,11512,11516,11520,11524,11528,11532,11536],{"__ignoreMap":61},[66,11513,11514],{"class":68,"line":69},[66,11515,4502],{},[66,11517,11518],{"class":68,"line":75},[66,11519,91],{"emptyLinePlaceholder":90},[66,11521,11522],{"class":68,"line":81},[66,11523,4511],{},[66,11525,11526],{"class":68,"line":87},[66,11527,4516],{},[66,11529,11530],{"class":68,"line":94},[66,11531,91],{"emptyLinePlaceholder":90},[66,11533,11534],{"class":68,"line":100},[66,11535,4525],{},[66,11537,11538],{"class":68,"line":106},[66,11539,4530],{},[10,11541,112],{},[56,11543,11545],{"className":11544,"code":4536,"language":118,"meta":61},[116],[63,11546,4536],{"__ignoreMap":61},[10,11548,123],{},[14,11550,126],{"id":126},[128,11552,11553,11559],{},[40,11554,4547,11555,4550,11557,4554],{},[63,11556,4307],{},[63,11558,4553],{},[40,11560,11561,4559],{},[63,11562,4481],{},[14,11564,146],{"id":146},[37,11566,11567,11569],{},[40,11568,4566],{},[40,11570,4569],{},[14,11572,157],{"id":157},[128,11574,11575,11577],{},[40,11576,4576],{},[40,11578,2306,11579,4582],{},[63,11580,4581],{},[10,11582,172],{},[14,11584,175],{"id":175},[10,11586,4589],{},[180,11588,182],{},{"title":61,"searchDepth":75,"depth":75,"links":11590},[11591,11592,11593,11594,11595,11596,11597,11598],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":4449,"description":4454},[193,4307,4609],{"id":4612,"title":4613,"body":11603,"category":193,"cover":194,"description":4618,"extension":195,"meta":11748,"navigation":90,"path":4793,"pinned":198,"publishedAt":199,"seo":11749,"slug":4795,"stem":4796,"summary":4797,"tags":11750,"updatedAt":199,"visible":90,"__hash__":4799},{"type":7,"value":11604,"toc":11738},[11605,11607,11609,11611,11613,11617,11623,11625,11639,11641,11643,11687,11689,11694,11696,11698,11708,11710,11722,11724,11730,11732,11734,11736],[10,11606,4618],{},[14,11608,16],{"id":16},[10,11610,4623],{},[14,11612,22],{"id":22},[10,11614,11615],{},[26,11616],{"alt":4630,"src":4631},[10,11618,11619,4637,11621,4641],{},[63,11620,4636],{},[63,11622,4640],{},[14,11624,35],{"id":35},[37,11626,11627,11629,11635],{},[40,11628,4648],{},[40,11630,11631,4653,11633,4656],{},[63,11632,4636],{},[63,11634,4290],{},[40,11636,4659,11637,4662],{},[63,11638,4640],{},[14,11640,51],{"id":51},[10,11642,54],{},[56,11644,11645],{"className":58,"code":4669,"language":60,"meta":61,"style":61},[63,11646,11647,11651,11655,11659,11663,11667,11671,11675,11679,11683],{"__ignoreMap":61},[66,11648,11649],{"class":68,"line":69},[66,11650,4676],{},[66,11652,11653],{"class":68,"line":75},[66,11654,91],{"emptyLinePlaceholder":90},[66,11656,11657],{"class":68,"line":81},[66,11658,4685],{},[66,11660,11661],{"class":68,"line":87},[66,11662,4690],{},[66,11664,11665],{"class":68,"line":94},[66,11666,4695],{},[66,11668,11669],{"class":68,"line":100},[66,11670,4700],{},[66,11672,11673],{"class":68,"line":106},[66,11674,4705],{},[66,11676,11677],{"class":68,"line":2461},[66,11678,4530],{},[66,11680,11681],{"class":68,"line":3921},[66,11682,91],{"emptyLinePlaceholder":90},[66,11684,11685],{"class":68,"line":4133},[66,11686,4718],{},[10,11688,112],{},[56,11690,11692],{"className":11691,"code":4724,"language":118,"meta":61},[116],[63,11693,4724],{"__ignoreMap":61},[10,11695,123],{},[14,11697,126],{"id":126},[128,11699,11700,11704],{},[40,11701,4735,11702,4738],{},[63,11703,4636],{},[40,11705,4741,11706,4744],{},[63,11707,4640],{},[14,11709,146],{"id":146},[37,11711,11712,11716],{},[40,11713,3435,11714,4753],{},[63,11715,4636],{},[40,11717,4756,11718,4759,11720,4762],{},[63,11719,4290],{},[63,11721,4636],{},[14,11723,157],{"id":157},[128,11725,11726,11728],{},[40,11727,4769],{},[40,11729,4772],{},[10,11731,172],{},[14,11733,175],{"id":175},[10,11735,4779],{},[180,11737,182],{},{"title":61,"searchDepth":75,"depth":75,"links":11739},[11740,11741,11742,11743,11744,11745,11746,11747],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":4613,"description":4618},[193,4640,4636],{"id":4801,"title":4802,"body":11752,"category":193,"cover":194,"description":4807,"extension":195,"meta":11891,"navigation":90,"path":4979,"pinned":198,"publishedAt":199,"seo":11892,"slug":4981,"stem":4982,"summary":4983,"tags":11893,"updatedAt":199,"visible":90,"__hash__":4987},{"type":7,"value":11753,"toc":11879},[11754,11756,11758,11760,11762,11766,11768,11770,11786,11788,11790,11818,11820,11825,11827,11829,11841,11843,11845,11849,11851,11853,11863,11865,11871,11873,11875,11877],[10,11755,4807],{},[14,11757,16],{"id":16},[10,11759,4812],{},[14,11761,22],{"id":22},[10,11763,11764],{},[26,11765],{"alt":4819,"src":4820},[10,11767,4823],{},[14,11769,35],{"id":35},[37,11771,11772,11774,11776],{},[40,11773,4830],{},[40,11775,4833],{},[40,11777,4836,11778,2224,11780,4843,11782,2224,11784,330],{},[63,11779,4839],{},[63,11781,4842],{},[63,11783,4846],{},[63,11785,4849],{},[14,11787,51],{"id":51},[10,11789,54],{},[56,11791,11792],{"className":58,"code":4856,"language":60,"meta":61,"style":61},[63,11793,11794,11798,11802,11806,11810,11814],{"__ignoreMap":61},[66,11795,11796],{"class":68,"line":69},[66,11797,4863],{},[66,11799,11800],{"class":68,"line":75},[66,11801,91],{"emptyLinePlaceholder":90},[66,11803,11804],{"class":68,"line":81},[66,11805,4872],{},[66,11807,11808],{"class":68,"line":87},[66,11809,4877],{},[66,11811,11812],{"class":68,"line":94},[66,11813,4882],{},[66,11815,11816],{"class":68,"line":100},[66,11817,4887],{},[10,11819,112],{},[56,11821,11823],{"className":11822,"code":4893,"language":118,"meta":61},[116],[63,11824,4893],{"__ignoreMap":61},[10,11826,123],{},[14,11828,126],{"id":126},[128,11830,11831,11839],{},[40,11832,4904,11833,4907,11835,1124,11837,330],{},[63,11834,4839],{},[63,11836,4910],{},[63,11838,4913],{},[40,11840,4916],{},[296,11842,2665],{"id":2665},[10,11844,4921],{},[10,11846,11847],{},[26,11848],{"alt":4926,"src":4927},[10,11850,4930],{},[14,11852,146],{"id":146},[37,11854,11855,11861],{},[40,11856,4937,11857,976,11859,4943],{},[63,11858,4940],{},[63,11860,4846],{},[40,11862,4946],{},[14,11864,157],{"id":157},[128,11866,11867,11869],{},[40,11868,4953],{},[40,11870,4956],{},[10,11872,172],{},[14,11874,175],{"id":175},[10,11876,4963],{},[180,11878,182],{},{"title":61,"searchDepth":75,"depth":75,"links":11880},[11881,11882,11883,11884,11885,11888,11889,11890],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":11886},[11887],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":4802,"description":4807},[193,4985,4986],{"id":4989,"title":4990,"body":11895,"category":193,"cover":194,"description":4995,"extension":195,"meta":12012,"navigation":90,"path":5134,"pinned":198,"publishedAt":199,"seo":12013,"slug":5136,"stem":5137,"summary":5138,"tags":12014,"updatedAt":199,"visible":90,"__hash__":5142},{"type":7,"value":11896,"toc":12002},[11897,11899,11901,11903,11905,11909,11911,11913,11921,11923,11925,11957,11959,11964,11966,11968,11976,11978,11986,11988,11994,11996,11998,12000],[10,11898,4995],{},[14,11900,16],{"id":16},[10,11902,5000],{},[14,11904,22],{"id":22},[10,11906,11907],{},[26,11908],{"alt":5007,"src":5008},[10,11910,5011],{},[14,11912,35],{"id":35},[37,11914,11915,11917,11919],{},[40,11916,5018],{},[40,11918,5021],{},[40,11920,5024],{},[14,11922,51],{"id":51},[10,11924,54],{},[56,11926,11927],{"className":58,"code":5031,"language":60,"meta":61,"style":61},[63,11928,11929,11933,11937,11941,11945,11949,11953],{"__ignoreMap":61},[66,11930,11931],{"class":68,"line":69},[66,11932,5038],{},[66,11934,11935],{"class":68,"line":75},[66,11936,91],{"emptyLinePlaceholder":90},[66,11938,11939],{"class":68,"line":81},[66,11940,5047],{},[66,11942,11943],{"class":68,"line":87},[66,11944,5052],{},[66,11946,11947],{"class":68,"line":94},[66,11948,91],{"emptyLinePlaceholder":90},[66,11950,11951],{"class":68,"line":100},[66,11952,5061],{},[66,11954,11955],{"class":68,"line":106},[66,11956,5066],{},[10,11958,112],{},[56,11960,11962],{"className":11961,"code":5072,"language":118,"meta":61},[116],[63,11963,5072],{"__ignoreMap":61},[10,11965,123],{},[14,11967,126],{"id":126},[128,11969,11970,11972],{},[40,11971,5083],{},[40,11973,5086,11974,5090],{},[63,11975,5089],{},[14,11977,146],{"id":146},[37,11979,11980,11984],{},[40,11981,5097,11982,5100],{},[63,11983,4307],{},[40,11985,5103],{},[14,11987,157],{"id":157},[128,11989,11990,11992],{},[40,11991,5110],{},[40,11993,5113],{},[10,11995,172],{},[14,11997,175],{"id":175},[10,11999,5120],{},[180,12001,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12003},[12004,12005,12006,12007,12008,12009,12010,12011],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":4990,"description":4995},[193,5140,5141],{"id":4,"title":5,"body":12016,"category":193,"cover":194,"description":12,"extension":195,"meta":12135,"navigation":90,"path":197,"pinned":198,"publishedAt":199,"seo":12136,"slug":201,"stem":202,"summary":203,"tags":12137,"updatedAt":199,"visible":90,"__hash__":207},{"type":7,"value":12017,"toc":12125},[12018,12020,12022,12024,12026,12030,12032,12034,12042,12044,12046,12078,12080,12085,12087,12089,12099,12101,12107,12109,12117,12119,12121,12123],[10,12019,12],{},[14,12021,16],{"id":16},[10,12023,19],{},[14,12025,22],{"id":22},[10,12027,12028],{},[26,12029],{"alt":28,"src":29},[10,12031,32],{},[14,12033,35],{"id":35},[37,12035,12036,12038,12040],{},[40,12037,42],{},[40,12039,45],{},[40,12041,48],{},[14,12043,51],{"id":51},[10,12045,54],{},[56,12047,12048],{"className":58,"code":59,"language":60,"meta":61,"style":61},[63,12049,12050,12054,12058,12062,12066,12070,12074],{"__ignoreMap":61},[66,12051,12052],{"class":68,"line":69},[66,12053,72],{},[66,12055,12056],{"class":68,"line":75},[66,12057,78],{},[66,12059,12060],{"class":68,"line":81},[66,12061,84],{},[66,12063,12064],{"class":68,"line":87},[66,12065,91],{"emptyLinePlaceholder":90},[66,12067,12068],{"class":68,"line":94},[66,12069,97],{},[66,12071,12072],{"class":68,"line":100},[66,12073,103],{},[66,12075,12076],{"class":68,"line":106},[66,12077,109],{},[10,12079,112],{},[56,12081,12083],{"className":12082,"code":117,"language":118,"meta":61},[116],[63,12084,117],{"__ignoreMap":61},[10,12086,123],{},[14,12088,126],{"id":126},[128,12090,12091,12095],{},[40,12092,132,12093,136],{},[63,12094,135],{},[40,12096,139,12097,143],{},[63,12098,142],{},[14,12100,146],{"id":146},[37,12102,12103,12105],{},[40,12104,151],{},[40,12106,154],{},[14,12108,157],{"id":157},[128,12110,12111,12115],{},[40,12112,162,12113,166],{},[63,12114,165],{},[40,12116,169],{},[10,12118,172],{},[14,12120,175],{"id":175},[10,12122,178],{},[180,12124,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12126},[12127,12128,12129,12130,12131,12132,12133,12134],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":5,"description":12},[193,205,206],{"id":5267,"title":5268,"body":12139,"category":193,"cover":194,"description":5273,"extension":195,"meta":12284,"navigation":90,"path":5454,"pinned":198,"publishedAt":199,"seo":12285,"slug":5456,"stem":5457,"summary":5458,"tags":12286,"updatedAt":199,"visible":90,"__hash__":5462},{"type":7,"value":12140,"toc":12272},[12141,12143,12145,12147,12149,12153,12157,12159,12171,12173,12175,12203,12205,12210,12212,12214,12228,12230,12232,12236,12244,12246,12256,12258,12264,12266,12268,12270],[10,12142,5273],{},[14,12144,16],{"id":16},[10,12146,5278],{},[14,12148,22],{"id":22},[10,12150,12151],{},[26,12152],{"alt":5285,"src":5286},[10,12154,5289,12155,5293],{},[63,12156,5292],{},[14,12158,35],{"id":35},[37,12160,12161,12163,12165],{},[40,12162,5300],{},[40,12164,5303],{},[40,12166,5306,12167,5309,12169,330],{},[63,12168,5292],{},[63,12170,5312],{},[14,12172,51],{"id":51},[10,12174,54],{},[56,12176,12177],{"className":58,"code":5319,"language":60,"meta":61,"style":61},[63,12178,12179,12183,12187,12191,12195,12199],{"__ignoreMap":61},[66,12180,12181],{"class":68,"line":69},[66,12182,5326],{},[66,12184,12185],{"class":68,"line":75},[66,12186,5331],{},[66,12188,12189],{"class":68,"line":81},[66,12190,5336],{},[66,12192,12193],{"class":68,"line":87},[66,12194,91],{"emptyLinePlaceholder":90},[66,12196,12197],{"class":68,"line":94},[66,12198,5345],{},[66,12200,12201],{"class":68,"line":100},[66,12202,5350],{},[10,12204,112],{},[56,12206,12208],{"className":12207,"code":5356,"language":118,"meta":61},[116],[63,12209,5356],{"__ignoreMap":61},[10,12211,123],{},[14,12213,126],{"id":126},[128,12215,12216,12222],{},[40,12217,5367,12218,2224,12220,5373],{},[63,12219,5370],{},[63,12221,4370],{},[40,12223,12224,5379,12226,5383],{},[63,12225,5378],{},[63,12227,5382],{},[296,12229,2665],{"id":2665},[10,12231,5388],{},[10,12233,12234],{},[26,12235],{"alt":5393,"src":5394},[10,12237,12238,2224,12240,1124,12242,5404],{},[63,12239,5370],{},[63,12241,4370],{},[63,12243,5403],{},[14,12245,146],{"id":146},[37,12247,12248,12252],{},[40,12249,5411,12250,5415],{},[63,12251,5414],{},[40,12253,5418,12254,5421],{},[63,12255,5403],{},[14,12257,157],{"id":157},[128,12259,12260,12262],{},[40,12261,5428],{},[40,12263,5431],{},[10,12265,172],{},[14,12267,175],{"id":175},[10,12269,5438],{},[180,12271,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12273},[12274,12275,12276,12277,12278,12281,12282,12283],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":12279},[12280],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":5268,"description":5273},[193,5460,5461],{"id":5464,"title":5465,"body":12288,"category":193,"cover":194,"description":5470,"extension":195,"meta":12437,"navigation":90,"path":5651,"pinned":198,"publishedAt":199,"seo":12438,"slug":5653,"stem":5654,"summary":5655,"tags":12439,"updatedAt":199,"visible":90,"__hash__":5659},{"type":7,"value":12289,"toc":12425},[12290,12292,12294,12296,12298,12302,12304,12306,12318,12320,12322,12366,12368,12373,12375,12377,12389,12391,12393,12397,12399,12401,12409,12411,12417,12419,12421,12423],[10,12291,5470],{},[14,12293,16],{"id":16},[10,12295,5475],{},[14,12297,22],{"id":22},[10,12299,12300],{},[26,12301],{"alt":5482,"src":5483},[10,12303,5486],{},[14,12305,35],{"id":35},[37,12307,12308,12310,12314],{},[40,12309,5493],{},[40,12311,12312,5499],{},[63,12313,5498],{},[40,12315,12316,5505],{},[63,12317,5504],{},[14,12319,51],{"id":51},[10,12321,54],{},[56,12323,12324],{"className":58,"code":5512,"language":60,"meta":61,"style":61},[63,12325,12326,12330,12334,12338,12342,12346,12350,12354,12358,12362],{"__ignoreMap":61},[66,12327,12328],{"class":68,"line":69},[66,12329,5519],{},[66,12331,12332],{"class":68,"line":75},[66,12333,5524],{},[66,12335,12336],{"class":68,"line":81},[66,12337,91],{"emptyLinePlaceholder":90},[66,12339,12340],{"class":68,"line":87},[66,12341,5533],{},[66,12343,12344],{"class":68,"line":94},[66,12345,5538],{},[66,12347,12348],{"class":68,"line":100},[66,12349,91],{"emptyLinePlaceholder":90},[66,12351,12352],{"class":68,"line":106},[66,12353,5547],{},[66,12355,12356],{"class":68,"line":2461},[66,12357,5552],{},[66,12359,12360],{"class":68,"line":3921},[66,12361,91],{"emptyLinePlaceholder":90},[66,12363,12364],{"class":68,"line":4133},[66,12365,5561],{},[10,12367,112],{},[56,12369,12371],{"className":12370,"code":5567,"language":118,"meta":61},[116],[63,12372,5567],{"__ignoreMap":61},[10,12374,123],{},[14,12376,126],{"id":126},[128,12378,12379,12383],{},[40,12380,5578,12381,5582],{},[63,12382,5581],{},[40,12384,12385,5588,12387,330],{},[63,12386,5587],{},[63,12388,5591],{},[296,12390,2665],{"id":2665},[10,12392,5596],{},[10,12394,12395],{},[26,12396],{"alt":5601,"src":5602},[10,12398,5605],{},[14,12400,146],{"id":146},[37,12402,12403,12407],{},[40,12404,5612,12405,5615],{},[63,12406,5312],{},[40,12408,5618],{},[14,12410,157],{"id":157},[128,12412,12413,12415],{},[40,12414,5625],{},[40,12416,5628],{},[10,12418,172],{},[14,12420,175],{"id":175},[10,12422,5635],{},[180,12424,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12426},[12427,12428,12429,12430,12431,12434,12435,12436],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":12432},[12433],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":5465,"description":5470},[193,5657,5658],{"id":5661,"title":5662,"body":12441,"category":193,"cover":194,"description":5667,"extension":195,"meta":12602,"navigation":90,"path":5865,"pinned":198,"publishedAt":199,"seo":12603,"slug":5867,"stem":5868,"summary":5869,"tags":12604,"updatedAt":199,"visible":90,"__hash__":5873},{"type":7,"value":12442,"toc":12590},[12443,12445,12447,12449,12451,12455,12457,12459,12471,12473,12475,12527,12529,12534,12536,12538,12556,12558,12560,12564,12566,12568,12574,12576,12582,12584,12586,12588],[10,12444,5667],{},[14,12446,16],{"id":16},[10,12448,5672],{},[14,12450,22],{"id":22},[10,12452,12453],{},[26,12454],{"alt":5679,"src":5680},[10,12456,5683],{},[14,12458,35],{"id":35},[37,12460,12461,12463,12465],{},[40,12462,5690],{},[40,12464,5693],{},[40,12466,12467,2143,12469,5702],{},[63,12468,5698],{},[63,12470,5701],{},[14,12472,51],{"id":51},[10,12474,54],{},[56,12476,12477],{"className":58,"code":5709,"language":60,"meta":61,"style":61},[63,12478,12479,12483,12487,12491,12495,12499,12503,12507,12511,12515,12519,12523],{"__ignoreMap":61},[66,12480,12481],{"class":68,"line":69},[66,12482,5716],{},[66,12484,12485],{"class":68,"line":75},[66,12486,91],{"emptyLinePlaceholder":90},[66,12488,12489],{"class":68,"line":81},[66,12490,5725],{},[66,12492,12493],{"class":68,"line":87},[66,12494,5730],{},[66,12496,12497],{"class":68,"line":94},[66,12498,91],{"emptyLinePlaceholder":90},[66,12500,12501],{"class":68,"line":100},[66,12502,5739],{},[66,12504,12505],{"class":68,"line":106},[66,12506,5744],{},[66,12508,12509],{"class":68,"line":2461},[66,12510,5749],{},[66,12512,12513],{"class":68,"line":3921},[66,12514,91],{"emptyLinePlaceholder":90},[66,12516,12517],{"class":68,"line":4133},[66,12518,5758],{},[66,12520,12521],{"class":68,"line":5761},[66,12522,91],{"emptyLinePlaceholder":90},[66,12524,12525],{"class":68,"line":5766},[66,12526,5769],{},[10,12528,112],{},[56,12530,12532],{"className":12531,"code":5775,"language":118,"meta":61},[116],[63,12533,5775],{"__ignoreMap":61},[10,12535,123],{},[14,12537,126],{"id":126},[128,12539,12540,12550],{},[40,12541,12542,5789,12544,5793,12546,5796,12548,5800],{},[63,12543,5788],{},[63,12545,5792],{},[63,12547,5581],{},[63,12549,5799],{},[40,12551,12552,5805,12554,5808],{},[63,12553,4553],{},[63,12555,2175],{},[296,12557,2665],{"id":2665},[10,12559,5813],{},[10,12561,12562],{},[26,12563],{"alt":5818,"src":5819},[10,12565,5822],{},[14,12567,146],{"id":146},[37,12569,12570,12572],{},[40,12571,5829],{},[40,12573,5832],{},[14,12575,157],{"id":157},[128,12577,12578,12580],{},[40,12579,5839],{},[40,12581,5842],{},[10,12583,172],{},[14,12585,175],{"id":175},[10,12587,5849],{},[180,12589,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12591},[12592,12593,12594,12595,12596,12599,12600,12601],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":12597},[12598],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":5662,"description":5667},[193,5871,5872],{"id":5875,"title":5876,"body":12606,"category":193,"cover":194,"description":5881,"extension":195,"meta":12729,"navigation":90,"path":6032,"pinned":198,"publishedAt":199,"seo":12730,"slug":6034,"stem":6035,"summary":6036,"tags":12731,"updatedAt":199,"visible":90,"__hash__":6040},{"type":7,"value":12607,"toc":12719},[12608,12610,12612,12614,12616,12620,12622,12624,12638,12640,12642,12670,12672,12677,12679,12681,12691,12693,12701,12703,12711,12713,12715,12717],[10,12609,5881],{},[14,12611,16],{"id":16},[10,12613,5886],{},[14,12615,22],{"id":22},[10,12617,12618],{},[26,12619],{"alt":5893,"src":5894},[10,12621,5897],{},[14,12623,35],{"id":35},[37,12625,12626,12628,12630],{},[40,12627,5904],{},[40,12629,5907],{},[40,12631,5910,12632,2224,12634,2224,12636,5918],{},[63,12633,2227],{},[63,12635,2393],{},[63,12637,5917],{},[14,12639,51],{"id":51},[10,12641,54],{},[56,12643,12644],{"className":58,"code":5925,"language":60,"meta":61,"style":61},[63,12645,12646,12650,12654,12658,12662,12666],{"__ignoreMap":61},[66,12647,12648],{"class":68,"line":69},[66,12649,5932],{},[66,12651,12652],{"class":68,"line":75},[66,12653,5937],{},[66,12655,12656],{"class":68,"line":81},[66,12657,5942],{},[66,12659,12660],{"class":68,"line":87},[66,12661,91],{"emptyLinePlaceholder":90},[66,12663,12664],{"class":68,"line":94},[66,12665,5951],{},[66,12667,12668],{"class":68,"line":100},[66,12669,5956],{},[10,12671,112],{},[56,12673,12675],{"className":12674,"code":5962,"language":118,"meta":61},[116],[63,12676,5962],{"__ignoreMap":61},[10,12678,123],{},[14,12680,126],{"id":126},[128,12682,12683,12689],{},[40,12684,5973,12685,5977,12687,5980],{},[63,12686,5976],{},[63,12688,2213],{},[40,12690,5983],{},[14,12692,146],{"id":146},[37,12694,12695,12699],{},[40,12696,5990,12697,5994],{},[63,12698,5993],{},[40,12700,5997],{},[14,12702,157],{"id":157},[128,12704,12705,12707],{},[40,12706,6004],{},[40,12708,6007,12709,6011],{},[63,12710,6010],{},[10,12712,172],{},[14,12714,175],{"id":175},[10,12716,6018],{},[180,12718,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12720},[12721,12722,12723,12724,12725,12726,12727,12728],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":5876,"description":5881},[193,6038,6039],{"id":6042,"title":6043,"body":12733,"category":193,"cover":194,"description":6048,"extension":195,"meta":12910,"navigation":90,"path":6276,"pinned":198,"publishedAt":199,"seo":12911,"slug":6278,"stem":6279,"summary":6280,"tags":12912,"updatedAt":199,"visible":90,"__hash__":6284},{"type":7,"value":12734,"toc":12898},[12735,12737,12739,12743,12745,12749,12755,12757,12769,12771,12775,12799,12803,12819,12825,12827,12832,12834,12836,12852,12854,12856,12860,12864,12866,12878,12880,12890,12892,12894,12896],[10,12736,6048],{},[14,12738,16],{"id":16},[10,12740,6053,12741,6056],{},[262,12742,5976],{},[14,12744,22],{"id":22},[10,12746,12747],{},[26,12748],{"alt":6063,"src":6064},[10,12750,6067,12751,6071,12753,6075],{},[63,12752,6070],{},[63,12754,6074],{},[14,12756,35],{"id":35},[37,12758,12759,12763,12765],{},[40,12760,6082,12761,6085],{},[63,12762,1138],{},[40,12764,6088],{},[40,12766,6091,12767,6095],{},[63,12768,6094],{},[14,12770,51],{"id":51},[10,12772,6100,12773,6104],{},[63,12774,6103],{},[56,12776,12777],{"className":58,"code":6107,"language":60,"meta":61,"style":61},[63,12778,12779,12783,12787,12791,12795],{"__ignoreMap":61},[66,12780,12781],{"class":68,"line":69},[66,12782,6114],{},[66,12784,12785],{"class":68,"line":75},[66,12786,6119],{},[66,12788,12789],{"class":68,"line":81},[66,12790,91],{"emptyLinePlaceholder":90},[66,12792,12793],{"class":68,"line":87},[66,12794,6128],{},[66,12796,12797],{"class":68,"line":94},[66,12798,6133],{},[10,12800,6136,12801,6140],{},[63,12802,6139],{},[56,12804,12805],{"className":58,"code":6143,"language":60,"meta":61,"style":61},[63,12806,12807,12811,12815],{"__ignoreMap":61},[66,12808,12809],{"class":68,"line":69},[66,12810,6150],{},[66,12812,12813],{"class":68,"line":75},[66,12814,91],{"emptyLinePlaceholder":90},[66,12816,12817],{"class":68,"line":81},[66,12818,6159],{},[10,12820,6162,12821,1124,12823,330],{},[63,12822,6165],{},[63,12824,6168],{},[10,12826,112],{},[56,12828,12830],{"className":12829,"code":6174,"language":118,"meta":61},[116],[63,12831,6174],{"__ignoreMap":61},[10,12833,123],{},[14,12835,126],{"id":126},[128,12837,12838,12844],{},[40,12839,6185,12840,6188,12842,6192],{},[63,12841,6103],{},[63,12843,6191],{},[40,12845,12846,6197,12848,6200,12850,6203],{},[63,12847,6139],{},[63,12849,6103],{},[63,12851,6139],{},[296,12853,2665],{"id":2665},[10,12855,6208],{},[10,12857,12858],{},[26,12859],{"alt":6213,"src":6214},[10,12861,6217,12862,6220],{},[63,12863,6191],{},[14,12865,146],{"id":146},[37,12867,12868,12874],{},[40,12869,6227,12870,1124,12872,330],{},[63,12871,6103],{},[63,12873,6139],{},[40,12875,6234,12876,6238],{},[63,12877,6237],{},[14,12879,157],{"id":157},[128,12881,12882,12886],{},[40,12883,2321,12884,6248],{},[63,12885,6247],{},[40,12887,6251,12888,330],{},[63,12889,6070],{},[10,12891,172],{},[14,12893,175],{"id":175},[10,12895,6260],{},[180,12897,182],{},{"title":61,"searchDepth":75,"depth":75,"links":12899},[12900,12901,12902,12903,12904,12907,12908,12909],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":12905},[12906],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":6043,"description":6048},[193,6282,6283],{"id":6286,"title":6287,"body":12914,"category":193,"cover":194,"description":6292,"extension":195,"meta":13053,"navigation":90,"path":6458,"pinned":198,"publishedAt":199,"seo":13054,"slug":6460,"stem":6461,"summary":6462,"tags":13055,"updatedAt":199,"visible":90,"__hash__":6465},{"type":7,"value":12915,"toc":13043},[12916,12918,12920,12922,12924,12928,12930,12932,12942,12944,12946,12986,12988,12993,12995,12997,13015,13017,13025,13027,13035,13037,13039,13041],[10,12917,6292],{},[14,12919,16],{"id":16},[10,12921,6297],{},[14,12923,22],{"id":22},[10,12925,12926],{},[26,12927],{"alt":6304,"src":6305},[10,12929,6308],{},[14,12931,35],{"id":35},[37,12933,12934,12938,12940],{},[40,12935,12936,6318],{},[63,12937,6317],{},[40,12939,6321],{},[40,12941,6324],{},[14,12943,51],{"id":51},[10,12945,1541],{},[56,12947,12948],{"className":559,"code":6331,"language":561,"meta":61,"style":61},[63,12949,12950,12960,12966,12972,12982],{"__ignoreMap":61},[66,12951,12952,12954,12956,12958],{"class":68,"line":69},[66,12953,659],{"class":568},[66,12955,601],{"class":571},[66,12957,6342],{"class":604},[66,12959,6345],{"class":604},[66,12961,12962,12964],{"class":68,"line":75},[66,12963,6350],{"class":571},[66,12965,6353],{"class":604},[66,12967,12968,12970],{"class":68,"line":81},[66,12969,60],{"class":568},[66,12971,572],{"class":571},[66,12973,12974,12976,12978,12980],{"class":68,"line":87},[66,12975,60],{"class":568},[66,12977,601],{"class":571},[66,12979,605],{"class":604},[66,12981,572],{"class":571},[66,12983,12984],{"class":68,"line":94},[66,12985,6374],{"class":568},[10,12987,112],{},[56,12989,12991],{"className":12990,"code":6380,"language":118,"meta":61},[116],[63,12992,6380],{"__ignoreMap":61},[10,12994,123],{},[14,12996,126],{"id":126},[128,12998,12999,13005],{},[40,13000,13001,6394,13003,6397],{},[63,13002,6393],{},[63,13004,659],{},[40,13006,6400,13007,2143,13009,6406,13011,3696,13013,6412],{},[63,13008,60],{},[63,13010,6405],{},[63,13012,6317],{},[63,13014,6411],{},[14,13016,146],{"id":146},[37,13018,13019,13021],{},[40,13020,6419],{},[40,13022,3435,13023,6424],{},[63,13024,6317],{},[14,13026,157],{"id":157},[128,13028,13029,13033],{},[40,13030,6431,13031,330],{},[63,13032,6434],{},[40,13034,6437],{},[10,13036,172],{},[14,13038,175],{"id":175},[10,13040,6444],{},[180,13042,1625],{},{"title":61,"searchDepth":75,"depth":75,"links":13044},[13045,13046,13047,13048,13049,13050,13051,13052],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":6287,"description":6292},[193,6464,228],{"id":6467,"title":6468,"body":13057,"category":193,"cover":194,"description":6473,"extension":195,"meta":13210,"navigation":90,"path":6662,"pinned":198,"publishedAt":199,"seo":13211,"slug":6664,"stem":6665,"summary":6666,"tags":13212,"updatedAt":199,"visible":90,"__hash__":6670},{"type":7,"value":13058,"toc":13200},[13059,13061,13063,13065,13067,13071,13077,13079,13095,13097,13099,13143,13145,13150,13152,13154,13166,13168,13182,13184,13192,13194,13196,13198],[10,13060,6473],{},[14,13062,16],{"id":16},[10,13064,6478],{},[14,13066,22],{"id":22},[10,13068,13069],{},[26,13070],{"alt":6485,"src":6486},[10,13072,13073,6492,13075,6495],{},[63,13074,6491],{},[63,13076,2403],{},[14,13078,35],{"id":35},[37,13080,13081,13083,13091],{},[40,13082,6502],{},[40,13084,13085,2224,13087,2224,13089,6514],{},[63,13086,6507],{},[63,13088,6510],{},[63,13090,6513],{},[40,13092,6517,13093,6521],{},[63,13094,6520],{},[14,13096,51],{"id":51},[10,13098,54],{},[56,13100,13101],{"className":58,"code":6528,"language":60,"meta":61,"style":61},[63,13102,13103,13107,13111,13115,13119,13123,13127,13131,13135,13139],{"__ignoreMap":61},[66,13104,13105],{"class":68,"line":69},[66,13106,6535],{},[66,13108,13109],{"class":68,"line":75},[66,13110,91],{"emptyLinePlaceholder":90},[66,13112,13113],{"class":68,"line":81},[66,13114,6544],{},[66,13116,13117],{"class":68,"line":87},[66,13118,6549],{},[66,13120,13121],{"class":68,"line":94},[66,13122,6554],{},[66,13124,13125],{"class":68,"line":100},[66,13126,91],{"emptyLinePlaceholder":90},[66,13128,13129],{"class":68,"line":106},[66,13130,6563],{},[66,13132,13133],{"class":68,"line":2461},[66,13134,6568],{},[66,13136,13137],{"class":68,"line":3921},[66,13138,6573],{},[66,13140,13141],{"class":68,"line":4133},[66,13142,6578],{},[10,13144,112],{},[56,13146,13148],{"className":13147,"code":6584,"language":118,"meta":61},[116],[63,13149,6584],{"__ignoreMap":61},[10,13151,123],{},[14,13153,126],{"id":126},[128,13155,13156,13160],{},[40,13157,13158,6598],{},[63,13159,6597],{},[40,13161,2306,13162,6603,13164,6606],{},[63,13163,2403],{},[63,13165,6491],{},[14,13167,146],{"id":146},[37,13169,13170,13176],{},[40,13171,3435,13172,6615,13174,6618],{},[63,13173,6491],{},[63,13175,6507],{},[40,13177,6621,13178,976,13180,6627],{},[63,13179,2403],{},[63,13181,6626],{},[14,13183,157],{"id":157},[128,13185,13186,13190],{},[40,13187,6634,13188,6638],{},[63,13189,6637],{},[40,13191,6641],{},[10,13193,172],{},[14,13195,175],{"id":175},[10,13197,6648],{},[180,13199,182],{},{"title":61,"searchDepth":75,"depth":75,"links":13201},[13202,13203,13204,13205,13206,13207,13208,13209],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":6468,"description":6473},[193,6668,6669],{"id":6672,"title":6673,"body":13214,"category":193,"cover":194,"description":6678,"extension":195,"meta":13361,"navigation":90,"path":6857,"pinned":198,"publishedAt":199,"seo":13362,"slug":6859,"stem":6860,"summary":6861,"tags":13363,"updatedAt":199,"visible":90,"__hash__":6865},{"type":7,"value":13215,"toc":13351},[13216,13218,13220,13222,13224,13228,13230,13232,13250,13252,13254,13302,13304,13309,13311,13313,13321,13323,13333,13335,13343,13345,13347,13349],[10,13217,6678],{},[14,13219,16],{"id":16},[10,13221,6683],{},[14,13223,22],{"id":22},[10,13225,13226],{},[26,13227],{"alt":6690,"src":6691},[10,13229,6694],{},[14,13231,35],{"id":35},[37,13233,13234,13238,13244],{},[40,13235,13236,6704],{},[63,13237,6703],{},[40,13239,13240,6710,13242,330],{},[63,13241,6709],{},[63,13243,6713],{},[40,13245,6716,13246,6720,13248,6724],{},[63,13247,6719],{},[63,13249,6723],{},[14,13251,51],{"id":51},[10,13253,54],{},[56,13255,13256],{"className":58,"code":6731,"language":60,"meta":61,"style":61},[63,13257,13258,13262,13266,13270,13274,13278,13282,13286,13290,13294,13298],{"__ignoreMap":61},[66,13259,13260],{"class":68,"line":69},[66,13261,6535],{},[66,13263,13264],{"class":68,"line":75},[66,13265,91],{"emptyLinePlaceholder":90},[66,13267,13268],{"class":68,"line":81},[66,13269,6746],{},[66,13271,13272],{"class":68,"line":87},[66,13273,6751],{},[66,13275,13276],{"class":68,"line":94},[66,13277,6756],{},[66,13279,13280],{"class":68,"line":100},[66,13281,6761],{},[66,13283,13284],{"class":68,"line":106},[66,13285,91],{"emptyLinePlaceholder":90},[66,13287,13288],{"class":68,"line":2461},[66,13289,6770],{},[66,13291,13292],{"class":68,"line":3921},[66,13293,6775],{},[66,13295,13296],{"class":68,"line":4133},[66,13297,6780],{},[66,13299,13300],{"class":68,"line":5761},[66,13301,6785],{},[10,13303,112],{},[56,13305,13307],{"className":13306,"code":6791,"language":118,"meta":61},[116],[63,13308,6791],{"__ignoreMap":61},[10,13310,123],{},[14,13312,126],{"id":126},[128,13314,13315,13319],{},[40,13316,6802,13317,6805],{},[63,13318,6719],{},[40,13320,6808],{},[14,13322,146],{"id":146},[37,13324,13325,13329],{},[40,13326,2306,13327,6817],{},[63,13328,6703],{},[40,13330,6820,13331,330],{},[63,13332,6823],{},[14,13334,157],{"id":157},[128,13336,13337,13339],{},[40,13338,6830],{},[40,13340,6833,13341,6836],{},[63,13342,304],{},[10,13344,172],{},[14,13346,175],{"id":175},[10,13348,6843],{},[180,13350,182],{},{"title":61,"searchDepth":75,"depth":75,"links":13352},[13353,13354,13355,13356,13357,13358,13359,13360],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":6673,"description":6678},[193,6863,6864],{"id":6867,"title":6868,"body":13365,"category":193,"cover":194,"description":6873,"extension":195,"meta":13508,"navigation":90,"path":7041,"pinned":198,"publishedAt":199,"seo":13509,"slug":7043,"stem":7044,"summary":7045,"tags":13510,"updatedAt":199,"visible":90,"__hash__":7049},{"type":7,"value":13366,"toc":13498},[13367,13369,13371,13373,13375,13379,13385,13387,13397,13399,13401,13453,13455,13460,13462,13464,13474,13476,13482,13484,13490,13492,13494,13496],[10,13368,6873],{},[14,13370,16],{"id":16},[10,13372,6878],{},[14,13374,22],{"id":22},[10,13376,13377],{},[26,13378],{"alt":6885,"src":6886},[10,13380,13381,6892,13383,6896],{},[63,13382,6891],{},[63,13384,6895],{},[14,13386,35],{"id":35},[37,13388,13389,13391,13395],{},[40,13390,6903],{},[40,13392,13393,6909],{},[63,13394,6908],{},[40,13396,6912],{},[14,13398,51],{"id":51},[10,13400,54],{},[56,13402,13403],{"className":58,"code":6919,"language":60,"meta":61,"style":61},[63,13404,13405,13409,13413,13417,13421,13425,13429,13433,13437,13441,13445,13449],{"__ignoreMap":61},[66,13406,13407],{"class":68,"line":69},[66,13408,6926],{},[66,13410,13411],{"class":68,"line":75},[66,13412,91],{"emptyLinePlaceholder":90},[66,13414,13415],{"class":68,"line":81},[66,13416,6935],{},[66,13418,13419],{"class":68,"line":87},[66,13420,91],{"emptyLinePlaceholder":90},[66,13422,13423],{"class":68,"line":94},[66,13424,6944],{},[66,13426,13427],{"class":68,"line":100},[66,13428,6949],{},[66,13430,13431],{"class":68,"line":106},[66,13432,6761],{},[66,13434,13435],{"class":68,"line":2461},[66,13436,91],{"emptyLinePlaceholder":90},[66,13438,13439],{"class":68,"line":3921},[66,13440,6962],{},[66,13442,13443],{"class":68,"line":4133},[66,13444,6967],{},[66,13446,13447],{"class":68,"line":5761},[66,13448,6780],{},[66,13450,13451],{"class":68,"line":5766},[66,13452,6976],{},[10,13454,112],{},[56,13456,13458],{"className":13457,"code":6982,"language":118,"meta":61},[116],[63,13459,6982],{"__ignoreMap":61},[10,13461,123],{},[14,13463,126],{"id":126},[128,13465,13466,13470],{},[40,13467,13468,6995],{},[63,13469,6891],{},[40,13471,13472,7000],{},[63,13473,6895],{},[14,13475,146],{"id":146},[37,13477,13478,13480],{},[40,13479,7007],{},[40,13481,7010],{},[14,13483,157],{"id":157},[128,13485,13486,13488],{},[40,13487,7017],{},[40,13489,7020],{},[10,13491,172],{},[14,13493,175],{"id":175},[10,13495,7027],{},[180,13497,182],{},{"title":61,"searchDepth":75,"depth":75,"links":13499},[13500,13501,13502,13503,13504,13505,13506,13507],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":6868,"description":6873},[193,7047,7048],{"id":7051,"title":7052,"body":13512,"category":193,"cover":194,"description":7057,"extension":195,"meta":13663,"navigation":90,"path":7242,"pinned":198,"publishedAt":199,"seo":13664,"slug":7244,"stem":7245,"summary":7246,"tags":13665,"updatedAt":199,"visible":90,"__hash__":7250},{"type":7,"value":13513,"toc":13653},[13514,13516,13518,13520,13522,13526,13530,13532,13546,13548,13550,13602,13604,13609,13611,13613,13625,13627,13637,13639,13645,13647,13649,13651],[10,13515,7057],{},[14,13517,16],{"id":16},[10,13519,7062],{},[14,13521,22],{"id":22},[10,13523,13524],{},[26,13525],{"alt":7069,"src":7070},[10,13527,13528,7076],{},[63,13529,7075],{},[14,13531,35],{"id":35},[37,13533,13534,13540,13544],{},[40,13535,2306,13536,7086,13538,7090],{},[63,13537,7085],{},[63,13539,7089],{},[40,13541,7093,13542,7097],{},[63,13543,7096],{},[40,13545,7100],{},[14,13547,51],{"id":51},[10,13549,54],{},[56,13551,13552],{"className":58,"code":7107,"language":60,"meta":61,"style":61},[63,13553,13554,13558,13562,13566,13570,13574,13578,13582,13586,13590,13594,13598],{"__ignoreMap":61},[66,13555,13556],{"class":68,"line":69},[66,13557,7114],{},[66,13559,13560],{"class":68,"line":75},[66,13561,91],{"emptyLinePlaceholder":90},[66,13563,13564],{"class":68,"line":81},[66,13565,7123],{},[66,13567,13568],{"class":68,"line":87},[66,13569,7128],{},[66,13571,13572],{"class":68,"line":94},[66,13573,7133],{},[66,13575,13576],{"class":68,"line":100},[66,13577,7138],{},[66,13579,13580],{"class":68,"line":106},[66,13581,7143],{},[66,13583,13584],{"class":68,"line":2461},[66,13585,91],{"emptyLinePlaceholder":90},[66,13587,13588],{"class":68,"line":3921},[66,13589,7152],{},[66,13591,13592],{"class":68,"line":4133},[66,13593,7157],{},[66,13595,13596],{"class":68,"line":5761},[66,13597,7162],{},[66,13599,13600],{"class":68,"line":5766},[66,13601,7167],{},[10,13603,112],{},[56,13605,13607],{"className":13606,"code":7173,"language":118,"meta":61},[116],[63,13608,7173],{"__ignoreMap":61},[10,13610,123],{},[14,13612,126],{"id":126},[128,13614,13615,13621],{},[40,13616,13617,7187,13619,7190],{},[63,13618,7186],{},[63,13620,7096],{},[40,13622,13623,7195],{},[63,13624,7075],{},[14,13626,146],{"id":146},[37,13628,13629,13631],{},[40,13630,7202],{},[40,13632,7205,13633,7208,13635,7211],{},[63,13634,7085],{},[63,13636,7089],{},[14,13638,157],{"id":157},[128,13640,13641,13643],{},[40,13642,7218],{},[40,13644,7221],{},[10,13646,172],{},[14,13648,175],{"id":175},[10,13650,7228],{},[180,13652,182],{},{"title":61,"searchDepth":75,"depth":75,"links":13654},[13655,13656,13657,13658,13659,13660,13661,13662],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":7052,"description":7057},[193,7248,7249],{"id":7252,"title":7253,"body":13667,"category":193,"cover":194,"description":7258,"extension":195,"meta":13881,"navigation":90,"path":7532,"pinned":198,"publishedAt":199,"seo":13882,"slug":7534,"stem":7535,"summary":7536,"tags":13883,"updatedAt":199,"visible":90,"__hash__":7540},{"type":7,"value":13668,"toc":13868},[13669,13671,13673,13675,13677,13681,13687,13689,13701,13703,13705,13765,13767,13772,13774,13776,13794,13796,13804,13808,13816,13818,13822,13826,13832,13834,13844,13846,13860,13862,13864,13866],[10,13670,7258],{},[14,13672,16],{"id":16},[10,13674,7263],{},[14,13676,22],{"id":22},[10,13678,13679],{},[26,13680],{"alt":7270,"src":7271},[10,13682,7274,13683,7278,13685,7282],{},[63,13684,7277],{},[63,13686,7281],{},[14,13688,35],{"id":35},[37,13690,13691,13695,13699],{},[40,13692,7289,13693,7292],{},[63,13694,7277],{},[40,13696,13697,7298],{},[63,13698,7297],{},[40,13700,7301],{},[14,13702,51],{"id":51},[10,13704,54],{},[56,13706,13707],{"className":58,"code":7308,"language":60,"meta":61,"style":61},[63,13708,13709,13713,13717,13721,13725,13729,13733,13737,13741,13745,13749,13753,13757,13761],{"__ignoreMap":61},[66,13710,13711],{"class":68,"line":69},[66,13712,7315],{},[66,13714,13715],{"class":68,"line":75},[66,13716,7320],{},[66,13718,13719],{"class":68,"line":81},[66,13720,7325],{},[66,13722,13723],{"class":68,"line":87},[66,13724,7330],{},[66,13726,13727],{"class":68,"line":94},[66,13728,7335],{},[66,13730,13731],{"class":68,"line":100},[66,13732,91],{"emptyLinePlaceholder":90},[66,13734,13735],{"class":68,"line":106},[66,13736,7344],{},[66,13738,13739],{"class":68,"line":2461},[66,13740,7349],{},[66,13742,13743],{"class":68,"line":3921},[66,13744,7354],{},[66,13746,13747],{"class":68,"line":4133},[66,13748,7359],{},[66,13750,13751],{"class":68,"line":5761},[66,13752,1113],{},[66,13754,13755],{"class":68,"line":5766},[66,13756,7368],{},[66,13758,13759],{"class":68,"line":7371},[66,13760,7374],{},[66,13762,13763],{"class":68,"line":7377},[66,13764,7380],{},[10,13766,112],{},[56,13768,13770],{"className":13769,"code":7386,"language":118,"meta":61},[116],[63,13771,7386],{"__ignoreMap":61},[10,13773,123],{},[14,13775,126],{"id":126},[128,13777,13778,13786],{},[40,13779,13780,7399,13782,7402,13784,7406],{},[63,13781,3004],{},[63,13783,7297],{},[63,13785,7405],{},[40,13787,7409,13788,7412,13790,7415,13792,330],{},[63,13789,7277],{},[63,13791,1127],{},[63,13793,7281],{},[296,13795,2665],{"id":2665},[10,13797,13798,2224,13800,1124,13802,7428],{},[63,13799,7277],{},[63,13801,1127],{},[63,13803,7281],{},[10,13805,13806],{},[26,13807],{"alt":7433,"src":7434},[10,13809,13810,7439,13812,7442,13814,7445],{},[63,13811,7277],{},[63,13813,1127],{},[63,13815,7281],{},[296,13817,2665],{"id":4188},[10,13819,13820,7453],{},[63,13821,7452],{},[10,13823,13824],{},[26,13825],{"alt":7458,"src":7459},[10,13827,7462,13828,7465,13830,7468],{},[63,13829,7452],{},[63,13831,1127],{},[14,13833,146],{"id":146},[37,13835,13836,13840],{},[40,13837,7475,13838,7479],{},[63,13839,7478],{},[40,13841,7482,13842,7485],{},[63,13843,7452],{},[14,13845,157],{"id":157},[128,13847,13848,13856],{},[40,13849,7492,13850,7496,13852,1124,13854,330],{},[63,13851,7495],{},[63,13853,7499],{},[63,13855,7502],{},[40,13857,7505,13858,7508],{},[63,13859,6713],{},[10,13861,172],{},[14,13863,175],{"id":175},[10,13865,7515],{},[180,13867,182],{},{"title":61,"searchDepth":75,"depth":75,"links":13869},[13870,13871,13872,13873,13874,13878,13879,13880],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":13875},[13876,13877],{"id":2665,"depth":81,"text":2665},{"id":4188,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":7253,"description":7258},[193,7538,7539],{"id":7542,"title":7543,"body":13885,"category":193,"cover":194,"description":7548,"extension":195,"meta":14036,"navigation":90,"path":7725,"pinned":198,"publishedAt":199,"seo":14037,"slug":7727,"stem":7728,"summary":7729,"tags":14038,"updatedAt":199,"visible":90,"__hash__":7732},{"type":7,"value":13886,"toc":14026},[13887,13889,13891,13893,13895,13899,13903,13905,13917,13919,13921,13969,13971,13976,13978,13980,13990,13992,14002,14004,14018,14020,14022,14024],[10,13888,7548],{},[14,13890,16],{"id":16},[10,13892,7553],{},[14,13894,22],{"id":22},[10,13896,13897],{},[26,13898],{"alt":7560,"src":7561},[10,13900,7564,13901,7567],{},[63,13902,6723],{},[14,13904,35],{"id":35},[37,13906,13907,13911,13915],{},[40,13908,13909,7576],{},[63,13910,6723],{},[40,13912,13913,7582],{},[63,13914,7581],{},[40,13916,7585],{},[14,13918,51],{"id":51},[10,13920,54],{},[56,13922,13923],{"className":58,"code":7592,"language":60,"meta":61,"style":61},[63,13924,13925,13929,13933,13937,13941,13945,13949,13953,13957,13961,13965],{"__ignoreMap":61},[66,13926,13927],{"class":68,"line":69},[66,13928,6535],{},[66,13930,13931],{"class":68,"line":75},[66,13932,91],{"emptyLinePlaceholder":90},[66,13934,13935],{"class":68,"line":81},[66,13936,6746],{},[66,13938,13939],{"class":68,"line":87},[66,13940,91],{"emptyLinePlaceholder":90},[66,13942,13943],{"class":68,"line":94},[66,13944,7615],{},[66,13946,13947],{"class":68,"line":100},[66,13948,7620],{},[66,13950,13951],{"class":68,"line":106},[66,13952,91],{"emptyLinePlaceholder":90},[66,13954,13955],{"class":68,"line":2461},[66,13956,7629],{},[66,13958,13959],{"class":68,"line":3921},[66,13960,7634],{},[66,13962,13963],{"class":68,"line":4133},[66,13964,91],{"emptyLinePlaceholder":90},[66,13966,13967],{"class":68,"line":5761},[66,13968,7643],{},[10,13970,112],{},[56,13972,13974],{"className":13973,"code":7649,"language":118,"meta":61},[116],[63,13975,7649],{"__ignoreMap":61},[10,13977,123],{},[14,13979,126],{"id":126},[128,13981,13982,13988],{},[40,13983,7564,13984,7662,13986,330],{},[63,13985,6723],{},[63,13987,7665],{},[40,13989,7668],{},[14,13991,146],{"id":146},[37,13993,13994,13998],{},[40,13995,4756,13996,7677],{},[63,13997,6723],{},[40,13999,7680,14000,7683],{},[63,14001,6723],{},[14,14003,157],{"id":157},[128,14005,14006,14012],{},[40,14007,7690,14008,7694,14010,330],{},[63,14009,7693],{},[63,14011,6723],{},[40,14013,4756,14014,7701,14016,330],{},[63,14015,6723],{},[63,14017,7704],{},[10,14019,172],{},[14,14021,175],{"id":175},[10,14023,7711],{},[180,14025,182],{},{"title":61,"searchDepth":75,"depth":75,"links":14027},[14028,14029,14030,14031,14032,14033,14034,14035],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":7543,"description":7548},[193,6723,7731],{"id":7734,"title":7735,"body":14040,"category":193,"cover":194,"description":7740,"extension":195,"meta":14211,"navigation":90,"path":7953,"pinned":198,"publishedAt":199,"seo":14212,"slug":7955,"stem":7956,"summary":7957,"tags":14213,"updatedAt":199,"visible":90,"__hash__":7961},{"type":7,"value":14041,"toc":14199},[14042,14044,14046,14048,14050,14054,14056,14058,14070,14072,14074,14130,14132,14137,14139,14141,14157,14159,14161,14165,14171,14173,14181,14183,14191,14193,14195,14197],[10,14043,7740],{},[14,14045,16],{"id":16},[10,14047,7745],{},[14,14049,22],{"id":22},[10,14051,14052],{},[26,14053],{"alt":7752,"src":7753},[10,14055,7756],{},[14,14057,35],{"id":35},[37,14059,14060,14064,14068],{},[40,14061,14062,7766],{},[63,14063,7765],{},[40,14065,14066,7772],{},[63,14067,7771],{},[40,14069,7775],{},[14,14071,51],{"id":51},[10,14073,54],{},[56,14075,14076],{"className":58,"code":7782,"language":60,"meta":61,"style":61},[63,14077,14078,14082,14086,14090,14094,14098,14102,14106,14110,14114,14118,14122,14126],{"__ignoreMap":61},[66,14079,14080],{"class":68,"line":69},[66,14081,7789],{},[66,14083,14084],{"class":68,"line":75},[66,14085,7794],{},[66,14087,14088],{"class":68,"line":81},[66,14089,7799],{},[66,14091,14092],{"class":68,"line":87},[66,14093,7804],{},[66,14095,14096],{"class":68,"line":94},[66,14097,91],{"emptyLinePlaceholder":90},[66,14099,14100],{"class":68,"line":100},[66,14101,7813],{},[66,14103,14104],{"class":68,"line":106},[66,14105,7818],{},[66,14107,14108],{"class":68,"line":2461},[66,14109,7823],{},[66,14111,14112],{"class":68,"line":3921},[66,14113,7828],{},[66,14115,14116],{"class":68,"line":4133},[66,14117,91],{"emptyLinePlaceholder":90},[66,14119,14120],{"class":68,"line":5761},[66,14121,7837],{},[66,14123,14124],{"class":68,"line":5766},[66,14125,7842],{},[66,14127,14128],{"class":68,"line":7371},[66,14129,7847],{},[10,14131,112],{},[56,14133,14135],{"className":14134,"code":7853,"language":118,"meta":61},[116],[63,14136,7853],{"__ignoreMap":61},[10,14138,123],{},[14,14140,126],{"id":126},[128,14142,14143,14149],{},[40,14144,7864,14145,7868,14147,7871],{},[63,14146,7867],{},[63,14148,7771],{},[40,14150,14151,7877,14153,7881,14155,7884],{},[63,14152,7876],{},[63,14154,7880],{},[63,14156,7765],{},[296,14158,2665],{"id":2665},[10,14160,7889],{},[10,14162,14163],{},[26,14164],{"alt":7894,"src":7895},[10,14166,7898,14167,1124,14169,7904],{},[63,14168,4553],{},[63,14170,7903],{},[14,14172,146],{"id":146},[37,14174,14175,14179],{},[40,14176,7911,14177,7914],{},[63,14178,7765],{},[40,14180,7917],{},[14,14182,157],{"id":157},[128,14184,14185,14189],{},[40,14186,162,14187,7927],{},[63,14188,7926],{},[40,14190,7930],{},[10,14192,172],{},[14,14194,175],{"id":175},[10,14196,7937],{},[180,14198,182],{},{"title":61,"searchDepth":75,"depth":75,"links":14200},[14201,14202,14203,14204,14205,14208,14209,14210],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":14206},[14207],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":7735,"description":7740},[193,7959,7960],{"id":7963,"title":7964,"body":14215,"category":193,"cover":194,"description":7969,"extension":195,"meta":14362,"navigation":90,"path":8148,"pinned":198,"publishedAt":199,"seo":14363,"slug":8150,"stem":8151,"summary":8152,"tags":14364,"updatedAt":199,"visible":90,"__hash__":8156},{"type":7,"value":14216,"toc":14352},[14217,14219,14221,14223,14225,14229,14231,14233,14241,14243,14245,14301,14303,14308,14310,14312,14324,14326,14332,14334,14344,14346,14348,14350],[10,14218,7969],{},[14,14220,16],{"id":16},[10,14222,7974],{},[14,14224,22],{"id":22},[10,14226,14227],{},[26,14228],{"alt":7981,"src":7982},[10,14230,7985],{},[14,14232,35],{"id":35},[37,14234,14235,14237,14239],{},[40,14236,7992],{},[40,14238,7995],{},[40,14240,7998],{},[14,14242,51],{"id":51},[10,14244,54],{},[56,14246,14247],{"className":58,"code":8005,"language":60,"meta":61,"style":61},[63,14248,14249,14253,14257,14261,14265,14269,14273,14277,14281,14285,14289,14293,14297],{"__ignoreMap":61},[66,14250,14251],{"class":68,"line":69},[66,14252,8012],{},[66,14254,14255],{"class":68,"line":75},[66,14256,8017],{},[66,14258,14259],{"class":68,"line":81},[66,14260,8022],{},[66,14262,14263],{"class":68,"line":87},[66,14264,91],{"emptyLinePlaceholder":90},[66,14266,14267],{"class":68,"line":94},[66,14268,8031],{},[66,14270,14271],{"class":68,"line":100},[66,14272,8036],{},[66,14274,14275],{"class":68,"line":106},[66,14276,8041],{},[66,14278,14279],{"class":68,"line":2461},[66,14280,91],{"emptyLinePlaceholder":90},[66,14282,14283],{"class":68,"line":3921},[66,14284,8050],{},[66,14286,14287],{"class":68,"line":4133},[66,14288,8055],{},[66,14290,14291],{"class":68,"line":5761},[66,14292,91],{"emptyLinePlaceholder":90},[66,14294,14295],{"class":68,"line":5766},[66,14296,8064],{},[66,14298,14299],{"class":68,"line":7371},[66,14300,8069],{},[10,14302,112],{},[56,14304,14306],{"className":14305,"code":8075,"language":118,"meta":61},[116],[63,14307,8075],{"__ignoreMap":61},[10,14309,123],{},[14,14311,126],{"id":126},[128,14313,14314,14320],{},[40,14315,14316,8089,14318,8093],{},[63,14317,8088],{},[63,14319,8092],{},[40,14321,8096,14322,8100],{},[63,14323,8099],{},[14,14325,146],{"id":146},[37,14327,14328,14330],{},[40,14329,8107],{},[40,14331,8110],{},[14,14333,157],{"id":157},[128,14335,14336,14342],{},[40,14337,8117,14338,8121,14340,330],{},[63,14339,8120],{},[63,14341,8124],{},[40,14343,8127],{},[10,14345,172],{},[14,14347,175],{"id":175},[10,14349,8134],{},[180,14351,182],{},{"title":61,"searchDepth":75,"depth":75,"links":14353},[14354,14355,14356,14357,14358,14359,14360,14361],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":7964,"description":7969},[193,8154,8155],{"id":8158,"title":8159,"body":14366,"category":193,"cover":194,"description":8164,"extension":195,"meta":14529,"navigation":90,"path":8368,"pinned":198,"publishedAt":199,"seo":14530,"slug":8370,"stem":8371,"summary":8372,"tags":14531,"updatedAt":199,"visible":90,"__hash__":8376},{"type":7,"value":14367,"toc":14517},[14368,14370,14372,14374,14376,14380,14384,14386,14402,14404,14406,14450,14452,14457,14459,14461,14475,14477,14481,14485,14489,14491,14497,14499,14509,14511,14513,14515],[10,14369,8164],{},[14,14371,16],{"id":16},[10,14373,8169],{},[14,14375,22],{"id":22},[10,14377,14378],{},[26,14379],{"alt":8176,"src":8177},[10,14381,8180,14382,8184],{},[63,14383,8183],{},[14,14385,35],{"id":35},[37,14387,14388,14394,14400],{},[40,14389,14390,8194,14392,8198],{},[63,14391,8193],{},[63,14393,8197],{},[40,14395,8201,14396,8205,14398,8208],{},[63,14397,8204],{},[63,14399,4307],{},[40,14401,8211],{},[14,14403,51],{"id":51},[10,14405,54],{},[56,14407,14408],{"className":58,"code":8218,"language":60,"meta":61,"style":61},[63,14409,14410,14414,14418,14422,14426,14430,14434,14438,14442,14446],{"__ignoreMap":61},[66,14411,14412],{"class":68,"line":69},[66,14413,8225],{},[66,14415,14416],{"class":68,"line":75},[66,14417,8230],{},[66,14419,14420],{"class":68,"line":81},[66,14421,8235],{},[66,14423,14424],{"class":68,"line":87},[66,14425,8240],{},[66,14427,14428],{"class":68,"line":94},[66,14429,8245],{},[66,14431,14432],{"class":68,"line":100},[66,14433,91],{"emptyLinePlaceholder":90},[66,14435,14436],{"class":68,"line":106},[66,14437,8254],{},[66,14439,14440],{"class":68,"line":2461},[66,14441,8259],{},[66,14443,14444],{"class":68,"line":3921},[66,14445,8259],{},[66,14447,14448],{"class":68,"line":4133},[66,14449,8259],{},[10,14451,112],{},[56,14453,14455],{"className":14454,"code":8273,"language":118,"meta":61},[116],[63,14456,8273],{"__ignoreMap":61},[10,14458,123],{},[14,14460,126],{"id":126},[128,14462,14463,14467],{},[40,14464,7864,14465,8287],{},[63,14466,8286],{},[40,14468,8290,14469,8293,14471,8296,14473,8300],{},[63,14470,8197],{},[63,14472,8183],{},[63,14474,8299],{},[296,14476,2665],{"id":2665},[10,14478,8305,14479,8308],{},[63,14480,8197],{},[10,14482,14483],{},[26,14484],{"alt":8313,"src":8314},[10,14486,8317,14487,8320],{},[63,14488,8183],{},[14,14490,146],{"id":146},[37,14492,14493,14495],{},[40,14494,8327],{},[40,14496,8330],{},[14,14498,157],{"id":157},[128,14500,14501,14503],{},[40,14502,8337],{},[40,14504,3979,14505,8342,14507,8345],{},[63,14506,4307],{},[63,14508,8197],{},[10,14510,172],{},[14,14512,175],{"id":175},[10,14514,8352],{},[180,14516,182],{},{"title":61,"searchDepth":75,"depth":75,"links":14518},[14519,14520,14521,14522,14523,14526,14527,14528],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":14524},[14525],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":8159,"description":8164},[193,8374,8375],{"id":8378,"title":8379,"body":14533,"category":193,"cover":194,"description":8384,"extension":195,"meta":14716,"navigation":90,"path":8609,"pinned":198,"publishedAt":199,"seo":14717,"slug":8611,"stem":8612,"summary":8613,"tags":14718,"updatedAt":199,"visible":90,"__hash__":8616},{"type":7,"value":14534,"toc":14704},[14535,14537,14539,14541,14543,14547,14549,14551,14565,14567,14569,14637,14639,14644,14646,14648,14662,14664,14666,14670,14676,14678,14686,14688,14696,14698,14700,14702],[10,14536,8384],{},[14,14538,16],{"id":16},[10,14540,8389],{},[14,14542,22],{"id":22},[10,14544,14545],{},[26,14546],{"alt":8396,"src":8397},[10,14548,8400],{},[14,14550,35],{"id":35},[37,14552,14553,14559,14561],{},[40,14554,14555,8410,14557,330],{},[63,14556,8409],{},[63,14558,8413],{},[40,14560,8416],{},[40,14562,14563,8422],{},[63,14564,8421],{},[14,14566,51],{"id":51},[10,14568,54],{},[56,14570,14571],{"className":58,"code":8429,"language":60,"meta":61,"style":61},[63,14572,14573,14577,14581,14585,14589,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633],{"__ignoreMap":61},[66,14574,14575],{"class":68,"line":69},[66,14576,8436],{},[66,14578,14579],{"class":68,"line":75},[66,14580,91],{"emptyLinePlaceholder":90},[66,14582,14583],{"class":68,"line":81},[66,14584,8445],{},[66,14586,14587],{"class":68,"line":87},[66,14588,8450],{},[66,14590,14591],{"class":68,"line":94},[66,14592,8455],{},[66,14594,14595],{"class":68,"line":100},[66,14596,8460],{},[66,14598,14599],{"class":68,"line":106},[66,14600,8465],{},[66,14602,14603],{"class":68,"line":2461},[66,14604,8470],{},[66,14606,14607],{"class":68,"line":3921},[66,14608,8475],{},[66,14610,14611],{"class":68,"line":4133},[66,14612,8480],{},[66,14614,14615],{"class":68,"line":5761},[66,14616,91],{"emptyLinePlaceholder":90},[66,14618,14619],{"class":68,"line":5766},[66,14620,8489],{},[66,14622,14623],{"class":68,"line":7371},[66,14624,6114],{},[66,14626,14627],{"class":68,"line":7377},[66,14628,6119],{},[66,14630,14631],{"class":68,"line":8500},[66,14632,91],{"emptyLinePlaceholder":90},[66,14634,14635],{"class":68,"line":8505},[66,14636,8508],{},[10,14638,112],{},[56,14640,14642],{"className":14641,"code":8514,"language":118,"meta":61},[116],[63,14643,8514],{"__ignoreMap":61},[10,14645,123],{},[14,14647,126],{"id":126},[128,14649,14650,14660],{},[40,14651,8525,14652,8529,14654,8533,14656,8537,14658,330],{},[63,14653,8528],{},[63,14655,8532],{},[63,14657,8536],{},[63,14659,8528],{},[40,14661,8542],{},[296,14663,2665],{"id":2665},[10,14665,8547],{},[10,14667,14668],{},[26,14669],{"alt":8552,"src":8553},[10,14671,14672,8558,14674,330],{},[63,14673,8409],{},[63,14675,8413],{},[14,14677,146],{"id":146},[37,14679,14680,14684],{},[40,14681,8567,14682,330],{},[63,14683,5312],{},[40,14685,8572],{},[14,14687,157],{"id":157},[128,14689,14690,14692],{},[40,14691,8579],{},[40,14693,8582,14694,8586],{},[63,14695,8585],{},[10,14697,172],{},[14,14699,175],{"id":175},[10,14701,8593],{},[180,14703,182],{},{"title":61,"searchDepth":75,"depth":75,"links":14705},[14706,14707,14708,14709,14710,14713,14714,14715],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":14711},[14712],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":8379,"description":8384},[193,8615,205],{"id":8618,"title":8619,"body":14720,"category":193,"cover":194,"description":8624,"extension":195,"meta":14879,"navigation":90,"path":8812,"pinned":198,"publishedAt":199,"seo":14880,"slug":8814,"stem":8815,"summary":8816,"tags":14881,"updatedAt":199,"visible":90,"__hash__":8820},{"type":7,"value":14721,"toc":14867},[14722,14724,14726,14728,14730,14734,14736,14738,14746,14748,14750,14814,14816,14821,14823,14825,14833,14835,14837,14841,14843,14845,14851,14853,14859,14861,14863,14865],[10,14723,8624],{},[14,14725,16],{"id":16},[10,14727,8629],{},[14,14729,22],{"id":22},[10,14731,14732],{},[26,14733],{"alt":8636,"src":8637},[10,14735,8640],{},[14,14737,35],{"id":35},[37,14739,14740,14742,14744],{},[40,14741,8647],{},[40,14743,8650],{},[40,14745,8653],{},[14,14747,51],{"id":51},[10,14749,54],{},[56,14751,14752],{"className":58,"code":8660,"language":60,"meta":61,"style":61},[63,14753,14754,14758,14762,14766,14770,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810],{"__ignoreMap":61},[66,14755,14756],{"class":68,"line":69},[66,14757,8667],{},[66,14759,14760],{"class":68,"line":75},[66,14761,8672],{},[66,14763,14764],{"class":68,"line":81},[66,14765,91],{"emptyLinePlaceholder":90},[66,14767,14768],{"class":68,"line":87},[66,14769,8681],{},[66,14771,14772],{"class":68,"line":94},[66,14773,91],{"emptyLinePlaceholder":90},[66,14775,14776],{"class":68,"line":100},[66,14777,8690],{},[66,14779,14780],{"class":68,"line":106},[66,14781,8695],{},[66,14783,14784],{"class":68,"line":2461},[66,14785,8700],{},[66,14787,14788],{"class":68,"line":3921},[66,14789,91],{"emptyLinePlaceholder":90},[66,14791,14792],{"class":68,"line":4133},[66,14793,8709],{},[66,14795,14796],{"class":68,"line":5761},[66,14797,8714],{},[66,14799,14800],{"class":68,"line":5766},[66,14801,8719],{},[66,14803,14804],{"class":68,"line":7371},[66,14805,91],{"emptyLinePlaceholder":90},[66,14807,14808],{"class":68,"line":7377},[66,14809,6128],{},[66,14811,14812],{"class":68,"line":8500},[66,14813,8732],{},[10,14815,112],{},[56,14817,14819],{"className":14818,"code":8738,"language":118,"meta":61},[116],[63,14820,8738],{"__ignoreMap":61},[10,14822,123],{},[14,14824,126],{"id":126},[128,14826,14827,14831],{},[40,14828,14829,8752],{},[63,14830,8751],{},[40,14832,8755],{},[296,14834,2665],{"id":2665},[10,14836,8760],{},[10,14838,14839],{},[26,14840],{"alt":8765,"src":8766},[10,14842,8769],{},[14,14844,146],{"id":146},[37,14846,14847,14849],{},[40,14848,8776],{},[40,14850,8779],{},[14,14852,157],{"id":157},[128,14854,14855,14857],{},[40,14856,8786],{},[40,14858,8789],{},[10,14860,172],{},[14,14862,175],{"id":175},[10,14864,8796],{},[180,14866,182],{},{"title":61,"searchDepth":75,"depth":75,"links":14868},[14869,14870,14871,14872,14873,14876,14877,14878],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":14874},[14875],{"id":2665,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":8619,"description":8624},[193,8818,8819],{"id":8822,"title":8823,"body":14883,"category":193,"cover":194,"description":8828,"extension":195,"meta":15121,"navigation":90,"path":9129,"pinned":198,"publishedAt":199,"seo":15122,"slug":9131,"stem":9132,"summary":9133,"tags":15123,"updatedAt":199,"visible":90,"__hash__":9137},{"type":7,"value":14884,"toc":15108},[14885,14887,14889,14891,14893,14897,14899,14901,14911,14913,14915,15031,15033,15038,15040,15042,15052,15054,15056,15060,15062,15064,15066,15070,15074,15076,15084,15086,15100,15102,15104,15106],[10,14886,8828],{},[14,14888,16],{"id":16},[10,14890,8833],{},[14,14892,22],{"id":22},[10,14894,14895],{},[26,14896],{"alt":8840,"src":8841},[10,14898,8844],{},[14,14900,35],{"id":35},[37,14902,14903,14905,14907],{},[40,14904,8851],{},[40,14906,8854],{},[40,14908,8857,14909,8861],{},[63,14910,8860],{},[14,14912,51],{"id":51},[10,14914,54],{},[56,14916,14917],{"className":58,"code":8868,"language":60,"meta":61,"style":61},[63,14918,14919,14923,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027],{"__ignoreMap":61},[66,14920,14921],{"class":68,"line":69},[66,14922,6926],{},[66,14924,14925],{"class":68,"line":75},[66,14926,6535],{},[66,14928,14929],{"class":68,"line":81},[66,14930,91],{"emptyLinePlaceholder":90},[66,14932,14933],{"class":68,"line":87},[66,14934,8887],{},[66,14936,14937],{"class":68,"line":94},[66,14938,8892],{},[66,14940,14941],{"class":68,"line":100},[66,14942,8897],{},[66,14944,14945],{"class":68,"line":106},[66,14946,8902],{},[66,14948,14949],{"class":68,"line":2461},[66,14950,91],{"emptyLinePlaceholder":90},[66,14952,14953],{"class":68,"line":3921},[66,14954,8911],{},[66,14956,14957],{"class":68,"line":4133},[66,14958,8916],{},[66,14960,14961],{"class":68,"line":5761},[66,14962,8921],{},[66,14964,14965],{"class":68,"line":5766},[66,14966,8926],{},[66,14968,14969],{"class":68,"line":7371},[66,14970,8931],{},[66,14972,14973],{"class":68,"line":7377},[66,14974,91],{"emptyLinePlaceholder":90},[66,14976,14977],{"class":68,"line":8500},[66,14978,8940],{},[66,14980,14981],{"class":68,"line":8505},[66,14982,8945],{},[66,14984,14985],{"class":68,"line":8948},[66,14986,8951],{},[66,14988,14989],{"class":68,"line":8954},[66,14990,91],{"emptyLinePlaceholder":90},[66,14992,14993],{"class":68,"line":8959},[66,14994,8962],{},[66,14996,14997],{"class":68,"line":8965},[66,14998,91],{"emptyLinePlaceholder":90},[66,15000,15001],{"class":68,"line":8970},[66,15002,7344],{},[66,15004,15005],{"class":68,"line":8975},[66,15006,8978],{},[66,15008,15009],{"class":68,"line":8981},[66,15010,8984],{},[66,15012,15013],{"class":68,"line":8987},[66,15014,8990],{},[66,15016,15017],{"class":68,"line":8993},[66,15018,7354],{},[66,15020,15021],{"class":68,"line":8998},[66,15022,9001],{},[66,15024,15025],{"class":68,"line":9004},[66,15026,1113],{},[66,15028,15029],{"class":68,"line":9009},[66,15030,9012],{},[10,15032,112],{},[56,15034,15036],{"className":15035,"code":9018,"language":118,"meta":61},[116],[63,15037,9018],{"__ignoreMap":61},[10,15039,123],{},[14,15041,126],{"id":126},[128,15043,15044,15048],{},[40,15045,9029,15046,9032],{},[63,15047,8860],{},[40,15049,15050,9037],{},[63,15051,8092],{},[296,15053,2665],{"id":2665},[10,15055,9042],{},[10,15057,15058],{},[26,15059],{"alt":9047,"src":9048},[10,15061,9051],{},[296,15063,2665],{"id":4188},[10,15065,9056],{},[10,15067,15068],{},[26,15069],{"alt":9061,"src":9062},[10,15071,9065,15072,9069],{},[63,15073,9068],{},[14,15075,146],{"id":146},[37,15077,15078,15080],{},[40,15079,9076],{},[40,15081,9079,15082,9082],{},[63,15083,9068],{},[14,15085,157],{"id":157},[128,15087,15088,15092,15094],{},[40,15089,9089,15090,9092],{},[63,15091,9068],{},[40,15093,9095],{},[40,15095,9098,15096,9102,15098,9105],{},[63,15097,9101],{},[63,15099,6070],{},[10,15101,172],{},[14,15103,175],{"id":175},[10,15105,9112],{},[180,15107,182],{},{"title":61,"searchDepth":75,"depth":75,"links":15109},[15110,15111,15112,15113,15114,15118,15119,15120],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":126,"depth":75,"text":126,"children":15115},[15116,15117],{"id":2665,"depth":81,"text":2665},{"id":4188,"depth":81,"text":2665},{"id":146,"depth":75,"text":146},{"id":157,"depth":75,"text":157},{"id":175,"depth":75,"text":175},{},{"title":8823,"description":8828},[193,9135,9136],{"id":1023,"title":1024,"body":15125,"category":193,"cover":1032,"description":61,"extension":195,"meta":15361,"navigation":90,"path":1349,"pinned":198,"publishedAt":1350,"seo":15362,"slug":1352,"stem":1353,"summary":1354,"tags":15363,"updatedAt":1350,"visible":90,"__hash__":1358},{"type":7,"value":15126,"toc":15346},[15127,15131,15133,15135,15137,15139,15159,15161,15166,15168,15170,15198,15204,15206,15210,15212,15232,15234,15244,15246,15248,15250,15252,15254,15256,15258,15260,15262,15282,15284,15286,15290,15292,15294,15296,15298,15302,15304,15322,15324,15326,15328,15330,15332,15334,15336,15338,15340,15342,15344],[10,15128,15129],{},[26,15130],{"alt":1031,"src":1032},[10,15132,1035],{},[10,15134,1038],{},[14,15136,1042],{"id":1041},[10,15138,1045],{},[56,15140,15141],{"className":58,"code":1048,"language":60,"meta":61,"style":61},[63,15142,15143,15147,15151,15155],{"__ignoreMap":61},[66,15144,15145],{"class":68,"line":69},[66,15146,1055],{},[66,15148,15149],{"class":68,"line":75},[66,15150,1060],{},[66,15152,15153],{"class":68,"line":81},[66,15154,91],{"emptyLinePlaceholder":90},[66,15156,15157],{"class":68,"line":87},[66,15158,1069],{},[10,15160,1072],{},[56,15162,15164],{"className":15163,"code":1076,"language":118,"meta":61},[116],[63,15165,1076],{"__ignoreMap":61},[10,15167,1081],{},[10,15169,1084],{},[56,15171,15172],{"className":58,"code":1087,"language":60,"meta":61,"style":61},[63,15173,15174,15178,15182,15186,15190,15194],{"__ignoreMap":61},[66,15175,15176],{"class":68,"line":69},[66,15177,1094],{},[66,15179,15180],{"class":68,"line":75},[66,15181,91],{"emptyLinePlaceholder":90},[66,15183,15184],{"class":68,"line":81},[66,15185,1103],{},[66,15187,15188],{"class":68,"line":87},[66,15189,1108],{},[66,15191,15192],{"class":68,"line":94},[66,15193,1113],{},[66,15195,15196],{"class":68,"line":100},[66,15197,1118],{},[10,15199,15200,1124,15202,1128],{},[63,15201,1123],{},[63,15203,1127],{},[14,15205,1132],{"id":1131},[10,15207,1135,15208,1139],{},[63,15209,1138],{},[10,15211,1142],{},[56,15213,15214],{"className":58,"code":1145,"language":60,"meta":61,"style":61},[63,15215,15216,15220,15224,15228],{"__ignoreMap":61},[66,15217,15218],{"class":68,"line":69},[66,15219,1152],{},[66,15221,15222],{"class":68,"line":75},[66,15223,1157],{},[66,15225,15226],{"class":68,"line":81},[66,15227,1162],{},[66,15229,15230],{"class":68,"line":87},[66,15231,1167],{},[10,15233,1170],{},[56,15235,15236],{"className":559,"code":1173,"language":561,"meta":61,"style":61},[63,15237,15238],{"__ignoreMap":61},[66,15239,15240,15242],{"class":68,"line":69},[66,15241,659],{"class":568},[66,15243,1182],{"class":604},[10,15245,1185],{},[14,15247,1189],{"id":1188},[296,15249,1192],{"id":1192},[10,15251,1195],{},[296,15253,1198],{"id":1198},[10,15255,1201],{},[296,15257,1204],{"id":1204},[10,15259,1207],{},[10,15261,1210],{},[56,15263,15264],{"className":58,"code":1213,"language":60,"meta":61,"style":61},[63,15265,15266,15270,15274,15278],{"__ignoreMap":61},[66,15267,15268],{"class":68,"line":69},[66,15269,1220],{},[66,15271,15272],{"class":68,"line":75},[66,15273,91],{"emptyLinePlaceholder":90},[66,15275,15276],{"class":68,"line":81},[66,15277,1229],{},[66,15279,15280],{"class":68,"line":87},[66,15281,1234],{},[10,15283,1237],{},[296,15285,1240],{"id":1240},[10,15287,1243,15288,1246],{},[63,15289,228],{},[10,15291,1249],{},[296,15293,1252],{"id":1252},[10,15295,1255],{},[14,15297,1259],{"id":1258},[10,15299,15300],{},[26,15301],{"alt":1264,"src":1265},[10,15303,1268],{},[37,15305,15306,15308,15310,15312,15314,15316,15318,15320],{},[40,15307,1273],{},[40,15309,1276],{},[40,15311,1279],{},[40,15313,1282],{},[40,15315,1285],{},[40,15317,1288],{},[40,15319,1291],{},[40,15321,1294],{},[10,15323,1297],{},[14,15325,1301],{"id":1300},[10,15327,1304],{},[10,15329,1307],{},[14,15331,1311],{"id":1310},[10,15333,1314],{},[10,15335,1317],{},[10,15337,1320],{},[14,15339,1323],{"id":1323},[10,15341,1326],{},[10,15343,1329],{},[180,15345,1332],{},{"title":61,"searchDepth":75,"depth":75,"links":15347},[15348,15349,15350,15357,15358,15359,15360],{"id":1041,"depth":75,"text":1042},{"id":1131,"depth":75,"text":1132},{"id":1188,"depth":75,"text":1189,"children":15351},[15352,15353,15354,15355,15356],{"id":1192,"depth":81,"text":1192},{"id":1198,"depth":81,"text":1198},{"id":1204,"depth":81,"text":1204},{"id":1240,"depth":81,"text":1240},{"id":1252,"depth":81,"text":1252},{"id":1258,"depth":75,"text":1259},{"id":1300,"depth":75,"text":1301},{"id":1310,"depth":75,"text":1311},{"id":1323,"depth":75,"text":1323},{},{"title":1024,"description":61},[193,1356,1357],{"id":210,"title":211,"body":15365,"category":193,"cover":194,"description":61,"extension":195,"meta":15944,"navigation":90,"path":1012,"pinned":198,"publishedAt":1013,"seo":15945,"slug":1015,"stem":1016,"summary":1017,"tags":15946,"updatedAt":1013,"visible":90,"__hash__":1021},{"type":7,"value":15366,"toc":15920},[15367,15369,15371,15373,15377,15379,15381,15405,15417,15419,15421,15426,15430,15434,15446,15450,15454,15458,15460,15494,15496,15500,15504,15506,15528,15558,15570,15580,15588,15590,15596,15606,15608,15613,15617,15619,15633,15639,15659,15661,15663,15665,15675,15679,15681,15690,15694,15696,15698,15718,15722,15724,15726,15728,15730,15750,15752,15754,15756,15782,15784,15800,15802,15818,15822,15824,15826,15846,15848,15850,15852,15856,15866,15868,15870,15872,15882,15890,15892,15894,15908,15918],[14,15368,216],{"id":216},[10,15370,219],{},[10,15372,222],{},[10,15374,225,15375,229],{},[63,15376,228],{},[14,15378,232],{"id":232},[10,15380,235],{},[237,15382,15383,15385],{},[10,15384,241],{},[237,15386,15387,15393,15395,15399,15401],{},[10,15388,246,15389,250,15391,254],{},[63,15390,249],{},[63,15392,253],{},[10,15394,257],{},[10,15396,260,15397,265],{},[262,15398,264],{},[10,15400,268],{},[10,15402,15403],{},[26,15404],{"alt":273,"src":274},[237,15406,15407,15409],{},[10,15408,279],{},[237,15410,15411,15413],{},[10,15412,284],{},[10,15414,15415],{},[26,15416],{"alt":289,"src":290},[14,15418,294],{"id":293},[296,15420,299],{"id":298},[10,15422,302,15423,310],{},[304,15424,309],{"href":306,"rel":15425},[308],[237,15427,15428],{},[10,15429,315],{},[10,15431,15432],{},[26,15433],{"alt":320,"src":321},[37,15435,15436,15440,15444],{},[40,15437,326,15438,330],{},[262,15439,329],{},[40,15441,333,15442,330],{},[262,15443,336],{},[40,15445,339],{},[10,15447,15448],{},[26,15449],{"alt":344,"src":345},[237,15451,15452],{},[10,15453,350],{},[10,15455,15456],{},[26,15457],{"alt":355,"src":356},[296,15459,360],{"id":359},[237,15461,15462,15466,15470,15490],{},[237,15463,15464],{},[10,15465,367],{},[10,15467,370,15468,374],{},[262,15469,373],{},[56,15471,15472],{"className":58,"code":377,"language":60,"meta":61,"style":61},[63,15473,15474,15478,15482,15486],{"__ignoreMap":61},[66,15475,15476],{"class":68,"line":69},[66,15477,384],{},[66,15479,15480],{"class":68,"line":75},[66,15481,389],{},[66,15483,15484],{"class":68,"line":81},[66,15485,394],{},[66,15487,15488],{"class":68,"line":87},[66,15489,399],{},[10,15491,402,15492,406],{},[262,15493,405],{},[10,15495,409],{},[10,15497,412,15498,415],{},[63,15499,60],{},[10,15501,15502],{},[26,15503],{"alt":420,"src":421},[10,15505,424],{},[237,15507,15508,15510,15514],{},[10,15509,429],{},[10,15511,15512],{},[262,15513,434],{},[237,15515,15516,15520,15524],{},[10,15517,439,15518,442],{},[63,15519,60],{},[10,15521,445,15522,448],{},[63,15523,60],{},[10,15525,451,15526,455],{},[262,15527,454],{},[237,15529,15530,15532,15536],{},[10,15531,460],{},[10,15533,15534],{},[262,15535,465],{},[237,15537,15538,15544,15552,15554],{},[10,15539,15540,473,15542,477],{},[63,15541,472],{},[63,15543,476],{},[10,15545,480,15546,483,15548,487,15550,491],{},[63,15547,472],{},[262,15549,486],{},[262,15551,490],{},[10,15553,494],{},[10,15555,15556,500],{},[262,15557,499],{},[237,15559,15560,15562],{},[10,15561,505],{},[237,15563,15564,15568],{},[10,15565,510,15566,514],{},[262,15567,513],{},[10,15569,517],{},[237,15571,15572,15576],{},[10,15573,522,15574],{},[262,15575,525],{},[10,15577,15578],{},[26,15579],{"alt":530,"src":531},[237,15581,15582,15584],{},[10,15583,536],{},[10,15585,15586],{},[26,15587],{"alt":530,"src":541},[296,15589,545],{"id":544},[10,15591,548,15592,552,15594,556],{},[63,15593,551],{},[63,15595,555],{},[56,15597,15598],{"className":559,"code":560,"language":561,"meta":61,"style":61},[63,15599,15600],{"__ignoreMap":61},[66,15601,15602,15604],{"class":68,"line":69},[66,15603,60],{"class":568},[66,15605,572],{"class":571},[10,15607,575],{},[56,15609,15611],{"className":15610,"code":579,"language":118,"meta":61},[116],[63,15612,579],{"__ignoreMap":61},[10,15614,15615],{},[26,15616],{"alt":530,"src":586},[10,15618,589],{},[56,15620,15621],{"className":559,"code":592,"language":561,"meta":61,"style":61},[63,15622,15623],{"__ignoreMap":61},[66,15624,15625,15627,15629,15631],{"class":68,"line":69},[66,15626,60],{"class":568},[66,15628,601],{"class":571},[66,15630,605],{"class":604},[66,15632,572],{"class":571},[10,15634,610,15635,613,15637,617],{},[63,15636,60],{},[63,15638,616],{},[56,15640,15641],{"className":559,"code":620,"language":561,"meta":61,"style":61},[63,15642,15643,15649],{"__ignoreMap":61},[66,15644,15645,15647],{"class":68,"line":69},[66,15646,476],{"class":568},[66,15648,572],{"class":571},[66,15650,15651,15653,15655,15657],{"class":68,"line":75},[66,15652,476],{"class":568},[66,15654,601],{"class":571},[66,15656,605],{"class":604},[66,15658,572],{"class":571},[14,15660,642],{"id":641},[296,15662,646],{"id":645},[10,15664,649],{},[56,15666,15667],{"className":559,"code":652,"language":561,"meta":61,"style":61},[63,15668,15669],{"__ignoreMap":61},[66,15670,15671,15673],{"class":68,"line":69},[66,15672,659],{"class":568},[66,15674,572],{"class":571},[10,15676,664,15677,668],{},[63,15678,667],{},[296,15680,672],{"id":671},[10,15682,302,15683,680,15686,330,15688,687],{},[304,15684,679],{"href":677,"rel":15685},[308],[262,15687,683],{},[63,15689,686],{},[10,15691,690,15692,694],{},[63,15693,693],{},[296,15695,698],{"id":697},[10,15697,701],{},[56,15699,15700],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,15701,15702,15708],{"__ignoreMap":61},[66,15703,15704,15706],{"class":68,"line":69},[66,15705,659],{"class":568},[66,15707,572],{"class":571},[66,15709,15710,15712,15714,15716],{"class":68,"line":75},[66,15711,659],{"class":568},[66,15713,601],{"class":571},[66,15715,605],{"class":604},[66,15717,572],{"class":571},[10,15719,725,15720,728],{},[63,15721,659],{},[14,15723,732],{"id":731},[10,15725,735],{},[296,15727,739],{"id":738},[10,15729,742],{},[56,15731,15732],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,15733,15734,15740],{"__ignoreMap":61},[66,15735,15736,15738],{"class":68,"line":69},[66,15737,659],{"class":568},[66,15739,572],{"class":571},[66,15741,15742,15744,15746,15748],{"class":68,"line":75},[66,15743,659],{"class":568},[66,15745,601],{"class":571},[66,15747,605],{"class":604},[66,15749,572],{"class":571},[10,15751,765],{},[296,15753,769],{"id":768},[10,15755,772],{},[56,15757,15758],{"className":559,"code":775,"language":561,"meta":61,"style":61},[63,15759,15760,15768],{"__ignoreMap":61},[66,15761,15762,15764,15766],{"class":68,"line":69},[66,15763,782],{"class":568},[66,15765,785],{"class":604},[66,15767,788],{"class":604},[66,15769,15770,15772,15774,15776,15778,15780],{"class":68,"line":75},[66,15771,782],{"class":568},[66,15773,785],{"class":604},[66,15775,797],{"class":604},[66,15777,800],{"class":604},[66,15779,803],{"class":604},[66,15781,806],{"class":604},[10,15783,809],{},[56,15785,15786],{"className":559,"code":812,"language":561,"meta":61,"style":61},[63,15787,15788],{"__ignoreMap":61},[66,15789,15790,15792,15794,15796,15798],{"class":68,"line":69},[66,15791,782],{"class":568},[66,15793,821],{"class":604},[66,15795,797],{"class":604},[66,15797,800],{"class":604},[66,15799,828],{"class":604},[10,15801,831],{},[56,15803,15804],{"className":559,"code":834,"language":561,"meta":61,"style":61},[63,15805,15806],{"__ignoreMap":61},[66,15807,15808,15810,15812,15814,15816],{"class":68,"line":69},[66,15809,782],{"class":568},[66,15811,843],{"class":604},[66,15813,846],{"class":571},[66,15815,849],{"class":604},[66,15817,852],{"class":604},[10,15819,15820,857],{},[63,15821,782],{},[296,15823,861],{"id":860},[10,15825,864],{},[56,15827,15828],{"className":559,"code":704,"language":561,"meta":61,"style":61},[63,15829,15830,15836],{"__ignoreMap":61},[66,15831,15832,15834],{"class":68,"line":69},[66,15833,659],{"class":568},[66,15835,572],{"class":571},[66,15837,15838,15840,15842,15844],{"class":68,"line":75},[66,15839,659],{"class":568},[66,15841,601],{"class":571},[66,15843,605],{"class":604},[66,15845,572],{"class":571},[10,15847,887],{},[14,15849,890],{"id":890},[296,15851,894],{"id":893},[10,15853,897,15854,901],{},[63,15855,900],{},[128,15857,15858,15862,15864],{},[40,15859,132,15860,908],{},[63,15861,616],{},[40,15863,911],{},[40,15865,914],{},[10,15867,917],{},[296,15869,921],{"id":920},[10,15871,924],{},[56,15873,15874],{"className":559,"code":652,"language":561,"meta":61,"style":61},[63,15875,15876],{"__ignoreMap":61},[66,15877,15878,15880],{"class":68,"line":69},[66,15879,659],{"class":568},[66,15881,572],{"class":571},[10,15883,937,15884,940,15886,943,15888,330],{},[63,15885,659],{},[63,15887,60],{},[63,15889,659],{},[296,15891,949],{"id":948},[10,15893,952],{},[56,15895,15896],{"className":559,"code":955,"language":561,"meta":61,"style":61},[63,15897,15898],{"__ignoreMap":61},[66,15899,15900,15902,15904,15906],{"class":68,"line":69},[66,15901,659],{"class":568},[66,15903,601],{"class":571},[66,15905,605],{"class":604},[66,15907,572],{"class":571},[10,15909,970,15910,973,15912,976,15914,979,15916,983],{},[63,15911,659],{},[63,15913,60],{},[63,15915,476],{},[63,15917,982],{},[180,15919,986],{},{"title":61,"searchDepth":75,"depth":75,"links":15921},[15922,15923,15924,15929,15934,15939],{"id":216,"depth":75,"text":216},{"id":232,"depth":75,"text":232},{"id":293,"depth":75,"text":294,"children":15925},[15926,15927,15928],{"id":298,"depth":81,"text":299},{"id":359,"depth":81,"text":360},{"id":544,"depth":81,"text":545},{"id":641,"depth":75,"text":642,"children":15930},[15931,15932,15933],{"id":645,"depth":81,"text":646},{"id":671,"depth":81,"text":672},{"id":697,"depth":81,"text":698},{"id":731,"depth":75,"text":732,"children":15935},[15936,15937,15938],{"id":738,"depth":81,"text":739},{"id":768,"depth":81,"text":769},{"id":860,"depth":81,"text":861},{"id":890,"depth":75,"text":890,"children":15940},[15941,15942,15943],{"id":893,"depth":81,"text":894},{"id":920,"depth":81,"text":921},{"id":948,"depth":81,"text":949},{},{"title":211,"description":61},[193,1019,1020],1786973365371]