[{"data":1,"prerenderedAt":15967},["ShallowReactive",2],{"post-python-nested-control-flow":3,"sidebar-posts":240,"post-related-source":9158},{"id":4,"title":5,"body":6,"category":225,"cover":226,"description":12,"extension":227,"meta":228,"navigation":93,"path":229,"pinned":230,"publishedAt":231,"seo":232,"slug":233,"stem":234,"summary":235,"tags":236,"updatedAt":231,"visible":93,"__hash__":239},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":8,"toc":213},"minimark",[9,13,17,20,23,30,33,36,65,68,71,119,122,130,133,136,155,159,162,168,171,174,189,192,200,203,206,209],[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\u002F20-nested-loop.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,49,53,54,57,58,53,61,64],{},"变量名使用 ",[50,51,52],"code",{},"row","、",[50,55,56],{},"cell"," 等层级含义，避免全部写成 ",[50,59,60],{},"i",[50,62,63],{},"j","。",[14,66,67],{"id":67},"跟着示例运行",[10,69,70],{},"把下面代码保存到本课脚本并运行：",[72,73,78],"pre",{"className":74,"code":75,"language":76,"meta":77,"style":77},"language-python shiki shiki-themes github-dark","table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n","python","",[50,79,80,88,95,101,107,113],{"__ignoreMap":77},[81,82,85],"span",{"class":83,"line":84},"line",1,[81,86,87],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[81,89,91],{"class":83,"line":90},2,[81,92,94],{"emptyLinePlaceholder":93},true,"\n",[81,96,98],{"class":83,"line":97},3,[81,99,100],{},"for row in table:\n",[81,102,104],{"class":83,"line":103},4,[81,105,106],{},"    for cell in row:\n",[81,108,110],{"class":83,"line":109},5,[81,111,112],{},"        print(cell)\n",[81,114,116],{"class":83,"line":115},6,[81,117,118],{},"    print(\"一行结束\")\n",[10,120,121],{},"预期结果：",[72,123,128],{"className":124,"code":126,"language":127,"meta":77},[125],"language-text","A1\nA2\n一行结束\nB1\nB2\n一行结束\n","text",[50,129,126],{"__ignoreMap":77},[10,131,132],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,134,135],{"id":135},"按执行顺序拆开看",[137,138,139,152],"ol",{},[40,140,141,142,144,145,148,149,64],{},"外层变量 ",[50,143,52],{}," 先引用第一行列表，内层才依次处理 ",[50,146,147],{},"A1"," 和 ",[50,150,151],{},"A2",[40,153,154],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[156,157,158],"h3",{"id":158},"再看一个具体细节",[10,160,161],{},"二维列表的输出顺序可以展开成一条时间线。",[10,163,164],{},[26,165],{"alt":166,"src":167},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,169,170],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,172,173],{"id":173},"初学者容易混淆的地方",[37,175,176,186],{},[40,177,178,179,182,183,185],{},"把两层循环变量都叫 ",[50,180,181],{},"item"," 或 ",[50,184,60],{},"，难以确认当前层级。",[40,187,188],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,190,191],{"id":191},"练习",[137,193,194,197],{},[40,195,196],{},"打印一个 2×3 数字表。",[40,198,199],{},"在内层增加条件，只输出大于 3 的元素。",[10,201,202],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,204,205],{"id":205},"本篇边界",[10,207,208],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,211,212],"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":77,"searchDepth":90,"depth":90,"links":214},[215,216,217,218,219,222,223,224],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":220},[221],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",false,"2026-08-17",{"title":5,"description":12},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[225,237,238],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",[241,1052,1388,1522,1674,1853,2041,2206,2389,2572,2764,2995,3179,3356,3513,3684,3849,4064,4293,4475,4639,4828,4971,5126,5286,5483,5680,5894,6061,6305,6486,6691,6886,7070,7271,7561,7753,7982,8177,8397,8637,8841],{"id":242,"title":243,"body":244,"category":225,"cover":226,"description":77,"extension":227,"meta":1041,"navigation":93,"path":1042,"pinned":230,"publishedAt":1043,"seo":1044,"slug":1045,"stem":1046,"summary":1047,"tags":1048,"updatedAt":1043,"visible":93,"__hash__":1051},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":245,"toc":1017},[246,249,252,255,262,265,268,307,323,327,331,342,347,353,370,376,381,387,391,437,440,446,452,455,486,531,548,562,572,576,587,603,606,612,617,620,638,648,669,673,677,680,692,699,703,718,725,729,732,753,759,763,766,770,773,793,796,800,803,837,840,859,862,883,888,892,895,915,918,921,925,932,946,949,953,956,966,977,981,984,999,1014],[14,247,248],{"id":248},"引言",[10,250,251],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,253,254],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,256,257,258,261],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[50,259,260],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,263,264],{"id":264},"扫盲",[10,266,267],{},"那么这里有几个概念：",[269,270,271,274],"blockquote",{},[10,272,273],{},"为什么需要安装python解释器？",[269,275,276,287,290,298,301],{},[10,277,278,279,282,283,286],{},"我们写的代码，电脑其实看不懂，电脑只认识",[50,280,281],{},"0","和",[50,284,285],{},"1","组成的机器指令。",[10,288,289],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,291,292,293,297],{},"这样，我们就能用",[294,295,296],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,299,300],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,302,303],{},[26,304],{"alt":305,"src":306},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[269,308,309,312],{},[10,310,311],{},"pip又是什么？",[269,313,314,317],{},[10,315,316],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,318,319],{},[26,320],{"alt":321,"src":322},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,324,326],{"id":325},"windows-安装","Windows 安装",[156,328,330],{"id":329},"_1-下载官方安装程序","1. 下载官方安装程序",[10,332,333,334,341],{},"打开 ",[335,336,340],"a",{"href":337,"rel":338},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[339],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[269,343,344],{},[10,345,346],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,348,349],{},[26,350],{"alt":351,"src":352},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,354,355,361,367],{},[40,356,357,358,64],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[294,359,360],{},"Windows installer (64-bit)",[40,362,363,364,64],{},"搭载 ARM 处理器的 Windows 设备选择 ",[294,365,366],{},"Windows installer (ARM64)",[40,368,369],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,371,372],{},[26,373],{"alt":374,"src":375},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[269,377,378],{},[10,379,380],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,382,383],{},[26,384],{"alt":385,"src":386},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[156,388,390],{"id":389},"_2-安装并加入-path","2. 安装并加入 PATH",[269,392,393,398,405,430],{},[269,394,395],{},[10,396,397],{},"PATH 环境变量",[10,399,400,401,404],{},"Windows 有一个特殊的变量叫 ",[294,402,403],{},"PATH","，它里面存了一串文件夹路径，比如：",[72,406,408],{"className":74,"code":407,"language":76,"meta":77,"style":77},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[50,409,410,415,420,425],{"__ignoreMap":77},[81,411,412],{"class":83,"line":84},[81,413,414],{},"D:\\Python313\\\n",[81,416,417],{"class":83,"line":90},[81,418,419],{},"D:\\Python313\\Scripts\\\n",[81,421,422],{"class":83,"line":97},[81,423,424],{},"C:\\Windows\\System32\\\n",[81,426,427],{"class":83,"line":103},[81,428,429],{},"...\n",[10,431,432,433,436],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[294,434,435],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,438,439],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,441,442,443,445],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[50,444,76],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,447,448],{},[26,449],{"alt":450,"src":451},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,453,454],{},"对安装界面最底部的两个勾选项分别解释 :",[269,456,457,460,465],{},[10,458,459],{},"Add python.exe to PATH",[10,461,462],{},[294,463,464],{},"把 Python 添加到系统环境变量",[269,466,467,473,479],{},[10,468,469,470,472],{},"勾选后，你可以在命令行任意位置直接输入 ",[50,471,76],{}," 就能运行",[10,474,475,476,478],{},"不勾选的话，命令行输入 ",[50,477,76],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,480,481,482,485],{},"必须",[294,483,484],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[269,487,488,491,496],{},[10,489,490],{},"Use admin privileges when installing py.exe",[10,492,493],{},[294,494,495],{},"使用管理员权限安装 py.exe（Python 启动器）",[269,497,498,508,522,525],{},[10,499,500,503,504,507],{},[50,501,502],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[50,505,506],{},"py"," 来启动 Python。",[10,509,510,511,513,514,517,518,521],{},"勾选后，",[50,512,502],{}," 会安装到",[294,515,516],{},"系统级目录","，电脑上",[294,519,520],{},"所有用户账户","都能用",[10,523,524],{},"不勾选，只有当前用户能用",[10,526,527,530],{},[294,528,529],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[269,532,533,536],{},[10,534,535],{},"操作建议",[269,537,538,545],{},[10,539,540,541,544],{},"两个都勾上之后，再点 ",[294,542,543],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,546,547],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[269,549,550,556],{},[10,551,552,553],{},"Python 安装的",[294,554,555],{},"可选功能页",[10,557,558],{},[26,559],{"alt":560,"src":561},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[269,563,564,567],{},[10,565,566],{},"高级选项页",[10,568,569],{},[26,570],{"alt":560,"src":571},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[156,573,575],{"id":574},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,577,578,579,582,583,586],{},"按 ",[50,580,581],{},"Win + R","，输入 ",[50,584,585],{},"cmd"," 并回车，然后执行：",[72,588,592],{"className":589,"code":590,"language":591,"meta":77,"style":77},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[50,593,594],{"__ignoreMap":77},[81,595,596,599],{"class":83,"line":84},[81,597,76],{"class":598},"svObZ",[81,600,602],{"class":601},"sDLfK"," --version\n",[10,604,605],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[72,607,610],{"className":608,"code":609,"language":127,"meta":77},[125],"Python 3.x.x\n",[50,611,609],{"__ignoreMap":77},[10,613,614],{},[26,615],{"alt":560,"src":616},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,618,619],{},"继续检查 pip：",[72,621,623],{"className":589,"code":622,"language":591,"meta":77,"style":77},"python -m pip --version\n",[50,624,625],{"__ignoreMap":77},[81,626,627,629,632,636],{"class":83,"line":84},[81,628,76],{"class":598},[81,630,631],{"class":601}," -m",[81,633,635],{"class":634},"sU2Wk"," pip",[81,637,602],{"class":601},[10,639,640,641,643,644,647],{},"如果 ",[50,642,76],{}," 无法识别，但 ",[50,645,646],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[72,649,651],{"className":589,"code":650,"language":591,"meta":77,"style":77},"py --version\npy -m pip --version\n",[50,652,653,659],{"__ignoreMap":77},[81,654,655,657],{"class":83,"line":84},[81,656,506],{"class":598},[81,658,602],{"class":601},[81,660,661,663,665,667],{"class":83,"line":90},[81,662,506],{"class":598},[81,664,631],{"class":601},[81,666,635],{"class":634},[81,668,602],{"class":601},[14,670,672],{"id":671},"macos-安装","macOS 安装",[156,674,676],{"id":675},"_1-先检查现有环境","1. 先检查现有环境",[10,678,679],{},"打开“终端”应用，执行：",[72,681,683],{"className":589,"code":682,"language":591,"meta":77,"style":77},"python3 --version\n",[50,684,685],{"__ignoreMap":77},[81,686,687,690],{"class":83,"line":84},[81,688,689],{"class":598},"python3",[81,691,602],{"class":601},[10,693,694,695,698],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[50,696,697],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[156,700,702],{"id":701},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,704,333,705,710,711,64,714,717],{},[335,706,709],{"href":707,"rel":708},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[339],"Python macOS 下载页","，下载当前稳定版的 ",[294,712,713],{},"macOS 64-bit universal2 installer",[50,715,716],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,719,720,721,724],{},"下载完成后打开 ",[50,722,723],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[156,726,728],{"id":727},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,730,731],{},"安装完成后重新打开终端，执行：",[72,733,735],{"className":589,"code":734,"language":591,"meta":77,"style":77},"python3 --version\npython3 -m pip --version\n",[50,736,737,743],{"__ignoreMap":77},[81,738,739,741],{"class":83,"line":84},[81,740,689],{"class":598},[81,742,602],{"class":601},[81,744,745,747,749,751],{"class":83,"line":90},[81,746,689],{"class":598},[81,748,631],{"class":601},[81,750,635],{"class":634},[81,752,602],{"class":601},[10,754,755,756,758],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[50,757,689],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,760,762],{"id":761},"linux-安装","Linux 安装",[10,764,765],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[156,767,769],{"id":768},"_1-检查是否已经安装","1. 检查是否已经安装",[10,771,772],{},"打开终端，执行：",[72,774,775],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,776,777,783],{"__ignoreMap":77},[81,778,779,781],{"class":83,"line":84},[81,780,689],{"class":598},[81,782,602],{"class":601},[81,784,785,787,789,791],{"class":83,"line":90},[81,786,689],{"class":598},[81,788,631],{"class":601},[81,790,635],{"class":634},[81,792,602],{"class":601},[10,794,795],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[156,797,799],{"id":798},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,801,802],{},"Ubuntu 或 Debian：",[72,804,806],{"className":589,"code":805,"language":591,"meta":77,"style":77},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[50,807,808,819],{"__ignoreMap":77},[81,809,810,813,816],{"class":83,"line":84},[81,811,812],{"class":598},"sudo",[81,814,815],{"class":634}," apt",[81,817,818],{"class":634}," update\n",[81,820,821,823,825,828,831,834],{"class":83,"line":90},[81,822,812],{"class":598},[81,824,815],{"class":634},[81,826,827],{"class":634}," install",[81,829,830],{"class":634}," python3",[81,832,833],{"class":634}," python3-pip",[81,835,836],{"class":634}," python3-venv\n",[10,838,839],{},"Fedora：",[72,841,843],{"className":589,"code":842,"language":591,"meta":77,"style":77},"sudo dnf install python3 python3-pip\n",[50,844,845],{"__ignoreMap":77},[81,846,847,849,852,854,856],{"class":83,"line":84},[81,848,812],{"class":598},[81,850,851],{"class":634}," dnf",[81,853,827],{"class":634},[81,855,830],{"class":634},[81,857,858],{"class":634}," python3-pip\n",[10,860,861],{},"Arch Linux：",[72,863,865],{"className":589,"code":864,"language":591,"meta":77,"style":77},"sudo pacman -S python python-pip\n",[50,866,867],{"__ignoreMap":77},[81,868,869,871,874,877,880],{"class":83,"line":84},[81,870,812],{"class":598},[81,872,873],{"class":634}," pacman",[81,875,876],{"class":601}," -S",[81,878,879],{"class":634}," python",[81,881,882],{"class":634}," python-pip\n",[10,884,885,887],{},[50,886,812],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[156,889,891],{"id":890},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,893,894],{},"安装结束后执行：",[72,896,897],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,898,899,905],{"__ignoreMap":77},[81,900,901,903],{"class":83,"line":84},[81,902,689],{"class":598},[81,904,602],{"class":601},[81,906,907,909,911,913],{"class":83,"line":90},[81,908,689],{"class":598},[81,910,631],{"class":601},[81,912,635],{"class":634},[81,914,602],{"class":601},[10,916,917],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,919,920],{"id":920},"常见问题",[156,922,924],{"id":923},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,926,927,928,931],{},"先关闭当前命令提示符并重新打开，再执行 ",[50,929,930],{},"python --version","。如果仍然失败，按下面的顺序检查：",[137,933,934,940,943],{},[40,935,936,937,939],{},"执行 ",[50,938,646],{},"，确认 Python Launcher 是否可用。",[40,941,942],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,944,945],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,947,948],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[156,950,952],{"id":951},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,954,955],{},"先尝试：",[72,957,958],{"className":589,"code":682,"language":591,"meta":77,"style":77},[50,959,960],{"__ignoreMap":77},[81,961,962,964],{"class":83,"line":84},[81,963,689],{"class":598},[81,965,602],{"class":601},[10,967,968,969,971,972,974,975,64],{},"在这两个系统中，只有 ",[50,970,689],{}," 命令而没有 ",[50,973,76],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[50,976,689],{},[156,978,980],{"id":979},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,982,983],{},"先使用模块方式检查：",[72,985,987],{"className":589,"code":986,"language":591,"meta":77,"style":77},"python3 -m pip --version\n",[50,988,989],{"__ignoreMap":77},[81,990,991,993,995,997],{"class":83,"line":84},[81,992,689],{"class":598},[81,994,631],{"class":601},[81,996,635],{"class":634},[81,998,602],{"class":601},[10,1000,1001,1002,1004,1005,182,1007,1009,1010,1013],{},"Windows 用户将命令中的 ",[50,1003,689],{}," 换成 ",[50,1006,76],{},[50,1008,506],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[50,1011,1012],{},"python3-pip","；不要直接使用其他系统的安装命令。",[210,1015,1016],{},"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":77,"searchDepth":90,"depth":90,"links":1018},[1019,1020,1021,1026,1031,1036],{"id":248,"depth":90,"text":248},{"id":264,"depth":90,"text":264},{"id":325,"depth":90,"text":326,"children":1022},[1023,1024,1025],{"id":329,"depth":97,"text":330},{"id":389,"depth":97,"text":390},{"id":574,"depth":97,"text":575},{"id":671,"depth":90,"text":672,"children":1027},[1028,1029,1030],{"id":675,"depth":97,"text":676},{"id":701,"depth":97,"text":702},{"id":727,"depth":97,"text":728},{"id":761,"depth":90,"text":762,"children":1032},[1033,1034,1035],{"id":768,"depth":97,"text":769},{"id":798,"depth":97,"text":799},{"id":890,"depth":97,"text":891},{"id":920,"depth":90,"text":920,"children":1037},[1038,1039,1040],{"id":923,"depth":97,"text":924},{"id":951,"depth":97,"text":952},{"id":979,"depth":97,"text":980},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":243,"description":77},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[225,1049,1050],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1053,"title":1054,"body":1055,"category":225,"cover":1062,"description":77,"extension":227,"meta":1377,"navigation":93,"path":1378,"pinned":230,"publishedAt":1379,"seo":1380,"slug":1381,"stem":1382,"summary":1383,"tags":1384,"updatedAt":1379,"visible":93,"__hash__":1387},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1056,"toc":1362},[1057,1063,1066,1069,1073,1076,1100,1103,1109,1112,1115,1149,1158,1162,1169,1172,1197,1200,1212,1215,1219,1222,1225,1228,1231,1234,1237,1240,1264,1267,1270,1276,1279,1282,1285,1289,1295,1298,1324,1327,1331,1334,1337,1341,1344,1347,1350,1353,1356,1359],[10,1058,1059],{},[26,1060],{"alt":1061,"src":1062},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1064,1065],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1067,1068],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1070,1072],{"id":1071},"python-代码是什么样的","Python 代码是什么样的",[10,1074,1075],{},"下面是一段简单的 Python 代码：",[72,1077,1079],{"className":74,"code":1078,"language":76,"meta":77,"style":77},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[50,1080,1081,1086,1091,1095],{"__ignoreMap":77},[81,1082,1083],{"class":83,"line":84},[81,1084,1085],{},"name = \"Python\"\n",[81,1087,1088],{"class":83,"line":90},[81,1089,1090],{},"year = 2026\n",[81,1092,1093],{"class":83,"line":97},[81,1094,94],{"emptyLinePlaceholder":93},[81,1096,1097],{"class":83,"line":103},[81,1098,1099],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1101,1102],{},"运行结果：",[72,1104,1107],{"className":1105,"code":1106,"language":127,"meta":77},[125],"正在学习 Python，当前年份是 2026\n",[50,1108,1106],{"__ignoreMap":77},[10,1110,1111],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1113,1114],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[72,1116,1118],{"className":74,"code":1117,"language":76,"meta":77,"style":77},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[50,1119,1120,1125,1129,1134,1139,1144],{"__ignoreMap":77},[81,1121,1122],{"class":83,"line":84},[81,1123,1124],{},"score = 85\n",[81,1126,1127],{"class":83,"line":90},[81,1128,94],{"emptyLinePlaceholder":93},[81,1130,1131],{"class":83,"line":97},[81,1132,1133],{},"if score >= 60:\n",[81,1135,1136],{"class":83,"line":103},[81,1137,1138],{},"    print(\"成绩合格\")\n",[81,1140,1141],{"class":83,"line":109},[81,1142,1143],{},"else:\n",[81,1145,1146],{"class":83,"line":115},[81,1147,1148],{},"    print(\"需要继续学习\")\n",[10,1150,1151,148,1154,1157],{},[50,1152,1153],{},"if",[50,1155,1156],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1159,1161],{"id":1160},"python-如何运行代码","Python 如何运行代码",[10,1163,1164,1165,1168],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[50,1166,1167],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1170,1171],{},"交互式环境适合快速验证一个表达式：",[72,1173,1175],{"className":74,"code":1174,"language":76,"meta":77,"style":77},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[50,1176,1177,1182,1187,1192],{"__ignoreMap":77},[81,1178,1179],{"class":83,"line":84},[81,1180,1181],{},">>> 10 + 20\n",[81,1183,1184],{"class":83,"line":90},[81,1185,1186],{},"30\n",[81,1188,1189],{"class":83,"line":97},[81,1190,1191],{},">>> \"Python\".lower()\n",[81,1193,1194],{"class":83,"line":103},[81,1195,1196],{},"'python'\n",[10,1198,1199],{},"需要保存和重复运行的程序，则可以写入文件：",[72,1201,1203],{"className":589,"code":1202,"language":591,"meta":77,"style":77},"python3 hello.py\n",[50,1204,1205],{"__ignoreMap":77},[81,1206,1207,1209],{"class":83,"line":84},[81,1208,689],{"class":598},[81,1210,1211],{"class":634}," hello.py\n",[10,1213,1214],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1216,1218],{"id":1217},"python-的特点","Python 的特点",[156,1220,1221],{"id":1221},"语法相对简洁",[10,1223,1224],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[156,1226,1227],{"id":1227},"支持多种编程方式",[10,1229,1230],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[156,1232,1233],{"id":1233},"标准库比较完整",[10,1235,1236],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1238,1239],{},"例如，获取当前时间：",[72,1241,1243],{"className":74,"code":1242,"language":76,"meta":77,"style":77},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[50,1244,1245,1250,1254,1259],{"__ignoreMap":77},[81,1246,1247],{"class":83,"line":84},[81,1248,1249],{},"from datetime import datetime\n",[81,1251,1252],{"class":83,"line":90},[81,1253,94],{"emptyLinePlaceholder":93},[81,1255,1256],{"class":83,"line":97},[81,1257,1258],{},"now = datetime.now()\n",[81,1260,1261],{"class":83,"line":103},[81,1262,1263],{},"print(now)\n",[10,1265,1266],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[156,1268,1269],{"id":1269},"第三方工具丰富",[10,1271,1272,1273,1275],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[50,1274,260],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1277,1278],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[156,1280,1281],{"id":1281},"支持多个操作系统",[10,1283,1284],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1286,1288],{"id":1287},"python-可以做什么","Python 可以做什么",[10,1290,1291],{},[26,1292],{"alt":1293,"src":1294},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1296,1297],{},"Python 的应用范围比较广，常见方向包括：",[37,1299,1300,1303,1306,1309,1312,1315,1318,1321],{},[40,1301,1302],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1304,1305],{},"开发网站后端和 API 服务；",[40,1307,1308],{},"进行数据清洗、统计分析和图表展示；",[40,1310,1311],{},"编写网络爬虫和信息采集工具；",[40,1313,1314],{},"开发自动化测试程序；",[40,1316,1317],{},"进行机器学习和人工智能开发；",[40,1319,1320],{},"编写运维、监控和辅助开发工具；",[40,1322,1323],{},"开发部分桌面应用和插件。",[10,1325,1326],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1328,1330],{"id":1329},"python-的发展","Python 的发展",[10,1332,1333],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1335,1336],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1338,1340],{"id":1339},"python-也有局限","Python 也有局限",[10,1342,1343],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1345,1346],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1348,1349],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1351,1352],{"id":1352},"写在最后",[10,1354,1355],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1357,1358],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[210,1360,1361],{},"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":77,"searchDepth":90,"depth":90,"links":1363},[1364,1365,1366,1373,1374,1375,1376],{"id":1071,"depth":90,"text":1072},{"id":1160,"depth":90,"text":1161},{"id":1217,"depth":90,"text":1218,"children":1367},[1368,1369,1370,1371,1372],{"id":1221,"depth":97,"text":1221},{"id":1227,"depth":97,"text":1227},{"id":1233,"depth":97,"text":1233},{"id":1269,"depth":97,"text":1269},{"id":1281,"depth":97,"text":1281},{"id":1287,"depth":90,"text":1288},{"id":1329,"depth":90,"text":1330},{"id":1339,"depth":90,"text":1340},{"id":1352,"depth":90,"text":1352},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1054,"description":77},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[225,1385,1386],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1389,"title":1390,"body":1391,"category":225,"cover":226,"description":1395,"extension":227,"meta":1513,"navigation":93,"path":1514,"pinned":230,"publishedAt":231,"seo":1515,"slug":1516,"stem":1517,"summary":1518,"tags":1519,"updatedAt":231,"visible":93,"__hash__":1521},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1392,"toc":1503},[1393,1396,1398,1401,1403,1409,1414,1416,1430,1432,1434,1443,1445,1451,1453,1455,1471,1473,1484,1486,1494,1496,1498,1501],[10,1394,1395],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1397,16],{"id":16},[10,1399,1400],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1402,22],{"id":22},[10,1404,1405],{},[26,1406],{"alt":1407,"src":1408},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1410,1411,1413],{},[50,1412,1167],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1415,35],{"id":35},[37,1417,1418,1424,1427],{},[40,1419,1420,1421,1423],{},"源代码是人编写的文本，通常保存在 ",[50,1422,1167],{}," 文件中。",[40,1425,1426],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1428,1429],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1431,67],{"id":67},[10,1433,70],{},[72,1435,1437],{"className":74,"code":1436,"language":76,"meta":77,"style":77},"print(\"你好，Python\")\n",[50,1438,1439],{"__ignoreMap":77},[81,1440,1441],{"class":83,"line":84},[81,1442,1436],{},[10,1444,121],{},[72,1446,1449],{"className":1447,"code":1448,"language":127,"meta":77},[125],"你好，Python\n",[50,1450,1448],{"__ignoreMap":77},[10,1452,132],{},[14,1454,135],{"id":135},[137,1456,1457,1464],{},[40,1458,1459,1460,1463],{},"终端启动解释器后，解释器读取 ",[50,1461,1462],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1465,1466,1467,1470],{},"字符串对象先准备好，再交给 ",[50,1468,1469],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1472,173],{"id":173},[37,1474,1475,1478],{},[40,1476,1477],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1479,1480,1481,1483],{},"认为 ",[50,1482,1167],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1485,191],{"id":191},[137,1487,1488,1491],{},[40,1489,1490],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1492,1493],{},"把示例文字改成自己的学习目标并重新运行。",[10,1495,202],{},[14,1497,205],{"id":205},[10,1499,1500],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,1502,212],{},{"title":77,"searchDepth":90,"depth":90,"links":1504},[1505,1506,1507,1508,1509,1510,1511,1512],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1390,"description":1395},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[225,1385,1520],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1523,"title":1524,"body":1525,"category":225,"cover":226,"description":1529,"extension":227,"meta":1665,"navigation":93,"path":1666,"pinned":230,"publishedAt":231,"seo":1667,"slug":1668,"stem":1669,"summary":1670,"tags":1671,"updatedAt":231,"visible":93,"__hash__":1673},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1526,"toc":1655},[1527,1530,1532,1535,1537,1543,1549,1551,1566,1568,1571,1591,1593,1599,1601,1603,1616,1618,1632,1634,1645,1647,1649,1652],[10,1528,1529],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1531,16],{"id":16},[10,1533,1534],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1536,22],{"id":22},[10,1538,1539],{},[26,1540],{"alt":1541,"src":1542},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1544,1545,1546,1548],{},"终端收到 ",[50,1547,689],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1550,35],{"id":35},[37,1552,1553,1556,1559],{},[40,1554,1555],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1557,1558],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1560,1561,1562,1565],{},"检查 pip 时使用 ",[50,1563,1564],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1567,67],{"id":67},[10,1569,1570],{},"在 macOS 终端执行：",[72,1572,1573],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,1574,1575,1581],{"__ignoreMap":77},[81,1576,1577,1579],{"class":83,"line":84},[81,1578,689],{"class":598},[81,1580,602],{"class":601},[81,1582,1583,1585,1587,1589],{"class":83,"line":90},[81,1584,689],{"class":598},[81,1586,631],{"class":601},[81,1588,635],{"class":634},[81,1590,602],{"class":601},[10,1592,121],{},[72,1594,1597],{"className":1595,"code":1596,"language":127,"meta":77},[125],"Python 3.14.x\npip 版本信息与安装路径\n",[50,1598,1596],{"__ignoreMap":77},[10,1600,132],{},[14,1602,135],{"id":135},[137,1604,1605,1611],{},[40,1606,1607,1610],{},[50,1608,1609],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1612,1613,1615],{},[50,1614,697],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1617,173],{"id":173},[37,1619,1620,1626],{},[40,1621,1622,1623,1625],{},"看到系统已有 ",[50,1624,689],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1627,1628,1629,1631],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[50,1630,689],{},"，不修改系统自带工具。",[14,1633,191],{"id":191},[137,1635,1636,1642],{},[40,1637,936,1638,1641],{},[50,1639,1640],{},"which python3","，记录当前解释器路径。",[40,1643,1644],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1646,202],{},[14,1648,205],{"id":205},[10,1650,1651],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,1653,1654],{},"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":77,"searchDepth":90,"depth":90,"links":1656},[1657,1658,1659,1660,1661,1662,1663,1664],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1524,"description":1529},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[225,1672,1049],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1675,"title":1676,"body":1677,"category":225,"cover":226,"description":1842,"extension":227,"meta":1843,"navigation":93,"path":1844,"pinned":230,"publishedAt":231,"seo":1845,"slug":1846,"stem":1847,"summary":1848,"tags":1849,"updatedAt":231,"visible":93,"__hash__":1852},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1678,"toc":1832},[1679,1685,1687,1690,1692,1698,1701,1703,1727,1729,1731,1758,1760,1766,1768,1770,1788,1790,1804,1806,1820,1822,1824,1830],[10,1680,1681,1682,1684],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[50,1683,1167],{}," 脚本。",[14,1686,16],{"id":16},[10,1688,1689],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1691,22],{"id":22},[10,1693,1694],{},[26,1695],{"alt":1696,"src":1697},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1699,1700],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1702,35],{"id":35},[37,1704,1705,1714,1721],{},[40,1706,1707,1708,1710,1711,64],{},"在终端输入 ",[50,1709,689],{}," 进入 REPL，提示符通常是 ",[50,1712,1713],{},">>>",[40,1715,1716,1717,1720],{},"输入 ",[50,1718,1719],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1722,1723,1724,1726],{},"需要保存、复查或多次运行的代码应写入 ",[50,1725,1167],{}," 文件。",[14,1728,67],{"id":67},[10,1730,70],{},[72,1732,1736],{"className":1733,"code":1734,"language":1735,"meta":77,"style":77},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[50,1737,1738,1743,1748,1753],{"__ignoreMap":77},[81,1739,1740],{"class":83,"line":84},[81,1741,1742],{},">>> 2 + 3\n",[81,1744,1745],{"class":83,"line":90},[81,1746,1747],{},"5\n",[81,1749,1750],{"class":83,"line":97},[81,1751,1752],{},">>> \"python\".upper()\n",[81,1754,1755],{"class":83,"line":103},[81,1756,1757],{},"'PYTHON'\n",[10,1759,121],{},[72,1761,1764],{"className":1762,"code":1763,"language":127,"meta":77},[125],"REPL 会直接显示表达式结果\n",[50,1765,1763],{"__ignoreMap":77},[10,1767,132],{},[14,1769,135],{"id":135},[137,1771,1772,1782],{},[40,1773,1774,1775,1778,1779,64],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[50,1776,1777],{},"2 + 3"," 能直接看到 ",[50,1780,1781],{},"5",[40,1783,1784,1785,1787],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[50,1786,1469],{}," 才会写到标准输出。",[14,1789,173],{"id":173},[37,1791,1792,1801],{},[40,1793,1794,1795,1797,1798,1800],{},"把提示符 ",[50,1796,1713],{}," 复制进 ",[50,1799,1167],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1802,1803],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1805,191],{"id":191},[137,1807,1808,1814],{},[40,1809,1810,1811,64],{},"在 REPL 计算 ",[50,1812,1813],{},"12 * 8",[40,1815,1816,1817,1819],{},"把同一表达式写入脚本；观察脚本中不调用 ",[50,1818,1469],{}," 时是否显示结果。",[10,1821,202],{},[14,1823,205],{"id":205},[10,1825,1826,1827,1829],{},"本篇目标是根据任务选择 REPL 或 ",[50,1828,1167],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,1831,212],{},{"title":77,"searchDepth":90,"depth":90,"links":1833},[1834,1835,1836,1837,1838,1839,1840,1841],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1676,"description":1842},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[225,1850,1851],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1854,"title":1855,"body":1856,"category":225,"cover":226,"description":1860,"extension":227,"meta":2031,"navigation":93,"path":2032,"pinned":230,"publishedAt":231,"seo":2033,"slug":2034,"stem":2035,"summary":2036,"tags":2037,"updatedAt":231,"visible":93,"__hash__":2040},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1857,"toc":2021},[1858,1861,1863,1866,1868,1874,1880,1882,1900,1902,1904,1949,1951,1957,1959,1961,1983,1985,1997,1999,2011,2013,2015,2018],[10,1859,1860],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1862,16],{"id":16},[10,1864,1865],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1867,22],{"id":22},[10,1869,1870],{},[26,1871],{"alt":1872,"src":1873},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1875,1876,1879],{},[50,1877,1878],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1881,35],{"id":35},[37,1883,1884,1887,1897],{},[40,1885,1886],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1888,1889,1892,1893,1896],{},[50,1890,1891],{},"pwd"," 显示当前目录，",[50,1894,1895],{},"ls"," 显示目录里的文件。",[40,1898,1899],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1901,67],{"id":67},[10,1903,1570],{},[72,1905,1907],{"className":589,"code":1906,"language":591,"meta":77,"style":77},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[50,1908,1909,1917,1924,1929,1943],{"__ignoreMap":77},[81,1910,1911,1914],{"class":83,"line":84},[81,1912,1913],{"class":598},"mkdir",[81,1915,1916],{"class":634}," python-study\n",[81,1918,1919,1922],{"class":83,"line":90},[81,1920,1921],{"class":601},"cd",[81,1923,1916],{"class":634},[81,1925,1926],{"class":83,"line":97},[81,1927,1928],{"class":601},"pwd\n",[81,1930,1931,1934,1937,1941],{"class":83,"line":103},[81,1932,1933],{"class":601},"printf",[81,1935,1936],{"class":634}," 'print(\"项目已经运行\")\\n'",[81,1938,1940],{"class":1939},"snl16"," >",[81,1942,1211],{"class":634},[81,1944,1945,1947],{"class":83,"line":109},[81,1946,689],{"class":598},[81,1948,1211],{"class":634},[10,1950,121],{},[72,1952,1955],{"className":1953,"code":1954,"language":127,"meta":77},[125],"项目已经运行\n",[50,1956,1954],{"__ignoreMap":77},[10,1958,132],{},[14,1960,135],{"id":135},[137,1962,1963,1974],{},[40,1964,1965,1967,1968,1970,1971,1973],{},[50,1966,1913],{}," 创建目录，",[50,1969,1921],{}," 改变终端当前目录，",[50,1972,1891],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1975,1976,1978,1979,1982],{},[50,1977,1878],{}," 会在当前目录寻找 ",[50,1980,1981],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1984,173],{"id":173},[37,1986,1987,1994],{},[40,1988,1989,1990,148,1992,64],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[50,1991,1891],{},[50,1993,1895],{},[40,1995,1996],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1998,191],{"id":191},[137,2000,2001,2008],{},[40,2002,2003,2004,2007],{},"新建 ",[50,2005,2006],{},"lesson01.py"," 并输出课程编号。",[40,2009,2010],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2012,202],{},[14,2014,205],{"id":205},[10,2016,2017],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,2019,2020],{},"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":77,"searchDepth":90,"depth":90,"links":2022},[2023,2024,2025,2026,2027,2028,2029,2030],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1855,"description":1860},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[225,2038,2039],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2042,"title":2043,"body":2044,"category":225,"cover":226,"description":2048,"extension":227,"meta":2196,"navigation":93,"path":2197,"pinned":230,"publishedAt":231,"seo":2198,"slug":2199,"stem":2200,"summary":2201,"tags":2202,"updatedAt":231,"visible":93,"__hash__":2205},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2045,"toc":2186},[2046,2049,2051,2054,2056,2062,2073,2075,2095,2097,2099,2119,2121,2127,2129,2131,2150,2152,2160,2162,2177,2179,2181,2184],[10,2047,2048],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2050,16],{"id":16},[10,2052,2053],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2055,22],{"id":22},[10,2057,2058],{},[26,2059],{"alt":2060,"src":2061},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2063,2064,2065,64,2067,2070,2071,64],{},"Python 先计算表达式，再把得到的对象交给 ",[50,2066,1469],{},[50,2068,2069],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[50,2072,1777],{},[14,2074,35],{"id":35},[37,2076,2077,2083,2092],{},[40,2078,2079,2082],{},[50,2080,2081],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2084,2085,2088,2089,64],{},[50,2086,2087],{},"7 + 5"," 是表达式，运行时先求值得到 ",[50,2090,2091],{},"12",[40,2093,2094],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2096,67],{"id":67},[10,2098,70],{},[72,2100,2102],{"className":74,"code":2101,"language":76,"meta":77,"style":77},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[50,2103,2104,2109,2114],{"__ignoreMap":77},[81,2105,2106],{"class":83,"line":84},[81,2107,2108],{},"print(42)\n",[81,2110,2111],{"class":83,"line":90},[81,2112,2113],{},"print(7 + 5)\n",[81,2115,2116],{"class":83,"line":97},[81,2117,2118],{},"print(\"Python 基础课\")\n",[10,2120,121],{},[72,2122,2125],{"className":2123,"code":2124,"language":127,"meta":77},[125],"42\n12\nPython 基础课\n",[50,2126,2124],{"__ignoreMap":77},[10,2128,132],{},[14,2130,135],{"id":135},[137,2132,2133,2141],{},[40,2134,2135,2138,2139,64],{},[50,2136,2137],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[50,2140,2091],{},[40,2142,2143,2145,2146,2149],{},[50,2144,1469],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[50,2147,2148],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2151,173],{"id":173},[37,2153,2154,2157],{},[40,2155,2156],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2158,2159],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2161,191],{"id":191},[137,2163,2164,2167],{},[40,2165,2166],{},"分别输出一个整数、一个小数和一段文本。",[40,2168,2169,2170,2172,2173,2176],{},"比较 ",[50,2171,2069],{}," 与 ",[50,2174,2175],{},"print(\"2 + 3\")"," 的结果。",[10,2178,202],{},[14,2180,205],{"id":205},[10,2182,2183],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,2185,212],{},{"title":77,"searchDepth":90,"depth":90,"links":2187},[2188,2189,2190,2191,2192,2193,2194,2195],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2043,"description":2048},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[225,2203,2204],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2207,"title":2208,"body":2209,"category":225,"cover":226,"description":2213,"extension":227,"meta":2379,"navigation":93,"path":2380,"pinned":230,"publishedAt":231,"seo":2381,"slug":2382,"stem":2383,"summary":2384,"tags":2385,"updatedAt":231,"visible":93,"__hash__":2388},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2210,"toc":2369},[2211,2214,2216,2219,2221,2227,2230,2232,2257,2259,2261,2289,2291,2297,2299,2301,2325,2327,2343,2345,2360,2362,2364,2367],[10,2212,2213],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2215,16],{"id":16},[10,2217,2218],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2220,22],{"id":22},[10,2222,2223],{},[26,2224],{"alt":2225,"src":2226},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2228,2229],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2231,35],{"id":35},[37,2233,2234,2237,2247],{},[40,2235,2236],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2238,2239,2240,2172,2243,2246],{},"变量名区分大小写，",[50,2241,2242],{},"score",[50,2244,2245],{},"Score"," 是两个名字。",[40,2248,2249,2250,53,2253,2256],{},"使用能表达含义的名称；不要用 ",[50,2251,2252],{},"list",[50,2254,2255],{},"str"," 等内置名称作为普通变量名。",[14,2258,67],{"id":67},[10,2260,70],{},[72,2262,2264],{"className":74,"code":2263,"language":76,"meta":77,"style":77},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[50,2265,2266,2271,2276,2280,2285],{"__ignoreMap":77},[81,2267,2268],{"class":83,"line":84},[81,2269,2270],{},"score = 90\n",[81,2272,2273],{"class":83,"line":90},[81,2274,2275],{},"print(score)\n",[81,2277,2278],{"class":83,"line":97},[81,2279,94],{"emptyLinePlaceholder":93},[81,2281,2282],{"class":83,"line":103},[81,2283,2284],{},"score = 95\n",[81,2286,2287],{"class":83,"line":109},[81,2288,2275],{},[10,2290,121],{},[72,2292,2295],{"className":2293,"code":2294,"language":127,"meta":77},[125],"90\n95\n",[50,2296,2294],{"__ignoreMap":77},[10,2298,132],{},[14,2300,135],{"id":135},[137,2302,2303,2312],{},[40,2304,936,2305,2308,2309,2311],{},[50,2306,2307],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[50,2310,2242],{}," 再绑定到它。",[40,2313,936,2314,2317,2318,2321,2322,64],{},[50,2315,2316],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[50,2319,2320],{},"90"," 没有被改造成 ",[50,2323,2324],{},"95",[14,2326,173],{"id":173},[37,2328,2329,2332],{},[40,2330,2331],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2333,2334,2335,53,2337,53,2339,2342],{},"使用 ",[50,2336,2252],{},[50,2338,2255],{},[50,2340,2341],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2344,191],{"id":191},[137,2346,2347,2357],{},[40,2348,2349,2350,148,2353,2356],{},"创建 ",[50,2351,2352],{},"course_name",[50,2354,2355],{},"lesson_count"," 两个变量并输出。",[40,2358,2359],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2361,202],{},[14,2363,205],{"id":205},[10,2365,2366],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,2368,212],{},{"title":77,"searchDepth":90,"depth":90,"links":2370},[2371,2372,2373,2374,2375,2376,2377,2378],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2208,"description":2213},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[225,2386,2387],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2390,"title":2391,"body":2392,"category":225,"cover":226,"description":2396,"extension":227,"meta":2562,"navigation":93,"path":2563,"pinned":230,"publishedAt":231,"seo":2564,"slug":2565,"stem":2566,"summary":2567,"tags":2568,"updatedAt":231,"visible":93,"__hash__":2571},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2393,"toc":2552},[2394,2397,2399,2402,2404,2410,2413,2415,2444,2446,2448,2494,2496,2502,2504,2506,2520,2522,2533,2535,2543,2545,2547,2550],[10,2395,2396],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2398,16],{"id":16},[10,2400,2401],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2403,22],{"id":22},[10,2405,2406],{},[26,2407],{"alt":2408,"src":2409},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2411,2412],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2414,35],{"id":35},[37,2416,2417,2427,2441],{},[40,2418,2419,2422,2423,2426],{},[50,2420,2421],{},"int"," 表示整数，",[50,2424,2425],{},"float"," 表示浮点数。",[40,2428,2429,2432,2433,2436,2437,2440],{},[50,2430,2431],{},"\u002F"," 总是进行真除法；",[50,2434,2435],{},"\u002F\u002F"," 是向下取整除法，",[50,2438,2439],{},"%"," 得到余数。",[40,2442,2443],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2445,67],{"id":67},[10,2447,70],{},[72,2449,2451],{"className":74,"code":2450,"language":76,"meta":77,"style":77},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[50,2452,2453,2458,2463,2468,2472,2477,2482,2488],{"__ignoreMap":77},[81,2454,2455],{"class":83,"line":84},[81,2456,2457],{},"price = 25\n",[81,2459,2460],{"class":83,"line":90},[81,2461,2462],{},"count = 4\n",[81,2464,2465],{"class":83,"line":97},[81,2466,2467],{},"discount = 0.9\n",[81,2469,2470],{"class":83,"line":103},[81,2471,94],{"emptyLinePlaceholder":93},[81,2473,2474],{"class":83,"line":109},[81,2475,2476],{},"total = price * count * discount\n",[81,2478,2479],{"class":83,"line":115},[81,2480,2481],{},"average = total \u002F count\n",[81,2483,2485],{"class":83,"line":2484},7,[81,2486,2487],{},"print(total)\n",[81,2489,2491],{"class":83,"line":2490},8,[81,2492,2493],{},"print(average)\n",[10,2495,121],{},[72,2497,2500],{"className":2498,"code":2499,"language":127,"meta":77},[125],"90.0\n22.5\n",[50,2501,2499],{"__ignoreMap":77},[10,2503,132],{},[14,2505,135],{"id":135},[137,2507,2508,2514],{},[40,2509,2510,2513],{},[50,2511,2512],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2515,2516,2519],{},[50,2517,2518],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2521,173],{"id":173},[37,2523,2524,2530],{},[40,2525,2526,2527,64],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[50,2528,2529],{},"decimal.Decimal",[40,2531,2532],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2534,191],{"id":191},[137,2536,2537,2540],{},[40,2538,2539],{},"计算 137 除以 10 的商和余数。",[40,2541,2542],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2544,202],{},[14,2546,205],{"id":205},[10,2548,2549],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,2551,212],{},{"title":77,"searchDepth":90,"depth":90,"links":2553},[2554,2555,2556,2557,2558,2559,2560,2561],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2391,"description":2396},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[225,2569,2570],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2573,"title":2574,"body":2575,"category":225,"cover":226,"description":2579,"extension":227,"meta":2754,"navigation":93,"path":2755,"pinned":230,"publishedAt":231,"seo":2756,"slug":2757,"stem":2758,"summary":2759,"tags":2760,"updatedAt":231,"visible":93,"__hash__":2763},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2576,"toc":2742},[2577,2580,2582,2585,2587,2593,2603,2605,2616,2618,2620,2650,2652,2658,2660,2662,2692,2694,2697,2703,2706,2708,2716,2718,2733,2735,2737,2740],[10,2578,2579],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2581,16],{"id":16},[10,2583,2584],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2586,22],{"id":22},[10,2588,2589],{},[26,2590],{"alt":2591,"src":2592},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2594,2595,2596,2599,2600,64],{},"切片 ",[50,2597,2598],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[50,2601,2602],{},"stop - start",[14,2604,35],{"id":35},[37,2606,2607,2610,2613],{},[40,2608,2609],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2611,2612],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2614,2615],{},"切片会创建新的字符串，不会修改原字符串。",[14,2617,67],{"id":67},[10,2619,70],{},[72,2621,2623],{"className":74,"code":2622,"language":76,"meta":77,"style":77},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[50,2624,2625,2630,2635,2640,2645],{"__ignoreMap":77},[81,2626,2627],{"class":83,"line":84},[81,2628,2629],{},"language = \"Python\"\n",[81,2631,2632],{"class":83,"line":90},[81,2633,2634],{},"print(language[0])\n",[81,2636,2637],{"class":83,"line":97},[81,2638,2639],{},"print(language[-1])\n",[81,2641,2642],{"class":83,"line":103},[81,2643,2644],{},"print(language[0:3])\n",[81,2646,2647],{"class":83,"line":109},[81,2648,2649],{},"print(language + \" 3.14\")\n",[10,2651,121],{},[72,2653,2656],{"className":2654,"code":2655,"language":127,"meta":77},[125],"P\nn\nPyt\nPython 3.14\n",[50,2657,2655],{"__ignoreMap":77},[10,2659,132],{},[14,2661,135],{"id":135},[137,2663,2664,2678],{},[40,2665,2666,2667,2669,2670,2673,2674,2677],{},"字符串 ",[50,2668,225],{}," 的正索引从 ",[50,2671,2672],{},"P"," 的 0 开始，负索引从末尾 ",[50,2675,2676],{},"n"," 的 -1 开始。",[40,2679,2680,2683,2684,2687,2688,2691],{},[50,2681,2682],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[50,2685,2686],{},"Pyt","；索引 3 的 ",[50,2689,2690],{},"h"," 不在结果中。",[156,2693,158],{"id":158},[10,2695,2696],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2698,2699],{},[26,2700],{"alt":2701,"src":2702},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2704,2705],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2707,173],{"id":173},[37,2709,2710,2713],{},[40,2711,2712],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2714,2715],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2717,191],{"id":191},[137,2719,2720,2730],{},[40,2721,2722,2723,2726,2727,64],{},"从 ",[50,2724,2725],{},"\"programming\""," 中切出 ",[50,2728,2729],{},"\"gram\"",[40,2731,2732],{},"使用负索引取得字符串倒数第二个字符。",[10,2734,202],{},[14,2736,205],{"id":205},[10,2738,2739],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,2741,212],{},{"title":77,"searchDepth":90,"depth":90,"links":2743},[2744,2745,2746,2747,2748,2751,2752,2753],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":2749},[2750],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2574,"description":2579},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[225,2761,2762],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2765,"title":2766,"body":2767,"category":225,"cover":226,"description":2771,"extension":227,"meta":2985,"navigation":93,"path":2986,"pinned":230,"publishedAt":231,"seo":2987,"slug":2988,"stem":2989,"summary":2990,"tags":2991,"updatedAt":231,"visible":93,"__hash__":2994},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2768,"toc":2973},[2769,2772,2774,2777,2779,2785,2795,2797,2830,2832,2834,2878,2880,2886,2888,2890,2911,2913,2916,2922,2930,2932,2946,2948,2964,2966,2968,2971],[10,2770,2771],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2773,16],{"id":16},[10,2775,2776],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2778,22],{"id":22},[10,2780,2781],{},[26,2782],{"alt":2783,"src":2784},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2786,2787,2788,182,2791,2794],{},"比较表达式先产生 ",[50,2789,2790],{},"True",[50,2792,2793],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2796,35],{"id":35},[37,2798,2799,2813,2827],{},[40,2800,2801,2804,2805,2808,2809,2812],{},[50,2802,2803],{},"=="," 判断是否相等，",[50,2806,2807],{},"!="," 判断是否不等；单个 ",[50,2810,2811],{},"="," 是赋值。",[40,2814,2815,2818,2819,2822,2823,2826],{},[50,2816,2817],{},"and"," 要求两侧都为真，",[50,2820,2821],{},"or"," 只需一侧为真，",[50,2824,2825],{},"not"," 取反。",[40,2828,2829],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2831,67],{"id":67},[10,2833,70],{},[72,2835,2837],{"className":74,"code":2836,"language":76,"meta":77,"style":77},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[50,2838,2839,2844,2849,2853,2858,2863,2868,2873],{"__ignoreMap":77},[81,2840,2841],{"class":83,"line":84},[81,2842,2843],{},"age = 20\n",[81,2845,2846],{"class":83,"line":90},[81,2847,2848],{},"has_ticket = True\n",[81,2850,2851],{"class":83,"line":97},[81,2852,94],{"emptyLinePlaceholder":93},[81,2854,2855],{"class":83,"line":103},[81,2856,2857],{},"is_adult = age >= 18\n",[81,2859,2860],{"class":83,"line":109},[81,2861,2862],{},"can_enter = is_adult and has_ticket\n",[81,2864,2865],{"class":83,"line":115},[81,2866,2867],{},"print(is_adult)\n",[81,2869,2870],{"class":83,"line":2484},[81,2871,2872],{},"print(can_enter)\n",[81,2874,2875],{"class":83,"line":2490},[81,2876,2877],{},"print(not has_ticket)\n",[10,2879,121],{},[72,2881,2884],{"className":2882,"code":2883,"language":127,"meta":77},[125],"True\nTrue\nFalse\n",[50,2885,2883],{"__ignoreMap":77},[10,2887,132],{},[14,2889,135],{"id":135},[137,2891,2892,2902],{},[40,2893,2894,2897,2898,2901],{},[50,2895,2896],{},"age >= 18"," 先产生布尔值并绑定给 ",[50,2899,2900],{},"is_adult","，这一步没有任何分支跳转。",[40,2903,2904,2907,2908,2910],{},[50,2905,2906],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[50,2909,2825],{}," 只对紧随其后的值取反。",[156,2912,158],{"id":158},[10,2914,2915],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2917,2918],{},[26,2919],{"alt":2920,"src":2921},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2923,2924,2926,2927,2929],{},[50,2925,2817],{}," 只有“真、真”得到真；",[50,2928,2821],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2931,173],{"id":173},[37,2933,2934,2943],{},[40,2935,2936,2937,2939,2940,2942],{},"用单个等号判断相等。",[50,2938,2811],{}," 是赋值，",[50,2941,2803],{}," 才是相等比较。",[40,2944,2945],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2947,191],{"id":191},[137,2949,2950,2957],{},[40,2951,2952,2953,2956],{},"判断数字 ",[50,2954,2955],{},"15"," 是否同时大于 10 且小于 20。",[40,2958,2959,2960,2963],{},"分别修改年龄和票据状态，记录 ",[50,2961,2962],{},"can_enter"," 的四种组合结果。",[10,2965,202],{},[14,2967,205],{"id":205},[10,2969,2970],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,2972,212],{},{"title":77,"searchDepth":90,"depth":90,"links":2974},[2975,2976,2977,2978,2979,2982,2983,2984],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":2980},[2981],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2766,"description":2771},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[225,2992,2993],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2996,"title":2997,"body":2998,"category":225,"cover":226,"description":3002,"extension":227,"meta":3170,"navigation":93,"path":3171,"pinned":230,"publishedAt":231,"seo":3172,"slug":3173,"stem":3174,"summary":3175,"tags":3176,"updatedAt":231,"visible":93,"__hash__":3178},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2999,"toc":3160},[3000,3003,3005,3008,3010,3016,3034,3036,3049,3051,3053,3087,3089,3095,3097,3099,3121,3123,3135,3137,3151,3153,3155,3158],[10,3001,3002],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3004,16],{"id":16},[10,3006,3007],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3009,22],{"id":22},[10,3011,3012],{},[26,3013],{"alt":3014,"src":3015},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3017,3018,3021,3022,3025,3026,3029,3030,3033],{},[50,3019,3020],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[50,3023,3024],{},"18","，程序首先得到的也是 ",[50,3027,3028],{},"\"18\"","，需要 ",[50,3031,3032],{},"int()"," 后才能按整数参与计算。",[14,3035,35],{"id":35},[37,3037,3038,3041,3046],{},[40,3039,3040],{},"提示文字应告诉用户需要输入什么。",[40,3042,3043,3045],{},[50,3044,3032],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3047,3048],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3050,67],{"id":67},[10,3052,70],{},[72,3054,3056],{"className":74,"code":3055,"language":76,"meta":77,"style":77},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[50,3057,3058,3063,3068,3073,3077,3082],{"__ignoreMap":77},[81,3059,3060],{"class":83,"line":84},[81,3061,3062],{},"name = input(\"请输入姓名：\")\n",[81,3064,3065],{"class":83,"line":90},[81,3066,3067],{},"age_text = input(\"请输入年龄：\")\n",[81,3069,3070],{"class":83,"line":97},[81,3071,3072],{},"age = int(age_text)\n",[81,3074,3075],{"class":83,"line":103},[81,3076,94],{"emptyLinePlaceholder":93},[81,3078,3079],{"class":83,"line":109},[81,3080,3081],{},"print(\"你好，\" + name)\n",[81,3083,3084],{"class":83,"line":115},[81,3085,3086],{},"print(age + 1)\n",[10,3088,121],{},[72,3090,3093],{"className":3091,"code":3092,"language":127,"meta":77},[125],"根据输入显示姓名，并输出下一年的年龄\n",[50,3094,3092],{"__ignoreMap":77},[10,3096,132],{},[14,3098,135],{"id":135},[137,3100,3101,3111],{},[40,3102,3103,3104,3106,3107,3110],{},"两次 ",[50,3105,3020],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[50,3108,3109],{},"age_text"," 用来提醒这仍是文本。",[40,3112,3113,3116,3117,3120],{},[50,3114,3115],{},"int(age_text)"," 创建整数对象，后面的 ",[50,3118,3119],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3122,173],{"id":173},[37,3124,3125,3132],{},[40,3126,3127,3128,3131],{},"直接计算 ",[50,3129,3130],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3133,3134],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3136,191],{"id":191},[137,3138,3139,3142],{},[40,3140,3141],{},"接收两个整数并输出它们的和。",[40,3143,1716,3144,3147,3148,3150],{},[50,3145,3146],{},"18.5"," 给 ",[50,3149,3032],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3152,202],{},[14,3154,205],{"id":205},[10,3156,3157],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,3159,212],{},{"title":77,"searchDepth":90,"depth":90,"links":3161},[3162,3163,3164,3165,3166,3167,3168,3169],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2997,"description":3002},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[225,2341,3177],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3180,"title":3181,"body":3182,"category":225,"cover":226,"description":3186,"extension":227,"meta":3346,"navigation":93,"path":3347,"pinned":230,"publishedAt":231,"seo":3348,"slug":3349,"stem":3350,"summary":3351,"tags":3352,"updatedAt":231,"visible":93,"__hash__":3355},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3183,"toc":3336},[3184,3187,3189,3192,3194,3200,3207,3209,3223,3225,3227,3266,3268,3274,3276,3278,3297,3299,3314,3316,3327,3329,3331,3334],[10,3185,3186],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3188,16],{"id":16},[10,3190,3191],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3193,22],{"id":22},[10,3195,3196],{},[26,3197],{"alt":3198,"src":3199},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3201,3202,3203,3206],{},"列表为元素维护从 0 开始的位置索引。修改 ",[50,3204,3205],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3208,35],{"id":35},[37,3210,3211,3214,3217],{},[40,3212,3213],{},"列表使用方括号，元素之间用逗号分隔。",[40,3215,3216],{},"列表可变，可以替换、追加和删除元素。",[40,3218,3219,3220,64],{},"访问不存在的索引会产生 ",[50,3221,3222],{},"IndexError",[14,3224,67],{"id":67},[10,3226,70],{},[72,3228,3230],{"className":74,"code":3229,"language":76,"meta":77,"style":77},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[50,3231,3232,3237,3242,3246,3251,3256,3261],{"__ignoreMap":77},[81,3233,3234],{"class":83,"line":84},[81,3235,3236],{},"scores = [82, 90, 76]\n",[81,3238,3239],{"class":83,"line":90},[81,3240,3241],{},"print(scores[0])\n",[81,3243,3244],{"class":83,"line":97},[81,3245,94],{"emptyLinePlaceholder":93},[81,3247,3248],{"class":83,"line":103},[81,3249,3250],{},"scores[1] = 95\n",[81,3252,3253],{"class":83,"line":109},[81,3254,3255],{},"scores.append(88)\n",[81,3257,3258],{"class":83,"line":115},[81,3259,3260],{},"print(scores)\n",[81,3262,3263],{"class":83,"line":2484},[81,3264,3265],{},"print(len(scores))\n",[10,3267,121],{},[72,3269,3272],{"className":3270,"code":3271,"language":127,"meta":77},[125],"82\n[82, 95, 76, 88]\n4\n",[50,3273,3271],{"__ignoreMap":77},[10,3275,132],{},[14,3277,135],{"id":135},[137,3279,3280,3283],{},[40,3281,3282],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3284,3285,3288,3289,3292,3293,3296],{},[50,3286,3287],{},"scores[1] = 95"," 替换第二个位置，",[50,3290,3291],{},"append(88)"," 在末尾增加新位置，",[50,3294,3295],{},"len()"," 因而从 3 变为 4。",[14,3298,173],{"id":173},[37,3300,3301,3311],{},[40,3302,3303,3304,3307,3308,64],{},"访问 ",[50,3305,3306],{},"scores[len(scores)]","。最后一个合法正索引是 ",[50,3309,3310],{},"len(scores) - 1",[40,3312,3313],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3315,191],{"id":191},[137,3317,3318,3321],{},[40,3319,3320],{},"建立三项学习任务列表，再追加第四项。",[40,3322,3323,3324,3326],{},"修改第二项，并用 ",[50,3325,3295],{}," 检查元素数量。",[10,3328,202],{},[14,3330,205],{"id":205},[10,3332,3333],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,3335,212],{},{"title":77,"searchDepth":90,"depth":90,"links":3337},[3338,3339,3340,3341,3342,3343,3344,3345],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3181,"description":3186},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[225,3353,3354],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3357,"title":3358,"body":3359,"category":225,"cover":226,"description":3363,"extension":227,"meta":3504,"navigation":93,"path":3505,"pinned":230,"publishedAt":231,"seo":3506,"slug":3507,"stem":3508,"summary":3509,"tags":3510,"updatedAt":231,"visible":93,"__hash__":3512},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3360,"toc":3494},[3361,3364,3366,3369,3371,3377,3380,3382,3393,3395,3397,3431,3433,3439,3441,3443,3457,3459,3471,3473,3485,3487,3489,3492],[10,3362,3363],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3365,16],{"id":16},[10,3367,3368],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3370,22],{"id":22},[10,3372,3373],{},[26,3374],{"alt":3375,"src":3376},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3378,3379],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3381,35],{"id":35},[37,3383,3384,3387,3390],{},[40,3385,3386],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3388,3389],{},"只有一个元素的元组必须保留尾随逗号。",[40,3391,3392],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3394,67],{"id":67},[10,3396,70],{},[72,3398,3400],{"className":74,"code":3399,"language":76,"meta":77,"style":77},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[50,3401,3402,3407,3412,3417,3421,3426],{"__ignoreMap":77},[81,3403,3404],{"class":83,"line":84},[81,3405,3406],{},"point = (120, 80)\n",[81,3408,3409],{"class":83,"line":90},[81,3410,3411],{},"print(point[0])\n",[81,3413,3414],{"class":83,"line":97},[81,3415,3416],{},"print(point[1])\n",[81,3418,3419],{"class":83,"line":103},[81,3420,94],{"emptyLinePlaceholder":93},[81,3422,3423],{"class":83,"line":109},[81,3424,3425],{},"single = (5,)\n",[81,3427,3428],{"class":83,"line":115},[81,3429,3430],{},"print(single)\n",[10,3432,121],{},[72,3434,3437],{"className":3435,"code":3436,"language":127,"meta":77},[125],"120\n80\n(5,)\n",[50,3438,3436],{"__ignoreMap":77},[10,3440,132],{},[14,3442,135],{"id":135},[137,3444,3445,3451],{},[40,3446,3447,3450],{},[50,3448,3449],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3452,3453,3456],{},[50,3454,3455],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3458,173],{"id":173},[37,3460,3461,3468],{},[40,3462,3463,3464,3467],{},"把 ",[50,3465,3466],{},"(5)"," 当作元组，实际它仍是整数。",[40,3469,3470],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3472,191],{"id":191},[137,3474,3475,3478],{},[40,3476,3477],{},"用元组表示宽度和高度。",[40,3479,2169,3480,2172,3482,3484],{},[50,3481,3466],{},[50,3483,3455],{}," 的类型。",[10,3486,202],{},[14,3488,205],{"id":205},[10,3490,3491],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,3493,212],{},{"title":77,"searchDepth":90,"depth":90,"links":3495},[3496,3497,3498,3499,3500,3501,3502,3503],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3358,"description":3363},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[225,3511,3354],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3514,"title":3515,"body":3516,"category":225,"cover":226,"description":3520,"extension":227,"meta":3675,"navigation":93,"path":3676,"pinned":230,"publishedAt":231,"seo":3677,"slug":3678,"stem":3679,"summary":3680,"tags":3681,"updatedAt":231,"visible":93,"__hash__":3683},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3517,"toc":3665},[3518,3521,3523,3526,3528,3534,3544,3546,3560,3562,3564,3598,3600,3606,3608,3610,3625,3627,3646,3648,3656,3658,3660,3663],[10,3519,3520],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3522,16],{"id":16},[10,3524,3525],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3527,22],{"id":22},[10,3529,3530],{},[26,3531],{"alt":3532,"src":3533},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3535,3536,3537,3540,3541,3543],{},"字典通过键定位值，不使用连续位置表达含义。",[50,3538,3539],{},"student[\"score\"]"," 读取的是键 ",[50,3542,2242],{}," 对应的值，而不是“第几个元素”。",[14,3545,35],{"id":35},[37,3547,3548,3551,3557],{},[40,3549,3550],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3552,2334,3553,3556],{},[50,3554,3555],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3558,3559],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3561,67],{"id":67},[10,3563,70],{},[72,3565,3567],{"className":74,"code":3566,"language":76,"meta":77,"style":77},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[50,3568,3569,3574,3579,3583,3588,3593],{"__ignoreMap":77},[81,3570,3571],{"class":83,"line":84},[81,3572,3573],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[81,3575,3576],{"class":83,"line":90},[81,3577,3578],{},"print(student[\"name\"])\n",[81,3580,3581],{"class":83,"line":97},[81,3582,94],{"emptyLinePlaceholder":93},[81,3584,3585],{"class":83,"line":103},[81,3586,3587],{},"student[\"score\"] = 95\n",[81,3589,3590],{"class":83,"line":109},[81,3591,3592],{},"student[\"city\"] = \"郑州\"\n",[81,3594,3595],{"class":83,"line":115},[81,3596,3597],{},"print(student)\n",[10,3599,121],{},[72,3601,3604],{"className":3602,"code":3603,"language":127,"meta":77},[125],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[50,3605,3603],{"__ignoreMap":77},[10,3607,132],{},[14,3609,135],{"id":135},[137,3611,3612,3615],{},[40,3613,3614],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3616,3617,3618,3620,3621,3624],{},"给已有键 ",[50,3619,2242],{}," 赋值会更新映射，给新键 ",[50,3622,3623],{},"city"," 赋值会增加映射。",[14,3626,173],{"id":173},[37,3628,3629,3636],{},[40,3630,3631,3632,3635],{},"按位置理解字典并尝试 ",[50,3633,3634],{},"student[0]","，而实际键是字符串。",[40,3637,3638,3639,3642,3643,64],{},"直接读取不确定存在的键并忽略 ",[50,3640,3641],{},"KeyError","；后续可根据场景使用成员检查或 ",[50,3644,3645],{},"get()",[14,3647,191],{"id":191},[137,3649,3650,3653],{},[40,3651,3652],{},"建立一本书的标题、作者和页数字典。",[40,3654,3655],{},"添加分类键，再修改页数。",[10,3657,202],{},[14,3659,205],{"id":205},[10,3661,3662],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,3664,212],{},{"title":77,"searchDepth":90,"depth":90,"links":3666},[3667,3668,3669,3670,3671,3672,3673,3674],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3515,"description":3520},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[225,3682,3354],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3685,"title":3686,"body":3687,"category":225,"cover":226,"description":3691,"extension":227,"meta":3840,"navigation":93,"path":3841,"pinned":230,"publishedAt":231,"seo":3842,"slug":3843,"stem":3844,"summary":3845,"tags":3846,"updatedAt":231,"visible":93,"__hash__":3848},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3688,"toc":3830},[3689,3692,3694,3697,3699,3705,3708,3710,3729,3731,3733,3767,3769,3775,3777,3779,3794,3796,3808,3810,3821,3823,3825,3828],[10,3690,3691],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3693,16],{"id":16},[10,3695,3696],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3698,22],{"id":22},[10,3700,3701],{},[26,3702],{"alt":3703,"src":3704},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3706,3707],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3709,35],{"id":35},[37,3711,3712,3715,3718],{},[40,3713,3714],{},"集合中的元素不重复。",[40,3716,3717],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3719,3720,3721,3724,3725,3728],{},"创建空集合必须写 ",[50,3722,3723],{},"set()","；",[50,3726,3727],{},"{}"," 创建的是空字典。",[14,3730,67],{"id":67},[10,3732,70],{},[72,3734,3736],{"className":74,"code":3735,"language":76,"meta":77,"style":77},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[50,3737,3738,3743,3748,3752,3757,3762],{"__ignoreMap":77},[81,3739,3740],{"class":83,"line":84},[81,3741,3742],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[81,3744,3745],{"class":83,"line":90},[81,3746,3747],{},"right = {\"Python\", \"Docker\"}\n",[81,3749,3750],{"class":83,"line":97},[81,3751,94],{"emptyLinePlaceholder":93},[81,3753,3754],{"class":83,"line":103},[81,3755,3756],{},"print(left & right)\n",[81,3758,3759],{"class":83,"line":109},[81,3760,3761],{},"print(left | right)\n",[81,3763,3764],{"class":83,"line":115},[81,3765,3766],{},"print(\"Git\" in left)\n",[10,3768,121],{},[72,3770,3773],{"className":3771,"code":3772,"language":127,"meta":77},[125],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[50,3774,3772],{"__ignoreMap":77},[10,3776,132],{},[14,3778,135],{"id":135},[137,3780,3781,3784],{},[40,3782,3783],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3785,3786,3789,3790,3793],{},[50,3787,3788],{},"&"," 计算交集，",[50,3791,3792],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3795,173],{"id":173},[37,3797,3798,3805],{},[40,3799,2334,3800,3802,3803,64],{},[50,3801,3727],{}," 创建空集合，实际得到空字典；空集合应写 ",[50,3804,3723],{},[40,3806,3807],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3809,191],{"id":191},[137,3811,3812,3818],{},[40,3813,3814,3815,3817],{},"把包含重复标签的列表交给 ",[50,3816,3723],{}," 去重。",[40,3819,3820],{},"计算两组课程标签的交集和差集。",[10,3822,202],{},[14,3824,205],{"id":205},[10,3826,3827],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,3829,212],{},{"title":77,"searchDepth":90,"depth":90,"links":3831},[3832,3833,3834,3835,3836,3837,3838,3839],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3686,"description":3691},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[225,3847,3354],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3850,"title":3851,"body":3852,"category":225,"cover":226,"description":3856,"extension":227,"meta":4054,"navigation":93,"path":4055,"pinned":230,"publishedAt":231,"seo":4056,"slug":4057,"stem":4058,"summary":4059,"tags":4060,"updatedAt":231,"visible":93,"__hash__":4063},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3853,"toc":4042},[3854,3857,3859,3862,3864,3870,3880,3882,3899,3901,3903,3953,3955,3961,3963,3965,3987,3989,3992,3998,4001,4003,4016,4018,4033,4035,4037,4040],[10,3855,3856],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3858,16],{"id":16},[10,3860,3861],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3863,22],{"id":22},[10,3865,3866],{},[26,3867],{"alt":3868,"src":3869},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3871,3872,3875,3876,3879],{},[50,3873,3874],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[50,3877,3878],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3881,35],{"id":35},[37,3883,3884,3893,3896],{},[40,3885,3886,3888,3889,3892],{},[50,3887,2803],{}," 比较内容是否相等，",[50,3890,3891],{},"is"," 比较是否为同一个对象。",[40,3894,3895],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3897,3898],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3900,67],{"id":67},[10,3902,70],{},[72,3904,3906],{"className":74,"code":3905,"language":76,"meta":77,"style":77},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[50,3907,3908,3913,3918,3923,3927,3932,3937,3942,3947],{"__ignoreMap":77},[81,3909,3910],{"class":83,"line":84},[81,3911,3912],{},"tasks = [\"变量\", \"字符串\"]\n",[81,3914,3915],{"class":83,"line":90},[81,3916,3917],{},"shared = tasks\n",[81,3919,3920],{"class":83,"line":97},[81,3921,3922],{},"backup = tasks.copy()\n",[81,3924,3925],{"class":83,"line":103},[81,3926,94],{"emptyLinePlaceholder":93},[81,3928,3929],{"class":83,"line":109},[81,3930,3931],{},"tasks.append(\"列表\")\n",[81,3933,3934],{"class":83,"line":115},[81,3935,3936],{},"print(shared)\n",[81,3938,3939],{"class":83,"line":2484},[81,3940,3941],{},"print(backup)\n",[81,3943,3944],{"class":83,"line":2490},[81,3945,3946],{},"print(tasks is shared)\n",[81,3948,3950],{"class":83,"line":3949},9,[81,3951,3952],{},"print(tasks is backup)\n",[10,3954,121],{},[72,3956,3959],{"className":3957,"code":3958,"language":127,"meta":77},[125],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[50,3960,3958],{"__ignoreMap":77},[10,3962,132],{},[14,3964,135],{"id":135},[137,3966,3967,3973],{},[40,3968,3969,3972],{},[50,3970,3971],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3974,3975,3978,3979,3982,3983,3986],{},[50,3976,3977],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[50,3980,3981],{},"shared"," 能观察到变化，",[50,3984,3985],{},"backup"," 不会。",[156,3988,158],{"id":158},[10,3990,3991],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3993,3994],{},[26,3995],{"alt":3996,"src":3997},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3999,4000],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4002,173],{"id":173},[37,4004,4005,4013],{},[40,4006,4007,4008,4010,4011,64],{},"用 ",[50,4009,2803],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[50,4012,3891],{},[40,4014,4015],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4017,191],{"id":191},[137,4019,4020,4023],{},[40,4021,4022],{},"让两个变量引用同一个字典并修改其中一个。",[40,4024,2334,4025,4028,4029,148,4031,64],{},[50,4026,4027],{},"copy()"," 创建外层副本，再比较 ",[50,4030,3891],{},[50,4032,2803],{},[10,4034,202],{},[14,4036,205],{"id":205},[10,4038,4039],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,4041,212],{},{"title":77,"searchDepth":90,"depth":90,"links":4043},[4044,4045,4046,4047,4048,4051,4052,4053],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":4049},[4050],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3851,"description":3856},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[225,4061,4062],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4065,"title":4066,"body":4067,"category":225,"cover":226,"description":4071,"extension":227,"meta":4284,"navigation":93,"path":4285,"pinned":230,"publishedAt":231,"seo":4286,"slug":4287,"stem":4288,"summary":4289,"tags":4290,"updatedAt":231,"visible":93,"__hash__":4292},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4068,"toc":4271},[4069,4072,4074,4077,4079,4085,4095,4097,4108,4110,4112,4165,4167,4173,4175,4177,4195,4197,4200,4206,4214,4217,4220,4226,4232,4234,4252,4254,4262,4264,4266,4269],[10,4070,4071],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4073,16],{"id":16},[10,4075,4076],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4078,22],{"id":22},[10,4080,4081],{},[26,4082],{"alt":4083,"src":4084},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4086,4087,53,4089,53,4092,4094],{},[50,4088,1153],{},[50,4090,4091],{},"elif",[50,4093,1156],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4096,35],{"id":35},[37,4098,4099,4102,4105],{},[40,4100,4101],{},"冒号表示接下来开始一个代码块。",[40,4103,4104],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4106,4107],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4109,67],{"id":67},[10,4111,70],{},[72,4113,4115],{"className":74,"code":4114,"language":76,"meta":77,"style":77},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[50,4116,4117,4122,4126,4131,4136,4141,4146,4150,4155,4159],{"__ignoreMap":77},[81,4118,4119],{"class":83,"line":84},[81,4120,4121],{},"score = int(input(\"请输入分数：\"))\n",[81,4123,4124],{"class":83,"line":90},[81,4125,94],{"emptyLinePlaceholder":93},[81,4127,4128],{"class":83,"line":97},[81,4129,4130],{},"if score >= 90:\n",[81,4132,4133],{"class":83,"line":103},[81,4134,4135],{},"    level = \"优秀\"\n",[81,4137,4138],{"class":83,"line":109},[81,4139,4140],{},"elif score >= 60:\n",[81,4142,4143],{"class":83,"line":115},[81,4144,4145],{},"    level = \"合格\"\n",[81,4147,4148],{"class":83,"line":2484},[81,4149,1143],{},[81,4151,4152],{"class":83,"line":2490},[81,4153,4154],{},"    level = \"需要继续学习\"\n",[81,4156,4157],{"class":83,"line":3949},[81,4158,94],{"emptyLinePlaceholder":93},[81,4160,4162],{"class":83,"line":4161},10,[81,4163,4164],{},"print(level)\n",[10,4166,121],{},[72,4168,4171],{"className":4169,"code":4170,"language":127,"meta":77},[125],"输入 85 时输出：合格\n",[50,4172,4170],{"__ignoreMap":77},[10,4174,132],{},[14,4176,135],{"id":135},[137,4178,4179,4186],{},[40,4180,4181,4182,4185],{},"输入先转换为整数，程序从 ",[50,4183,4184],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4187,4188,4191,4192,4194],{},[50,4189,4190],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[50,4193,1156],{}," 被跳过；最终三个分支只会选择一个。",[156,4196,158],{"id":158},[10,4198,4199],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4201,4202],{},[26,4203],{"alt":4204,"src":4205},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4207,4208,4210,4211,4213],{},[50,4209,4184],{}," 必须放在 ",[50,4212,4190],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[156,4215,158],{"id":4216},"再看一个具体细节-1",[10,4218,4219],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4221,4222],{},[26,4223],{"alt":4224,"src":4225},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4227,4228,4229,4231],{},"同一缩进层级属于同一个代码块；回到 ",[50,4230,1153],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4233,173],{"id":173},[37,4235,4236,4242],{},[40,4237,4238,4239,4241],{},"先写 ",[50,4240,4190],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4243,4244,4245,4247,4248,4251],{},"混用多个独立 ",[50,4246,1153],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[50,4249,4250],{},"if\u002Felif\u002Felse"," 链。",[14,4253,191],{"id":191},[137,4255,4256,4259],{},[40,4257,4258],{},"根据温度输出“冷、适中、热”三个等级。",[40,4260,4261],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4263,202],{},[14,4265,205],{"id":205},[10,4267,4268],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,4270,212],{},{"title":77,"searchDepth":90,"depth":90,"links":4272},[4273,4274,4275,4276,4277,4281,4282,4283],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":4278},[4279,4280],{"id":158,"depth":97,"text":158},{"id":4216,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4066,"description":4071},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[225,1153,4291],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4294,"title":4295,"body":4296,"category":225,"cover":226,"description":4300,"extension":227,"meta":4466,"navigation":93,"path":4467,"pinned":230,"publishedAt":231,"seo":4468,"slug":4469,"stem":4470,"summary":4471,"tags":4472,"updatedAt":231,"visible":93,"__hash__":4474},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4297,"toc":4454},[4298,4301,4303,4306,4308,4314,4320,4322,4337,4339,4341,4379,4381,4387,4389,4391,4406,4408,4411,4417,4423,4425,4433,4435,4445,4447,4449,4452],[10,4299,4300],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4302,16],{"id":16},[10,4304,4305],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4307,22],{"id":22},[10,4309,4310],{},[26,4311],{"alt":4312,"src":4313},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4315,4316,4319],{},[50,4317,4318],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4321,35],{"id":35},[37,4323,4324,4327,4330],{},[40,4325,4326],{},"进入循环前先准备参与条件判断的状态。",[40,4328,4329],{},"循环体中必须有机会让条件变为假。",[40,4331,4332,4333,4336],{},"能够预先确定遍历对象时，后续介绍的 ",[50,4334,4335],{},"for"," 通常更直接。",[14,4338,67],{"id":67},[10,4340,70],{},[72,4342,4344],{"className":74,"code":4343,"language":76,"meta":77,"style":77},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[50,4345,4346,4351,4355,4360,4365,4370,4374],{"__ignoreMap":77},[81,4347,4348],{"class":83,"line":84},[81,4349,4350],{},"count = 1\n",[81,4352,4353],{"class":83,"line":90},[81,4354,94],{"emptyLinePlaceholder":93},[81,4356,4357],{"class":83,"line":97},[81,4358,4359],{},"while count \u003C= 3:\n",[81,4361,4362],{"class":83,"line":103},[81,4363,4364],{},"    print(\"第\", count, \"次练习\")\n",[81,4366,4367],{"class":83,"line":109},[81,4368,4369],{},"    count = count + 1\n",[81,4371,4372],{"class":83,"line":115},[81,4373,94],{"emptyLinePlaceholder":93},[81,4375,4376],{"class":83,"line":2484},[81,4377,4378],{},"print(\"练习结束\")\n",[10,4380,121],{},[72,4382,4385],{"className":4383,"code":4384,"language":127,"meta":77},[125],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[50,4386,4384],{"__ignoreMap":77},[10,4388,132],{},[14,4390,135],{"id":135},[137,4392,4393,4400],{},[40,4394,4395,4396,4399],{},"进入循环前 ",[50,4397,4398],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4401,4402,4403,4405],{},"循环体末尾把 ",[50,4404,4398],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[156,4407,158],{"id":158},[10,4409,4410],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4412,4413],{},[26,4414],{"alt":4415,"src":4416},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4418,4419,4420,4422],{},"第4次检查时 ",[50,4421,4398],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4424,173],{"id":173},[37,4426,4427,4430],{},[40,4428,4429],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4431,4432],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4434,191],{"id":191},[137,4436,4437,4442],{},[40,4438,2334,4439,4441],{},[50,4440,4318],{}," 输出 1 到 5。",[40,4443,4444],{},"计算 1 到 10 的累加和。",[10,4446,202],{},[14,4448,205],{"id":205},[10,4450,4451],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,4453,212],{},{"title":77,"searchDepth":90,"depth":90,"links":4455},[4456,4457,4458,4459,4460,4463,4464,4465],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":4461},[4462],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4295,"description":4300},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[225,4318,4473],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4476,"title":4477,"body":4478,"category":225,"cover":226,"description":4482,"extension":227,"meta":4630,"navigation":93,"path":4631,"pinned":230,"publishedAt":231,"seo":4632,"slug":4633,"stem":4634,"summary":4635,"tags":4636,"updatedAt":231,"visible":93,"__hash__":4638},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4479,"toc":4620},[4480,4483,4485,4488,4490,4496,4501,4503,4517,4519,4521,4559,4561,4567,4569,4571,4588,4590,4598,4600,4611,4613,4615,4618],[10,4481,4482],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4484,16],{"id":16},[10,4486,4487],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4489,22],{"id":22},[10,4491,4492],{},[26,4493],{"alt":4494,"src":4495},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4497,4498,4500],{},[50,4499,4335],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4502,35],{"id":35},[37,4504,4505,4511,4514],{},[40,4506,4507,4510],{},[50,4508,4509],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4512,4513],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4515,4516],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4518,67],{"id":67},[10,4520,70],{},[72,4522,4524],{"className":74,"code":4523,"language":76,"meta":77,"style":77},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[50,4525,4526,4531,4535,4540,4545,4549,4554],{"__ignoreMap":77},[81,4527,4528],{"class":83,"line":84},[81,4529,4530],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[81,4532,4533],{"class":83,"line":90},[81,4534,94],{"emptyLinePlaceholder":93},[81,4536,4537],{"class":83,"line":97},[81,4538,4539],{},"for course in courses:\n",[81,4541,4542],{"class":83,"line":103},[81,4543,4544],{},"    print(course)\n",[81,4546,4547],{"class":83,"line":109},[81,4548,94],{"emptyLinePlaceholder":93},[81,4550,4551],{"class":83,"line":115},[81,4552,4553],{},"for number in range(1, 4):\n",[81,4555,4556],{"class":83,"line":2484},[81,4557,4558],{},"    print(number)\n",[10,4560,121],{},[72,4562,4565],{"className":4563,"code":4564,"language":127,"meta":77},[125],"变量\n字符串\n列表\n1\n2\n3\n",[50,4566,4564],{"__ignoreMap":77},[10,4568,132],{},[14,4570,135],{"id":135},[137,4572,4573,4583],{},[40,4574,4575,4576,4578,4579,4582],{},"第一个 ",[50,4577,4335],{}," 依次从列表取得字符串，循环变量 ",[50,4580,4581],{},"course"," 每轮重新绑定。",[40,4584,4585,4587],{},[50,4586,4509],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4589,173],{"id":173},[37,4591,4592,4595],{},[40,4593,4594],{},"只需要元素却手工维护索引，增加越界风险。",[40,4596,4597],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4599,191],{"id":191},[137,4601,4602,4605],{},[40,4603,4604],{},"逐项输出一个字符串中的字符。",[40,4606,2334,4607,4610],{},[50,4608,4609],{},"range()"," 输出 2、4、6、8。",[10,4612,202],{},[14,4614,205],{"id":205},[10,4616,4617],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,4619,212],{},{"title":77,"searchDepth":90,"depth":90,"links":4621},[4622,4623,4624,4625,4626,4627,4628,4629],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4477,"description":4482},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[225,4335,4637],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4640,"title":4641,"body":4642,"category":225,"cover":226,"description":4646,"extension":227,"meta":4820,"navigation":93,"path":4821,"pinned":230,"publishedAt":231,"seo":4822,"slug":4823,"stem":4824,"summary":4825,"tags":4826,"updatedAt":231,"visible":93,"__hash__":4827},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4643,"toc":4810},[4644,4647,4649,4652,4654,4660,4670,4672,4691,4693,4695,4747,4749,4755,4757,4759,4773,4775,4791,4793,4801,4803,4805,4808],[10,4645,4646],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4648,16],{"id":16},[10,4650,4651],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4653,22],{"id":22},[10,4655,4656],{},[26,4657],{"alt":4658,"src":4659},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4661,4662,4665,4666,4669],{},[50,4663,4664],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[50,4667,4668],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4671,35],{"id":35},[37,4673,4674,4677,4685],{},[40,4675,4676],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4678,4679,4681,4682,4684],{},[50,4680,4664],{}," 前要确认不会跳过 ",[50,4683,4318],{}," 循环中的状态更新。",[40,4686,4687,4688,4690],{},"多层嵌套中 ",[50,4689,4668],{}," 只结束它所在的最内层循环。",[14,4692,67],{"id":67},[10,4694,70],{},[72,4696,4698],{"className":74,"code":4697,"language":76,"meta":77,"style":77},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[50,4699,4700,4705,4709,4714,4719,4724,4729,4734,4738,4742],{"__ignoreMap":77},[81,4701,4702],{"class":83,"line":84},[81,4703,4704],{},"numbers = [3, -1, 0, 8, 12]\n",[81,4706,4707],{"class":83,"line":90},[81,4708,94],{"emptyLinePlaceholder":93},[81,4710,4711],{"class":83,"line":97},[81,4712,4713],{},"for number in numbers:\n",[81,4715,4716],{"class":83,"line":103},[81,4717,4718],{},"    if number \u003C 0:\n",[81,4720,4721],{"class":83,"line":109},[81,4722,4723],{},"        continue\n",[81,4725,4726],{"class":83,"line":115},[81,4727,4728],{},"    if number == 0:\n",[81,4730,4731],{"class":83,"line":2484},[81,4732,4733],{},"        break\n",[81,4735,4736],{"class":83,"line":2490},[81,4737,4558],{},[81,4739,4740],{"class":83,"line":3949},[81,4741,94],{"emptyLinePlaceholder":93},[81,4743,4744],{"class":83,"line":4161},[81,4745,4746],{},"print(\"循环结束\")\n",[10,4748,121],{},[72,4750,4753],{"className":4751,"code":4752,"language":127,"meta":77},[125],"3\n循环结束\n",[50,4754,4752],{"__ignoreMap":77},[10,4756,132],{},[14,4758,135],{"id":135},[137,4760,4761,4767],{},[40,4762,4763,4764,4766],{},"遇到 -1 时 ",[50,4765,4664],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4768,4769,4770,4772],{},"遇到 0 时 ",[50,4771,4668],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4774,173],{"id":173},[37,4776,4777,4782],{},[40,4778,3463,4779,4781],{},[50,4780,4664],{}," 当作结束循环，实际它只跳到下一轮。",[40,4783,4784,4785,4787,4788,4790],{},"在 ",[50,4786,4318],{}," 中把状态更新放在可能被 ",[50,4789,4664],{}," 跳过的位置，造成无限循环。",[14,4792,191],{"id":191},[137,4794,4795,4798],{},[40,4796,4797],{},"跳过列表中的空字符串并输出其他内容。",[40,4799,4800],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4802,202],{},[14,4804,205],{"id":205},[10,4806,4807],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,4809,212],{},{"title":77,"searchDepth":90,"depth":90,"links":4811},[4812,4813,4814,4815,4816,4817,4818,4819],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4641,"description":4646},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[225,4668,4664],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4,"title":5,"body":4829,"category":225,"cover":226,"description":12,"extension":227,"meta":4968,"navigation":93,"path":229,"pinned":230,"publishedAt":231,"seo":4969,"slug":233,"stem":234,"summary":235,"tags":4970,"updatedAt":231,"visible":93,"__hash__":239},{"type":7,"value":4830,"toc":4956},[4831,4833,4835,4837,4839,4843,4845,4847,4863,4865,4867,4895,4897,4902,4904,4906,4918,4920,4922,4926,4928,4930,4940,4942,4948,4950,4952,4954],[10,4832,12],{},[14,4834,16],{"id":16},[10,4836,19],{},[14,4838,22],{"id":22},[10,4840,4841],{},[26,4842],{"alt":28,"src":29},[10,4844,32],{},[14,4846,35],{"id":35},[37,4848,4849,4851,4853],{},[40,4850,42],{},[40,4852,45],{},[40,4854,48,4855,53,4857,57,4859,53,4861,64],{},[50,4856,52],{},[50,4858,56],{},[50,4860,60],{},[50,4862,63],{},[14,4864,67],{"id":67},[10,4866,70],{},[72,4868,4869],{"className":74,"code":75,"language":76,"meta":77,"style":77},[50,4870,4871,4875,4879,4883,4887,4891],{"__ignoreMap":77},[81,4872,4873],{"class":83,"line":84},[81,4874,87],{},[81,4876,4877],{"class":83,"line":90},[81,4878,94],{"emptyLinePlaceholder":93},[81,4880,4881],{"class":83,"line":97},[81,4882,100],{},[81,4884,4885],{"class":83,"line":103},[81,4886,106],{},[81,4888,4889],{"class":83,"line":109},[81,4890,112],{},[81,4892,4893],{"class":83,"line":115},[81,4894,118],{},[10,4896,121],{},[72,4898,4900],{"className":4899,"code":126,"language":127,"meta":77},[125],[50,4901,126],{"__ignoreMap":77},[10,4903,132],{},[14,4905,135],{"id":135},[137,4907,4908,4916],{},[40,4909,141,4910,144,4912,148,4914,64],{},[50,4911,52],{},[50,4913,147],{},[50,4915,151],{},[40,4917,154],{},[156,4919,158],{"id":158},[10,4921,161],{},[10,4923,4924],{},[26,4925],{"alt":166,"src":167},[10,4927,170],{},[14,4929,173],{"id":173},[37,4931,4932,4938],{},[40,4933,178,4934,182,4936,185],{},[50,4935,181],{},[50,4937,60],{},[40,4939,188],{},[14,4941,191],{"id":191},[137,4943,4944,4946],{},[40,4945,196],{},[40,4947,199],{},[10,4949,202],{},[14,4951,205],{"id":205},[10,4953,208],{},[210,4955,212],{},{"title":77,"searchDepth":90,"depth":90,"links":4957},[4958,4959,4960,4961,4962,4965,4966,4967],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":4963},[4964],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5,"description":12},[225,237,238],{"id":4972,"title":4973,"body":4974,"category":225,"cover":226,"description":4978,"extension":227,"meta":5116,"navigation":93,"path":5117,"pinned":230,"publishedAt":231,"seo":5118,"slug":5119,"stem":5120,"summary":5121,"tags":5122,"updatedAt":231,"visible":93,"__hash__":5125},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4975,"toc":5106},[4976,4979,4981,4984,4986,4992,4995,4997,5008,5010,5012,5050,5052,5058,5060,5062,5074,5076,5087,5089,5097,5099,5101,5104],[10,4977,4978],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4980,16],{"id":16},[10,4982,4983],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4985,22],{"id":22},[10,4987,4988],{},[26,4989],{"alt":4990,"src":4991},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4993,4994],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4996,35],{"id":35},[37,4998,4999,5002,5005],{},[40,5000,5001],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5003,5004],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5006,5007],{},"推导式创建新列表，不修改输入列表。",[14,5009,67],{"id":67},[10,5011,70],{},[72,5013,5015],{"className":74,"code":5014,"language":76,"meta":77,"style":77},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[50,5016,5017,5022,5026,5031,5036,5040,5045],{"__ignoreMap":77},[81,5018,5019],{"class":83,"line":84},[81,5020,5021],{},"numbers = [1, 2, 3, 4, 5]\n",[81,5023,5024],{"class":83,"line":90},[81,5025,94],{"emptyLinePlaceholder":93},[81,5027,5028],{"class":83,"line":97},[81,5029,5030],{},"squares = [number * number for number in numbers]\n",[81,5032,5033],{"class":83,"line":103},[81,5034,5035],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[81,5037,5038],{"class":83,"line":109},[81,5039,94],{"emptyLinePlaceholder":93},[81,5041,5042],{"class":83,"line":115},[81,5043,5044],{},"print(squares)\n",[81,5046,5047],{"class":83,"line":2484},[81,5048,5049],{},"print(even_squares)\n",[10,5051,121],{},[72,5053,5056],{"className":5054,"code":5055,"language":127,"meta":77},[125],"[1, 4, 9, 16, 25]\n[4, 16]\n",[50,5057,5055],{"__ignoreMap":77},[10,5059,132],{},[14,5061,135],{"id":135},[137,5063,5064,5067],{},[40,5065,5066],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5068,5069,5070,5073],{},"第二条先用 ",[50,5071,5072],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5075,173],{"id":173},[37,5077,5078,5084],{},[40,5079,5080,5081,5083],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[50,5082,4335],{}," 开始找输入。",[40,5085,5086],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5088,191],{"id":191},[137,5090,5091,5094],{},[40,5092,5093],{},"把字符串列表转换为长度列表。",[40,5095,5096],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5098,202],{},[14,5100,205],{"id":205},[10,5102,5103],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,5105,212],{},{"title":77,"searchDepth":90,"depth":90,"links":5107},[5108,5109,5110,5111,5112,5113,5114,5115],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4973,"description":4978},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[225,5123,5124],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5127,"title":5128,"body":5129,"category":225,"cover":226,"description":5133,"extension":227,"meta":5276,"navigation":93,"path":5277,"pinned":230,"publishedAt":231,"seo":5278,"slug":5279,"stem":5280,"summary":5281,"tags":5282,"updatedAt":231,"visible":93,"__hash__":5285},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5130,"toc":5266},[5131,5134,5136,5139,5141,5147,5150,5152,5163,5165,5167,5206,5208,5214,5216,5218,5233,5235,5243,5245,5257,5259,5261,5264],[10,5132,5133],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5135,16],{"id":16},[10,5137,5138],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5140,22],{"id":22},[10,5142,5143],{},[26,5144],{"alt":5145,"src":5146},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5148,5149],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5151,35],{"id":35},[37,5153,5154,5157,5160],{},[40,5155,5156],{},"函数名描述动作，使用小写字母和下划线。",[40,5158,5159],{},"函数定义要先执行，之后才能调用。",[40,5161,5162],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5164,67],{"id":67},[10,5166,70],{},[72,5168,5170],{"className":74,"code":5169,"language":76,"meta":77,"style":77},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[50,5171,5172,5177,5182,5187,5191,5196,5201],{"__ignoreMap":77},[81,5173,5174],{"class":83,"line":84},[81,5175,5176],{},"def show_progress():\n",[81,5178,5179],{"class":83,"line":90},[81,5180,5181],{},"    print(\"正在学习函数\")\n",[81,5183,5184],{"class":83,"line":97},[81,5185,5186],{},"    print(\"本节完成 50%\")\n",[81,5188,5189],{"class":83,"line":103},[81,5190,94],{"emptyLinePlaceholder":93},[81,5192,5193],{"class":83,"line":109},[81,5194,5195],{},"print(\"调用前\")\n",[81,5197,5198],{"class":83,"line":115},[81,5199,5200],{},"show_progress()\n",[81,5202,5203],{"class":83,"line":2484},[81,5204,5205],{},"print(\"调用后\")\n",[10,5207,121],{},[72,5209,5212],{"className":5210,"code":5211,"language":127,"meta":77},[125],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[50,5213,5211],{"__ignoreMap":77},[10,5215,132],{},[14,5217,135],{"id":135},[137,5219,5220,5226],{},[40,5221,936,5222,5225],{},[50,5223,5224],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5227,5228,5229,5232],{},"运行到 ",[50,5230,5231],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5234,173],{"id":173},[37,5236,5237,5240],{},[40,5238,5239],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5241,5242],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5244,191],{"id":191},[137,5246,5247,5254],{},[40,5248,5249,5250,5253],{},"定义 ",[50,5251,5252],{},"show_plan()"," 输出两行学习计划。",[40,5255,5256],{},"连续调用同一个函数两次，观察执行顺序。",[10,5258,202],{},[14,5260,205],{"id":205},[10,5262,5263],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,5265,212],{},{"title":77,"searchDepth":90,"depth":90,"links":5267},[5268,5269,5270,5271,5272,5273,5274,5275],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5128,"description":5133},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[225,5283,5284],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5287,"title":5288,"body":5289,"category":225,"cover":226,"description":5293,"extension":227,"meta":5473,"navigation":93,"path":5474,"pinned":230,"publishedAt":231,"seo":5475,"slug":5476,"stem":5477,"summary":5478,"tags":5479,"updatedAt":231,"visible":93,"__hash__":5482},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5290,"toc":5461},[5291,5294,5296,5299,5301,5307,5314,5316,5333,5335,5337,5371,5373,5379,5381,5383,5404,5406,5409,5415,5425,5427,5442,5444,5452,5454,5456,5459],[10,5292,5293],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5295,16],{"id":16},[10,5297,5298],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5300,22],{"id":22},[10,5302,5303],{},[26,5304],{"alt":5305,"src":5306},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5308,5309,5310,5313],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[50,5311,5312],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5315,35],{"id":35},[37,5317,5318,5321,5324],{},[40,5319,5320],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5322,5323],{},"局部变量默认只在函数内部可见。",[40,5325,5326,5327,5329,5330,64],{},"没有显式 ",[50,5328,5312],{}," 的函数会返回 ",[50,5331,5332],{},"None",[14,5334,67],{"id":67},[10,5336,70],{},[72,5338,5340],{"className":74,"code":5339,"language":76,"meta":77,"style":77},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[50,5341,5342,5347,5352,5357,5361,5366],{"__ignoreMap":77},[81,5343,5344],{"class":83,"line":84},[81,5345,5346],{},"def calculate_total(price, count):\n",[81,5348,5349],{"class":83,"line":90},[81,5350,5351],{},"    total = price * count\n",[81,5353,5354],{"class":83,"line":97},[81,5355,5356],{},"    return total\n",[81,5358,5359],{"class":83,"line":103},[81,5360,94],{"emptyLinePlaceholder":93},[81,5362,5363],{"class":83,"line":109},[81,5364,5365],{},"result = calculate_total(25, 4)\n",[81,5367,5368],{"class":83,"line":115},[81,5369,5370],{},"print(result)\n",[10,5372,121],{},[72,5374,5377],{"className":5375,"code":5376,"language":127,"meta":77},[125],"100\n",[50,5378,5376],{"__ignoreMap":77},[10,5380,132],{},[14,5382,135],{"id":135},[137,5384,5385,5394],{},[40,5386,5387,5388,53,5391,5393],{},"调用时 25 和 4 分别绑定到 ",[50,5389,5390],{},"price",[50,5392,4398],{},"，它们只在本次函数调用的局部范围中使用。",[40,5395,5396,5399,5400,5403],{},[50,5397,5398],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[50,5401,5402],{},"result"," 并输出。",[156,5405,158],{"id":158},[10,5407,5408],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5410,5411],{},[26,5412],{"alt":5413,"src":5414},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5416,5417,53,5419,148,5421,5424],{},[50,5418,5390],{},[50,5420,4398],{},[50,5422,5423],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5426,173],{"id":173},[37,5428,5429,5436],{},[40,5430,5431,5432,5435],{},"在函数内部只 ",[50,5433,5434],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5437,5438,5439,5441],{},"试图在函数外直接访问局部变量 ",[50,5440,5423],{},"，它的名字只在调用期间的局部作用域存在。",[14,5443,191],{"id":191},[137,5445,5446,5449],{},[40,5447,5448],{},"编写计算长方形面积的函数。",[40,5450,5451],{},"让函数返回结果后在调用方加上单位再输出。",[10,5453,202],{},[14,5455,205],{"id":205},[10,5457,5458],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,5460,212],{},{"title":77,"searchDepth":90,"depth":90,"links":5462},[5463,5464,5465,5466,5467,5470,5471,5472],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":5468},[5469],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5288,"description":5293},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[225,5480,5481],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5484,"title":5485,"body":5486,"category":225,"cover":226,"description":5490,"extension":227,"meta":5670,"navigation":93,"path":5671,"pinned":230,"publishedAt":231,"seo":5672,"slug":5673,"stem":5674,"summary":5675,"tags":5676,"updatedAt":231,"visible":93,"__hash__":5679},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5487,"toc":5658},[5488,5491,5493,5496,5498,5504,5507,5509,5526,5528,5530,5582,5584,5590,5592,5594,5612,5614,5617,5623,5626,5628,5639,5641,5649,5651,5653,5656],[10,5489,5490],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5492,16],{"id":16},[10,5494,5495],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5497,22],{"id":22},[10,5499,5500],{},[26,5501],{"alt":5502,"src":5503},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5505,5506],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5508,35],{"id":35},[37,5510,5511,5514,5520],{},[40,5512,5513],{},"必需参数应放在有默认值的参数之前。",[40,5515,5516,5519],{},[50,5517,5518],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5521,5522,5525],{},[50,5523,5524],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5527,67],{"id":67},[10,5529,70],{},[72,5531,5533],{"className":74,"code":5532,"language":76,"meta":77,"style":77},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[50,5534,5535,5540,5545,5549,5554,5559,5563,5568,5573,5577],{"__ignoreMap":77},[81,5536,5537],{"class":83,"line":84},[81,5538,5539],{},"def build_title(name, level=\"基础\"):\n",[81,5541,5542],{"class":83,"line":90},[81,5543,5544],{},"    return name + \"｜\" + level\n",[81,5546,5547],{"class":83,"line":97},[81,5548,94],{"emptyLinePlaceholder":93},[81,5550,5551],{"class":83,"line":103},[81,5552,5553],{},"print(build_title(\"Python\"))\n",[81,5555,5556],{"class":83,"line":109},[81,5557,5558],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[81,5560,5561],{"class":83,"line":115},[81,5562,94],{"emptyLinePlaceholder":93},[81,5564,5565],{"class":83,"line":2484},[81,5566,5567],{},"def total(*numbers):\n",[81,5569,5570],{"class":83,"line":2490},[81,5571,5572],{},"    return sum(numbers)\n",[81,5574,5575],{"class":83,"line":3949},[81,5576,94],{"emptyLinePlaceholder":93},[81,5578,5579],{"class":83,"line":4161},[81,5580,5581],{},"print(total(10, 20, 30))\n",[10,5583,121],{},[72,5585,5588],{"className":5586,"code":5587,"language":127,"meta":77},[125],"Python｜基础\n异常处理｜进阶\n60\n",[50,5589,5587],{"__ignoreMap":77},[10,5591,132],{},[14,5593,135],{"id":135},[137,5595,5596,5603],{},[40,5597,5598,5599,5602],{},"第一次调用只提供必需参数，",[50,5600,5601],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5604,5605,5608,5609,64],{},[50,5606,5607],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[50,5610,5611],{},"sum()",[156,5613,158],{"id":158},[10,5615,5616],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5618,5619],{},[26,5620],{"alt":5621,"src":5622},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5624,5625],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5627,173],{"id":173},[37,5629,5630,5636],{},[40,5631,5632,5633,5635],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[50,5634,5332],{}," 再在函数内创建。",[40,5637,5638],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5640,191],{"id":191},[137,5642,5643,5646],{},[40,5644,5645],{},"给问候函数增加默认称呼。",[40,5647,5648],{},"编写接收任意数量分数并返回总分的函数。",[10,5650,202],{},[14,5652,205],{"id":205},[10,5654,5655],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,5657,212],{},{"title":77,"searchDepth":90,"depth":90,"links":5659},[5660,5661,5662,5663,5664,5667,5668,5669],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":5665},[5666],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5485,"description":5490},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[225,5677,5678],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5681,"title":5682,"body":5683,"category":225,"cover":226,"description":5687,"extension":227,"meta":5884,"navigation":93,"path":5885,"pinned":230,"publishedAt":231,"seo":5886,"slug":5887,"stem":5888,"summary":5889,"tags":5890,"updatedAt":231,"visible":93,"__hash__":5893},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5684,"toc":5872},[5685,5688,5690,5693,5695,5701,5704,5706,5723,5725,5727,5790,5792,5798,5800,5802,5829,5831,5834,5840,5843,5845,5853,5855,5863,5865,5867,5870],[10,5686,5687],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5689,16],{"id":16},[10,5691,5692],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5694,22],{"id":22},[10,5696,5697],{},[26,5698],{"alt":5699,"src":5700},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5702,5703],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5705,35],{"id":35},[37,5707,5708,5711,5714],{},[40,5709,5710],{},"函数内部赋值默认创建局部变量。",[40,5712,5713],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5715,5716,2172,5719,5722],{},[50,5717,5718],{},"global",[50,5720,5721],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5724,67],{"id":67},[10,5726,70],{},[72,5728,5730],{"className":74,"code":5729,"language":76,"meta":77,"style":77},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[50,5731,5732,5737,5741,5746,5751,5755,5760,5765,5770,5774,5779,5784],{"__ignoreMap":77},[81,5733,5734],{"class":83,"line":84},[81,5735,5736],{},"course = \"Python\"\n",[81,5738,5739],{"class":83,"line":90},[81,5740,94],{"emptyLinePlaceholder":93},[81,5742,5743],{"class":83,"line":97},[81,5744,5745],{},"def outer():\n",[81,5747,5748],{"class":83,"line":103},[81,5749,5750],{},"    level = \"基础\"\n",[81,5752,5753],{"class":83,"line":109},[81,5754,94],{"emptyLinePlaceholder":93},[81,5756,5757],{"class":83,"line":115},[81,5758,5759],{},"    def show():\n",[81,5761,5762],{"class":83,"line":2484},[81,5763,5764],{},"        lesson = \"作用域\"\n",[81,5766,5767],{"class":83,"line":2490},[81,5768,5769],{},"        print(course, level, lesson)\n",[81,5771,5772],{"class":83,"line":3949},[81,5773,94],{"emptyLinePlaceholder":93},[81,5775,5776],{"class":83,"line":4161},[81,5777,5778],{},"    show()\n",[81,5780,5782],{"class":83,"line":5781},11,[81,5783,94],{"emptyLinePlaceholder":93},[81,5785,5787],{"class":83,"line":5786},12,[81,5788,5789],{},"outer()\n",[10,5791,121],{},[72,5793,5796],{"className":5794,"code":5795,"language":127,"meta":77},[125],"Python 基础 作用域\n",[50,5797,5795],{"__ignoreMap":77},[10,5799,132],{},[14,5801,135],{"id":135},[137,5803,5804,5821],{},[40,5805,5806,5809,5810,5813,5814,5816,5817,5820],{},[50,5807,5808],{},"show()"," 中查找 ",[50,5811,5812],{},"lesson"," 时先在局部找到，查找 ",[50,5815,5601],{}," 时到外层 ",[50,5818,5819],{},"outer()"," 找到。",[40,5822,5823,5825,5826,5828],{},[50,5824,4581],{}," 在局部和外层都不存在，继续到模块全局找到；",[50,5827,2204],{}," 最后在内置作用域找到。",[156,5830,158],{"id":158},[10,5832,5833],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5835,5836],{},[26,5837],{"alt":5838,"src":5839},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5841,5842],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5844,173],{"id":173},[37,5846,5847,5850],{},[40,5848,5849],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5851,5852],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5854,191],{"id":191},[137,5856,5857,5860],{},[40,5858,5859],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5861,5862],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5864,202],{},[14,5866,205],{"id":205},[10,5868,5869],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,5871,212],{},{"title":77,"searchDepth":90,"depth":90,"links":5873},[5874,5875,5876,5877,5878,5881,5882,5883],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":5879},[5880],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5682,"description":5687},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[225,5891,5892],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5895,"title":5896,"body":5897,"category":225,"cover":226,"description":5901,"extension":227,"meta":6051,"navigation":93,"path":6052,"pinned":230,"publishedAt":231,"seo":6053,"slug":6054,"stem":6055,"summary":6056,"tags":6057,"updatedAt":231,"visible":93,"__hash__":6060},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5898,"toc":6041},[5899,5902,5904,5907,5909,5915,5918,5920,5939,5941,5943,5977,5979,5985,5987,5989,6004,6006,6018,6020,6032,6034,6036,6039],[10,5900,5901],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5903,16],{"id":16},[10,5905,5906],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5908,22],{"id":22},[10,5910,5911],{},[26,5912],{"alt":5913,"src":5914},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5916,5917],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5919,35],{"id":35},[37,5921,5922,5925,5928],{},[40,5923,5924],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5926,5927],{},"注解表达接口意图，不代替输入校验和测试。",[40,5929,5930,5931,53,5933,53,5935,5938],{},"基础注解优先使用 ",[50,5932,2255],{},[50,5934,2421],{},[50,5936,5937],{},"list[str]"," 等直接写法。",[14,5940,67],{"id":67},[10,5942,70],{},[72,5944,5946],{"className":74,"code":5945,"language":76,"meta":77,"style":77},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[50,5947,5948,5953,5958,5963,5967,5972],{"__ignoreMap":77},[81,5949,5950],{"class":83,"line":84},[81,5951,5952],{},"def format_score(name: str, score: int) -> str:\n",[81,5954,5955],{"class":83,"line":90},[81,5956,5957],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[81,5959,5960],{"class":83,"line":97},[81,5961,5962],{},"    return name + \"：\" + str(score)\n",[81,5964,5965],{"class":83,"line":103},[81,5966,94],{"emptyLinePlaceholder":93},[81,5968,5969],{"class":83,"line":109},[81,5970,5971],{},"print(format_score(\"小郑\", 95))\n",[81,5973,5974],{"class":83,"line":115},[81,5975,5976],{},"print(format_score.__doc__)\n",[10,5978,121],{},[72,5980,5983],{"className":5981,"code":5982,"language":127,"meta":77},[125],"小郑：95\n返回带姓名的分数文本。\n",[50,5984,5982],{"__ignoreMap":77},[10,5986,132],{},[14,5988,135],{"id":135},[137,5990,5991,6001],{},[40,5992,5993,5994,5997,5998,6000],{},"函数签名说明 ",[50,5995,5996],{},"name"," 预期为字符串、",[50,5999,2242],{}," 预期为整数，返回值预期为字符串。",[40,6002,6003],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6005,173],{"id":173},[37,6007,6008,6015],{},[40,6009,6010,6011,6014],{},"认为加了 ",[50,6012,6013],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6016,6017],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6019,191],{"id":191},[137,6021,6022,6025],{},[40,6023,6024],{},"为面积函数补充参数和返回值注解。",[40,6026,6027,6028,6031],{},"通过 ",[50,6029,6030],{},"函数名.__doc__"," 查看文档字符串。",[10,6033,202],{},[14,6035,205],{"id":205},[10,6037,6038],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,6040,212],{},{"title":77,"searchDepth":90,"depth":90,"links":6042},[6043,6044,6045,6046,6047,6048,6049,6050],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5896,"description":5901},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[225,6058,6059],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6062,"title":6063,"body":6064,"category":225,"cover":226,"description":6068,"extension":227,"meta":6295,"navigation":93,"path":6296,"pinned":230,"publishedAt":231,"seo":6297,"slug":6298,"stem":6299,"summary":6300,"tags":6301,"updatedAt":231,"visible":93,"__hash__":6304},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6065,"toc":6283},[6066,6069,6071,6077,6079,6085,6096,6098,6116,6118,6125,6154,6161,6180,6189,6191,6197,6199,6201,6224,6226,6229,6235,6241,6243,6259,6261,6274,6276,6278,6281],[10,6067,6068],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6070,16],{"id":16},[10,6072,6073,6074,6076],{},"本篇只处理“模块、import 与 ",[294,6075,5996],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6078,22],{"id":22},[10,6080,6081],{},[26,6082],{"alt":6083,"src":6084},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6086,6087,6088,6091,6092,6095],{},"同一个文件直接运行时 ",[50,6089,6090],{},"__name__"," 等于 ",[50,6093,6094],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6097,35],{"id":35},[37,6099,6100,6106,6109],{},[40,6101,6102,6103,6105],{},"一个 ",[50,6104,1167],{}," 文件就是一个模块。",[40,6107,6108],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6110,6111,6112,6115],{},"避免使用 ",[50,6113,6114],{},"from module import *","，它会让名字来源不清楚。",[14,6117,67],{"id":67},[10,6119,6120,6121,6124],{},"先在同一个目录中创建两个文件。把函数放进 ",[50,6122,6123],{},"calculator.py","：",[72,6126,6128],{"className":74,"code":6127,"language":76,"meta":77,"style":77},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[50,6129,6130,6135,6140,6144,6149],{"__ignoreMap":77},[81,6131,6132],{"class":83,"line":84},[81,6133,6134],{},"def add(left, right):\n",[81,6136,6137],{"class":83,"line":90},[81,6138,6139],{},"    return left + right\n",[81,6141,6142],{"class":83,"line":97},[81,6143,94],{"emptyLinePlaceholder":93},[81,6145,6146],{"class":83,"line":103},[81,6147,6148],{},"if __name__ == \"__main__\":\n",[81,6150,6151],{"class":83,"line":109},[81,6152,6153],{},"    print(add(2, 3))\n",[10,6155,6156,6157,6160],{},"再创建 ",[50,6158,6159],{},"app.py","，从模块中导入函数：",[72,6162,6164],{"className":74,"code":6163,"language":76,"meta":77,"style":77},"from calculator import add\n\nprint(add(10, 20))\n",[50,6165,6166,6171,6175],{"__ignoreMap":77},[81,6167,6168],{"class":83,"line":84},[81,6169,6170],{},"from calculator import add\n",[81,6172,6173],{"class":83,"line":90},[81,6174,94],{"emptyLinePlaceholder":93},[81,6176,6177],{"class":83,"line":97},[81,6178,6179],{},"print(add(10, 20))\n",[10,6181,6182,6183,148,6186,64],{},"分别执行 ",[50,6184,6185],{},"python3 calculator.py",[50,6187,6188],{},"python3 app.py",[10,6190,121],{},[72,6192,6195],{"className":6193,"code":6194,"language":127,"meta":77},[125],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[50,6196,6194],{"__ignoreMap":77},[10,6198,132],{},[14,6200,135],{"id":135},[137,6202,6203,6213],{},[40,6204,6205,6206,6208,6209,6212],{},"直接运行 ",[50,6207,6123],{}," 时，模块名是 ",[50,6210,6211],{},"__main__","，入口代码输出 5。",[40,6214,6215,6217,6218,6220,6221,6223],{},[50,6216,6159],{}," 导入模块时，",[50,6219,6123],{}," 的函数定义会执行，但入口判断为假；随后 ",[50,6222,6159],{}," 调用函数输出 30。",[156,6225,158],{"id":158},[10,6227,6228],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6230,6231],{},[26,6232],{"alt":6233,"src":6234},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6236,6237,6238,6240],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[50,6239,6211],{}," 保护下的演示代码。",[14,6242,173],{"id":173},[37,6244,6245,6252],{},[40,6246,6247,6248,148,6250,64],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[50,6249,6123],{},[50,6251,6159],{},[40,6253,6254,6255,6258],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[50,6256,6257],{},"json.py","，导致导入目标被遮蔽。",[14,6260,191],{"id":191},[137,6262,6263,6269],{},[40,6264,2349,6265,6268],{},[50,6266,6267],{},"text_tools.py"," 并导出一个格式化函数。",[40,6270,6271,6272,64],{},"分别直接运行模块和从另一个脚本导入，输出 ",[50,6273,6090],{},[10,6275,202],{},[14,6277,205],{"id":205},[10,6279,6280],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,6282,212],{},{"title":77,"searchDepth":90,"depth":90,"links":6284},[6285,6286,6287,6288,6289,6292,6293,6294],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":6290},[6291],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6063,"description":6068},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[225,6302,6303],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6306,"title":6307,"body":6308,"category":225,"cover":226,"description":6312,"extension":227,"meta":6477,"navigation":93,"path":6478,"pinned":230,"publishedAt":231,"seo":6479,"slug":6480,"stem":6481,"summary":6482,"tags":6483,"updatedAt":231,"visible":93,"__hash__":6485},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6309,"toc":6467},[6310,6313,6315,6318,6320,6326,6329,6331,6345,6347,6349,6395,6397,6403,6405,6407,6433,6435,6445,6447,6458,6460,6462,6465],[10,6311,6312],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6314,16],{"id":16},[10,6316,6317],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6319,22],{"id":22},[10,6321,6322],{},[26,6323],{"alt":6324,"src":6325},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6327,6328],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6330,35],{"id":35},[37,6332,6333,6339,6342],{},[40,6334,6335,6338],{},[50,6336,6337],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6340,6341],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6343,6344],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6346,67],{"id":67},[10,6348,1570],{},[72,6350,6352],{"className":589,"code":6351,"language":591,"meta":77,"style":77},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[50,6353,6354,6366,6374,6380,6390],{"__ignoreMap":77},[81,6355,6356,6358,6360,6363],{"class":83,"line":84},[81,6357,689],{"class":598},[81,6359,631],{"class":601},[81,6361,6362],{"class":634}," venv",[81,6364,6365],{"class":634}," .venv\n",[81,6367,6368,6371],{"class":83,"line":90},[81,6369,6370],{"class":601},"source",[81,6372,6373],{"class":634}," .venv\u002Fbin\u002Factivate\n",[81,6375,6376,6378],{"class":83,"line":97},[81,6377,76],{"class":598},[81,6379,602],{"class":601},[81,6381,6382,6384,6386,6388],{"class":83,"line":103},[81,6383,76],{"class":598},[81,6385,631],{"class":601},[81,6387,635],{"class":634},[81,6389,602],{"class":601},[81,6391,6392],{"class":83,"line":109},[81,6393,6394],{"class":598},"deactivate\n",[10,6396,121],{},[72,6398,6401],{"className":6399,"code":6400,"language":127,"meta":77},[125],"Python 和 pip 的路径应指向当前项目的 .venv\n",[50,6402,6400],{"__ignoreMap":77},[10,6404,132],{},[14,6406,135],{"id":135},[137,6408,6409,6418],{},[40,6410,6411,6414,6415,6417],{},[50,6412,6413],{},"venv"," 根据当前 ",[50,6416,689],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6419,6420,6421,2172,6423,6426,6427,3724,6429,6432],{},"激活后 ",[50,6422,76],{},[50,6424,6425],{},"python -m pip"," 优先指向 ",[50,6428,6337],{},[50,6430,6431],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6434,173],{"id":173},[37,6436,6437,6440],{},[40,6438,6439],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6441,3463,6442,6444],{},[50,6443,6337],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6446,191],{"id":191},[137,6448,6449,6455],{},[40,6450,6451,6452,64],{},"创建虚拟环境并记录激活前后的 ",[50,6453,6454],{},"which python",[40,6456,6457],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6459,202],{},[14,6461,205],{"id":205},[10,6463,6464],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,6466,1654],{},{"title":77,"searchDepth":90,"depth":90,"links":6468},[6469,6470,6471,6472,6473,6474,6475,6476],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6307,"description":6312},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[225,6484,260],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6487,"title":6488,"body":6489,"category":225,"cover":226,"description":6493,"extension":227,"meta":6681,"navigation":93,"path":6682,"pinned":230,"publishedAt":231,"seo":6683,"slug":6684,"stem":6685,"summary":6686,"tags":6687,"updatedAt":231,"visible":93,"__hash__":6690},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6490,"toc":6671},[6491,6494,6496,6499,6501,6507,6516,6518,6542,6544,6546,6599,6601,6607,6609,6611,6627,6629,6648,6650,6662,6664,6666,6669],[10,6492,6493],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6495,16],{"id":16},[10,6497,6498],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6500,22],{"id":22},[10,6502,6503],{},[26,6504],{"alt":6505,"src":6506},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6508,6509,6512,6513,6515],{},[50,6510,6511],{},"Path"," 使用 ",[50,6514,2431],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6517,35],{"id":35},[37,6519,6520,6523,6535],{},[40,6521,6522],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6524,6525,53,6528,53,6531,6534],{},[50,6526,6527],{},"exists()",[50,6529,6530],{},"is_file()",[50,6532,6533],{},"is_dir()"," 检查真实文件系统状态。",[40,6536,6537,6538,6541],{},"创建目录前明确目标；",[50,6539,6540],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6543,67],{"id":67},[10,6545,70],{},[72,6547,6549],{"className":74,"code":6548,"language":76,"meta":77,"style":77},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[50,6550,6551,6556,6560,6565,6570,6575,6579,6584,6589,6594],{"__ignoreMap":77},[81,6552,6553],{"class":83,"line":84},[81,6554,6555],{},"from pathlib import Path\n",[81,6557,6558],{"class":83,"line":90},[81,6559,94],{"emptyLinePlaceholder":93},[81,6561,6562],{"class":83,"line":97},[81,6563,6564],{},"project = Path.cwd()\n",[81,6566,6567],{"class":83,"line":103},[81,6568,6569],{},"data_dir = project \u002F \"data\"\n",[81,6571,6572],{"class":83,"line":109},[81,6573,6574],{},"file_path = data_dir \u002F \"records.json\"\n",[81,6576,6577],{"class":83,"line":115},[81,6578,94],{"emptyLinePlaceholder":93},[81,6580,6581],{"class":83,"line":2484},[81,6582,6583],{},"print(project)\n",[81,6585,6586],{"class":83,"line":2490},[81,6587,6588],{},"print(file_path.name)\n",[81,6590,6591],{"class":83,"line":3949},[81,6592,6593],{},"print(file_path.suffix)\n",[81,6595,6596],{"class":83,"line":4161},[81,6597,6598],{},"print(file_path.exists())\n",[10,6600,121],{},[72,6602,6605],{"className":6603,"code":6604,"language":127,"meta":77},[125],"显示当前项目路径、records.json、.json 和存在状态\n",[50,6606,6604],{"__ignoreMap":77},[10,6608,132],{},[14,6610,135],{"id":135},[137,6612,6613,6619],{},[40,6614,6615,6618],{},[50,6616,6617],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6620,2334,6621,6623,6624,6626],{},[50,6622,2431],{}," 组合路径片段只创建新的 ",[50,6625,6511],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6628,173],{"id":173},[37,6630,6631,6639],{},[40,6632,3463,6633,6635,6636,6638],{},[50,6634,6511],{}," 对象存在当成真实文件存在，仍需调用 ",[50,6637,6527],{}," 等方法确认。",[40,6640,6641,6642,182,6644,6647],{},"手工拼接 ",[50,6643,2431],{},[50,6645,6646],{},"\\"," 分隔符，降低跨平台可读性。",[14,6649,191],{"id":191},[137,6651,6652,6659],{},[40,6653,6654,6655,6658],{},"组合 ",[50,6656,6657],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6660,6661],{},"输出路径的父目录、文件名和扩展名。",[10,6663,202],{},[14,6665,205],{"id":205},[10,6667,6668],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,6670,212],{},{"title":77,"searchDepth":90,"depth":90,"links":6672},[6673,6674,6675,6676,6677,6678,6679,6680],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6488,"description":6493},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[225,6688,6689],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6692,"title":6693,"body":6694,"category":225,"cover":226,"description":6698,"extension":227,"meta":6876,"navigation":93,"path":6877,"pinned":230,"publishedAt":231,"seo":6878,"slug":6879,"stem":6880,"summary":6881,"tags":6882,"updatedAt":231,"visible":93,"__hash__":6885},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6695,"toc":6866},[6696,6699,6701,6704,6706,6712,6715,6717,6745,6747,6749,6806,6808,6814,6816,6818,6829,6831,6844,6846,6857,6859,6861,6864],[10,6697,6698],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6700,16],{"id":16},[10,6702,6703],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6705,22],{"id":22},[10,6707,6708],{},[26,6709],{"alt":6710,"src":6711},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6713,6714],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6716,35],{"id":35},[37,6718,6719,6725,6734],{},[40,6720,6721,6724],{},[50,6722,6723],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6726,6727,6730,6731,64],{},[50,6728,6729],{},"r"," 模式读取不存在文件会产生 ",[50,6732,6733],{},"FileNotFoundError",[40,6735,6736,6737,6740,6741,6744],{},"本篇显式调用 ",[50,6738,6739],{},"close()","；第 34 篇会用 ",[50,6742,6743],{},"with"," 更可靠地管理关闭动作。",[14,6746,67],{"id":67},[10,6748,70],{},[72,6750,6752],{"className":74,"code":6751,"language":76,"meta":77,"style":77},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[50,6753,6754,6758,6762,6767,6772,6777,6782,6786,6791,6796,6801],{"__ignoreMap":77},[81,6755,6756],{"class":83,"line":84},[81,6757,6555],{},[81,6759,6760],{"class":83,"line":90},[81,6761,94],{"emptyLinePlaceholder":93},[81,6763,6764],{"class":83,"line":97},[81,6765,6766],{},"file_path = Path(\"notes.txt\")\n",[81,6768,6769],{"class":83,"line":103},[81,6770,6771],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[81,6773,6774],{"class":83,"line":109},[81,6775,6776],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[81,6778,6779],{"class":83,"line":115},[81,6780,6781],{},"writer.close()\n",[81,6783,6784],{"class":83,"line":2484},[81,6785,94],{"emptyLinePlaceholder":93},[81,6787,6788],{"class":83,"line":2490},[81,6789,6790],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[81,6792,6793],{"class":83,"line":3949},[81,6794,6795],{},"content = reader.read()\n",[81,6797,6798],{"class":83,"line":4161},[81,6799,6800],{},"reader.close()\n",[81,6802,6803],{"class":83,"line":5781},[81,6804,6805],{},"print(content)\n",[10,6807,121],{},[72,6809,6812],{"className":6810,"code":6811,"language":127,"meta":77},[125],"变量\n循环\n函数\n",[50,6813,6811],{"__ignoreMap":77},[10,6815,132],{},[14,6817,135],{"id":135},[137,6819,6820,6826],{},[40,6821,6822,6823,6825],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[50,6824,6739],{}," 确保缓冲内容交给文件系统。",[40,6827,6828],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6830,173],{"id":173},[37,6832,6833,6838],{},[40,6834,2334,6835,6837],{},[50,6836,6723],{}," 模式打开重要文件却未确认覆盖风险。",[40,6839,6840,6841,64],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[50,6842,6843],{},"encoding=\"utf-8\"",[14,6845,191],{"id":191},[137,6847,6848,6851],{},[40,6849,6850],{},"写入三行学习记录并读取。",[40,6852,6853,6854,6856],{},"改用 ",[50,6855,335],{}," 模式追加一行，确认原内容仍保留。",[10,6858,202],{},[14,6860,205],{"id":205},[10,6862,6863],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,6865,212],{},{"title":77,"searchDepth":90,"depth":90,"links":6867},[6868,6869,6870,6871,6872,6873,6874,6875],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6693,"description":6698},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[225,6883,6884],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6887,"title":6888,"body":6889,"category":225,"cover":226,"description":6893,"extension":227,"meta":7060,"navigation":93,"path":7061,"pinned":230,"publishedAt":231,"seo":7062,"slug":7063,"stem":7064,"summary":7065,"tags":7066,"updatedAt":231,"visible":93,"__hash__":7069},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6890,"toc":7050},[6891,6894,6896,6899,6901,6907,6917,6919,6933,6935,6937,6997,6999,7005,7007,7009,7021,7023,7031,7033,7041,7043,7045,7048],[10,6892,6893],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6895,16],{"id":16},[10,6897,6898],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6900,22],{"id":22},[10,6902,6903],{},[26,6904],{"alt":6905,"src":6906},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6908,6909,6912,6913,6916],{},[50,6910,6911],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[50,6914,6915],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6918,35],{"id":35},[37,6920,6921,6924,6930],{},[40,6922,6923],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6925,6926,6929],{},[50,6927,6928],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6931,6932],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6934,67],{"id":67},[10,6936,70],{},[72,6938,6940],{"className":74,"code":6939,"language":76,"meta":77,"style":77},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[50,6941,6942,6947,6951,6956,6960,6965,6970,6974,6978,6983,6988,6992],{"__ignoreMap":77},[81,6943,6944],{"class":83,"line":84},[81,6945,6946],{},"import json\n",[81,6948,6949],{"class":83,"line":90},[81,6950,94],{"emptyLinePlaceholder":93},[81,6952,6953],{"class":83,"line":97},[81,6954,6955],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[81,6957,6958],{"class":83,"line":103},[81,6959,94],{"emptyLinePlaceholder":93},[81,6961,6962],{"class":83,"line":109},[81,6963,6964],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[81,6966,6967],{"class":83,"line":115},[81,6968,6969],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[81,6971,6972],{"class":83,"line":2484},[81,6973,6781],{},[81,6975,6976],{"class":83,"line":2490},[81,6977,94],{"emptyLinePlaceholder":93},[81,6979,6980],{"class":83,"line":3949},[81,6981,6982],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[81,6984,6985],{"class":83,"line":4161},[81,6986,6987],{},"loaded = json.load(reader)\n",[81,6989,6990],{"class":83,"line":5781},[81,6991,6800],{},[81,6993,6994],{"class":83,"line":5786},[81,6995,6996],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6998,121],{},[72,7000,7003],{"className":7001,"code":7002,"language":127,"meta":77},[125],"Python 60\n",[50,7004,7002],{"__ignoreMap":77},[10,7006,132],{},[14,7008,135],{"id":135},[137,7010,7011,7016],{},[40,7012,7013,7015],{},[50,7014,6911],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7017,7018,7020],{},[50,7019,6915],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7022,173],{"id":173},[37,7024,7025,7028],{},[40,7026,7027],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7029,7030],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7032,191],{"id":191},[137,7034,7035,7038],{},[40,7036,7037],{},"保存包含两条学习记录的列表。",[40,7039,7040],{},"读取后修改进度，再重新写回文件。",[10,7042,202],{},[14,7044,205],{"id":205},[10,7046,7047],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,7049,212],{},{"title":77,"searchDepth":90,"depth":90,"links":7051},[7052,7053,7054,7055,7056,7057,7058,7059],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6888,"description":6893},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[225,7067,7068],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7071,"title":7072,"body":7073,"category":225,"cover":226,"description":7077,"extension":227,"meta":7261,"navigation":93,"path":7262,"pinned":230,"publishedAt":231,"seo":7263,"slug":7264,"stem":7265,"summary":7266,"tags":7267,"updatedAt":231,"visible":93,"__hash__":7270},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7074,"toc":7251},[7075,7078,7080,7083,7085,7091,7097,7099,7121,7123,7125,7188,7190,7196,7198,7200,7216,7218,7232,7234,7242,7244,7246,7249],[10,7076,7077],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7079,16],{"id":16},[10,7081,7082],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7084,22],{"id":22},[10,7086,7087],{},[26,7088],{"alt":7089,"src":7090},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7092,7093,7096],{},[50,7094,7095],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7098,35],{"id":35},[37,7100,7101,7111,7118],{},[40,7102,2334,7103,7106,7107,7110],{},[50,7104,7105],{},"newline=\"\""," 让 ",[50,7108,7109],{},"csv"," 模块正确处理换行。",[40,7112,7113,7114,7117],{},"字段顺序由 ",[50,7115,7116],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7119,7120],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7122,67],{"id":67},[10,7124,70],{},[72,7126,7128],{"className":74,"code":7127,"language":76,"meta":77,"style":77},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[50,7129,7130,7135,7139,7144,7149,7154,7159,7164,7168,7173,7178,7183],{"__ignoreMap":77},[81,7131,7132],{"class":83,"line":84},[81,7133,7134],{},"import csv\n",[81,7136,7137],{"class":83,"line":90},[81,7138,94],{"emptyLinePlaceholder":93},[81,7140,7141],{"class":83,"line":97},[81,7142,7143],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[81,7145,7146],{"class":83,"line":103},[81,7147,7148],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[81,7150,7151],{"class":83,"line":109},[81,7152,7153],{},"writer.writeheader()\n",[81,7155,7156],{"class":83,"line":115},[81,7157,7158],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[81,7160,7161],{"class":83,"line":2484},[81,7162,7163],{},"writer_file.close()\n",[81,7165,7166],{"class":83,"line":2490},[81,7167,94],{"emptyLinePlaceholder":93},[81,7169,7170],{"class":83,"line":3949},[81,7171,7172],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[81,7174,7175],{"class":83,"line":4161},[81,7176,7177],{},"for row in csv.DictReader(reader_file):\n",[81,7179,7180],{"class":83,"line":5781},[81,7181,7182],{},"    print(row[\"name\"], row[\"score\"])\n",[81,7184,7185],{"class":83,"line":5786},[81,7186,7187],{},"reader_file.close()\n",[10,7189,121],{},[72,7191,7194],{"className":7192,"code":7193,"language":127,"meta":77},[125],"小郑 95\n",[50,7195,7193],{"__ignoreMap":77},[10,7197,132],{},[14,7199,135],{"id":135},[137,7201,7202,7211],{},[40,7203,7204,7207,7208,7210],{},[50,7205,7206],{},"DictWriter"," 按 ",[50,7209,7116],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7212,7213,7215],{},[50,7214,7095],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7217,173],{"id":173},[37,7219,7220,7223],{},[40,7221,7222],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7224,7225,7226,7228,7229,7231],{},"在 macOS 以外环境忽略 ",[50,7227,7105],{}," 可能出现额外空行；统一交给 ",[50,7230,7109],{}," 模块管理换行。",[14,7233,191],{"id":191},[137,7235,7236,7239],{},[40,7237,7238],{},"写入三名学习者的课程和分数。",[40,7240,7241],{},"读取 CSV 后把分数字符串转换为整数。",[10,7243,202],{},[14,7245,205],{"id":205},[10,7247,7248],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,7250,212],{},{"title":77,"searchDepth":90,"depth":90,"links":7252},[7253,7254,7255,7256,7257,7258,7259,7260],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7072,"description":7077},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[225,7268,7269],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7272,"title":7273,"body":7274,"category":225,"cover":226,"description":7278,"extension":227,"meta":7551,"navigation":93,"path":7552,"pinned":230,"publishedAt":231,"seo":7553,"slug":7554,"stem":7555,"summary":7556,"tags":7557,"updatedAt":231,"visible":93,"__hash__":7560},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7275,"toc":7538},[7276,7279,7281,7284,7286,7292,7303,7305,7322,7324,7326,7401,7403,7409,7411,7413,7438,7440,7449,7455,7466,7468,7474,7480,7489,7491,7506,7508,7529,7531,7533,7536],[10,7277,7278],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7280,16],{"id":16},[10,7282,7283],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7285,22],{"id":22},[10,7287,7288],{},[26,7289],{"alt":7290,"src":7291},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7293,7294,7295,7298,7299,7302],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[50,7296,7297],{},"except","；无论是否异常，",[50,7300,7301],{},"finally"," 都会在离开结构前执行。",[14,7304,35],{"id":35},[37,7306,7307,7313,7319],{},[40,7308,7309,7310,7312],{},"只捕获能够处理的具体异常，不使用空的 ",[50,7311,7297],{}," 吞掉全部错误。",[40,7314,7315,7318],{},[50,7316,7317],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7320,7321],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7323,67],{"id":67},[10,7325,70],{},[72,7327,7329],{"className":74,"code":7328,"language":76,"meta":77,"style":77},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[50,7330,7331,7336,7341,7346,7351,7356,7360,7365,7370,7375,7380,7384,7389,7395],{"__ignoreMap":77},[81,7332,7333],{"class":83,"line":84},[81,7334,7335],{},"def parse_age(text):\n",[81,7337,7338],{"class":83,"line":90},[81,7339,7340],{},"    age = int(text)\n",[81,7342,7343],{"class":83,"line":97},[81,7344,7345],{},"    if age \u003C 0:\n",[81,7347,7348],{"class":83,"line":103},[81,7349,7350],{},"        raise ValueError(\"年龄不能为负数\")\n",[81,7352,7353],{"class":83,"line":109},[81,7354,7355],{},"    return age\n",[81,7357,7358],{"class":83,"line":115},[81,7359,94],{"emptyLinePlaceholder":93},[81,7361,7362],{"class":83,"line":2484},[81,7363,7364],{},"try:\n",[81,7366,7367],{"class":83,"line":2490},[81,7368,7369],{},"    age = parse_age(\"18\")\n",[81,7371,7372],{"class":83,"line":3949},[81,7373,7374],{},"except ValueError as error:\n",[81,7376,7377],{"class":83,"line":4161},[81,7378,7379],{},"    print(\"输入错误：\", error)\n",[81,7381,7382],{"class":83,"line":5781},[81,7383,1143],{},[81,7385,7386],{"class":83,"line":5786},[81,7387,7388],{},"    print(\"年龄：\", age)\n",[81,7390,7392],{"class":83,"line":7391},13,[81,7393,7394],{},"finally:\n",[81,7396,7398],{"class":83,"line":7397},14,[81,7399,7400],{},"    print(\"处理结束\")\n",[10,7402,121],{},[72,7404,7407],{"className":7405,"code":7406,"language":127,"meta":77},[125],"年龄： 18\n处理结束\n",[50,7408,7406],{"__ignoreMap":77},[10,7410,132],{},[14,7412,135],{"id":135},[137,7414,7415,7427],{},[40,7416,7417,7419,7420,7422,7423,7426],{},[50,7418,3032],{}," 或主动 ",[50,7421,7317],{}," 都可能产生 ",[50,7424,7425],{},"ValueError","，控制流立即离开当前正常路径。",[40,7428,7429,7430,7432,7433,7435,7436,64],{},"有异常时进入匹配的 ",[50,7431,7297],{},"；没有异常时执行 ",[50,7434,1156],{},"；两种情况最后都会执行 ",[50,7437,7301],{},[156,7439,158],{"id":158},[10,7441,7442,53,7444,148,7446,7448],{},[50,7443,7297],{},[50,7445,1156],{},[50,7447,7301],{}," 的职责不同，不能只看它们出现的顺序。",[10,7450,7451],{},[26,7452],{"alt":7453,"src":7454},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7456,7457,7459,7460,7462,7463,7465],{},[50,7458,7297],{}," 处理匹配异常，",[50,7461,1156],{}," 只在无异常时运行，",[50,7464,7301],{}," 负责两条路径都需要的清理动作。",[156,7467,158],{"id":4216},[10,7469,7470,7473],{},[50,7471,7472],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7475,7476],{},[26,7477],{"alt":7478,"src":7479},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7481,7482,7483,7485,7486,7488],{},"只把可能产生预期异常的操作放进 ",[50,7484,7472],{},"，后续正常业务放进 ",[50,7487,1156],{},"，错误边界会更清楚。",[14,7490,173],{"id":173},[37,7492,7493,7500],{},[40,7494,7495,7496,7499],{},"使用裸 ",[50,7497,7498],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7501,7502,7503,7505],{},"把整个程序包在一个巨大 ",[50,7504,7472],{}," 中，无法判断究竟哪一步允许失败。",[14,7507,191],{"id":191},[137,7509,7510,7523],{},[40,7511,7512,7513,7516,7517,148,7520,64],{},"让 ",[50,7514,7515],{},"parse_age"," 分别处理 ",[50,7518,7519],{},"\"abc\"",[50,7521,7522],{},"\"-1\"",[40,7524,7525,7526,7528],{},"为文件读取捕获 ",[50,7527,6733],{}," 并给出清晰提示。",[10,7530,202],{},[14,7532,205],{"id":205},[10,7534,7535],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,7537,212],{},{"title":77,"searchDepth":90,"depth":90,"links":7539},[7540,7541,7542,7543,7544,7548,7549,7550],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":7545},[7546,7547],{"id":158,"depth":97,"text":158},{"id":4216,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7273,"description":7278},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[225,7558,7559],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7562,"title":7563,"body":7564,"category":225,"cover":226,"description":7568,"extension":227,"meta":7744,"navigation":93,"path":7745,"pinned":230,"publishedAt":231,"seo":7746,"slug":7747,"stem":7748,"summary":7749,"tags":7750,"updatedAt":231,"visible":93,"__hash__":7752},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7565,"toc":7734},[7566,7569,7571,7574,7576,7582,7588,7590,7606,7608,7610,7664,7666,7672,7674,7676,7689,7691,7704,7706,7725,7727,7729,7732],[10,7567,7568],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7570,16],{"id":16},[10,7572,7573],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7575,22],{"id":22},[10,7577,7578],{},[26,7579],{"alt":7580,"src":7581},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7583,7584,7585,7587],{},"进入 ",[50,7586,6743],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7589,35],{"id":35},[37,7591,7592,7597,7603],{},[40,7593,7594,7596],{},[50,7595,6743],{}," 把资源获取和释放配成一个清晰边界。",[40,7598,7599,7602],{},[50,7600,7601],{},"as file"," 得到的是上下文返回的资源对象。",[40,7604,7605],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7607,67],{"id":67},[10,7609,70],{},[72,7611,7613],{"className":74,"code":7612,"language":76,"meta":77,"style":77},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[50,7614,7615,7619,7623,7627,7631,7636,7641,7645,7650,7655,7659],{"__ignoreMap":77},[81,7616,7617],{"class":83,"line":84},[81,7618,6555],{},[81,7620,7621],{"class":83,"line":90},[81,7622,94],{"emptyLinePlaceholder":93},[81,7624,7625],{"class":83,"line":97},[81,7626,6766],{},[81,7628,7629],{"class":83,"line":103},[81,7630,94],{"emptyLinePlaceholder":93},[81,7632,7633],{"class":83,"line":109},[81,7634,7635],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[81,7637,7638],{"class":83,"line":115},[81,7639,7640],{},"    file.write(\"上下文管理器\\n\")\n",[81,7642,7643],{"class":83,"line":2484},[81,7644,94],{"emptyLinePlaceholder":93},[81,7646,7647],{"class":83,"line":2490},[81,7648,7649],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[81,7651,7652],{"class":83,"line":3949},[81,7653,7654],{},"    print(file.read())\n",[81,7656,7657],{"class":83,"line":4161},[81,7658,94],{"emptyLinePlaceholder":93},[81,7660,7661],{"class":83,"line":5781},[81,7662,7663],{},"print(file.closed)\n",[10,7665,121],{},[72,7667,7670],{"className":7668,"code":7669,"language":127,"meta":77},[125],"上下文管理器\n\nTrue\n",[50,7671,7669],{"__ignoreMap":77},[10,7673,132],{},[14,7675,135],{"id":135},[137,7677,7678,7686],{},[40,7679,7584,7680,7682,7683,64],{},[50,7681,6743],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[50,7684,7685],{},"file",[40,7687,7688],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7690,173],{"id":173},[37,7692,7693,7698],{},[40,7694,4784,7695,7697],{},[50,7696,6743],{}," 代码块外继续读写已经关闭的文件对象。",[40,7699,7700,7701,7703],{},"误以为 ",[50,7702,6743],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7705,191],{"id":191},[137,7707,7708,7717],{},[40,7709,7710,7711,7714,7715,64],{},"把第 30 篇的手动 ",[50,7712,7713],{},"open\u002Fclose"," 改写为 ",[50,7716,6743],{},[40,7718,4784,7719,7721,7722,64],{},[50,7720,6743],{}," 块后检查 ",[50,7723,7724],{},"file.closed",[10,7726,202],{},[14,7728,205],{"id":205},[10,7730,7731],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,7733,212],{},{"title":77,"searchDepth":90,"depth":90,"links":7735},[7736,7737,7738,7739,7740,7741,7742,7743],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7563,"description":7568},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[225,6743,7751],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7754,"title":7755,"body":7756,"category":225,"cover":226,"description":7760,"extension":227,"meta":7972,"navigation":93,"path":7973,"pinned":230,"publishedAt":231,"seo":7974,"slug":7975,"stem":7976,"summary":7977,"tags":7978,"updatedAt":231,"visible":93,"__hash__":7981},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7757,"toc":7960},[7758,7761,7763,7766,7768,7774,7777,7779,7796,7798,7800,7868,7870,7876,7878,7880,7905,7907,7910,7916,7925,7927,7938,7940,7951,7953,7955,7958],[10,7759,7760],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7762,16],{"id":16},[10,7764,7765],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7767,22],{"id":22},[10,7769,7770],{},[26,7771],{"alt":7772,"src":7773},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7775,7776],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7778,35],{"id":35},[37,7780,7781,7787,7793],{},[40,7782,7783,7786],{},[50,7784,7785],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7788,7789,7792],{},[50,7790,7791],{},"__init__"," 在实例创建过程中初始化属性。",[40,7794,7795],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7797,67],{"id":67},[10,7799,70],{},[72,7801,7803],{"className":74,"code":7802,"language":76,"meta":77,"style":77},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[50,7804,7805,7810,7815,7820,7825,7829,7834,7839,7844,7849,7853,7858,7863],{"__ignoreMap":77},[81,7806,7807],{"class":83,"line":84},[81,7808,7809],{},"class LearningRecord:\n",[81,7811,7812],{"class":83,"line":90},[81,7813,7814],{},"    def __init__(self, course, progress=0):\n",[81,7816,7817],{"class":83,"line":97},[81,7818,7819],{},"        self.course = course\n",[81,7821,7822],{"class":83,"line":103},[81,7823,7824],{},"        self.progress = progress\n",[81,7826,7827],{"class":83,"line":109},[81,7828,94],{"emptyLinePlaceholder":93},[81,7830,7831],{"class":83,"line":115},[81,7832,7833],{},"    def advance(self, amount):\n",[81,7835,7836],{"class":83,"line":2484},[81,7837,7838],{},"        self.progress = self.progress + amount\n",[81,7840,7841],{"class":83,"line":2490},[81,7842,7843],{},"        if self.progress > 100:\n",[81,7845,7846],{"class":83,"line":3949},[81,7847,7848],{},"            self.progress = 100\n",[81,7850,7851],{"class":83,"line":4161},[81,7852,94],{"emptyLinePlaceholder":93},[81,7854,7855],{"class":83,"line":5781},[81,7856,7857],{},"record = LearningRecord(\"Python\", 40)\n",[81,7859,7860],{"class":83,"line":5786},[81,7861,7862],{},"record.advance(15)\n",[81,7864,7865],{"class":83,"line":7391},[81,7866,7867],{},"print(record.course, record.progress)\n",[10,7869,121],{},[72,7871,7874],{"className":7872,"code":7873,"language":127,"meta":77},[125],"Python 55\n",[50,7875,7873],{"__ignoreMap":77},[10,7877,132],{},[14,7879,135],{"id":135},[137,7881,7882,7892],{},[40,7883,7884,7885,7888,7889,7891],{},"调用 ",[50,7886,7887],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[50,7890,7791],{}," 把课程和进度保存在该实例属性中。",[40,7893,7894,7897,7898,7901,7902,7904],{},[50,7895,7896],{},"record.advance(15)"," 自动把 ",[50,7899,7900],{},"record"," 作为 ",[50,7903,7785],{},"，方法更新同一实例的进度并限制上限。",[156,7906,158],{"id":158},[10,7908,7909],{},"类是共同定义，实例则各自保存状态。",[10,7911,7912],{},[26,7913],{"alt":7914,"src":7915},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7917,7918,7919,148,7921,7924],{},"两个实例共享同一套方法定义，但 ",[50,7920,4581],{},[50,7922,7923],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7926,173],{"id":173},[37,7928,7929,7935],{},[40,7930,7931,7932,7934],{},"调用实例方法时手工再传一次 ",[50,7933,7785],{},"。通过实例调用时 Python 会自动绑定。",[40,7936,7937],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7939,191],{"id":191},[137,7941,7942,7948],{},[40,7943,5249,7944,7947],{},[50,7945,7946],{},"Book"," 类，保存标题和阅读页数。",[40,7949,7950],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7952,202],{},[14,7954,205],{"id":205},[10,7956,7957],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,7959,212],{},{"title":77,"searchDepth":90,"depth":90,"links":7961},[7962,7963,7964,7965,7966,7969,7970,7971],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":7967},[7968],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7755,"description":7760},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[225,7979,7980],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7983,"title":7984,"body":7985,"category":225,"cover":226,"description":7989,"extension":227,"meta":8167,"navigation":93,"path":8168,"pinned":230,"publishedAt":231,"seo":8169,"slug":8170,"stem":8171,"summary":8172,"tags":8173,"updatedAt":231,"visible":93,"__hash__":8176},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7986,"toc":8157},[7987,7990,7992,7995,7997,8003,8006,8008,8019,8021,8023,8090,8092,8098,8100,8102,8121,8123,8131,8133,8148,8150,8152,8155],[10,7988,7989],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7991,16],{"id":16},[10,7993,7994],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7996,22],{"id":22},[10,7998,7999],{},[26,8000],{"alt":8001,"src":8002},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8004,8005],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8007,35],{"id":35},[37,8009,8010,8013,8016],{},[40,8011,8012],{},"封装让对象通过方法维护自己的有效状态。",[40,8014,8015],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8017,8018],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8020,67],{"id":67},[10,8022,70],{},[72,8024,8026],{"className":74,"code":8025,"language":76,"meta":77,"style":77},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[50,8027,8028,8033,8038,8043,8047,8052,8057,8062,8066,8071,8076,8080,8085],{"__ignoreMap":77},[81,8029,8030],{"class":83,"line":84},[81,8031,8032],{},"class Storage:\n",[81,8034,8035],{"class":83,"line":90},[81,8036,8037],{},"    def save(self, text):\n",[81,8039,8040],{"class":83,"line":97},[81,8041,8042],{},"        print(\"保存：\", text)\n",[81,8044,8045],{"class":83,"line":103},[81,8046,94],{"emptyLinePlaceholder":93},[81,8048,8049],{"class":83,"line":109},[81,8050,8051],{},"class LearningService:\n",[81,8053,8054],{"class":83,"line":115},[81,8055,8056],{},"    def __init__(self, storage):\n",[81,8058,8059],{"class":83,"line":2484},[81,8060,8061],{},"        self.storage = storage\n",[81,8063,8064],{"class":83,"line":2490},[81,8065,94],{"emptyLinePlaceholder":93},[81,8067,8068],{"class":83,"line":3949},[81,8069,8070],{},"    def finish_lesson(self, title):\n",[81,8072,8073],{"class":83,"line":4161},[81,8074,8075],{},"        self.storage.save(title)\n",[81,8077,8078],{"class":83,"line":5781},[81,8079,94],{"emptyLinePlaceholder":93},[81,8081,8082],{"class":83,"line":5786},[81,8083,8084],{},"service = LearningService(Storage())\n",[81,8086,8087],{"class":83,"line":7391},[81,8088,8089],{},"service.finish_lesson(\"异常处理\")\n",[10,8091,121],{},[72,8093,8096],{"className":8094,"code":8095,"language":127,"meta":77},[125],"保存： 异常处理\n",[50,8097,8095],{"__ignoreMap":77},[10,8099,132],{},[14,8101,135],{"id":135},[137,8103,8104,8114],{},[40,8105,8106,8109,8110,8113],{},[50,8107,8108],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[50,8111,8112],{},"save()"," 的协作对象。",[40,8115,8116,8117,8120],{},"调用业务方法时，服务把保存动作委托给 ",[50,8118,8119],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8122,173],{"id":173},[37,8124,8125,8128],{},[40,8126,8127],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8129,8130],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8132,191],{"id":191},[137,8134,8135,8145],{},[40,8136,8137,8138,8141,8142,64],{},"用组合让 ",[50,8139,8140],{},"OrderService"," 使用一个 ",[50,8143,8144],{},"Notifier",[40,8146,8147],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8149,202],{},[14,8151,205],{"id":205},[10,8153,8154],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,8156,212],{},{"title":77,"searchDepth":90,"depth":90,"links":8158},[8159,8160,8161,8162,8163,8164,8165,8166],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7984,"description":7989},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[225,8174,8175],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8178,"title":8179,"body":8180,"category":225,"cover":226,"description":8184,"extension":227,"meta":8387,"navigation":93,"path":8388,"pinned":230,"publishedAt":231,"seo":8389,"slug":8390,"stem":8391,"summary":8392,"tags":8393,"updatedAt":231,"visible":93,"__hash__":8396},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8181,"toc":8375},[8182,8185,8187,8190,8192,8198,8205,8207,8232,8234,8236,8288,8290,8296,8298,8300,8321,8323,8329,8335,8341,8343,8351,8353,8366,8368,8370,8373],[10,8183,8184],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8186,16],{"id":16},[10,8188,8189],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8191,22],{"id":22},[10,8193,8194],{},[26,8195],{"alt":8196,"src":8197},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8199,8200,8201,8204],{},"生成器运行到 ",[50,8202,8203],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8206,35],{"id":35},[37,8208,8209,8219,8229],{},[40,8210,8211,8214,8215,8218],{},[50,8212,8213],{},"iter()"," 从可迭代对象取得迭代器，",[50,8216,8217],{},"next()"," 请求下一个值。",[40,8220,8221,8222,8225,8226,8228],{},"没有更多值时迭代器抛出 ",[50,8223,8224],{},"StopIteration","，",[50,8227,4335],{}," 会自动处理。",[40,8230,8231],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8233,67],{"id":67},[10,8235,70],{},[72,8237,8239],{"className":74,"code":8238,"language":76,"meta":77,"style":77},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[50,8240,8241,8246,8251,8256,8261,8266,8270,8275,8280,8284],{"__ignoreMap":77},[81,8242,8243],{"class":83,"line":84},[81,8244,8245],{},"def countdown(start):\n",[81,8247,8248],{"class":83,"line":90},[81,8249,8250],{},"    current = start\n",[81,8252,8253],{"class":83,"line":97},[81,8254,8255],{},"    while current > 0:\n",[81,8257,8258],{"class":83,"line":103},[81,8259,8260],{},"        yield current\n",[81,8262,8263],{"class":83,"line":109},[81,8264,8265],{},"        current = current - 1\n",[81,8267,8268],{"class":83,"line":115},[81,8269,94],{"emptyLinePlaceholder":93},[81,8271,8272],{"class":83,"line":2484},[81,8273,8274],{},"iterator = countdown(3)\n",[81,8276,8277],{"class":83,"line":2490},[81,8278,8279],{},"print(next(iterator))\n",[81,8281,8282],{"class":83,"line":3949},[81,8283,8279],{},[81,8285,8286],{"class":83,"line":4161},[81,8287,8279],{},[10,8289,121],{},[72,8291,8294],{"className":8292,"code":8293,"language":127,"meta":77},[125],"3\n2\n1\n",[50,8295,8293],{"__ignoreMap":77},[10,8297,132],{},[14,8299,135],{"id":135},[137,8301,8302,8308],{},[40,8303,7884,8304,8307],{},[50,8305,8306],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8309,8310,8311,8313,8314,8316,8317,8320],{},"每次 ",[50,8312,8217],{}," 运行到下一个 ",[50,8315,8203],{}," 并暂停，局部变量 ",[50,8318,8319],{},"current"," 和执行位置被保留。",[156,8322,158],{"id":158},[10,8324,8325,8326,8328],{},"生成器的暂停位置可以展开成多次 ",[50,8327,8217],{}," 的时间线。",[10,8330,8331],{},[26,8332],{"alt":8333,"src":8334},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8336,8337,8338,8340],{},"每次请求只推进到下一个 ",[50,8339,8203],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8342,173],{"id":173},[37,8344,8345,8348],{},[40,8346,8347],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8349,8350],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8352,191],{"id":191},[137,8354,8355,8358],{},[40,8356,8357],{},"编写产生 1 到指定上限偶数的生成器。",[40,8359,4007,8360,8362,8363,8365],{},[50,8361,4335],{}," 遍历生成器，比较手动 ",[50,8364,8217],{}," 的差异。",[10,8367,202],{},[14,8369,205],{"id":205},[10,8371,8372],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,8374,212],{},{"title":77,"searchDepth":90,"depth":90,"links":8376},[8377,8378,8379,8380,8381,8384,8385,8386],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":8382},[8383],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8179,"description":8184},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[225,8394,8395],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8398,"title":8399,"body":8400,"category":225,"cover":226,"description":8404,"extension":227,"meta":8628,"navigation":93,"path":8629,"pinned":230,"publishedAt":231,"seo":8630,"slug":8631,"stem":8632,"summary":8633,"tags":8634,"updatedAt":231,"visible":93,"__hash__":8636},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8401,"toc":8616},[8402,8405,8407,8410,8412,8418,8421,8423,8443,8445,8447,8529,8531,8537,8539,8541,8563,8565,8568,8574,8581,8583,8593,8595,8607,8609,8611,8614],[10,8403,8404],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8406,16],{"id":16},[10,8408,8409],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8411,22],{"id":22},[10,8413,8414],{},[26,8415],{"alt":8416,"src":8417},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8419,8420],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8422,35],{"id":35},[37,8424,8425,8434,8437],{},[40,8426,8427,8430,8431,64],{},[50,8428,8429],{},"@trace"," 等价于 ",[50,8432,8433],{},"add = trace(add)",[40,8435,8436],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8438,8439,8442],{},[50,8440,8441],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8444,67],{"id":67},[10,8446,70],{},[72,8448,8450],{"className":74,"code":8449,"language":76,"meta":77,"style":77},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[50,8451,8452,8457,8461,8466,8471,8476,8481,8486,8491,8496,8501,8505,8510,8514,8518,8523],{"__ignoreMap":77},[81,8453,8454],{"class":83,"line":84},[81,8455,8456],{},"from functools import wraps\n",[81,8458,8459],{"class":83,"line":90},[81,8460,94],{"emptyLinePlaceholder":93},[81,8462,8463],{"class":83,"line":97},[81,8464,8465],{},"def trace(function):\n",[81,8467,8468],{"class":83,"line":103},[81,8469,8470],{},"    @wraps(function)\n",[81,8472,8473],{"class":83,"line":109},[81,8474,8475],{},"    def wrapper(*args, **kwargs):\n",[81,8477,8478],{"class":83,"line":115},[81,8479,8480],{},"        print(\"开始：\", function.__name__)\n",[81,8482,8483],{"class":83,"line":2484},[81,8484,8485],{},"        result = function(*args, **kwargs)\n",[81,8487,8488],{"class":83,"line":2490},[81,8489,8490],{},"        print(\"结束：\", function.__name__)\n",[81,8492,8493],{"class":83,"line":3949},[81,8494,8495],{},"        return result\n",[81,8497,8498],{"class":83,"line":4161},[81,8499,8500],{},"    return wrapper\n",[81,8502,8503],{"class":83,"line":5781},[81,8504,94],{"emptyLinePlaceholder":93},[81,8506,8507],{"class":83,"line":5786},[81,8508,8509],{},"@trace\n",[81,8511,8512],{"class":83,"line":7391},[81,8513,6134],{},[81,8515,8516],{"class":83,"line":7397},[81,8517,6139],{},[81,8519,8521],{"class":83,"line":8520},15,[81,8522,94],{"emptyLinePlaceholder":93},[81,8524,8526],{"class":83,"line":8525},16,[81,8527,8528],{},"print(add(2, 3))\n",[10,8530,121],{},[72,8532,8535],{"className":8533,"code":8534,"language":127,"meta":77},[125],"开始： add\n结束： add\n5\n",[50,8536,8534],{"__ignoreMap":77},[10,8538,132],{},[14,8540,135],{"id":135},[137,8542,8543,8560],{},[40,8544,8545,8546,8549,8550,8553,8554,8557,8558,64],{},"解释器执行定义时，把原 ",[50,8547,8548],{},"add"," 函数交给 ",[50,8551,8552],{},"trace","，返回的 ",[50,8555,8556],{},"wrapper"," 重新绑定到名字 ",[50,8559,8548],{},[40,8561,8562],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[156,8564,158],{"id":158},[10,8566,8567],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8569,8570],{},[26,8571],{"alt":8572,"src":8573},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8575,8576,8578,8579,64],{},[50,8577,8429],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[50,8580,8433],{},[14,8582,173],{"id":173},[37,8584,8585,8590],{},[40,8586,8587,8588,64],{},"包装函数忘记返回原函数结果，调用方得到 ",[50,8589,5332],{},[40,8591,8592],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8594,191],{"id":191},[137,8596,8597,8600],{},[40,8598,8599],{},"编写只记录调用次数的简单装饰器。",[40,8601,8602,8603,8606],{},"删除包装函数的 ",[50,8604,8605],{},"return result","，观察调用方得到什么。",[10,8608,202],{},[14,8610,205],{"id":205},[10,8612,8613],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,8615,212],{},{"title":77,"searchDepth":90,"depth":90,"links":8617},[8618,8619,8620,8621,8622,8625,8626,8627],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":8623},[8624],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8399,"description":8404},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[225,8635,5283],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8638,"title":8639,"body":8640,"category":225,"cover":226,"description":8644,"extension":227,"meta":8831,"navigation":93,"path":8832,"pinned":230,"publishedAt":231,"seo":8833,"slug":8834,"stem":8835,"summary":8836,"tags":8837,"updatedAt":231,"visible":93,"__hash__":8840},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8641,"toc":8819},[8642,8645,8647,8650,8652,8658,8661,8663,8674,8676,8678,8753,8755,8761,8763,8765,8776,8778,8781,8787,8790,8792,8800,8802,8810,8812,8814,8817],[10,8643,8644],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8646,16],{"id":16},[10,8648,8649],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8651,22],{"id":22},[10,8653,8654],{},[26,8655],{"alt":8656,"src":8657},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8659,8660],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8662,35],{"id":35},[37,8664,8665,8668,8671],{},[40,8666,8667],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8669,8670],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8672,8673],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8675,67],{"id":67},[10,8677,70],{},[72,8679,8681],{"className":74,"code":8680,"language":76,"meta":77,"style":77},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[50,8682,8683,8688,8693,8697,8702,8706,8711,8716,8721,8725,8730,8735,8740,8744,8748],{"__ignoreMap":77},[81,8684,8685],{"class":83,"line":84},[81,8686,8687],{},"import logging\n",[81,8689,8690],{"class":83,"line":90},[81,8691,8692],{},"import unittest\n",[81,8694,8695],{"class":83,"line":97},[81,8696,94],{"emptyLinePlaceholder":93},[81,8698,8699],{"class":83,"line":103},[81,8700,8701],{},"logging.basicConfig(level=logging.INFO)\n",[81,8703,8704],{"class":83,"line":109},[81,8705,94],{"emptyLinePlaceholder":93},[81,8707,8708],{"class":83,"line":115},[81,8709,8710],{},"def clamp_progress(value):\n",[81,8712,8713],{"class":83,"line":2484},[81,8714,8715],{},"    logging.info(\"检查进度：%s\", value)\n",[81,8717,8718],{"class":83,"line":2490},[81,8719,8720],{},"    return max(0, min(100, value))\n",[81,8722,8723],{"class":83,"line":3949},[81,8724,94],{"emptyLinePlaceholder":93},[81,8726,8727],{"class":83,"line":4161},[81,8728,8729],{},"class ProgressTest(unittest.TestCase):\n",[81,8731,8732],{"class":83,"line":5781},[81,8733,8734],{},"    def test_upper_limit(self):\n",[81,8736,8737],{"class":83,"line":5786},[81,8738,8739],{},"        self.assertEqual(clamp_progress(120), 100)\n",[81,8741,8742],{"class":83,"line":7391},[81,8743,94],{"emptyLinePlaceholder":93},[81,8745,8746],{"class":83,"line":7397},[81,8747,6148],{},[81,8749,8750],{"class":83,"line":8520},[81,8751,8752],{},"    unittest.main()\n",[10,8754,121],{},[72,8756,8759],{"className":8757,"code":8758,"language":127,"meta":77},[125],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[50,8760,8758],{"__ignoreMap":77},[10,8762,132],{},[14,8764,135],{"id":135},[137,8766,8767,8773],{},[40,8768,8769,8772],{},[50,8770,8771],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8774,8775],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[156,8777,158],{"id":158},[10,8779,8780],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8782,8783],{},[26,8784],{"alt":8785,"src":8786},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8788,8789],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8791,173],{"id":173},[37,8793,8794,8797],{},[40,8795,8796],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8798,8799],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8801,191],{"id":191},[137,8803,8804,8807],{},[40,8805,8806],{},"为负数进度增加测试。",[40,8808,8809],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8811,202],{},[14,8813,205],{"id":205},[10,8815,8816],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,8818,212],{},{"title":77,"searchDepth":90,"depth":90,"links":8820},[8821,8822,8823,8824,8825,8828,8829,8830],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":8826},[8827],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8639,"description":8644},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[225,8838,8839],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8842,"title":8843,"body":8844,"category":225,"cover":226,"description":8848,"extension":227,"meta":9148,"navigation":93,"path":9149,"pinned":230,"publishedAt":231,"seo":9150,"slug":9151,"stem":9152,"summary":9153,"tags":9154,"updatedAt":231,"visible":93,"__hash__":9157},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8845,"toc":9135},[8846,8849,8851,8854,8856,8862,8865,8867,8882,8884,8886,9033,9035,9041,9043,9045,9058,9060,9063,9069,9072,9074,9077,9083,9090,9092,9103,9105,9126,9128,9130,9133],[10,8847,8848],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8850,16],{"id":16},[10,8852,8853],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8855,22],{"id":22},[10,8857,8858],{},[26,8859],{"alt":8860,"src":8861},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8863,8864],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8866,35],{"id":35},[37,8868,8869,8872,8875],{},[40,8870,8871],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8873,8874],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8876,8877,8878,8881],{},"实际扩展前先为 ",[50,8879,8880],{},"add()"," 和存储边界补充测试。",[14,8883,67],{"id":67},[10,8885,70],{},[72,8887,8889],{"className":74,"code":8888,"language":76,"meta":77,"style":77},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[50,8890,8891,8895,8899,8903,8908,8913,8918,8923,8927,8932,8937,8942,8947,8952,8956,8961,8966,8972,8977,8983,8988,8993,8999,9005,9011,9016,9022,9027],{"__ignoreMap":77},[81,8892,8893],{"class":83,"line":84},[81,8894,6946],{},[81,8896,8897],{"class":83,"line":90},[81,8898,6555],{},[81,8900,8901],{"class":83,"line":97},[81,8902,94],{"emptyLinePlaceholder":93},[81,8904,8905],{"class":83,"line":103},[81,8906,8907],{},"class LearningRecords:\n",[81,8909,8910],{"class":83,"line":109},[81,8911,8912],{},"    def __init__(self, file_path):\n",[81,8914,8915],{"class":83,"line":115},[81,8916,8917],{},"        self.file_path = Path(file_path)\n",[81,8919,8920],{"class":83,"line":2484},[81,8921,8922],{},"        self.items = []\n",[81,8924,8925],{"class":83,"line":2490},[81,8926,94],{"emptyLinePlaceholder":93},[81,8928,8929],{"class":83,"line":3949},[81,8930,8931],{},"    def add(self, title):\n",[81,8933,8934],{"class":83,"line":4161},[81,8935,8936],{},"        title = title.strip()\n",[81,8938,8939],{"class":83,"line":5781},[81,8940,8941],{},"        if not title:\n",[81,8943,8944],{"class":83,"line":5786},[81,8945,8946],{},"            raise ValueError(\"课程名称不能为空\")\n",[81,8948,8949],{"class":83,"line":7391},[81,8950,8951],{},"        self.items.append({\"title\": title, \"done\": False})\n",[81,8953,8954],{"class":83,"line":7397},[81,8955,94],{"emptyLinePlaceholder":93},[81,8957,8958],{"class":83,"line":8520},[81,8959,8960],{},"    def save(self):\n",[81,8962,8963],{"class":83,"line":8525},[81,8964,8965],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[81,8967,8969],{"class":83,"line":8968},17,[81,8970,8971],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[81,8973,8975],{"class":83,"line":8974},18,[81,8976,94],{"emptyLinePlaceholder":93},[81,8978,8980],{"class":83,"line":8979},19,[81,8981,8982],{},"records = LearningRecords(\"learning-records.json\")\n",[81,8984,8986],{"class":83,"line":8985},20,[81,8987,94],{"emptyLinePlaceholder":93},[81,8989,8991],{"class":83,"line":8990},21,[81,8992,7364],{},[81,8994,8996],{"class":83,"line":8995},22,[81,8997,8998],{},"    title = input(\"输入已学习课程：\")\n",[81,9000,9002],{"class":83,"line":9001},23,[81,9003,9004],{},"    records.add(title)\n",[81,9006,9008],{"class":83,"line":9007},24,[81,9009,9010],{},"    records.save()\n",[81,9012,9014],{"class":83,"line":9013},25,[81,9015,7374],{},[81,9017,9019],{"class":83,"line":9018},26,[81,9020,9021],{},"    print(\"无法保存：\", error)\n",[81,9023,9025],{"class":83,"line":9024},27,[81,9026,1143],{},[81,9028,9030],{"class":83,"line":9029},28,[81,9031,9032],{},"    print(\"已保存 1 条学习记录\")\n",[10,9034,121],{},[72,9036,9039],{"className":9037,"code":9038,"language":127,"meta":77},[125],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[50,9040,9038],{"__ignoreMap":77},[10,9042,132],{},[14,9044,135],{"id":135},[137,9046,9047,9053],{},[40,9048,9049,9050,9052],{},"输入层取得课程名后，",[50,9051,8880],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9054,9055,9057],{},[50,9056,8112],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[156,9059,158],{"id":158},[10,9061,9062],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9064,9065],{},[26,9066],{"alt":9067,"src":9068},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9070,9071],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[156,9073,158],{"id":4216},[10,9075,9076],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9078,9079],{},[26,9080],{"alt":9081,"src":9082},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9084,9085,9086,9089],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[50,9087,9088],{},"load()"," 把文件状态恢复到内存。",[14,9091,173],{"id":173},[37,9093,9094,9097],{},[40,9095,9096],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9098,9099,9100,9102],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[50,9101,9088],{}," 是下一项必要扩展。",[14,9104,191],{"id":191},[137,9106,9107,9113,9116],{},[40,9108,9109,9110,9112],{},"增加 ",[50,9111,9088],{},"，文件不存在时从空列表开始。",[40,9114,9115],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9117,9118,9119,9122,9123,9125],{},"把输入循环放进 ",[50,9120,9121],{},"main()","，通过 ",[50,9124,6090],{}," 控制程序入口。",[10,9127,202],{},[14,9129,205],{"id":205},[10,9131,9132],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[210,9134,212],{},{"title":77,"searchDepth":90,"depth":90,"links":9136},[9137,9138,9139,9140,9141,9145,9146,9147],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":9142},[9143,9144],{"id":158,"depth":97,"text":158},{"id":4216,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8843,"description":8848},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[225,9155,9156],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9159,9262,9381,9512,9655,9780,9917,10054,10195,10364,10501,10634,10757,10886,11013,11176,11352,11493,11622,11771,11914,12035,12158,12307,12460,12625,12752,12933,13076,13233,13384,13531,13686,13904,14059,14234,14385,14552,14739,14902,15144,15384],{"id":1389,"title":1390,"body":9160,"category":225,"cover":226,"description":1395,"extension":227,"meta":9259,"navigation":93,"path":1514,"pinned":230,"publishedAt":231,"seo":9260,"slug":1516,"stem":1517,"summary":1518,"tags":9261,"updatedAt":231,"visible":93,"__hash__":1521},{"type":7,"value":9161,"toc":9249},[9162,9164,9166,9168,9170,9174,9178,9180,9190,9192,9194,9202,9204,9209,9211,9213,9223,9225,9233,9235,9241,9243,9245,9247],[10,9163,1395],{},[14,9165,16],{"id":16},[10,9167,1400],{},[14,9169,22],{"id":22},[10,9171,9172],{},[26,9173],{"alt":1407,"src":1408},[10,9175,9176,1413],{},[50,9177,1167],{},[14,9179,35],{"id":35},[37,9181,9182,9186,9188],{},[40,9183,1420,9184,1423],{},[50,9185,1167],{},[40,9187,1426],{},[40,9189,1429],{},[14,9191,67],{"id":67},[10,9193,70],{},[72,9195,9196],{"className":74,"code":1436,"language":76,"meta":77,"style":77},[50,9197,9198],{"__ignoreMap":77},[81,9199,9200],{"class":83,"line":84},[81,9201,1436],{},[10,9203,121],{},[72,9205,9207],{"className":9206,"code":1448,"language":127,"meta":77},[125],[50,9208,1448],{"__ignoreMap":77},[10,9210,132],{},[14,9212,135],{"id":135},[137,9214,9215,9219],{},[40,9216,1459,9217,1463],{},[50,9218,1462],{},[40,9220,1466,9221,1470],{},[50,9222,1469],{},[14,9224,173],{"id":173},[37,9226,9227,9229],{},[40,9228,1477],{},[40,9230,1480,9231,1483],{},[50,9232,1167],{},[14,9234,191],{"id":191},[137,9236,9237,9239],{},[40,9238,1490],{},[40,9240,1493],{},[10,9242,202],{},[14,9244,205],{"id":205},[10,9246,1500],{},[210,9248,212],{},{"title":77,"searchDepth":90,"depth":90,"links":9250},[9251,9252,9253,9254,9255,9256,9257,9258],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":1390,"description":1395},[225,1385,1520],{"id":1523,"title":1524,"body":9263,"category":225,"cover":226,"description":1529,"extension":227,"meta":9378,"navigation":93,"path":1666,"pinned":230,"publishedAt":231,"seo":9379,"slug":1668,"stem":1669,"summary":1670,"tags":9380,"updatedAt":231,"visible":93,"__hash__":1673},{"type":7,"value":9264,"toc":9368},[9265,9267,9269,9271,9273,9277,9281,9283,9293,9295,9297,9317,9319,9324,9326,9328,9338,9340,9350,9352,9360,9362,9364,9366],[10,9266,1529],{},[14,9268,16],{"id":16},[10,9270,1534],{},[14,9272,22],{"id":22},[10,9274,9275],{},[26,9276],{"alt":1541,"src":1542},[10,9278,1545,9279,1548],{},[50,9280,689],{},[14,9282,35],{"id":35},[37,9284,9285,9287,9289],{},[40,9286,1555],{},[40,9288,1558],{},[40,9290,1561,9291,1565],{},[50,9292,1564],{},[14,9294,67],{"id":67},[10,9296,1570],{},[72,9298,9299],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,9300,9301,9307],{"__ignoreMap":77},[81,9302,9303,9305],{"class":83,"line":84},[81,9304,689],{"class":598},[81,9306,602],{"class":601},[81,9308,9309,9311,9313,9315],{"class":83,"line":90},[81,9310,689],{"class":598},[81,9312,631],{"class":601},[81,9314,635],{"class":634},[81,9316,602],{"class":601},[10,9318,121],{},[72,9320,9322],{"className":9321,"code":1596,"language":127,"meta":77},[125],[50,9323,1596],{"__ignoreMap":77},[10,9325,132],{},[14,9327,135],{"id":135},[137,9329,9330,9334],{},[40,9331,9332,1610],{},[50,9333,1609],{},[40,9335,9336,1615],{},[50,9337,697],{},[14,9339,173],{"id":173},[37,9341,9342,9346],{},[40,9343,1622,9344,1625],{},[50,9345,689],{},[40,9347,1628,9348,1631],{},[50,9349,689],{},[14,9351,191],{"id":191},[137,9353,9354,9358],{},[40,9355,936,9356,1641],{},[50,9357,1640],{},[40,9359,1644],{},[10,9361,202],{},[14,9363,205],{"id":205},[10,9365,1651],{},[210,9367,1654],{},{"title":77,"searchDepth":90,"depth":90,"links":9369},[9370,9371,9372,9373,9374,9375,9376,9377],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":1524,"description":1529},[225,1672,1049],{"id":1675,"title":1676,"body":9382,"category":225,"cover":226,"description":1842,"extension":227,"meta":9509,"navigation":93,"path":1844,"pinned":230,"publishedAt":231,"seo":9510,"slug":1846,"stem":1847,"summary":1848,"tags":9511,"updatedAt":231,"visible":93,"__hash__":1852},{"type":7,"value":9383,"toc":9499},[9384,9388,9390,9392,9394,9398,9400,9402,9418,9420,9422,9442,9444,9449,9451,9453,9465,9467,9477,9479,9489,9491,9493,9497],[10,9385,1681,9386,1684],{},[50,9387,1167],{},[14,9389,16],{"id":16},[10,9391,1689],{},[14,9393,22],{"id":22},[10,9395,9396],{},[26,9397],{"alt":1696,"src":1697},[10,9399,1700],{},[14,9401,35],{"id":35},[37,9403,9404,9410,9414],{},[40,9405,1707,9406,1710,9408,64],{},[50,9407,689],{},[50,9409,1713],{},[40,9411,1716,9412,1720],{},[50,9413,1719],{},[40,9415,1723,9416,1726],{},[50,9417,1167],{},[14,9419,67],{"id":67},[10,9421,70],{},[72,9423,9424],{"className":1733,"code":1734,"language":1735,"meta":77,"style":77},[50,9425,9426,9430,9434,9438],{"__ignoreMap":77},[81,9427,9428],{"class":83,"line":84},[81,9429,1742],{},[81,9431,9432],{"class":83,"line":90},[81,9433,1747],{},[81,9435,9436],{"class":83,"line":97},[81,9437,1752],{},[81,9439,9440],{"class":83,"line":103},[81,9441,1757],{},[10,9443,121],{},[72,9445,9447],{"className":9446,"code":1763,"language":127,"meta":77},[125],[50,9448,1763],{"__ignoreMap":77},[10,9450,132],{},[14,9452,135],{"id":135},[137,9454,9455,9461],{},[40,9456,1774,9457,1778,9459,64],{},[50,9458,1777],{},[50,9460,1781],{},[40,9462,1784,9463,1787],{},[50,9464,1469],{},[14,9466,173],{"id":173},[37,9468,9469,9475],{},[40,9470,1794,9471,1797,9473,1800],{},[50,9472,1713],{},[50,9474,1167],{},[40,9476,1803],{},[14,9478,191],{"id":191},[137,9480,9481,9485],{},[40,9482,1810,9483,64],{},[50,9484,1813],{},[40,9486,1816,9487,1819],{},[50,9488,1469],{},[10,9490,202],{},[14,9492,205],{"id":205},[10,9494,1826,9495,1829],{},[50,9496,1167],{},[210,9498,212],{},{"title":77,"searchDepth":90,"depth":90,"links":9500},[9501,9502,9503,9504,9505,9506,9507,9508],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":1676,"description":1842},[225,1850,1851],{"id":1854,"title":1855,"body":9513,"category":225,"cover":226,"description":1860,"extension":227,"meta":9652,"navigation":93,"path":2032,"pinned":230,"publishedAt":231,"seo":9653,"slug":2034,"stem":2035,"summary":2036,"tags":9654,"updatedAt":231,"visible":93,"__hash__":2040},{"type":7,"value":9514,"toc":9642},[9515,9517,9519,9521,9523,9527,9531,9533,9545,9547,9549,9585,9587,9592,9594,9596,9612,9614,9624,9626,9634,9636,9638,9640],[10,9516,1860],{},[14,9518,16],{"id":16},[10,9520,1865],{},[14,9522,22],{"id":22},[10,9524,9525],{},[26,9526],{"alt":1872,"src":1873},[10,9528,9529,1879],{},[50,9530,1878],{},[14,9532,35],{"id":35},[37,9534,9535,9537,9543],{},[40,9536,1886],{},[40,9538,9539,1892,9541,1896],{},[50,9540,1891],{},[50,9542,1895],{},[40,9544,1899],{},[14,9546,67],{"id":67},[10,9548,1570],{},[72,9550,9551],{"className":589,"code":1906,"language":591,"meta":77,"style":77},[50,9552,9553,9559,9565,9569,9579],{"__ignoreMap":77},[81,9554,9555,9557],{"class":83,"line":84},[81,9556,1913],{"class":598},[81,9558,1916],{"class":634},[81,9560,9561,9563],{"class":83,"line":90},[81,9562,1921],{"class":601},[81,9564,1916],{"class":634},[81,9566,9567],{"class":83,"line":97},[81,9568,1928],{"class":601},[81,9570,9571,9573,9575,9577],{"class":83,"line":103},[81,9572,1933],{"class":601},[81,9574,1936],{"class":634},[81,9576,1940],{"class":1939},[81,9578,1211],{"class":634},[81,9580,9581,9583],{"class":83,"line":109},[81,9582,689],{"class":598},[81,9584,1211],{"class":634},[10,9586,121],{},[72,9588,9590],{"className":9589,"code":1954,"language":127,"meta":77},[125],[50,9591,1954],{"__ignoreMap":77},[10,9593,132],{},[14,9595,135],{"id":135},[137,9597,9598,9606],{},[40,9599,9600,1967,9602,1970,9604,1973],{},[50,9601,1913],{},[50,9603,1921],{},[50,9605,1891],{},[40,9607,9608,1978,9610,1982],{},[50,9609,1878],{},[50,9611,1981],{},[14,9613,173],{"id":173},[37,9615,9616,9622],{},[40,9617,1989,9618,148,9620,64],{},[50,9619,1891],{},[50,9621,1895],{},[40,9623,1996],{},[14,9625,191],{"id":191},[137,9627,9628,9632],{},[40,9629,2003,9630,2007],{},[50,9631,2006],{},[40,9633,2010],{},[10,9635,202],{},[14,9637,205],{"id":205},[10,9639,2017],{},[210,9641,2020],{},{"title":77,"searchDepth":90,"depth":90,"links":9643},[9644,9645,9646,9647,9648,9649,9650,9651],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":1855,"description":1860},[225,2038,2039],{"id":2042,"title":2043,"body":9656,"category":225,"cover":226,"description":2048,"extension":227,"meta":9777,"navigation":93,"path":2197,"pinned":230,"publishedAt":231,"seo":9778,"slug":2199,"stem":2200,"summary":2201,"tags":9779,"updatedAt":231,"visible":93,"__hash__":2205},{"type":7,"value":9657,"toc":9767},[9658,9660,9662,9664,9666,9670,9678,9680,9694,9696,9698,9714,9716,9721,9723,9725,9739,9741,9747,9749,9759,9761,9763,9765],[10,9659,2048],{},[14,9661,16],{"id":16},[10,9663,2053],{},[14,9665,22],{"id":22},[10,9667,9668],{},[26,9669],{"alt":2060,"src":2061},[10,9671,2064,9672,64,9674,2070,9676,64],{},[50,9673,1469],{},[50,9675,2069],{},[50,9677,1777],{},[14,9679,35],{"id":35},[37,9681,9682,9686,9692],{},[40,9683,9684,2082],{},[50,9685,2081],{},[40,9687,9688,2088,9690,64],{},[50,9689,2087],{},[50,9691,2091],{},[40,9693,2094],{},[14,9695,67],{"id":67},[10,9697,70],{},[72,9699,9700],{"className":74,"code":2101,"language":76,"meta":77,"style":77},[50,9701,9702,9706,9710],{"__ignoreMap":77},[81,9703,9704],{"class":83,"line":84},[81,9705,2108],{},[81,9707,9708],{"class":83,"line":90},[81,9709,2113],{},[81,9711,9712],{"class":83,"line":97},[81,9713,2118],{},[10,9715,121],{},[72,9717,9719],{"className":9718,"code":2124,"language":127,"meta":77},[125],[50,9720,2124],{"__ignoreMap":77},[10,9722,132],{},[14,9724,135],{"id":135},[137,9726,9727,9733],{},[40,9728,9729,2138,9731,64],{},[50,9730,2137],{},[50,9732,2091],{},[40,9734,9735,2145,9737,2149],{},[50,9736,1469],{},[50,9738,2148],{},[14,9740,173],{"id":173},[37,9742,9743,9745],{},[40,9744,2156],{},[40,9746,2159],{},[14,9748,191],{"id":191},[137,9750,9751,9753],{},[40,9752,2166],{},[40,9754,2169,9755,2172,9757,2176],{},[50,9756,2069],{},[50,9758,2175],{},[10,9760,202],{},[14,9762,205],{"id":205},[10,9764,2183],{},[210,9766,212],{},{"title":77,"searchDepth":90,"depth":90,"links":9768},[9769,9770,9771,9772,9773,9774,9775,9776],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":2043,"description":2048},[225,2203,2204],{"id":2207,"title":2208,"body":9781,"category":225,"cover":226,"description":2213,"extension":227,"meta":9914,"navigation":93,"path":2380,"pinned":230,"publishedAt":231,"seo":9915,"slug":2382,"stem":2383,"summary":2384,"tags":9916,"updatedAt":231,"visible":93,"__hash__":2388},{"type":7,"value":9782,"toc":9904},[9783,9785,9787,9789,9791,9795,9797,9799,9815,9817,9819,9843,9845,9850,9852,9854,9870,9872,9884,9886,9896,9898,9900,9902],[10,9784,2213],{},[14,9786,16],{"id":16},[10,9788,2218],{},[14,9790,22],{"id":22},[10,9792,9793],{},[26,9794],{"alt":2225,"src":2226},[10,9796,2229],{},[14,9798,35],{"id":35},[37,9800,9801,9803,9809],{},[40,9802,2236],{},[40,9804,2239,9805,2172,9807,2246],{},[50,9806,2242],{},[50,9808,2245],{},[40,9810,2249,9811,53,9813,2256],{},[50,9812,2252],{},[50,9814,2255],{},[14,9816,67],{"id":67},[10,9818,70],{},[72,9820,9821],{"className":74,"code":2263,"language":76,"meta":77,"style":77},[50,9822,9823,9827,9831,9835,9839],{"__ignoreMap":77},[81,9824,9825],{"class":83,"line":84},[81,9826,2270],{},[81,9828,9829],{"class":83,"line":90},[81,9830,2275],{},[81,9832,9833],{"class":83,"line":97},[81,9834,94],{"emptyLinePlaceholder":93},[81,9836,9837],{"class":83,"line":103},[81,9838,2284],{},[81,9840,9841],{"class":83,"line":109},[81,9842,2275],{},[10,9844,121],{},[72,9846,9848],{"className":9847,"code":2294,"language":127,"meta":77},[125],[50,9849,2294],{"__ignoreMap":77},[10,9851,132],{},[14,9853,135],{"id":135},[137,9855,9856,9862],{},[40,9857,936,9858,2308,9860,2311],{},[50,9859,2307],{},[50,9861,2242],{},[40,9863,936,9864,2317,9866,2321,9868,64],{},[50,9865,2316],{},[50,9867,2320],{},[50,9869,2324],{},[14,9871,173],{"id":173},[37,9873,9874,9876],{},[40,9875,2331],{},[40,9877,2334,9878,53,9880,53,9882,2342],{},[50,9879,2252],{},[50,9881,2255],{},[50,9883,2341],{},[14,9885,191],{"id":191},[137,9887,9888,9894],{},[40,9889,2349,9890,148,9892,2356],{},[50,9891,2352],{},[50,9893,2355],{},[40,9895,2359],{},[10,9897,202],{},[14,9899,205],{"id":205},[10,9901,2366],{},[210,9903,212],{},{"title":77,"searchDepth":90,"depth":90,"links":9905},[9906,9907,9908,9909,9910,9911,9912,9913],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":2208,"description":2213},[225,2386,2387],{"id":2390,"title":2391,"body":9918,"category":225,"cover":226,"description":2396,"extension":227,"meta":10051,"navigation":93,"path":2563,"pinned":230,"publishedAt":231,"seo":10052,"slug":2565,"stem":2566,"summary":2567,"tags":10053,"updatedAt":231,"visible":93,"__hash__":2571},{"type":7,"value":9919,"toc":10041},[9920,9922,9924,9926,9928,9932,9934,9936,9954,9956,9958,9994,9996,10001,10003,10005,10015,10017,10025,10027,10033,10035,10037,10039],[10,9921,2396],{},[14,9923,16],{"id":16},[10,9925,2401],{},[14,9927,22],{"id":22},[10,9929,9930],{},[26,9931],{"alt":2408,"src":2409},[10,9933,2412],{},[14,9935,35],{"id":35},[37,9937,9938,9944,9952],{},[40,9939,9940,2422,9942,2426],{},[50,9941,2421],{},[50,9943,2425],{},[40,9945,9946,2432,9948,2436,9950,2440],{},[50,9947,2431],{},[50,9949,2435],{},[50,9951,2439],{},[40,9953,2443],{},[14,9955,67],{"id":67},[10,9957,70],{},[72,9959,9960],{"className":74,"code":2450,"language":76,"meta":77,"style":77},[50,9961,9962,9966,9970,9974,9978,9982,9986,9990],{"__ignoreMap":77},[81,9963,9964],{"class":83,"line":84},[81,9965,2457],{},[81,9967,9968],{"class":83,"line":90},[81,9969,2462],{},[81,9971,9972],{"class":83,"line":97},[81,9973,2467],{},[81,9975,9976],{"class":83,"line":103},[81,9977,94],{"emptyLinePlaceholder":93},[81,9979,9980],{"class":83,"line":109},[81,9981,2476],{},[81,9983,9984],{"class":83,"line":115},[81,9985,2481],{},[81,9987,9988],{"class":83,"line":2484},[81,9989,2487],{},[81,9991,9992],{"class":83,"line":2490},[81,9993,2493],{},[10,9995,121],{},[72,9997,9999],{"className":9998,"code":2499,"language":127,"meta":77},[125],[50,10000,2499],{"__ignoreMap":77},[10,10002,132],{},[14,10004,135],{"id":135},[137,10006,10007,10011],{},[40,10008,10009,2513],{},[50,10010,2512],{},[40,10012,10013,2519],{},[50,10014,2518],{},[14,10016,173],{"id":173},[37,10018,10019,10023],{},[40,10020,2526,10021,64],{},[50,10022,2529],{},[40,10024,2532],{},[14,10026,191],{"id":191},[137,10028,10029,10031],{},[40,10030,2539],{},[40,10032,2542],{},[10,10034,202],{},[14,10036,205],{"id":205},[10,10038,2549],{},[210,10040,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10042},[10043,10044,10045,10046,10047,10048,10049,10050],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":2391,"description":2396},[225,2569,2570],{"id":2573,"title":2574,"body":10055,"category":225,"cover":226,"description":2579,"extension":227,"meta":10192,"navigation":93,"path":2755,"pinned":230,"publishedAt":231,"seo":10193,"slug":2757,"stem":2758,"summary":2759,"tags":10194,"updatedAt":231,"visible":93,"__hash__":2763},{"type":7,"value":10056,"toc":10180},[10057,10059,10061,10063,10065,10069,10075,10077,10085,10087,10089,10113,10115,10120,10122,10124,10142,10144,10146,10150,10152,10154,10160,10162,10172,10174,10176,10178],[10,10058,2579],{},[14,10060,16],{"id":16},[10,10062,2584],{},[14,10064,22],{"id":22},[10,10066,10067],{},[26,10068],{"alt":2591,"src":2592},[10,10070,2595,10071,2599,10073,64],{},[50,10072,2598],{},[50,10074,2602],{},[14,10076,35],{"id":35},[37,10078,10079,10081,10083],{},[40,10080,2609],{},[40,10082,2612],{},[40,10084,2615],{},[14,10086,67],{"id":67},[10,10088,70],{},[72,10090,10091],{"className":74,"code":2622,"language":76,"meta":77,"style":77},[50,10092,10093,10097,10101,10105,10109],{"__ignoreMap":77},[81,10094,10095],{"class":83,"line":84},[81,10096,2629],{},[81,10098,10099],{"class":83,"line":90},[81,10100,2634],{},[81,10102,10103],{"class":83,"line":97},[81,10104,2639],{},[81,10106,10107],{"class":83,"line":103},[81,10108,2644],{},[81,10110,10111],{"class":83,"line":109},[81,10112,2649],{},[10,10114,121],{},[72,10116,10118],{"className":10117,"code":2655,"language":127,"meta":77},[125],[50,10119,2655],{"__ignoreMap":77},[10,10121,132],{},[14,10123,135],{"id":135},[137,10125,10126,10134],{},[40,10127,2666,10128,2669,10130,2673,10132,2677],{},[50,10129,225],{},[50,10131,2672],{},[50,10133,2676],{},[40,10135,10136,2683,10138,2687,10140,2691],{},[50,10137,2682],{},[50,10139,2686],{},[50,10141,2690],{},[156,10143,158],{"id":158},[10,10145,2696],{},[10,10147,10148],{},[26,10149],{"alt":2701,"src":2702},[10,10151,2705],{},[14,10153,173],{"id":173},[37,10155,10156,10158],{},[40,10157,2712],{},[40,10159,2715],{},[14,10161,191],{"id":191},[137,10163,10164,10170],{},[40,10165,2722,10166,2726,10168,64],{},[50,10167,2725],{},[50,10169,2729],{},[40,10171,2732],{},[10,10173,202],{},[14,10175,205],{"id":205},[10,10177,2739],{},[210,10179,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10181},[10182,10183,10184,10185,10186,10189,10190,10191],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":10187},[10188],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":2574,"description":2579},[225,2761,2762],{"id":2765,"title":2766,"body":10196,"category":225,"cover":226,"description":2771,"extension":227,"meta":10361,"navigation":93,"path":2986,"pinned":230,"publishedAt":231,"seo":10362,"slug":2988,"stem":2989,"summary":2990,"tags":10363,"updatedAt":231,"visible":93,"__hash__":2994},{"type":7,"value":10197,"toc":10349},[10198,10200,10202,10204,10206,10210,10216,10218,10238,10240,10242,10278,10280,10285,10287,10289,10303,10305,10307,10311,10317,10319,10329,10331,10341,10343,10345,10347],[10,10199,2771],{},[14,10201,16],{"id":16},[10,10203,2776],{},[14,10205,22],{"id":22},[10,10207,10208],{},[26,10209],{"alt":2783,"src":2784},[10,10211,2787,10212,182,10214,2794],{},[50,10213,2790],{},[50,10215,2793],{},[14,10217,35],{"id":35},[37,10219,10220,10228,10236],{},[40,10221,10222,2804,10224,2808,10226,2812],{},[50,10223,2803],{},[50,10225,2807],{},[50,10227,2811],{},[40,10229,10230,2818,10232,2822,10234,2826],{},[50,10231,2817],{},[50,10233,2821],{},[50,10235,2825],{},[40,10237,2829],{},[14,10239,67],{"id":67},[10,10241,70],{},[72,10243,10244],{"className":74,"code":2836,"language":76,"meta":77,"style":77},[50,10245,10246,10250,10254,10258,10262,10266,10270,10274],{"__ignoreMap":77},[81,10247,10248],{"class":83,"line":84},[81,10249,2843],{},[81,10251,10252],{"class":83,"line":90},[81,10253,2848],{},[81,10255,10256],{"class":83,"line":97},[81,10257,94],{"emptyLinePlaceholder":93},[81,10259,10260],{"class":83,"line":103},[81,10261,2857],{},[81,10263,10264],{"class":83,"line":109},[81,10265,2862],{},[81,10267,10268],{"class":83,"line":115},[81,10269,2867],{},[81,10271,10272],{"class":83,"line":2484},[81,10273,2872],{},[81,10275,10276],{"class":83,"line":2490},[81,10277,2877],{},[10,10279,121],{},[72,10281,10283],{"className":10282,"code":2883,"language":127,"meta":77},[125],[50,10284,2883],{"__ignoreMap":77},[10,10286,132],{},[14,10288,135],{"id":135},[137,10290,10291,10297],{},[40,10292,10293,2897,10295,2901],{},[50,10294,2896],{},[50,10296,2900],{},[40,10298,10299,2907,10301,2910],{},[50,10300,2906],{},[50,10302,2825],{},[156,10304,158],{"id":158},[10,10306,2915],{},[10,10308,10309],{},[26,10310],{"alt":2920,"src":2921},[10,10312,10313,2926,10315,2929],{},[50,10314,2817],{},[50,10316,2821],{},[14,10318,173],{"id":173},[37,10320,10321,10327],{},[40,10322,2936,10323,2939,10325,2942],{},[50,10324,2811],{},[50,10326,2803],{},[40,10328,2945],{},[14,10330,191],{"id":191},[137,10332,10333,10337],{},[40,10334,2952,10335,2956],{},[50,10336,2955],{},[40,10338,2959,10339,2963],{},[50,10340,2962],{},[10,10342,202],{},[14,10344,205],{"id":205},[10,10346,2970],{},[210,10348,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10350},[10351,10352,10353,10354,10355,10358,10359,10360],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":10356},[10357],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":2766,"description":2771},[225,2992,2993],{"id":2996,"title":2997,"body":10365,"category":225,"cover":226,"description":3002,"extension":227,"meta":10498,"navigation":93,"path":3171,"pinned":230,"publishedAt":231,"seo":10499,"slug":3173,"stem":3174,"summary":3175,"tags":10500,"updatedAt":231,"visible":93,"__hash__":3178},{"type":7,"value":10366,"toc":10488},[10367,10369,10371,10373,10375,10379,10389,10391,10401,10403,10405,10433,10435,10440,10442,10444,10458,10460,10468,10470,10480,10482,10484,10486],[10,10368,3002],{},[14,10370,16],{"id":16},[10,10372,3007],{},[14,10374,22],{"id":22},[10,10376,10377],{},[26,10378],{"alt":3014,"src":3015},[10,10380,10381,3021,10383,3025,10385,3029,10387,3033],{},[50,10382,3020],{},[50,10384,3024],{},[50,10386,3028],{},[50,10388,3032],{},[14,10390,35],{"id":35},[37,10392,10393,10395,10399],{},[40,10394,3040],{},[40,10396,10397,3045],{},[50,10398,3032],{},[40,10400,3048],{},[14,10402,67],{"id":67},[10,10404,70],{},[72,10406,10407],{"className":74,"code":3055,"language":76,"meta":77,"style":77},[50,10408,10409,10413,10417,10421,10425,10429],{"__ignoreMap":77},[81,10410,10411],{"class":83,"line":84},[81,10412,3062],{},[81,10414,10415],{"class":83,"line":90},[81,10416,3067],{},[81,10418,10419],{"class":83,"line":97},[81,10420,3072],{},[81,10422,10423],{"class":83,"line":103},[81,10424,94],{"emptyLinePlaceholder":93},[81,10426,10427],{"class":83,"line":109},[81,10428,3081],{},[81,10430,10431],{"class":83,"line":115},[81,10432,3086],{},[10,10434,121],{},[72,10436,10438],{"className":10437,"code":3092,"language":127,"meta":77},[125],[50,10439,3092],{"__ignoreMap":77},[10,10441,132],{},[14,10443,135],{"id":135},[137,10445,10446,10452],{},[40,10447,3103,10448,3106,10450,3110],{},[50,10449,3020],{},[50,10451,3109],{},[40,10453,10454,3116,10456,3120],{},[50,10455,3115],{},[50,10457,3119],{},[14,10459,173],{"id":173},[37,10461,10462,10466],{},[40,10463,3127,10464,3131],{},[50,10465,3130],{},[40,10467,3134],{},[14,10469,191],{"id":191},[137,10471,10472,10474],{},[40,10473,3141],{},[40,10475,1716,10476,3147,10478,3150],{},[50,10477,3146],{},[50,10479,3032],{},[10,10481,202],{},[14,10483,205],{"id":205},[10,10485,3157],{},[210,10487,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10489},[10490,10491,10492,10493,10494,10495,10496,10497],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":2997,"description":3002},[225,2341,3177],{"id":3180,"title":3181,"body":10502,"category":225,"cover":226,"description":3186,"extension":227,"meta":10631,"navigation":93,"path":3347,"pinned":230,"publishedAt":231,"seo":10632,"slug":3349,"stem":3350,"summary":3351,"tags":10633,"updatedAt":231,"visible":93,"__hash__":3355},{"type":7,"value":10503,"toc":10621},[10504,10506,10508,10510,10512,10516,10520,10522,10532,10534,10536,10568,10570,10575,10577,10579,10591,10593,10603,10605,10613,10615,10617,10619],[10,10505,3186],{},[14,10507,16],{"id":16},[10,10509,3191],{},[14,10511,22],{"id":22},[10,10513,10514],{},[26,10515],{"alt":3198,"src":3199},[10,10517,3202,10518,3206],{},[50,10519,3205],{},[14,10521,35],{"id":35},[37,10523,10524,10526,10528],{},[40,10525,3213],{},[40,10527,3216],{},[40,10529,3219,10530,64],{},[50,10531,3222],{},[14,10533,67],{"id":67},[10,10535,70],{},[72,10537,10538],{"className":74,"code":3229,"language":76,"meta":77,"style":77},[50,10539,10540,10544,10548,10552,10556,10560,10564],{"__ignoreMap":77},[81,10541,10542],{"class":83,"line":84},[81,10543,3236],{},[81,10545,10546],{"class":83,"line":90},[81,10547,3241],{},[81,10549,10550],{"class":83,"line":97},[81,10551,94],{"emptyLinePlaceholder":93},[81,10553,10554],{"class":83,"line":103},[81,10555,3250],{},[81,10557,10558],{"class":83,"line":109},[81,10559,3255],{},[81,10561,10562],{"class":83,"line":115},[81,10563,3260],{},[81,10565,10566],{"class":83,"line":2484},[81,10567,3265],{},[10,10569,121],{},[72,10571,10573],{"className":10572,"code":3271,"language":127,"meta":77},[125],[50,10574,3271],{"__ignoreMap":77},[10,10576,132],{},[14,10578,135],{"id":135},[137,10580,10581,10583],{},[40,10582,3282],{},[40,10584,10585,3288,10587,3292,10589,3296],{},[50,10586,3287],{},[50,10588,3291],{},[50,10590,3295],{},[14,10592,173],{"id":173},[37,10594,10595,10601],{},[40,10596,3303,10597,3307,10599,64],{},[50,10598,3306],{},[50,10600,3310],{},[40,10602,3313],{},[14,10604,191],{"id":191},[137,10606,10607,10609],{},[40,10608,3320],{},[40,10610,3323,10611,3326],{},[50,10612,3295],{},[10,10614,202],{},[14,10616,205],{"id":205},[10,10618,3333],{},[210,10620,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10622},[10623,10624,10625,10626,10627,10628,10629,10630],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":3181,"description":3186},[225,3353,3354],{"id":3357,"title":3358,"body":10635,"category":225,"cover":226,"description":3363,"extension":227,"meta":10754,"navigation":93,"path":3505,"pinned":230,"publishedAt":231,"seo":10755,"slug":3507,"stem":3508,"summary":3509,"tags":10756,"updatedAt":231,"visible":93,"__hash__":3512},{"type":7,"value":10636,"toc":10744},[10637,10639,10641,10643,10645,10649,10651,10653,10661,10663,10665,10693,10695,10700,10702,10704,10714,10716,10724,10726,10736,10738,10740,10742],[10,10638,3363],{},[14,10640,16],{"id":16},[10,10642,3368],{},[14,10644,22],{"id":22},[10,10646,10647],{},[26,10648],{"alt":3375,"src":3376},[10,10650,3379],{},[14,10652,35],{"id":35},[37,10654,10655,10657,10659],{},[40,10656,3386],{},[40,10658,3389],{},[40,10660,3392],{},[14,10662,67],{"id":67},[10,10664,70],{},[72,10666,10667],{"className":74,"code":3399,"language":76,"meta":77,"style":77},[50,10668,10669,10673,10677,10681,10685,10689],{"__ignoreMap":77},[81,10670,10671],{"class":83,"line":84},[81,10672,3406],{},[81,10674,10675],{"class":83,"line":90},[81,10676,3411],{},[81,10678,10679],{"class":83,"line":97},[81,10680,3416],{},[81,10682,10683],{"class":83,"line":103},[81,10684,94],{"emptyLinePlaceholder":93},[81,10686,10687],{"class":83,"line":109},[81,10688,3425],{},[81,10690,10691],{"class":83,"line":115},[81,10692,3430],{},[10,10694,121],{},[72,10696,10698],{"className":10697,"code":3436,"language":127,"meta":77},[125],[50,10699,3436],{"__ignoreMap":77},[10,10701,132],{},[14,10703,135],{"id":135},[137,10705,10706,10710],{},[40,10707,10708,3450],{},[50,10709,3449],{},[40,10711,10712,3456],{},[50,10713,3455],{},[14,10715,173],{"id":173},[37,10717,10718,10722],{},[40,10719,3463,10720,3467],{},[50,10721,3466],{},[40,10723,3470],{},[14,10725,191],{"id":191},[137,10727,10728,10730],{},[40,10729,3477],{},[40,10731,2169,10732,2172,10734,3484],{},[50,10733,3466],{},[50,10735,3455],{},[10,10737,202],{},[14,10739,205],{"id":205},[10,10741,3491],{},[210,10743,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10745},[10746,10747,10748,10749,10750,10751,10752,10753],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":3358,"description":3363},[225,3511,3354],{"id":3514,"title":3515,"body":10758,"category":225,"cover":226,"description":3520,"extension":227,"meta":10883,"navigation":93,"path":3676,"pinned":230,"publishedAt":231,"seo":10884,"slug":3678,"stem":3679,"summary":3680,"tags":10885,"updatedAt":231,"visible":93,"__hash__":3683},{"type":7,"value":10759,"toc":10873},[10760,10762,10764,10766,10768,10772,10778,10780,10790,10792,10794,10822,10824,10829,10831,10833,10843,10845,10857,10859,10865,10867,10869,10871],[10,10761,3520],{},[14,10763,16],{"id":16},[10,10765,3525],{},[14,10767,22],{"id":22},[10,10769,10770],{},[26,10771],{"alt":3532,"src":3533},[10,10773,3536,10774,3540,10776,3543],{},[50,10775,3539],{},[50,10777,2242],{},[14,10779,35],{"id":35},[37,10781,10782,10784,10788],{},[40,10783,3550],{},[40,10785,2334,10786,3556],{},[50,10787,3555],{},[40,10789,3559],{},[14,10791,67],{"id":67},[10,10793,70],{},[72,10795,10796],{"className":74,"code":3566,"language":76,"meta":77,"style":77},[50,10797,10798,10802,10806,10810,10814,10818],{"__ignoreMap":77},[81,10799,10800],{"class":83,"line":84},[81,10801,3573],{},[81,10803,10804],{"class":83,"line":90},[81,10805,3578],{},[81,10807,10808],{"class":83,"line":97},[81,10809,94],{"emptyLinePlaceholder":93},[81,10811,10812],{"class":83,"line":103},[81,10813,3587],{},[81,10815,10816],{"class":83,"line":109},[81,10817,3592],{},[81,10819,10820],{"class":83,"line":115},[81,10821,3597],{},[10,10823,121],{},[72,10825,10827],{"className":10826,"code":3603,"language":127,"meta":77},[125],[50,10828,3603],{"__ignoreMap":77},[10,10830,132],{},[14,10832,135],{"id":135},[137,10834,10835,10837],{},[40,10836,3614],{},[40,10838,3617,10839,3620,10841,3624],{},[50,10840,2242],{},[50,10842,3623],{},[14,10844,173],{"id":173},[37,10846,10847,10851],{},[40,10848,3631,10849,3635],{},[50,10850,3634],{},[40,10852,3638,10853,3642,10855,64],{},[50,10854,3641],{},[50,10856,3645],{},[14,10858,191],{"id":191},[137,10860,10861,10863],{},[40,10862,3652],{},[40,10864,3655],{},[10,10866,202],{},[14,10868,205],{"id":205},[10,10870,3662],{},[210,10872,212],{},{"title":77,"searchDepth":90,"depth":90,"links":10874},[10875,10876,10877,10878,10879,10880,10881,10882],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":3515,"description":3520},[225,3682,3354],{"id":3685,"title":3686,"body":10887,"category":225,"cover":226,"description":3691,"extension":227,"meta":11010,"navigation":93,"path":3841,"pinned":230,"publishedAt":231,"seo":11011,"slug":3843,"stem":3844,"summary":3845,"tags":11012,"updatedAt":231,"visible":93,"__hash__":3848},{"type":7,"value":10888,"toc":11000},[10889,10891,10893,10895,10897,10901,10903,10905,10917,10919,10921,10949,10951,10956,10958,10960,10970,10972,10982,10984,10992,10994,10996,10998],[10,10890,3691],{},[14,10892,16],{"id":16},[10,10894,3696],{},[14,10896,22],{"id":22},[10,10898,10899],{},[26,10900],{"alt":3703,"src":3704},[10,10902,3707],{},[14,10904,35],{"id":35},[37,10906,10907,10909,10911],{},[40,10908,3714],{},[40,10910,3717],{},[40,10912,3720,10913,3724,10915,3728],{},[50,10914,3723],{},[50,10916,3727],{},[14,10918,67],{"id":67},[10,10920,70],{},[72,10922,10923],{"className":74,"code":3735,"language":76,"meta":77,"style":77},[50,10924,10925,10929,10933,10937,10941,10945],{"__ignoreMap":77},[81,10926,10927],{"class":83,"line":84},[81,10928,3742],{},[81,10930,10931],{"class":83,"line":90},[81,10932,3747],{},[81,10934,10935],{"class":83,"line":97},[81,10936,94],{"emptyLinePlaceholder":93},[81,10938,10939],{"class":83,"line":103},[81,10940,3756],{},[81,10942,10943],{"class":83,"line":109},[81,10944,3761],{},[81,10946,10947],{"class":83,"line":115},[81,10948,3766],{},[10,10950,121],{},[72,10952,10954],{"className":10953,"code":3772,"language":127,"meta":77},[125],[50,10955,3772],{"__ignoreMap":77},[10,10957,132],{},[14,10959,135],{"id":135},[137,10961,10962,10964],{},[40,10963,3783],{},[40,10965,10966,3789,10968,3793],{},[50,10967,3788],{},[50,10969,3792],{},[14,10971,173],{"id":173},[37,10973,10974,10980],{},[40,10975,2334,10976,3802,10978,64],{},[50,10977,3727],{},[50,10979,3723],{},[40,10981,3807],{},[14,10983,191],{"id":191},[137,10985,10986,10990],{},[40,10987,3814,10988,3817],{},[50,10989,3723],{},[40,10991,3820],{},[10,10993,202],{},[14,10995,205],{"id":205},[10,10997,3827],{},[210,10999,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11001},[11002,11003,11004,11005,11006,11007,11008,11009],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":3686,"description":3691},[225,3847,3354],{"id":3850,"title":3851,"body":11014,"category":225,"cover":226,"description":3856,"extension":227,"meta":11173,"navigation":93,"path":4055,"pinned":230,"publishedAt":231,"seo":11174,"slug":4057,"stem":4058,"summary":4059,"tags":11175,"updatedAt":231,"visible":93,"__hash__":4063},{"type":7,"value":11015,"toc":11161},[11016,11018,11020,11022,11024,11028,11034,11036,11048,11050,11052,11092,11094,11099,11101,11103,11117,11119,11121,11125,11127,11129,11139,11141,11153,11155,11157,11159],[10,11017,3856],{},[14,11019,16],{"id":16},[10,11021,3861],{},[14,11023,22],{"id":22},[10,11025,11026],{},[26,11027],{"alt":3868,"src":3869},[10,11029,11030,3875,11032,3879],{},[50,11031,3874],{},[50,11033,3878],{},[14,11035,35],{"id":35},[37,11037,11038,11044,11046],{},[40,11039,11040,3888,11042,3892],{},[50,11041,2803],{},[50,11043,3891],{},[40,11045,3895],{},[40,11047,3898],{},[14,11049,67],{"id":67},[10,11051,70],{},[72,11053,11054],{"className":74,"code":3905,"language":76,"meta":77,"style":77},[50,11055,11056,11060,11064,11068,11072,11076,11080,11084,11088],{"__ignoreMap":77},[81,11057,11058],{"class":83,"line":84},[81,11059,3912],{},[81,11061,11062],{"class":83,"line":90},[81,11063,3917],{},[81,11065,11066],{"class":83,"line":97},[81,11067,3922],{},[81,11069,11070],{"class":83,"line":103},[81,11071,94],{"emptyLinePlaceholder":93},[81,11073,11074],{"class":83,"line":109},[81,11075,3931],{},[81,11077,11078],{"class":83,"line":115},[81,11079,3936],{},[81,11081,11082],{"class":83,"line":2484},[81,11083,3941],{},[81,11085,11086],{"class":83,"line":2490},[81,11087,3946],{},[81,11089,11090],{"class":83,"line":3949},[81,11091,3952],{},[10,11093,121],{},[72,11095,11097],{"className":11096,"code":3958,"language":127,"meta":77},[125],[50,11098,3958],{"__ignoreMap":77},[10,11100,132],{},[14,11102,135],{"id":135},[137,11104,11105,11109],{},[40,11106,11107,3972],{},[50,11108,3971],{},[40,11110,11111,3978,11113,3982,11115,3986],{},[50,11112,3977],{},[50,11114,3981],{},[50,11116,3985],{},[156,11118,158],{"id":158},[10,11120,3991],{},[10,11122,11123],{},[26,11124],{"alt":3996,"src":3997},[10,11126,4000],{},[14,11128,173],{"id":173},[37,11130,11131,11137],{},[40,11132,4007,11133,4010,11135,64],{},[50,11134,2803],{},[50,11136,3891],{},[40,11138,4015],{},[14,11140,191],{"id":191},[137,11142,11143,11145],{},[40,11144,4022],{},[40,11146,2334,11147,4028,11149,148,11151,64],{},[50,11148,4027],{},[50,11150,3891],{},[50,11152,2803],{},[10,11154,202],{},[14,11156,205],{"id":205},[10,11158,4039],{},[210,11160,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11162},[11163,11164,11165,11166,11167,11170,11171,11172],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":11168},[11169],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":3851,"description":3856},[225,4061,4062],{"id":4065,"title":4066,"body":11177,"category":225,"cover":226,"description":4071,"extension":227,"meta":11349,"navigation":93,"path":4285,"pinned":230,"publishedAt":231,"seo":11350,"slug":4287,"stem":4288,"summary":4289,"tags":11351,"updatedAt":231,"visible":93,"__hash__":4292},{"type":7,"value":11178,"toc":11336},[11179,11181,11183,11185,11187,11191,11199,11201,11209,11211,11213,11257,11259,11264,11266,11268,11280,11282,11284,11288,11294,11296,11298,11302,11306,11308,11320,11322,11328,11330,11332,11334],[10,11180,4071],{},[14,11182,16],{"id":16},[10,11184,4076],{},[14,11186,22],{"id":22},[10,11188,11189],{},[26,11190],{"alt":4083,"src":4084},[10,11192,11193,53,11195,53,11197,4094],{},[50,11194,1153],{},[50,11196,4091],{},[50,11198,1156],{},[14,11200,35],{"id":35},[37,11202,11203,11205,11207],{},[40,11204,4101],{},[40,11206,4104],{},[40,11208,4107],{},[14,11210,67],{"id":67},[10,11212,70],{},[72,11214,11215],{"className":74,"code":4114,"language":76,"meta":77,"style":77},[50,11216,11217,11221,11225,11229,11233,11237,11241,11245,11249,11253],{"__ignoreMap":77},[81,11218,11219],{"class":83,"line":84},[81,11220,4121],{},[81,11222,11223],{"class":83,"line":90},[81,11224,94],{"emptyLinePlaceholder":93},[81,11226,11227],{"class":83,"line":97},[81,11228,4130],{},[81,11230,11231],{"class":83,"line":103},[81,11232,4135],{},[81,11234,11235],{"class":83,"line":109},[81,11236,4140],{},[81,11238,11239],{"class":83,"line":115},[81,11240,4145],{},[81,11242,11243],{"class":83,"line":2484},[81,11244,1143],{},[81,11246,11247],{"class":83,"line":2490},[81,11248,4154],{},[81,11250,11251],{"class":83,"line":3949},[81,11252,94],{"emptyLinePlaceholder":93},[81,11254,11255],{"class":83,"line":4161},[81,11256,4164],{},[10,11258,121],{},[72,11260,11262],{"className":11261,"code":4170,"language":127,"meta":77},[125],[50,11263,4170],{"__ignoreMap":77},[10,11265,132],{},[14,11267,135],{"id":135},[137,11269,11270,11274],{},[40,11271,4181,11272,4185],{},[50,11273,4184],{},[40,11275,11276,4191,11278,4194],{},[50,11277,4190],{},[50,11279,1156],{},[156,11281,158],{"id":158},[10,11283,4199],{},[10,11285,11286],{},[26,11287],{"alt":4204,"src":4205},[10,11289,11290,4210,11292,4213],{},[50,11291,4184],{},[50,11293,4190],{},[156,11295,158],{"id":4216},[10,11297,4219],{},[10,11299,11300],{},[26,11301],{"alt":4224,"src":4225},[10,11303,4228,11304,4231],{},[50,11305,1153],{},[14,11307,173],{"id":173},[37,11309,11310,11314],{},[40,11311,4238,11312,4241],{},[50,11313,4190],{},[40,11315,4244,11316,4247,11318,4251],{},[50,11317,1153],{},[50,11319,4250],{},[14,11321,191],{"id":191},[137,11323,11324,11326],{},[40,11325,4258],{},[40,11327,4261],{},[10,11329,202],{},[14,11331,205],{"id":205},[10,11333,4268],{},[210,11335,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11337},[11338,11339,11340,11341,11342,11346,11347,11348],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":11343},[11344,11345],{"id":158,"depth":97,"text":158},{"id":4216,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":4066,"description":4071},[225,1153,4291],{"id":4294,"title":4295,"body":11353,"category":225,"cover":226,"description":4300,"extension":227,"meta":11490,"navigation":93,"path":4467,"pinned":230,"publishedAt":231,"seo":11491,"slug":4469,"stem":4470,"summary":4471,"tags":11492,"updatedAt":231,"visible":93,"__hash__":4474},{"type":7,"value":11354,"toc":11478},[11355,11357,11359,11361,11363,11367,11371,11373,11383,11385,11387,11419,11421,11426,11428,11430,11440,11442,11444,11448,11452,11454,11460,11462,11470,11472,11474,11476],[10,11356,4300],{},[14,11358,16],{"id":16},[10,11360,4305],{},[14,11362,22],{"id":22},[10,11364,11365],{},[26,11366],{"alt":4312,"src":4313},[10,11368,11369,4319],{},[50,11370,4318],{},[14,11372,35],{"id":35},[37,11374,11375,11377,11379],{},[40,11376,4326],{},[40,11378,4329],{},[40,11380,4332,11381,4336],{},[50,11382,4335],{},[14,11384,67],{"id":67},[10,11386,70],{},[72,11388,11389],{"className":74,"code":4343,"language":76,"meta":77,"style":77},[50,11390,11391,11395,11399,11403,11407,11411,11415],{"__ignoreMap":77},[81,11392,11393],{"class":83,"line":84},[81,11394,4350],{},[81,11396,11397],{"class":83,"line":90},[81,11398,94],{"emptyLinePlaceholder":93},[81,11400,11401],{"class":83,"line":97},[81,11402,4359],{},[81,11404,11405],{"class":83,"line":103},[81,11406,4364],{},[81,11408,11409],{"class":83,"line":109},[81,11410,4369],{},[81,11412,11413],{"class":83,"line":115},[81,11414,94],{"emptyLinePlaceholder":93},[81,11416,11417],{"class":83,"line":2484},[81,11418,4378],{},[10,11420,121],{},[72,11422,11424],{"className":11423,"code":4384,"language":127,"meta":77},[125],[50,11425,4384],{"__ignoreMap":77},[10,11427,132],{},[14,11429,135],{"id":135},[137,11431,11432,11436],{},[40,11433,4395,11434,4399],{},[50,11435,4398],{},[40,11437,4402,11438,4405],{},[50,11439,4398],{},[156,11441,158],{"id":158},[10,11443,4410],{},[10,11445,11446],{},[26,11447],{"alt":4415,"src":4416},[10,11449,4419,11450,4422],{},[50,11451,4398],{},[14,11453,173],{"id":173},[37,11455,11456,11458],{},[40,11457,4429],{},[40,11459,4432],{},[14,11461,191],{"id":191},[137,11463,11464,11468],{},[40,11465,2334,11466,4441],{},[50,11467,4318],{},[40,11469,4444],{},[10,11471,202],{},[14,11473,205],{"id":205},[10,11475,4451],{},[210,11477,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11479},[11480,11481,11482,11483,11484,11487,11488,11489],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":11485},[11486],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":4295,"description":4300},[225,4318,4473],{"id":4476,"title":4477,"body":11494,"category":225,"cover":226,"description":4482,"extension":227,"meta":11619,"navigation":93,"path":4631,"pinned":230,"publishedAt":231,"seo":11620,"slug":4633,"stem":4634,"summary":4635,"tags":11621,"updatedAt":231,"visible":93,"__hash__":4638},{"type":7,"value":11495,"toc":11609},[11496,11498,11500,11502,11504,11508,11512,11514,11524,11526,11528,11560,11562,11567,11569,11571,11583,11585,11591,11593,11601,11603,11605,11607],[10,11497,4482],{},[14,11499,16],{"id":16},[10,11501,4487],{},[14,11503,22],{"id":22},[10,11505,11506],{},[26,11507],{"alt":4494,"src":4495},[10,11509,11510,4500],{},[50,11511,4335],{},[14,11513,35],{"id":35},[37,11515,11516,11520,11522],{},[40,11517,11518,4510],{},[50,11519,4509],{},[40,11521,4513],{},[40,11523,4516],{},[14,11525,67],{"id":67},[10,11527,70],{},[72,11529,11530],{"className":74,"code":4523,"language":76,"meta":77,"style":77},[50,11531,11532,11536,11540,11544,11548,11552,11556],{"__ignoreMap":77},[81,11533,11534],{"class":83,"line":84},[81,11535,4530],{},[81,11537,11538],{"class":83,"line":90},[81,11539,94],{"emptyLinePlaceholder":93},[81,11541,11542],{"class":83,"line":97},[81,11543,4539],{},[81,11545,11546],{"class":83,"line":103},[81,11547,4544],{},[81,11549,11550],{"class":83,"line":109},[81,11551,94],{"emptyLinePlaceholder":93},[81,11553,11554],{"class":83,"line":115},[81,11555,4553],{},[81,11557,11558],{"class":83,"line":2484},[81,11559,4558],{},[10,11561,121],{},[72,11563,11565],{"className":11564,"code":4564,"language":127,"meta":77},[125],[50,11566,4564],{"__ignoreMap":77},[10,11568,132],{},[14,11570,135],{"id":135},[137,11572,11573,11579],{},[40,11574,4575,11575,4578,11577,4582],{},[50,11576,4335],{},[50,11578,4581],{},[40,11580,11581,4587],{},[50,11582,4509],{},[14,11584,173],{"id":173},[37,11586,11587,11589],{},[40,11588,4594],{},[40,11590,4597],{},[14,11592,191],{"id":191},[137,11594,11595,11597],{},[40,11596,4604],{},[40,11598,2334,11599,4610],{},[50,11600,4609],{},[10,11602,202],{},[14,11604,205],{"id":205},[10,11606,4617],{},[210,11608,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11610},[11611,11612,11613,11614,11615,11616,11617,11618],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":4477,"description":4482},[225,4335,4637],{"id":4640,"title":4641,"body":11623,"category":225,"cover":226,"description":4646,"extension":227,"meta":11768,"navigation":93,"path":4821,"pinned":230,"publishedAt":231,"seo":11769,"slug":4823,"stem":4824,"summary":4825,"tags":11770,"updatedAt":231,"visible":93,"__hash__":4827},{"type":7,"value":11624,"toc":11758},[11625,11627,11629,11631,11633,11637,11643,11645,11659,11661,11663,11707,11709,11714,11716,11718,11728,11730,11742,11744,11750,11752,11754,11756],[10,11626,4646],{},[14,11628,16],{"id":16},[10,11630,4651],{},[14,11632,22],{"id":22},[10,11634,11635],{},[26,11636],{"alt":4658,"src":4659},[10,11638,11639,4665,11641,4669],{},[50,11640,4664],{},[50,11642,4668],{},[14,11644,35],{"id":35},[37,11646,11647,11649,11655],{},[40,11648,4676],{},[40,11650,11651,4681,11653,4684],{},[50,11652,4664],{},[50,11654,4318],{},[40,11656,4687,11657,4690],{},[50,11658,4668],{},[14,11660,67],{"id":67},[10,11662,70],{},[72,11664,11665],{"className":74,"code":4697,"language":76,"meta":77,"style":77},[50,11666,11667,11671,11675,11679,11683,11687,11691,11695,11699,11703],{"__ignoreMap":77},[81,11668,11669],{"class":83,"line":84},[81,11670,4704],{},[81,11672,11673],{"class":83,"line":90},[81,11674,94],{"emptyLinePlaceholder":93},[81,11676,11677],{"class":83,"line":97},[81,11678,4713],{},[81,11680,11681],{"class":83,"line":103},[81,11682,4718],{},[81,11684,11685],{"class":83,"line":109},[81,11686,4723],{},[81,11688,11689],{"class":83,"line":115},[81,11690,4728],{},[81,11692,11693],{"class":83,"line":2484},[81,11694,4733],{},[81,11696,11697],{"class":83,"line":2490},[81,11698,4558],{},[81,11700,11701],{"class":83,"line":3949},[81,11702,94],{"emptyLinePlaceholder":93},[81,11704,11705],{"class":83,"line":4161},[81,11706,4746],{},[10,11708,121],{},[72,11710,11712],{"className":11711,"code":4752,"language":127,"meta":77},[125],[50,11713,4752],{"__ignoreMap":77},[10,11715,132],{},[14,11717,135],{"id":135},[137,11719,11720,11724],{},[40,11721,4763,11722,4766],{},[50,11723,4664],{},[40,11725,4769,11726,4772],{},[50,11727,4668],{},[14,11729,173],{"id":173},[37,11731,11732,11736],{},[40,11733,3463,11734,4781],{},[50,11735,4664],{},[40,11737,4784,11738,4787,11740,4790],{},[50,11739,4318],{},[50,11741,4664],{},[14,11743,191],{"id":191},[137,11745,11746,11748],{},[40,11747,4797],{},[40,11749,4800],{},[10,11751,202],{},[14,11753,205],{"id":205},[10,11755,4807],{},[210,11757,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11759},[11760,11761,11762,11763,11764,11765,11766,11767],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":4641,"description":4646},[225,4668,4664],{"id":4,"title":5,"body":11772,"category":225,"cover":226,"description":12,"extension":227,"meta":11911,"navigation":93,"path":229,"pinned":230,"publishedAt":231,"seo":11912,"slug":233,"stem":234,"summary":235,"tags":11913,"updatedAt":231,"visible":93,"__hash__":239},{"type":7,"value":11773,"toc":11899},[11774,11776,11778,11780,11782,11786,11788,11790,11806,11808,11810,11838,11840,11845,11847,11849,11861,11863,11865,11869,11871,11873,11883,11885,11891,11893,11895,11897],[10,11775,12],{},[14,11777,16],{"id":16},[10,11779,19],{},[14,11781,22],{"id":22},[10,11783,11784],{},[26,11785],{"alt":28,"src":29},[10,11787,32],{},[14,11789,35],{"id":35},[37,11791,11792,11794,11796],{},[40,11793,42],{},[40,11795,45],{},[40,11797,48,11798,53,11800,57,11802,53,11804,64],{},[50,11799,52],{},[50,11801,56],{},[50,11803,60],{},[50,11805,63],{},[14,11807,67],{"id":67},[10,11809,70],{},[72,11811,11812],{"className":74,"code":75,"language":76,"meta":77,"style":77},[50,11813,11814,11818,11822,11826,11830,11834],{"__ignoreMap":77},[81,11815,11816],{"class":83,"line":84},[81,11817,87],{},[81,11819,11820],{"class":83,"line":90},[81,11821,94],{"emptyLinePlaceholder":93},[81,11823,11824],{"class":83,"line":97},[81,11825,100],{},[81,11827,11828],{"class":83,"line":103},[81,11829,106],{},[81,11831,11832],{"class":83,"line":109},[81,11833,112],{},[81,11835,11836],{"class":83,"line":115},[81,11837,118],{},[10,11839,121],{},[72,11841,11843],{"className":11842,"code":126,"language":127,"meta":77},[125],[50,11844,126],{"__ignoreMap":77},[10,11846,132],{},[14,11848,135],{"id":135},[137,11850,11851,11859],{},[40,11852,141,11853,144,11855,148,11857,64],{},[50,11854,52],{},[50,11856,147],{},[50,11858,151],{},[40,11860,154],{},[156,11862,158],{"id":158},[10,11864,161],{},[10,11866,11867],{},[26,11868],{"alt":166,"src":167},[10,11870,170],{},[14,11872,173],{"id":173},[37,11874,11875,11881],{},[40,11876,178,11877,182,11879,185],{},[50,11878,181],{},[50,11880,60],{},[40,11882,188],{},[14,11884,191],{"id":191},[137,11886,11887,11889],{},[40,11888,196],{},[40,11890,199],{},[10,11892,202],{},[14,11894,205],{"id":205},[10,11896,208],{},[210,11898,212],{},{"title":77,"searchDepth":90,"depth":90,"links":11900},[11901,11902,11903,11904,11905,11908,11909,11910],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":11906},[11907],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5,"description":12},[225,237,238],{"id":4972,"title":4973,"body":11915,"category":225,"cover":226,"description":4978,"extension":227,"meta":12032,"navigation":93,"path":5117,"pinned":230,"publishedAt":231,"seo":12033,"slug":5119,"stem":5120,"summary":5121,"tags":12034,"updatedAt":231,"visible":93,"__hash__":5125},{"type":7,"value":11916,"toc":12022},[11917,11919,11921,11923,11925,11929,11931,11933,11941,11943,11945,11977,11979,11984,11986,11988,11996,11998,12006,12008,12014,12016,12018,12020],[10,11918,4978],{},[14,11920,16],{"id":16},[10,11922,4983],{},[14,11924,22],{"id":22},[10,11926,11927],{},[26,11928],{"alt":4990,"src":4991},[10,11930,4994],{},[14,11932,35],{"id":35},[37,11934,11935,11937,11939],{},[40,11936,5001],{},[40,11938,5004],{},[40,11940,5007],{},[14,11942,67],{"id":67},[10,11944,70],{},[72,11946,11947],{"className":74,"code":5014,"language":76,"meta":77,"style":77},[50,11948,11949,11953,11957,11961,11965,11969,11973],{"__ignoreMap":77},[81,11950,11951],{"class":83,"line":84},[81,11952,5021],{},[81,11954,11955],{"class":83,"line":90},[81,11956,94],{"emptyLinePlaceholder":93},[81,11958,11959],{"class":83,"line":97},[81,11960,5030],{},[81,11962,11963],{"class":83,"line":103},[81,11964,5035],{},[81,11966,11967],{"class":83,"line":109},[81,11968,94],{"emptyLinePlaceholder":93},[81,11970,11971],{"class":83,"line":115},[81,11972,5044],{},[81,11974,11975],{"class":83,"line":2484},[81,11976,5049],{},[10,11978,121],{},[72,11980,11982],{"className":11981,"code":5055,"language":127,"meta":77},[125],[50,11983,5055],{"__ignoreMap":77},[10,11985,132],{},[14,11987,135],{"id":135},[137,11989,11990,11992],{},[40,11991,5066],{},[40,11993,5069,11994,5073],{},[50,11995,5072],{},[14,11997,173],{"id":173},[37,11999,12000,12004],{},[40,12001,5080,12002,5083],{},[50,12003,4335],{},[40,12005,5086],{},[14,12007,191],{"id":191},[137,12009,12010,12012],{},[40,12011,5093],{},[40,12013,5096],{},[10,12015,202],{},[14,12017,205],{"id":205},[10,12019,5103],{},[210,12021,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12023},[12024,12025,12026,12027,12028,12029,12030,12031],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":4973,"description":4978},[225,5123,5124],{"id":5127,"title":5128,"body":12036,"category":225,"cover":226,"description":5133,"extension":227,"meta":12155,"navigation":93,"path":5277,"pinned":230,"publishedAt":231,"seo":12156,"slug":5279,"stem":5280,"summary":5281,"tags":12157,"updatedAt":231,"visible":93,"__hash__":5285},{"type":7,"value":12037,"toc":12145},[12038,12040,12042,12044,12046,12050,12052,12054,12062,12064,12066,12098,12100,12105,12107,12109,12119,12121,12127,12129,12137,12139,12141,12143],[10,12039,5133],{},[14,12041,16],{"id":16},[10,12043,5138],{},[14,12045,22],{"id":22},[10,12047,12048],{},[26,12049],{"alt":5145,"src":5146},[10,12051,5149],{},[14,12053,35],{"id":35},[37,12055,12056,12058,12060],{},[40,12057,5156],{},[40,12059,5159],{},[40,12061,5162],{},[14,12063,67],{"id":67},[10,12065,70],{},[72,12067,12068],{"className":74,"code":5169,"language":76,"meta":77,"style":77},[50,12069,12070,12074,12078,12082,12086,12090,12094],{"__ignoreMap":77},[81,12071,12072],{"class":83,"line":84},[81,12073,5176],{},[81,12075,12076],{"class":83,"line":90},[81,12077,5181],{},[81,12079,12080],{"class":83,"line":97},[81,12081,5186],{},[81,12083,12084],{"class":83,"line":103},[81,12085,94],{"emptyLinePlaceholder":93},[81,12087,12088],{"class":83,"line":109},[81,12089,5195],{},[81,12091,12092],{"class":83,"line":115},[81,12093,5200],{},[81,12095,12096],{"class":83,"line":2484},[81,12097,5205],{},[10,12099,121],{},[72,12101,12103],{"className":12102,"code":5211,"language":127,"meta":77},[125],[50,12104,5211],{"__ignoreMap":77},[10,12106,132],{},[14,12108,135],{"id":135},[137,12110,12111,12115],{},[40,12112,936,12113,5225],{},[50,12114,5224],{},[40,12116,5228,12117,5232],{},[50,12118,5231],{},[14,12120,173],{"id":173},[37,12122,12123,12125],{},[40,12124,5239],{},[40,12126,5242],{},[14,12128,191],{"id":191},[137,12130,12131,12135],{},[40,12132,5249,12133,5253],{},[50,12134,5252],{},[40,12136,5256],{},[10,12138,202],{},[14,12140,205],{"id":205},[10,12142,5263],{},[210,12144,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12146},[12147,12148,12149,12150,12151,12152,12153,12154],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5128,"description":5133},[225,5283,5284],{"id":5287,"title":5288,"body":12159,"category":225,"cover":226,"description":5293,"extension":227,"meta":12304,"navigation":93,"path":5474,"pinned":230,"publishedAt":231,"seo":12305,"slug":5476,"stem":5477,"summary":5478,"tags":12306,"updatedAt":231,"visible":93,"__hash__":5482},{"type":7,"value":12160,"toc":12292},[12161,12163,12165,12167,12169,12173,12177,12179,12191,12193,12195,12223,12225,12230,12232,12234,12248,12250,12252,12256,12264,12266,12276,12278,12284,12286,12288,12290],[10,12162,5293],{},[14,12164,16],{"id":16},[10,12166,5298],{},[14,12168,22],{"id":22},[10,12170,12171],{},[26,12172],{"alt":5305,"src":5306},[10,12174,5309,12175,5313],{},[50,12176,5312],{},[14,12178,35],{"id":35},[37,12180,12181,12183,12185],{},[40,12182,5320],{},[40,12184,5323],{},[40,12186,5326,12187,5329,12189,64],{},[50,12188,5312],{},[50,12190,5332],{},[14,12192,67],{"id":67},[10,12194,70],{},[72,12196,12197],{"className":74,"code":5339,"language":76,"meta":77,"style":77},[50,12198,12199,12203,12207,12211,12215,12219],{"__ignoreMap":77},[81,12200,12201],{"class":83,"line":84},[81,12202,5346],{},[81,12204,12205],{"class":83,"line":90},[81,12206,5351],{},[81,12208,12209],{"class":83,"line":97},[81,12210,5356],{},[81,12212,12213],{"class":83,"line":103},[81,12214,94],{"emptyLinePlaceholder":93},[81,12216,12217],{"class":83,"line":109},[81,12218,5365],{},[81,12220,12221],{"class":83,"line":115},[81,12222,5370],{},[10,12224,121],{},[72,12226,12228],{"className":12227,"code":5376,"language":127,"meta":77},[125],[50,12229,5376],{"__ignoreMap":77},[10,12231,132],{},[14,12233,135],{"id":135},[137,12235,12236,12242],{},[40,12237,5387,12238,53,12240,5393],{},[50,12239,5390],{},[50,12241,4398],{},[40,12243,12244,5399,12246,5403],{},[50,12245,5398],{},[50,12247,5402],{},[156,12249,158],{"id":158},[10,12251,5408],{},[10,12253,12254],{},[26,12255],{"alt":5413,"src":5414},[10,12257,12258,53,12260,148,12262,5424],{},[50,12259,5390],{},[50,12261,4398],{},[50,12263,5423],{},[14,12265,173],{"id":173},[37,12267,12268,12272],{},[40,12269,5431,12270,5435],{},[50,12271,5434],{},[40,12273,5438,12274,5441],{},[50,12275,5423],{},[14,12277,191],{"id":191},[137,12279,12280,12282],{},[40,12281,5448],{},[40,12283,5451],{},[10,12285,202],{},[14,12287,205],{"id":205},[10,12289,5458],{},[210,12291,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12293},[12294,12295,12296,12297,12298,12301,12302,12303],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":12299},[12300],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5288,"description":5293},[225,5480,5481],{"id":5484,"title":5485,"body":12308,"category":225,"cover":226,"description":5490,"extension":227,"meta":12457,"navigation":93,"path":5671,"pinned":230,"publishedAt":231,"seo":12458,"slug":5673,"stem":5674,"summary":5675,"tags":12459,"updatedAt":231,"visible":93,"__hash__":5679},{"type":7,"value":12309,"toc":12445},[12310,12312,12314,12316,12318,12322,12324,12326,12338,12340,12342,12386,12388,12393,12395,12397,12409,12411,12413,12417,12419,12421,12429,12431,12437,12439,12441,12443],[10,12311,5490],{},[14,12313,16],{"id":16},[10,12315,5495],{},[14,12317,22],{"id":22},[10,12319,12320],{},[26,12321],{"alt":5502,"src":5503},[10,12323,5506],{},[14,12325,35],{"id":35},[37,12327,12328,12330,12334],{},[40,12329,5513],{},[40,12331,12332,5519],{},[50,12333,5518],{},[40,12335,12336,5525],{},[50,12337,5524],{},[14,12339,67],{"id":67},[10,12341,70],{},[72,12343,12344],{"className":74,"code":5532,"language":76,"meta":77,"style":77},[50,12345,12346,12350,12354,12358,12362,12366,12370,12374,12378,12382],{"__ignoreMap":77},[81,12347,12348],{"class":83,"line":84},[81,12349,5539],{},[81,12351,12352],{"class":83,"line":90},[81,12353,5544],{},[81,12355,12356],{"class":83,"line":97},[81,12357,94],{"emptyLinePlaceholder":93},[81,12359,12360],{"class":83,"line":103},[81,12361,5553],{},[81,12363,12364],{"class":83,"line":109},[81,12365,5558],{},[81,12367,12368],{"class":83,"line":115},[81,12369,94],{"emptyLinePlaceholder":93},[81,12371,12372],{"class":83,"line":2484},[81,12373,5567],{},[81,12375,12376],{"class":83,"line":2490},[81,12377,5572],{},[81,12379,12380],{"class":83,"line":3949},[81,12381,94],{"emptyLinePlaceholder":93},[81,12383,12384],{"class":83,"line":4161},[81,12385,5581],{},[10,12387,121],{},[72,12389,12391],{"className":12390,"code":5587,"language":127,"meta":77},[125],[50,12392,5587],{"__ignoreMap":77},[10,12394,132],{},[14,12396,135],{"id":135},[137,12398,12399,12403],{},[40,12400,5598,12401,5602],{},[50,12402,5601],{},[40,12404,12405,5608,12407,64],{},[50,12406,5607],{},[50,12408,5611],{},[156,12410,158],{"id":158},[10,12412,5616],{},[10,12414,12415],{},[26,12416],{"alt":5621,"src":5622},[10,12418,5625],{},[14,12420,173],{"id":173},[37,12422,12423,12427],{},[40,12424,5632,12425,5635],{},[50,12426,5332],{},[40,12428,5638],{},[14,12430,191],{"id":191},[137,12432,12433,12435],{},[40,12434,5645],{},[40,12436,5648],{},[10,12438,202],{},[14,12440,205],{"id":205},[10,12442,5655],{},[210,12444,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12446},[12447,12448,12449,12450,12451,12454,12455,12456],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":12452},[12453],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5485,"description":5490},[225,5677,5678],{"id":5681,"title":5682,"body":12461,"category":225,"cover":226,"description":5687,"extension":227,"meta":12622,"navigation":93,"path":5885,"pinned":230,"publishedAt":231,"seo":12623,"slug":5887,"stem":5888,"summary":5889,"tags":12624,"updatedAt":231,"visible":93,"__hash__":5893},{"type":7,"value":12462,"toc":12610},[12463,12465,12467,12469,12471,12475,12477,12479,12491,12493,12495,12547,12549,12554,12556,12558,12576,12578,12580,12584,12586,12588,12594,12596,12602,12604,12606,12608],[10,12464,5687],{},[14,12466,16],{"id":16},[10,12468,5692],{},[14,12470,22],{"id":22},[10,12472,12473],{},[26,12474],{"alt":5699,"src":5700},[10,12476,5703],{},[14,12478,35],{"id":35},[37,12480,12481,12483,12485],{},[40,12482,5710],{},[40,12484,5713],{},[40,12486,12487,2172,12489,5722],{},[50,12488,5718],{},[50,12490,5721],{},[14,12492,67],{"id":67},[10,12494,70],{},[72,12496,12497],{"className":74,"code":5729,"language":76,"meta":77,"style":77},[50,12498,12499,12503,12507,12511,12515,12519,12523,12527,12531,12535,12539,12543],{"__ignoreMap":77},[81,12500,12501],{"class":83,"line":84},[81,12502,5736],{},[81,12504,12505],{"class":83,"line":90},[81,12506,94],{"emptyLinePlaceholder":93},[81,12508,12509],{"class":83,"line":97},[81,12510,5745],{},[81,12512,12513],{"class":83,"line":103},[81,12514,5750],{},[81,12516,12517],{"class":83,"line":109},[81,12518,94],{"emptyLinePlaceholder":93},[81,12520,12521],{"class":83,"line":115},[81,12522,5759],{},[81,12524,12525],{"class":83,"line":2484},[81,12526,5764],{},[81,12528,12529],{"class":83,"line":2490},[81,12530,5769],{},[81,12532,12533],{"class":83,"line":3949},[81,12534,94],{"emptyLinePlaceholder":93},[81,12536,12537],{"class":83,"line":4161},[81,12538,5778],{},[81,12540,12541],{"class":83,"line":5781},[81,12542,94],{"emptyLinePlaceholder":93},[81,12544,12545],{"class":83,"line":5786},[81,12546,5789],{},[10,12548,121],{},[72,12550,12552],{"className":12551,"code":5795,"language":127,"meta":77},[125],[50,12553,5795],{"__ignoreMap":77},[10,12555,132],{},[14,12557,135],{"id":135},[137,12559,12560,12570],{},[40,12561,12562,5809,12564,5813,12566,5816,12568,5820],{},[50,12563,5808],{},[50,12565,5812],{},[50,12567,5601],{},[50,12569,5819],{},[40,12571,12572,5825,12574,5828],{},[50,12573,4581],{},[50,12575,2204],{},[156,12577,158],{"id":158},[10,12579,5833],{},[10,12581,12582],{},[26,12583],{"alt":5838,"src":5839},[10,12585,5842],{},[14,12587,173],{"id":173},[37,12589,12590,12592],{},[40,12591,5849],{},[40,12593,5852],{},[14,12595,191],{"id":191},[137,12597,12598,12600],{},[40,12599,5859],{},[40,12601,5862],{},[10,12603,202],{},[14,12605,205],{"id":205},[10,12607,5869],{},[210,12609,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12611},[12612,12613,12614,12615,12616,12619,12620,12621],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":12617},[12618],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5682,"description":5687},[225,5891,5892],{"id":5895,"title":5896,"body":12626,"category":225,"cover":226,"description":5901,"extension":227,"meta":12749,"navigation":93,"path":6052,"pinned":230,"publishedAt":231,"seo":12750,"slug":6054,"stem":6055,"summary":6056,"tags":12751,"updatedAt":231,"visible":93,"__hash__":6060},{"type":7,"value":12627,"toc":12739},[12628,12630,12632,12634,12636,12640,12642,12644,12658,12660,12662,12690,12692,12697,12699,12701,12711,12713,12721,12723,12731,12733,12735,12737],[10,12629,5901],{},[14,12631,16],{"id":16},[10,12633,5906],{},[14,12635,22],{"id":22},[10,12637,12638],{},[26,12639],{"alt":5913,"src":5914},[10,12641,5917],{},[14,12643,35],{"id":35},[37,12645,12646,12648,12650],{},[40,12647,5924],{},[40,12649,5927],{},[40,12651,5930,12652,53,12654,53,12656,5938],{},[50,12653,2255],{},[50,12655,2421],{},[50,12657,5937],{},[14,12659,67],{"id":67},[10,12661,70],{},[72,12663,12664],{"className":74,"code":5945,"language":76,"meta":77,"style":77},[50,12665,12666,12670,12674,12678,12682,12686],{"__ignoreMap":77},[81,12667,12668],{"class":83,"line":84},[81,12669,5952],{},[81,12671,12672],{"class":83,"line":90},[81,12673,5957],{},[81,12675,12676],{"class":83,"line":97},[81,12677,5962],{},[81,12679,12680],{"class":83,"line":103},[81,12681,94],{"emptyLinePlaceholder":93},[81,12683,12684],{"class":83,"line":109},[81,12685,5971],{},[81,12687,12688],{"class":83,"line":115},[81,12689,5976],{},[10,12691,121],{},[72,12693,12695],{"className":12694,"code":5982,"language":127,"meta":77},[125],[50,12696,5982],{"__ignoreMap":77},[10,12698,132],{},[14,12700,135],{"id":135},[137,12702,12703,12709],{},[40,12704,5993,12705,5997,12707,6000],{},[50,12706,5996],{},[50,12708,2242],{},[40,12710,6003],{},[14,12712,173],{"id":173},[37,12714,12715,12719],{},[40,12716,6010,12717,6014],{},[50,12718,6013],{},[40,12720,6017],{},[14,12722,191],{"id":191},[137,12724,12725,12727],{},[40,12726,6024],{},[40,12728,6027,12729,6031],{},[50,12730,6030],{},[10,12732,202],{},[14,12734,205],{"id":205},[10,12736,6038],{},[210,12738,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12740},[12741,12742,12743,12744,12745,12746,12747,12748],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":5896,"description":5901},[225,6058,6059],{"id":6062,"title":6063,"body":12753,"category":225,"cover":226,"description":6068,"extension":227,"meta":12930,"navigation":93,"path":6296,"pinned":230,"publishedAt":231,"seo":12931,"slug":6298,"stem":6299,"summary":6300,"tags":12932,"updatedAt":231,"visible":93,"__hash__":6304},{"type":7,"value":12754,"toc":12918},[12755,12757,12759,12763,12765,12769,12775,12777,12789,12791,12795,12819,12823,12839,12845,12847,12852,12854,12856,12872,12874,12876,12880,12884,12886,12898,12900,12910,12912,12914,12916],[10,12756,6068],{},[14,12758,16],{"id":16},[10,12760,6073,12761,6076],{},[294,12762,5996],{},[14,12764,22],{"id":22},[10,12766,12767],{},[26,12768],{"alt":6083,"src":6084},[10,12770,6087,12771,6091,12773,6095],{},[50,12772,6090],{},[50,12774,6094],{},[14,12776,35],{"id":35},[37,12778,12779,12783,12785],{},[40,12780,6102,12781,6105],{},[50,12782,1167],{},[40,12784,6108],{},[40,12786,6111,12787,6115],{},[50,12788,6114],{},[14,12790,67],{"id":67},[10,12792,6120,12793,6124],{},[50,12794,6123],{},[72,12796,12797],{"className":74,"code":6127,"language":76,"meta":77,"style":77},[50,12798,12799,12803,12807,12811,12815],{"__ignoreMap":77},[81,12800,12801],{"class":83,"line":84},[81,12802,6134],{},[81,12804,12805],{"class":83,"line":90},[81,12806,6139],{},[81,12808,12809],{"class":83,"line":97},[81,12810,94],{"emptyLinePlaceholder":93},[81,12812,12813],{"class":83,"line":103},[81,12814,6148],{},[81,12816,12817],{"class":83,"line":109},[81,12818,6153],{},[10,12820,6156,12821,6160],{},[50,12822,6159],{},[72,12824,12825],{"className":74,"code":6163,"language":76,"meta":77,"style":77},[50,12826,12827,12831,12835],{"__ignoreMap":77},[81,12828,12829],{"class":83,"line":84},[81,12830,6170],{},[81,12832,12833],{"class":83,"line":90},[81,12834,94],{"emptyLinePlaceholder":93},[81,12836,12837],{"class":83,"line":97},[81,12838,6179],{},[10,12840,6182,12841,148,12843,64],{},[50,12842,6185],{},[50,12844,6188],{},[10,12846,121],{},[72,12848,12850],{"className":12849,"code":6194,"language":127,"meta":77},[125],[50,12851,6194],{"__ignoreMap":77},[10,12853,132],{},[14,12855,135],{"id":135},[137,12857,12858,12864],{},[40,12859,6205,12860,6208,12862,6212],{},[50,12861,6123],{},[50,12863,6211],{},[40,12865,12866,6217,12868,6220,12870,6223],{},[50,12867,6159],{},[50,12869,6123],{},[50,12871,6159],{},[156,12873,158],{"id":158},[10,12875,6228],{},[10,12877,12878],{},[26,12879],{"alt":6233,"src":6234},[10,12881,6237,12882,6240],{},[50,12883,6211],{},[14,12885,173],{"id":173},[37,12887,12888,12894],{},[40,12889,6247,12890,148,12892,64],{},[50,12891,6123],{},[50,12893,6159],{},[40,12895,6254,12896,6258],{},[50,12897,6257],{},[14,12899,191],{"id":191},[137,12901,12902,12906],{},[40,12903,2349,12904,6268],{},[50,12905,6267],{},[40,12907,6271,12908,64],{},[50,12909,6090],{},[10,12911,202],{},[14,12913,205],{"id":205},[10,12915,6280],{},[210,12917,212],{},{"title":77,"searchDepth":90,"depth":90,"links":12919},[12920,12921,12922,12923,12924,12927,12928,12929],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":12925},[12926],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":6063,"description":6068},[225,6302,6303],{"id":6306,"title":6307,"body":12934,"category":225,"cover":226,"description":6312,"extension":227,"meta":13073,"navigation":93,"path":6478,"pinned":230,"publishedAt":231,"seo":13074,"slug":6480,"stem":6481,"summary":6482,"tags":13075,"updatedAt":231,"visible":93,"__hash__":6485},{"type":7,"value":12935,"toc":13063},[12936,12938,12940,12942,12944,12948,12950,12952,12962,12964,12966,13006,13008,13013,13015,13017,13035,13037,13045,13047,13055,13057,13059,13061],[10,12937,6312],{},[14,12939,16],{"id":16},[10,12941,6317],{},[14,12943,22],{"id":22},[10,12945,12946],{},[26,12947],{"alt":6324,"src":6325},[10,12949,6328],{},[14,12951,35],{"id":35},[37,12953,12954,12958,12960],{},[40,12955,12956,6338],{},[50,12957,6337],{},[40,12959,6341],{},[40,12961,6344],{},[14,12963,67],{"id":67},[10,12965,1570],{},[72,12967,12968],{"className":589,"code":6351,"language":591,"meta":77,"style":77},[50,12969,12970,12980,12986,12992,13002],{"__ignoreMap":77},[81,12971,12972,12974,12976,12978],{"class":83,"line":84},[81,12973,689],{"class":598},[81,12975,631],{"class":601},[81,12977,6362],{"class":634},[81,12979,6365],{"class":634},[81,12981,12982,12984],{"class":83,"line":90},[81,12983,6370],{"class":601},[81,12985,6373],{"class":634},[81,12987,12988,12990],{"class":83,"line":97},[81,12989,76],{"class":598},[81,12991,602],{"class":601},[81,12993,12994,12996,12998,13000],{"class":83,"line":103},[81,12995,76],{"class":598},[81,12997,631],{"class":601},[81,12999,635],{"class":634},[81,13001,602],{"class":601},[81,13003,13004],{"class":83,"line":109},[81,13005,6394],{"class":598},[10,13007,121],{},[72,13009,13011],{"className":13010,"code":6400,"language":127,"meta":77},[125],[50,13012,6400],{"__ignoreMap":77},[10,13014,132],{},[14,13016,135],{"id":135},[137,13018,13019,13025],{},[40,13020,13021,6414,13023,6417],{},[50,13022,6413],{},[50,13024,689],{},[40,13026,6420,13027,2172,13029,6426,13031,3724,13033,6432],{},[50,13028,76],{},[50,13030,6425],{},[50,13032,6337],{},[50,13034,6431],{},[14,13036,173],{"id":173},[37,13038,13039,13041],{},[40,13040,6439],{},[40,13042,3463,13043,6444],{},[50,13044,6337],{},[14,13046,191],{"id":191},[137,13048,13049,13053],{},[40,13050,6451,13051,64],{},[50,13052,6454],{},[40,13054,6457],{},[10,13056,202],{},[14,13058,205],{"id":205},[10,13060,6464],{},[210,13062,1654],{},{"title":77,"searchDepth":90,"depth":90,"links":13064},[13065,13066,13067,13068,13069,13070,13071,13072],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":6307,"description":6312},[225,6484,260],{"id":6487,"title":6488,"body":13077,"category":225,"cover":226,"description":6493,"extension":227,"meta":13230,"navigation":93,"path":6682,"pinned":230,"publishedAt":231,"seo":13231,"slug":6684,"stem":6685,"summary":6686,"tags":13232,"updatedAt":231,"visible":93,"__hash__":6690},{"type":7,"value":13078,"toc":13220},[13079,13081,13083,13085,13087,13091,13097,13099,13115,13117,13119,13163,13165,13170,13172,13174,13186,13188,13202,13204,13212,13214,13216,13218],[10,13080,6493],{},[14,13082,16],{"id":16},[10,13084,6498],{},[14,13086,22],{"id":22},[10,13088,13089],{},[26,13090],{"alt":6505,"src":6506},[10,13092,13093,6512,13095,6515],{},[50,13094,6511],{},[50,13096,2431],{},[14,13098,35],{"id":35},[37,13100,13101,13103,13111],{},[40,13102,6522],{},[40,13104,13105,53,13107,53,13109,6534],{},[50,13106,6527],{},[50,13108,6530],{},[50,13110,6533],{},[40,13112,6537,13113,6541],{},[50,13114,6540],{},[14,13116,67],{"id":67},[10,13118,70],{},[72,13120,13121],{"className":74,"code":6548,"language":76,"meta":77,"style":77},[50,13122,13123,13127,13131,13135,13139,13143,13147,13151,13155,13159],{"__ignoreMap":77},[81,13124,13125],{"class":83,"line":84},[81,13126,6555],{},[81,13128,13129],{"class":83,"line":90},[81,13130,94],{"emptyLinePlaceholder":93},[81,13132,13133],{"class":83,"line":97},[81,13134,6564],{},[81,13136,13137],{"class":83,"line":103},[81,13138,6569],{},[81,13140,13141],{"class":83,"line":109},[81,13142,6574],{},[81,13144,13145],{"class":83,"line":115},[81,13146,94],{"emptyLinePlaceholder":93},[81,13148,13149],{"class":83,"line":2484},[81,13150,6583],{},[81,13152,13153],{"class":83,"line":2490},[81,13154,6588],{},[81,13156,13157],{"class":83,"line":3949},[81,13158,6593],{},[81,13160,13161],{"class":83,"line":4161},[81,13162,6598],{},[10,13164,121],{},[72,13166,13168],{"className":13167,"code":6604,"language":127,"meta":77},[125],[50,13169,6604],{"__ignoreMap":77},[10,13171,132],{},[14,13173,135],{"id":135},[137,13175,13176,13180],{},[40,13177,13178,6618],{},[50,13179,6617],{},[40,13181,2334,13182,6623,13184,6626],{},[50,13183,2431],{},[50,13185,6511],{},[14,13187,173],{"id":173},[37,13189,13190,13196],{},[40,13191,3463,13192,6635,13194,6638],{},[50,13193,6511],{},[50,13195,6527],{},[40,13197,6641,13198,182,13200,6647],{},[50,13199,2431],{},[50,13201,6646],{},[14,13203,191],{"id":191},[137,13205,13206,13210],{},[40,13207,6654,13208,6658],{},[50,13209,6657],{},[40,13211,6661],{},[10,13213,202],{},[14,13215,205],{"id":205},[10,13217,6668],{},[210,13219,212],{},{"title":77,"searchDepth":90,"depth":90,"links":13221},[13222,13223,13224,13225,13226,13227,13228,13229],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":6488,"description":6493},[225,6688,6689],{"id":6692,"title":6693,"body":13234,"category":225,"cover":226,"description":6698,"extension":227,"meta":13381,"navigation":93,"path":6877,"pinned":230,"publishedAt":231,"seo":13382,"slug":6879,"stem":6880,"summary":6881,"tags":13383,"updatedAt":231,"visible":93,"__hash__":6885},{"type":7,"value":13235,"toc":13371},[13236,13238,13240,13242,13244,13248,13250,13252,13270,13272,13274,13322,13324,13329,13331,13333,13341,13343,13353,13355,13363,13365,13367,13369],[10,13237,6698],{},[14,13239,16],{"id":16},[10,13241,6703],{},[14,13243,22],{"id":22},[10,13245,13246],{},[26,13247],{"alt":6710,"src":6711},[10,13249,6714],{},[14,13251,35],{"id":35},[37,13253,13254,13258,13264],{},[40,13255,13256,6724],{},[50,13257,6723],{},[40,13259,13260,6730,13262,64],{},[50,13261,6729],{},[50,13263,6733],{},[40,13265,6736,13266,6740,13268,6744],{},[50,13267,6739],{},[50,13269,6743],{},[14,13271,67],{"id":67},[10,13273,70],{},[72,13275,13276],{"className":74,"code":6751,"language":76,"meta":77,"style":77},[50,13277,13278,13282,13286,13290,13294,13298,13302,13306,13310,13314,13318],{"__ignoreMap":77},[81,13279,13280],{"class":83,"line":84},[81,13281,6555],{},[81,13283,13284],{"class":83,"line":90},[81,13285,94],{"emptyLinePlaceholder":93},[81,13287,13288],{"class":83,"line":97},[81,13289,6766],{},[81,13291,13292],{"class":83,"line":103},[81,13293,6771],{},[81,13295,13296],{"class":83,"line":109},[81,13297,6776],{},[81,13299,13300],{"class":83,"line":115},[81,13301,6781],{},[81,13303,13304],{"class":83,"line":2484},[81,13305,94],{"emptyLinePlaceholder":93},[81,13307,13308],{"class":83,"line":2490},[81,13309,6790],{},[81,13311,13312],{"class":83,"line":3949},[81,13313,6795],{},[81,13315,13316],{"class":83,"line":4161},[81,13317,6800],{},[81,13319,13320],{"class":83,"line":5781},[81,13321,6805],{},[10,13323,121],{},[72,13325,13327],{"className":13326,"code":6811,"language":127,"meta":77},[125],[50,13328,6811],{"__ignoreMap":77},[10,13330,132],{},[14,13332,135],{"id":135},[137,13334,13335,13339],{},[40,13336,6822,13337,6825],{},[50,13338,6739],{},[40,13340,6828],{},[14,13342,173],{"id":173},[37,13344,13345,13349],{},[40,13346,2334,13347,6837],{},[50,13348,6723],{},[40,13350,6840,13351,64],{},[50,13352,6843],{},[14,13354,191],{"id":191},[137,13356,13357,13359],{},[40,13358,6850],{},[40,13360,6853,13361,6856],{},[50,13362,335],{},[10,13364,202],{},[14,13366,205],{"id":205},[10,13368,6863],{},[210,13370,212],{},{"title":77,"searchDepth":90,"depth":90,"links":13372},[13373,13374,13375,13376,13377,13378,13379,13380],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":6693,"description":6698},[225,6883,6884],{"id":6887,"title":6888,"body":13385,"category":225,"cover":226,"description":6893,"extension":227,"meta":13528,"navigation":93,"path":7061,"pinned":230,"publishedAt":231,"seo":13529,"slug":7063,"stem":7064,"summary":7065,"tags":13530,"updatedAt":231,"visible":93,"__hash__":7069},{"type":7,"value":13386,"toc":13518},[13387,13389,13391,13393,13395,13399,13405,13407,13417,13419,13421,13473,13475,13480,13482,13484,13494,13496,13502,13504,13510,13512,13514,13516],[10,13388,6893],{},[14,13390,16],{"id":16},[10,13392,6898],{},[14,13394,22],{"id":22},[10,13396,13397],{},[26,13398],{"alt":6905,"src":6906},[10,13400,13401,6912,13403,6916],{},[50,13402,6911],{},[50,13404,6915],{},[14,13406,35],{"id":35},[37,13408,13409,13411,13415],{},[40,13410,6923],{},[40,13412,13413,6929],{},[50,13414,6928],{},[40,13416,6932],{},[14,13418,67],{"id":67},[10,13420,70],{},[72,13422,13423],{"className":74,"code":6939,"language":76,"meta":77,"style":77},[50,13424,13425,13429,13433,13437,13441,13445,13449,13453,13457,13461,13465,13469],{"__ignoreMap":77},[81,13426,13427],{"class":83,"line":84},[81,13428,6946],{},[81,13430,13431],{"class":83,"line":90},[81,13432,94],{"emptyLinePlaceholder":93},[81,13434,13435],{"class":83,"line":97},[81,13436,6955],{},[81,13438,13439],{"class":83,"line":103},[81,13440,94],{"emptyLinePlaceholder":93},[81,13442,13443],{"class":83,"line":109},[81,13444,6964],{},[81,13446,13447],{"class":83,"line":115},[81,13448,6969],{},[81,13450,13451],{"class":83,"line":2484},[81,13452,6781],{},[81,13454,13455],{"class":83,"line":2490},[81,13456,94],{"emptyLinePlaceholder":93},[81,13458,13459],{"class":83,"line":3949},[81,13460,6982],{},[81,13462,13463],{"class":83,"line":4161},[81,13464,6987],{},[81,13466,13467],{"class":83,"line":5781},[81,13468,6800],{},[81,13470,13471],{"class":83,"line":5786},[81,13472,6996],{},[10,13474,121],{},[72,13476,13478],{"className":13477,"code":7002,"language":127,"meta":77},[125],[50,13479,7002],{"__ignoreMap":77},[10,13481,132],{},[14,13483,135],{"id":135},[137,13485,13486,13490],{},[40,13487,13488,7015],{},[50,13489,6911],{},[40,13491,13492,7020],{},[50,13493,6915],{},[14,13495,173],{"id":173},[37,13497,13498,13500],{},[40,13499,7027],{},[40,13501,7030],{},[14,13503,191],{"id":191},[137,13505,13506,13508],{},[40,13507,7037],{},[40,13509,7040],{},[10,13511,202],{},[14,13513,205],{"id":205},[10,13515,7047],{},[210,13517,212],{},{"title":77,"searchDepth":90,"depth":90,"links":13519},[13520,13521,13522,13523,13524,13525,13526,13527],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":6888,"description":6893},[225,7067,7068],{"id":7071,"title":7072,"body":13532,"category":225,"cover":226,"description":7077,"extension":227,"meta":13683,"navigation":93,"path":7262,"pinned":230,"publishedAt":231,"seo":13684,"slug":7264,"stem":7265,"summary":7266,"tags":13685,"updatedAt":231,"visible":93,"__hash__":7270},{"type":7,"value":13533,"toc":13673},[13534,13536,13538,13540,13542,13546,13550,13552,13566,13568,13570,13622,13624,13629,13631,13633,13645,13647,13657,13659,13665,13667,13669,13671],[10,13535,7077],{},[14,13537,16],{"id":16},[10,13539,7082],{},[14,13541,22],{"id":22},[10,13543,13544],{},[26,13545],{"alt":7089,"src":7090},[10,13547,13548,7096],{},[50,13549,7095],{},[14,13551,35],{"id":35},[37,13553,13554,13560,13564],{},[40,13555,2334,13556,7106,13558,7110],{},[50,13557,7105],{},[50,13559,7109],{},[40,13561,7113,13562,7117],{},[50,13563,7116],{},[40,13565,7120],{},[14,13567,67],{"id":67},[10,13569,70],{},[72,13571,13572],{"className":74,"code":7127,"language":76,"meta":77,"style":77},[50,13573,13574,13578,13582,13586,13590,13594,13598,13602,13606,13610,13614,13618],{"__ignoreMap":77},[81,13575,13576],{"class":83,"line":84},[81,13577,7134],{},[81,13579,13580],{"class":83,"line":90},[81,13581,94],{"emptyLinePlaceholder":93},[81,13583,13584],{"class":83,"line":97},[81,13585,7143],{},[81,13587,13588],{"class":83,"line":103},[81,13589,7148],{},[81,13591,13592],{"class":83,"line":109},[81,13593,7153],{},[81,13595,13596],{"class":83,"line":115},[81,13597,7158],{},[81,13599,13600],{"class":83,"line":2484},[81,13601,7163],{},[81,13603,13604],{"class":83,"line":2490},[81,13605,94],{"emptyLinePlaceholder":93},[81,13607,13608],{"class":83,"line":3949},[81,13609,7172],{},[81,13611,13612],{"class":83,"line":4161},[81,13613,7177],{},[81,13615,13616],{"class":83,"line":5781},[81,13617,7182],{},[81,13619,13620],{"class":83,"line":5786},[81,13621,7187],{},[10,13623,121],{},[72,13625,13627],{"className":13626,"code":7193,"language":127,"meta":77},[125],[50,13628,7193],{"__ignoreMap":77},[10,13630,132],{},[14,13632,135],{"id":135},[137,13634,13635,13641],{},[40,13636,13637,7207,13639,7210],{},[50,13638,7206],{},[50,13640,7116],{},[40,13642,13643,7215],{},[50,13644,7095],{},[14,13646,173],{"id":173},[37,13648,13649,13651],{},[40,13650,7222],{},[40,13652,7225,13653,7228,13655,7231],{},[50,13654,7105],{},[50,13656,7109],{},[14,13658,191],{"id":191},[137,13660,13661,13663],{},[40,13662,7238],{},[40,13664,7241],{},[10,13666,202],{},[14,13668,205],{"id":205},[10,13670,7248],{},[210,13672,212],{},{"title":77,"searchDepth":90,"depth":90,"links":13674},[13675,13676,13677,13678,13679,13680,13681,13682],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":7072,"description":7077},[225,7268,7269],{"id":7272,"title":7273,"body":13687,"category":225,"cover":226,"description":7278,"extension":227,"meta":13901,"navigation":93,"path":7552,"pinned":230,"publishedAt":231,"seo":13902,"slug":7554,"stem":7555,"summary":7556,"tags":13903,"updatedAt":231,"visible":93,"__hash__":7560},{"type":7,"value":13688,"toc":13888},[13689,13691,13693,13695,13697,13701,13707,13709,13721,13723,13725,13785,13787,13792,13794,13796,13814,13816,13824,13828,13836,13838,13842,13846,13852,13854,13864,13866,13880,13882,13884,13886],[10,13690,7278],{},[14,13692,16],{"id":16},[10,13694,7283],{},[14,13696,22],{"id":22},[10,13698,13699],{},[26,13700],{"alt":7290,"src":7291},[10,13702,7294,13703,7298,13705,7302],{},[50,13704,7297],{},[50,13706,7301],{},[14,13708,35],{"id":35},[37,13710,13711,13715,13719],{},[40,13712,7309,13713,7312],{},[50,13714,7297],{},[40,13716,13717,7318],{},[50,13718,7317],{},[40,13720,7321],{},[14,13722,67],{"id":67},[10,13724,70],{},[72,13726,13727],{"className":74,"code":7328,"language":76,"meta":77,"style":77},[50,13728,13729,13733,13737,13741,13745,13749,13753,13757,13761,13765,13769,13773,13777,13781],{"__ignoreMap":77},[81,13730,13731],{"class":83,"line":84},[81,13732,7335],{},[81,13734,13735],{"class":83,"line":90},[81,13736,7340],{},[81,13738,13739],{"class":83,"line":97},[81,13740,7345],{},[81,13742,13743],{"class":83,"line":103},[81,13744,7350],{},[81,13746,13747],{"class":83,"line":109},[81,13748,7355],{},[81,13750,13751],{"class":83,"line":115},[81,13752,94],{"emptyLinePlaceholder":93},[81,13754,13755],{"class":83,"line":2484},[81,13756,7364],{},[81,13758,13759],{"class":83,"line":2490},[81,13760,7369],{},[81,13762,13763],{"class":83,"line":3949},[81,13764,7374],{},[81,13766,13767],{"class":83,"line":4161},[81,13768,7379],{},[81,13770,13771],{"class":83,"line":5781},[81,13772,1143],{},[81,13774,13775],{"class":83,"line":5786},[81,13776,7388],{},[81,13778,13779],{"class":83,"line":7391},[81,13780,7394],{},[81,13782,13783],{"class":83,"line":7397},[81,13784,7400],{},[10,13786,121],{},[72,13788,13790],{"className":13789,"code":7406,"language":127,"meta":77},[125],[50,13791,7406],{"__ignoreMap":77},[10,13793,132],{},[14,13795,135],{"id":135},[137,13797,13798,13806],{},[40,13799,13800,7419,13802,7422,13804,7426],{},[50,13801,3032],{},[50,13803,7317],{},[50,13805,7425],{},[40,13807,7429,13808,7432,13810,7435,13812,64],{},[50,13809,7297],{},[50,13811,1156],{},[50,13813,7301],{},[156,13815,158],{"id":158},[10,13817,13818,53,13820,148,13822,7448],{},[50,13819,7297],{},[50,13821,1156],{},[50,13823,7301],{},[10,13825,13826],{},[26,13827],{"alt":7453,"src":7454},[10,13829,13830,7459,13832,7462,13834,7465],{},[50,13831,7297],{},[50,13833,1156],{},[50,13835,7301],{},[156,13837,158],{"id":4216},[10,13839,13840,7473],{},[50,13841,7472],{},[10,13843,13844],{},[26,13845],{"alt":7478,"src":7479},[10,13847,7482,13848,7485,13850,7488],{},[50,13849,7472],{},[50,13851,1156],{},[14,13853,173],{"id":173},[37,13855,13856,13860],{},[40,13857,7495,13858,7499],{},[50,13859,7498],{},[40,13861,7502,13862,7505],{},[50,13863,7472],{},[14,13865,191],{"id":191},[137,13867,13868,13876],{},[40,13869,7512,13870,7516,13872,148,13874,64],{},[50,13871,7515],{},[50,13873,7519],{},[50,13875,7522],{},[40,13877,7525,13878,7528],{},[50,13879,6733],{},[10,13881,202],{},[14,13883,205],{"id":205},[10,13885,7535],{},[210,13887,212],{},{"title":77,"searchDepth":90,"depth":90,"links":13889},[13890,13891,13892,13893,13894,13898,13899,13900],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":13895},[13896,13897],{"id":158,"depth":97,"text":158},{"id":4216,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":7273,"description":7278},[225,7558,7559],{"id":7562,"title":7563,"body":13905,"category":225,"cover":226,"description":7568,"extension":227,"meta":14056,"navigation":93,"path":7745,"pinned":230,"publishedAt":231,"seo":14057,"slug":7747,"stem":7748,"summary":7749,"tags":14058,"updatedAt":231,"visible":93,"__hash__":7752},{"type":7,"value":13906,"toc":14046},[13907,13909,13911,13913,13915,13919,13923,13925,13937,13939,13941,13989,13991,13996,13998,14000,14010,14012,14022,14024,14038,14040,14042,14044],[10,13908,7568],{},[14,13910,16],{"id":16},[10,13912,7573],{},[14,13914,22],{"id":22},[10,13916,13917],{},[26,13918],{"alt":7580,"src":7581},[10,13920,7584,13921,7587],{},[50,13922,6743],{},[14,13924,35],{"id":35},[37,13926,13927,13931,13935],{},[40,13928,13929,7596],{},[50,13930,6743],{},[40,13932,13933,7602],{},[50,13934,7601],{},[40,13936,7605],{},[14,13938,67],{"id":67},[10,13940,70],{},[72,13942,13943],{"className":74,"code":7612,"language":76,"meta":77,"style":77},[50,13944,13945,13949,13953,13957,13961,13965,13969,13973,13977,13981,13985],{"__ignoreMap":77},[81,13946,13947],{"class":83,"line":84},[81,13948,6555],{},[81,13950,13951],{"class":83,"line":90},[81,13952,94],{"emptyLinePlaceholder":93},[81,13954,13955],{"class":83,"line":97},[81,13956,6766],{},[81,13958,13959],{"class":83,"line":103},[81,13960,94],{"emptyLinePlaceholder":93},[81,13962,13963],{"class":83,"line":109},[81,13964,7635],{},[81,13966,13967],{"class":83,"line":115},[81,13968,7640],{},[81,13970,13971],{"class":83,"line":2484},[81,13972,94],{"emptyLinePlaceholder":93},[81,13974,13975],{"class":83,"line":2490},[81,13976,7649],{},[81,13978,13979],{"class":83,"line":3949},[81,13980,7654],{},[81,13982,13983],{"class":83,"line":4161},[81,13984,94],{"emptyLinePlaceholder":93},[81,13986,13987],{"class":83,"line":5781},[81,13988,7663],{},[10,13990,121],{},[72,13992,13994],{"className":13993,"code":7669,"language":127,"meta":77},[125],[50,13995,7669],{"__ignoreMap":77},[10,13997,132],{},[14,13999,135],{"id":135},[137,14001,14002,14008],{},[40,14003,7584,14004,7682,14006,64],{},[50,14005,6743],{},[50,14007,7685],{},[40,14009,7688],{},[14,14011,173],{"id":173},[37,14013,14014,14018],{},[40,14015,4784,14016,7697],{},[50,14017,6743],{},[40,14019,7700,14020,7703],{},[50,14021,6743],{},[14,14023,191],{"id":191},[137,14025,14026,14032],{},[40,14027,7710,14028,7714,14030,64],{},[50,14029,7713],{},[50,14031,6743],{},[40,14033,4784,14034,7721,14036,64],{},[50,14035,6743],{},[50,14037,7724],{},[10,14039,202],{},[14,14041,205],{"id":205},[10,14043,7731],{},[210,14045,212],{},{"title":77,"searchDepth":90,"depth":90,"links":14047},[14048,14049,14050,14051,14052,14053,14054,14055],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":7563,"description":7568},[225,6743,7751],{"id":7754,"title":7755,"body":14060,"category":225,"cover":226,"description":7760,"extension":227,"meta":14231,"navigation":93,"path":7973,"pinned":230,"publishedAt":231,"seo":14232,"slug":7975,"stem":7976,"summary":7977,"tags":14233,"updatedAt":231,"visible":93,"__hash__":7981},{"type":7,"value":14061,"toc":14219},[14062,14064,14066,14068,14070,14074,14076,14078,14090,14092,14094,14150,14152,14157,14159,14161,14177,14179,14181,14185,14191,14193,14201,14203,14211,14213,14215,14217],[10,14063,7760],{},[14,14065,16],{"id":16},[10,14067,7765],{},[14,14069,22],{"id":22},[10,14071,14072],{},[26,14073],{"alt":7772,"src":7773},[10,14075,7776],{},[14,14077,35],{"id":35},[37,14079,14080,14084,14088],{},[40,14081,14082,7786],{},[50,14083,7785],{},[40,14085,14086,7792],{},[50,14087,7791],{},[40,14089,7795],{},[14,14091,67],{"id":67},[10,14093,70],{},[72,14095,14096],{"className":74,"code":7802,"language":76,"meta":77,"style":77},[50,14097,14098,14102,14106,14110,14114,14118,14122,14126,14130,14134,14138,14142,14146],{"__ignoreMap":77},[81,14099,14100],{"class":83,"line":84},[81,14101,7809],{},[81,14103,14104],{"class":83,"line":90},[81,14105,7814],{},[81,14107,14108],{"class":83,"line":97},[81,14109,7819],{},[81,14111,14112],{"class":83,"line":103},[81,14113,7824],{},[81,14115,14116],{"class":83,"line":109},[81,14117,94],{"emptyLinePlaceholder":93},[81,14119,14120],{"class":83,"line":115},[81,14121,7833],{},[81,14123,14124],{"class":83,"line":2484},[81,14125,7838],{},[81,14127,14128],{"class":83,"line":2490},[81,14129,7843],{},[81,14131,14132],{"class":83,"line":3949},[81,14133,7848],{},[81,14135,14136],{"class":83,"line":4161},[81,14137,94],{"emptyLinePlaceholder":93},[81,14139,14140],{"class":83,"line":5781},[81,14141,7857],{},[81,14143,14144],{"class":83,"line":5786},[81,14145,7862],{},[81,14147,14148],{"class":83,"line":7391},[81,14149,7867],{},[10,14151,121],{},[72,14153,14155],{"className":14154,"code":7873,"language":127,"meta":77},[125],[50,14156,7873],{"__ignoreMap":77},[10,14158,132],{},[14,14160,135],{"id":135},[137,14162,14163,14169],{},[40,14164,7884,14165,7888,14167,7891],{},[50,14166,7887],{},[50,14168,7791],{},[40,14170,14171,7897,14173,7901,14175,7904],{},[50,14172,7896],{},[50,14174,7900],{},[50,14176,7785],{},[156,14178,158],{"id":158},[10,14180,7909],{},[10,14182,14183],{},[26,14184],{"alt":7914,"src":7915},[10,14186,7918,14187,148,14189,7924],{},[50,14188,4581],{},[50,14190,7923],{},[14,14192,173],{"id":173},[37,14194,14195,14199],{},[40,14196,7931,14197,7934],{},[50,14198,7785],{},[40,14200,7937],{},[14,14202,191],{"id":191},[137,14204,14205,14209],{},[40,14206,5249,14207,7947],{},[50,14208,7946],{},[40,14210,7950],{},[10,14212,202],{},[14,14214,205],{"id":205},[10,14216,7957],{},[210,14218,212],{},{"title":77,"searchDepth":90,"depth":90,"links":14220},[14221,14222,14223,14224,14225,14228,14229,14230],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":14226},[14227],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":7755,"description":7760},[225,7979,7980],{"id":7983,"title":7984,"body":14235,"category":225,"cover":226,"description":7989,"extension":227,"meta":14382,"navigation":93,"path":8168,"pinned":230,"publishedAt":231,"seo":14383,"slug":8170,"stem":8171,"summary":8172,"tags":14384,"updatedAt":231,"visible":93,"__hash__":8176},{"type":7,"value":14236,"toc":14372},[14237,14239,14241,14243,14245,14249,14251,14253,14261,14263,14265,14321,14323,14328,14330,14332,14344,14346,14352,14354,14364,14366,14368,14370],[10,14238,7989],{},[14,14240,16],{"id":16},[10,14242,7994],{},[14,14244,22],{"id":22},[10,14246,14247],{},[26,14248],{"alt":8001,"src":8002},[10,14250,8005],{},[14,14252,35],{"id":35},[37,14254,14255,14257,14259],{},[40,14256,8012],{},[40,14258,8015],{},[40,14260,8018],{},[14,14262,67],{"id":67},[10,14264,70],{},[72,14266,14267],{"className":74,"code":8025,"language":76,"meta":77,"style":77},[50,14268,14269,14273,14277,14281,14285,14289,14293,14297,14301,14305,14309,14313,14317],{"__ignoreMap":77},[81,14270,14271],{"class":83,"line":84},[81,14272,8032],{},[81,14274,14275],{"class":83,"line":90},[81,14276,8037],{},[81,14278,14279],{"class":83,"line":97},[81,14280,8042],{},[81,14282,14283],{"class":83,"line":103},[81,14284,94],{"emptyLinePlaceholder":93},[81,14286,14287],{"class":83,"line":109},[81,14288,8051],{},[81,14290,14291],{"class":83,"line":115},[81,14292,8056],{},[81,14294,14295],{"class":83,"line":2484},[81,14296,8061],{},[81,14298,14299],{"class":83,"line":2490},[81,14300,94],{"emptyLinePlaceholder":93},[81,14302,14303],{"class":83,"line":3949},[81,14304,8070],{},[81,14306,14307],{"class":83,"line":4161},[81,14308,8075],{},[81,14310,14311],{"class":83,"line":5781},[81,14312,94],{"emptyLinePlaceholder":93},[81,14314,14315],{"class":83,"line":5786},[81,14316,8084],{},[81,14318,14319],{"class":83,"line":7391},[81,14320,8089],{},[10,14322,121],{},[72,14324,14326],{"className":14325,"code":8095,"language":127,"meta":77},[125],[50,14327,8095],{"__ignoreMap":77},[10,14329,132],{},[14,14331,135],{"id":135},[137,14333,14334,14340],{},[40,14335,14336,8109,14338,8113],{},[50,14337,8108],{},[50,14339,8112],{},[40,14341,8116,14342,8120],{},[50,14343,8119],{},[14,14345,173],{"id":173},[37,14347,14348,14350],{},[40,14349,8127],{},[40,14351,8130],{},[14,14353,191],{"id":191},[137,14355,14356,14362],{},[40,14357,8137,14358,8141,14360,64],{},[50,14359,8140],{},[50,14361,8144],{},[40,14363,8147],{},[10,14365,202],{},[14,14367,205],{"id":205},[10,14369,8154],{},[210,14371,212],{},{"title":77,"searchDepth":90,"depth":90,"links":14373},[14374,14375,14376,14377,14378,14379,14380,14381],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":7984,"description":7989},[225,8174,8175],{"id":8178,"title":8179,"body":14386,"category":225,"cover":226,"description":8184,"extension":227,"meta":14549,"navigation":93,"path":8388,"pinned":230,"publishedAt":231,"seo":14550,"slug":8390,"stem":8391,"summary":8392,"tags":14551,"updatedAt":231,"visible":93,"__hash__":8396},{"type":7,"value":14387,"toc":14537},[14388,14390,14392,14394,14396,14400,14404,14406,14422,14424,14426,14470,14472,14477,14479,14481,14495,14497,14501,14505,14509,14511,14517,14519,14529,14531,14533,14535],[10,14389,8184],{},[14,14391,16],{"id":16},[10,14393,8189],{},[14,14395,22],{"id":22},[10,14397,14398],{},[26,14399],{"alt":8196,"src":8197},[10,14401,8200,14402,8204],{},[50,14403,8203],{},[14,14405,35],{"id":35},[37,14407,14408,14414,14420],{},[40,14409,14410,8214,14412,8218],{},[50,14411,8213],{},[50,14413,8217],{},[40,14415,8221,14416,8225,14418,8228],{},[50,14417,8224],{},[50,14419,4335],{},[40,14421,8231],{},[14,14423,67],{"id":67},[10,14425,70],{},[72,14427,14428],{"className":74,"code":8238,"language":76,"meta":77,"style":77},[50,14429,14430,14434,14438,14442,14446,14450,14454,14458,14462,14466],{"__ignoreMap":77},[81,14431,14432],{"class":83,"line":84},[81,14433,8245],{},[81,14435,14436],{"class":83,"line":90},[81,14437,8250],{},[81,14439,14440],{"class":83,"line":97},[81,14441,8255],{},[81,14443,14444],{"class":83,"line":103},[81,14445,8260],{},[81,14447,14448],{"class":83,"line":109},[81,14449,8265],{},[81,14451,14452],{"class":83,"line":115},[81,14453,94],{"emptyLinePlaceholder":93},[81,14455,14456],{"class":83,"line":2484},[81,14457,8274],{},[81,14459,14460],{"class":83,"line":2490},[81,14461,8279],{},[81,14463,14464],{"class":83,"line":3949},[81,14465,8279],{},[81,14467,14468],{"class":83,"line":4161},[81,14469,8279],{},[10,14471,121],{},[72,14473,14475],{"className":14474,"code":8293,"language":127,"meta":77},[125],[50,14476,8293],{"__ignoreMap":77},[10,14478,132],{},[14,14480,135],{"id":135},[137,14482,14483,14487],{},[40,14484,7884,14485,8307],{},[50,14486,8306],{},[40,14488,8310,14489,8313,14491,8316,14493,8320],{},[50,14490,8217],{},[50,14492,8203],{},[50,14494,8319],{},[156,14496,158],{"id":158},[10,14498,8325,14499,8328],{},[50,14500,8217],{},[10,14502,14503],{},[26,14504],{"alt":8333,"src":8334},[10,14506,8337,14507,8340],{},[50,14508,8203],{},[14,14510,173],{"id":173},[37,14512,14513,14515],{},[40,14514,8347],{},[40,14516,8350],{},[14,14518,191],{"id":191},[137,14520,14521,14523],{},[40,14522,8357],{},[40,14524,4007,14525,8362,14527,8365],{},[50,14526,4335],{},[50,14528,8217],{},[10,14530,202],{},[14,14532,205],{"id":205},[10,14534,8372],{},[210,14536,212],{},{"title":77,"searchDepth":90,"depth":90,"links":14538},[14539,14540,14541,14542,14543,14546,14547,14548],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":14544},[14545],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":8179,"description":8184},[225,8394,8395],{"id":8398,"title":8399,"body":14553,"category":225,"cover":226,"description":8404,"extension":227,"meta":14736,"navigation":93,"path":8629,"pinned":230,"publishedAt":231,"seo":14737,"slug":8631,"stem":8632,"summary":8633,"tags":14738,"updatedAt":231,"visible":93,"__hash__":8636},{"type":7,"value":14554,"toc":14724},[14555,14557,14559,14561,14563,14567,14569,14571,14585,14587,14589,14657,14659,14664,14666,14668,14682,14684,14686,14690,14696,14698,14706,14708,14716,14718,14720,14722],[10,14556,8404],{},[14,14558,16],{"id":16},[10,14560,8409],{},[14,14562,22],{"id":22},[10,14564,14565],{},[26,14566],{"alt":8416,"src":8417},[10,14568,8420],{},[14,14570,35],{"id":35},[37,14572,14573,14579,14581],{},[40,14574,14575,8430,14577,64],{},[50,14576,8429],{},[50,14578,8433],{},[40,14580,8436],{},[40,14582,14583,8442],{},[50,14584,8441],{},[14,14586,67],{"id":67},[10,14588,70],{},[72,14590,14591],{"className":74,"code":8449,"language":76,"meta":77,"style":77},[50,14592,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633,14637,14641,14645,14649,14653],{"__ignoreMap":77},[81,14594,14595],{"class":83,"line":84},[81,14596,8456],{},[81,14598,14599],{"class":83,"line":90},[81,14600,94],{"emptyLinePlaceholder":93},[81,14602,14603],{"class":83,"line":97},[81,14604,8465],{},[81,14606,14607],{"class":83,"line":103},[81,14608,8470],{},[81,14610,14611],{"class":83,"line":109},[81,14612,8475],{},[81,14614,14615],{"class":83,"line":115},[81,14616,8480],{},[81,14618,14619],{"class":83,"line":2484},[81,14620,8485],{},[81,14622,14623],{"class":83,"line":2490},[81,14624,8490],{},[81,14626,14627],{"class":83,"line":3949},[81,14628,8495],{},[81,14630,14631],{"class":83,"line":4161},[81,14632,8500],{},[81,14634,14635],{"class":83,"line":5781},[81,14636,94],{"emptyLinePlaceholder":93},[81,14638,14639],{"class":83,"line":5786},[81,14640,8509],{},[81,14642,14643],{"class":83,"line":7391},[81,14644,6134],{},[81,14646,14647],{"class":83,"line":7397},[81,14648,6139],{},[81,14650,14651],{"class":83,"line":8520},[81,14652,94],{"emptyLinePlaceholder":93},[81,14654,14655],{"class":83,"line":8525},[81,14656,8528],{},[10,14658,121],{},[72,14660,14662],{"className":14661,"code":8534,"language":127,"meta":77},[125],[50,14663,8534],{"__ignoreMap":77},[10,14665,132],{},[14,14667,135],{"id":135},[137,14669,14670,14680],{},[40,14671,8545,14672,8549,14674,8553,14676,8557,14678,64],{},[50,14673,8548],{},[50,14675,8552],{},[50,14677,8556],{},[50,14679,8548],{},[40,14681,8562],{},[156,14683,158],{"id":158},[10,14685,8567],{},[10,14687,14688],{},[26,14689],{"alt":8572,"src":8573},[10,14691,14692,8578,14694,64],{},[50,14693,8429],{},[50,14695,8433],{},[14,14697,173],{"id":173},[37,14699,14700,14704],{},[40,14701,8587,14702,64],{},[50,14703,5332],{},[40,14705,8592],{},[14,14707,191],{"id":191},[137,14709,14710,14712],{},[40,14711,8599],{},[40,14713,8602,14714,8606],{},[50,14715,8605],{},[10,14717,202],{},[14,14719,205],{"id":205},[10,14721,8613],{},[210,14723,212],{},{"title":77,"searchDepth":90,"depth":90,"links":14725},[14726,14727,14728,14729,14730,14733,14734,14735],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":14731},[14732],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":8399,"description":8404},[225,8635,5283],{"id":8638,"title":8639,"body":14740,"category":225,"cover":226,"description":8644,"extension":227,"meta":14899,"navigation":93,"path":8832,"pinned":230,"publishedAt":231,"seo":14900,"slug":8834,"stem":8835,"summary":8836,"tags":14901,"updatedAt":231,"visible":93,"__hash__":8840},{"type":7,"value":14741,"toc":14887},[14742,14744,14746,14748,14750,14754,14756,14758,14766,14768,14770,14834,14836,14841,14843,14845,14853,14855,14857,14861,14863,14865,14871,14873,14879,14881,14883,14885],[10,14743,8644],{},[14,14745,16],{"id":16},[10,14747,8649],{},[14,14749,22],{"id":22},[10,14751,14752],{},[26,14753],{"alt":8656,"src":8657},[10,14755,8660],{},[14,14757,35],{"id":35},[37,14759,14760,14762,14764],{},[40,14761,8667],{},[40,14763,8670],{},[40,14765,8673],{},[14,14767,67],{"id":67},[10,14769,70],{},[72,14771,14772],{"className":74,"code":8680,"language":76,"meta":77,"style":77},[50,14773,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810,14814,14818,14822,14826,14830],{"__ignoreMap":77},[81,14775,14776],{"class":83,"line":84},[81,14777,8687],{},[81,14779,14780],{"class":83,"line":90},[81,14781,8692],{},[81,14783,14784],{"class":83,"line":97},[81,14785,94],{"emptyLinePlaceholder":93},[81,14787,14788],{"class":83,"line":103},[81,14789,8701],{},[81,14791,14792],{"class":83,"line":109},[81,14793,94],{"emptyLinePlaceholder":93},[81,14795,14796],{"class":83,"line":115},[81,14797,8710],{},[81,14799,14800],{"class":83,"line":2484},[81,14801,8715],{},[81,14803,14804],{"class":83,"line":2490},[81,14805,8720],{},[81,14807,14808],{"class":83,"line":3949},[81,14809,94],{"emptyLinePlaceholder":93},[81,14811,14812],{"class":83,"line":4161},[81,14813,8729],{},[81,14815,14816],{"class":83,"line":5781},[81,14817,8734],{},[81,14819,14820],{"class":83,"line":5786},[81,14821,8739],{},[81,14823,14824],{"class":83,"line":7391},[81,14825,94],{"emptyLinePlaceholder":93},[81,14827,14828],{"class":83,"line":7397},[81,14829,6148],{},[81,14831,14832],{"class":83,"line":8520},[81,14833,8752],{},[10,14835,121],{},[72,14837,14839],{"className":14838,"code":8758,"language":127,"meta":77},[125],[50,14840,8758],{"__ignoreMap":77},[10,14842,132],{},[14,14844,135],{"id":135},[137,14846,14847,14851],{},[40,14848,14849,8772],{},[50,14850,8771],{},[40,14852,8775],{},[156,14854,158],{"id":158},[10,14856,8780],{},[10,14858,14859],{},[26,14860],{"alt":8785,"src":8786},[10,14862,8789],{},[14,14864,173],{"id":173},[37,14866,14867,14869],{},[40,14868,8796],{},[40,14870,8799],{},[14,14872,191],{"id":191},[137,14874,14875,14877],{},[40,14876,8806],{},[40,14878,8809],{},[10,14880,202],{},[14,14882,205],{"id":205},[10,14884,8816],{},[210,14886,212],{},{"title":77,"searchDepth":90,"depth":90,"links":14888},[14889,14890,14891,14892,14893,14896,14897,14898],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":14894},[14895],{"id":158,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":8639,"description":8644},[225,8838,8839],{"id":8842,"title":8843,"body":14903,"category":225,"cover":226,"description":8848,"extension":227,"meta":15141,"navigation":93,"path":9149,"pinned":230,"publishedAt":231,"seo":15142,"slug":9151,"stem":9152,"summary":9153,"tags":15143,"updatedAt":231,"visible":93,"__hash__":9157},{"type":7,"value":14904,"toc":15128},[14905,14907,14909,14911,14913,14917,14919,14921,14931,14933,14935,15051,15053,15058,15060,15062,15072,15074,15076,15080,15082,15084,15086,15090,15094,15096,15104,15106,15120,15122,15124,15126],[10,14906,8848],{},[14,14908,16],{"id":16},[10,14910,8853],{},[14,14912,22],{"id":22},[10,14914,14915],{},[26,14916],{"alt":8860,"src":8861},[10,14918,8864],{},[14,14920,35],{"id":35},[37,14922,14923,14925,14927],{},[40,14924,8871],{},[40,14926,8874],{},[40,14928,8877,14929,8881],{},[50,14930,8880],{},[14,14932,67],{"id":67},[10,14934,70],{},[72,14936,14937],{"className":74,"code":8888,"language":76,"meta":77,"style":77},[50,14938,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035,15039,15043,15047],{"__ignoreMap":77},[81,14940,14941],{"class":83,"line":84},[81,14942,6946],{},[81,14944,14945],{"class":83,"line":90},[81,14946,6555],{},[81,14948,14949],{"class":83,"line":97},[81,14950,94],{"emptyLinePlaceholder":93},[81,14952,14953],{"class":83,"line":103},[81,14954,8907],{},[81,14956,14957],{"class":83,"line":109},[81,14958,8912],{},[81,14960,14961],{"class":83,"line":115},[81,14962,8917],{},[81,14964,14965],{"class":83,"line":2484},[81,14966,8922],{},[81,14968,14969],{"class":83,"line":2490},[81,14970,94],{"emptyLinePlaceholder":93},[81,14972,14973],{"class":83,"line":3949},[81,14974,8931],{},[81,14976,14977],{"class":83,"line":4161},[81,14978,8936],{},[81,14980,14981],{"class":83,"line":5781},[81,14982,8941],{},[81,14984,14985],{"class":83,"line":5786},[81,14986,8946],{},[81,14988,14989],{"class":83,"line":7391},[81,14990,8951],{},[81,14992,14993],{"class":83,"line":7397},[81,14994,94],{"emptyLinePlaceholder":93},[81,14996,14997],{"class":83,"line":8520},[81,14998,8960],{},[81,15000,15001],{"class":83,"line":8525},[81,15002,8965],{},[81,15004,15005],{"class":83,"line":8968},[81,15006,8971],{},[81,15008,15009],{"class":83,"line":8974},[81,15010,94],{"emptyLinePlaceholder":93},[81,15012,15013],{"class":83,"line":8979},[81,15014,8982],{},[81,15016,15017],{"class":83,"line":8985},[81,15018,94],{"emptyLinePlaceholder":93},[81,15020,15021],{"class":83,"line":8990},[81,15022,7364],{},[81,15024,15025],{"class":83,"line":8995},[81,15026,8998],{},[81,15028,15029],{"class":83,"line":9001},[81,15030,9004],{},[81,15032,15033],{"class":83,"line":9007},[81,15034,9010],{},[81,15036,15037],{"class":83,"line":9013},[81,15038,7374],{},[81,15040,15041],{"class":83,"line":9018},[81,15042,9021],{},[81,15044,15045],{"class":83,"line":9024},[81,15046,1143],{},[81,15048,15049],{"class":83,"line":9029},[81,15050,9032],{},[10,15052,121],{},[72,15054,15056],{"className":15055,"code":9038,"language":127,"meta":77},[125],[50,15057,9038],{"__ignoreMap":77},[10,15059,132],{},[14,15061,135],{"id":135},[137,15063,15064,15068],{},[40,15065,9049,15066,9052],{},[50,15067,8880],{},[40,15069,15070,9057],{},[50,15071,8112],{},[156,15073,158],{"id":158},[10,15075,9062],{},[10,15077,15078],{},[26,15079],{"alt":9067,"src":9068},[10,15081,9071],{},[156,15083,158],{"id":4216},[10,15085,9076],{},[10,15087,15088],{},[26,15089],{"alt":9081,"src":9082},[10,15091,9085,15092,9089],{},[50,15093,9088],{},[14,15095,173],{"id":173},[37,15097,15098,15100],{},[40,15099,9096],{},[40,15101,9099,15102,9102],{},[50,15103,9088],{},[14,15105,191],{"id":191},[137,15107,15108,15112,15114],{},[40,15109,9109,15110,9112],{},[50,15111,9088],{},[40,15113,9115],{},[40,15115,9118,15116,9122,15118,9125],{},[50,15117,9121],{},[50,15119,6090],{},[10,15121,202],{},[14,15123,205],{"id":205},[10,15125,9132],{},[210,15127,212],{},{"title":77,"searchDepth":90,"depth":90,"links":15129},[15130,15131,15132,15133,15134,15138,15139,15140],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":35,"depth":90,"text":35},{"id":67,"depth":90,"text":67},{"id":135,"depth":90,"text":135,"children":15135},[15136,15137],{"id":158,"depth":97,"text":158},{"id":4216,"depth":97,"text":158},{"id":173,"depth":90,"text":173},{"id":191,"depth":90,"text":191},{"id":205,"depth":90,"text":205},{},{"title":8843,"description":8848},[225,9155,9156],{"id":1053,"title":1054,"body":15145,"category":225,"cover":1062,"description":77,"extension":227,"meta":15381,"navigation":93,"path":1378,"pinned":230,"publishedAt":1379,"seo":15382,"slug":1381,"stem":1382,"summary":1383,"tags":15383,"updatedAt":1379,"visible":93,"__hash__":1387},{"type":7,"value":15146,"toc":15366},[15147,15151,15153,15155,15157,15159,15179,15181,15186,15188,15190,15218,15224,15226,15230,15232,15252,15254,15264,15266,15268,15270,15272,15274,15276,15278,15280,15282,15302,15304,15306,15310,15312,15314,15316,15318,15322,15324,15342,15344,15346,15348,15350,15352,15354,15356,15358,15360,15362,15364],[10,15148,15149],{},[26,15150],{"alt":1061,"src":1062},[10,15152,1065],{},[10,15154,1068],{},[14,15156,1072],{"id":1071},[10,15158,1075],{},[72,15160,15161],{"className":74,"code":1078,"language":76,"meta":77,"style":77},[50,15162,15163,15167,15171,15175],{"__ignoreMap":77},[81,15164,15165],{"class":83,"line":84},[81,15166,1085],{},[81,15168,15169],{"class":83,"line":90},[81,15170,1090],{},[81,15172,15173],{"class":83,"line":97},[81,15174,94],{"emptyLinePlaceholder":93},[81,15176,15177],{"class":83,"line":103},[81,15178,1099],{},[10,15180,1102],{},[72,15182,15184],{"className":15183,"code":1106,"language":127,"meta":77},[125],[50,15185,1106],{"__ignoreMap":77},[10,15187,1111],{},[10,15189,1114],{},[72,15191,15192],{"className":74,"code":1117,"language":76,"meta":77,"style":77},[50,15193,15194,15198,15202,15206,15210,15214],{"__ignoreMap":77},[81,15195,15196],{"class":83,"line":84},[81,15197,1124],{},[81,15199,15200],{"class":83,"line":90},[81,15201,94],{"emptyLinePlaceholder":93},[81,15203,15204],{"class":83,"line":97},[81,15205,1133],{},[81,15207,15208],{"class":83,"line":103},[81,15209,1138],{},[81,15211,15212],{"class":83,"line":109},[81,15213,1143],{},[81,15215,15216],{"class":83,"line":115},[81,15217,1148],{},[10,15219,15220,148,15222,1157],{},[50,15221,1153],{},[50,15223,1156],{},[14,15225,1161],{"id":1160},[10,15227,1164,15228,1168],{},[50,15229,1167],{},[10,15231,1171],{},[72,15233,15234],{"className":74,"code":1174,"language":76,"meta":77,"style":77},[50,15235,15236,15240,15244,15248],{"__ignoreMap":77},[81,15237,15238],{"class":83,"line":84},[81,15239,1181],{},[81,15241,15242],{"class":83,"line":90},[81,15243,1186],{},[81,15245,15246],{"class":83,"line":97},[81,15247,1191],{},[81,15249,15250],{"class":83,"line":103},[81,15251,1196],{},[10,15253,1199],{},[72,15255,15256],{"className":589,"code":1202,"language":591,"meta":77,"style":77},[50,15257,15258],{"__ignoreMap":77},[81,15259,15260,15262],{"class":83,"line":84},[81,15261,689],{"class":598},[81,15263,1211],{"class":634},[10,15265,1214],{},[14,15267,1218],{"id":1217},[156,15269,1221],{"id":1221},[10,15271,1224],{},[156,15273,1227],{"id":1227},[10,15275,1230],{},[156,15277,1233],{"id":1233},[10,15279,1236],{},[10,15281,1239],{},[72,15283,15284],{"className":74,"code":1242,"language":76,"meta":77,"style":77},[50,15285,15286,15290,15294,15298],{"__ignoreMap":77},[81,15287,15288],{"class":83,"line":84},[81,15289,1249],{},[81,15291,15292],{"class":83,"line":90},[81,15293,94],{"emptyLinePlaceholder":93},[81,15295,15296],{"class":83,"line":97},[81,15297,1258],{},[81,15299,15300],{"class":83,"line":103},[81,15301,1263],{},[10,15303,1266],{},[156,15305,1269],{"id":1269},[10,15307,1272,15308,1275],{},[50,15309,260],{},[10,15311,1278],{},[156,15313,1281],{"id":1281},[10,15315,1284],{},[14,15317,1288],{"id":1287},[10,15319,15320],{},[26,15321],{"alt":1293,"src":1294},[10,15323,1297],{},[37,15325,15326,15328,15330,15332,15334,15336,15338,15340],{},[40,15327,1302],{},[40,15329,1305],{},[40,15331,1308],{},[40,15333,1311],{},[40,15335,1314],{},[40,15337,1317],{},[40,15339,1320],{},[40,15341,1323],{},[10,15343,1326],{},[14,15345,1330],{"id":1329},[10,15347,1333],{},[10,15349,1336],{},[14,15351,1340],{"id":1339},[10,15353,1343],{},[10,15355,1346],{},[10,15357,1349],{},[14,15359,1352],{"id":1352},[10,15361,1355],{},[10,15363,1358],{},[210,15365,1361],{},{"title":77,"searchDepth":90,"depth":90,"links":15367},[15368,15369,15370,15377,15378,15379,15380],{"id":1071,"depth":90,"text":1072},{"id":1160,"depth":90,"text":1161},{"id":1217,"depth":90,"text":1218,"children":15371},[15372,15373,15374,15375,15376],{"id":1221,"depth":97,"text":1221},{"id":1227,"depth":97,"text":1227},{"id":1233,"depth":97,"text":1233},{"id":1269,"depth":97,"text":1269},{"id":1281,"depth":97,"text":1281},{"id":1287,"depth":90,"text":1288},{"id":1329,"depth":90,"text":1330},{"id":1339,"depth":90,"text":1340},{"id":1352,"depth":90,"text":1352},{},{"title":1054,"description":77},[225,1385,1386],{"id":242,"title":243,"body":15385,"category":225,"cover":226,"description":77,"extension":227,"meta":15964,"navigation":93,"path":1042,"pinned":230,"publishedAt":1043,"seo":15965,"slug":1045,"stem":1046,"summary":1047,"tags":15966,"updatedAt":1043,"visible":93,"__hash__":1051},{"type":7,"value":15386,"toc":15940},[15387,15389,15391,15393,15397,15399,15401,15425,15437,15439,15441,15446,15450,15454,15466,15470,15474,15478,15480,15514,15516,15520,15524,15526,15548,15578,15590,15600,15608,15610,15616,15626,15628,15633,15637,15639,15653,15659,15679,15681,15683,15685,15695,15699,15701,15710,15714,15716,15718,15738,15742,15744,15746,15748,15750,15770,15772,15774,15776,15802,15804,15820,15822,15838,15842,15844,15846,15866,15868,15870,15872,15876,15886,15888,15890,15892,15902,15910,15912,15914,15928,15938],[14,15388,248],{"id":248},[10,15390,251],{},[10,15392,254],{},[10,15394,257,15395,261],{},[50,15396,260],{},[14,15398,264],{"id":264},[10,15400,267],{},[269,15402,15403,15405],{},[10,15404,273],{},[269,15406,15407,15413,15415,15419,15421],{},[10,15408,278,15409,282,15411,286],{},[50,15410,281],{},[50,15412,285],{},[10,15414,289],{},[10,15416,292,15417,297],{},[294,15418,296],{},[10,15420,300],{},[10,15422,15423],{},[26,15424],{"alt":305,"src":306},[269,15426,15427,15429],{},[10,15428,311],{},[269,15430,15431,15433],{},[10,15432,316],{},[10,15434,15435],{},[26,15436],{"alt":321,"src":322},[14,15438,326],{"id":325},[156,15440,330],{"id":329},[10,15442,333,15443,341],{},[335,15444,340],{"href":337,"rel":15445},[339],[269,15447,15448],{},[10,15449,346],{},[10,15451,15452],{},[26,15453],{"alt":351,"src":352},[37,15455,15456,15460,15464],{},[40,15457,357,15458,64],{},[294,15459,360],{},[40,15461,363,15462,64],{},[294,15463,366],{},[40,15465,369],{},[10,15467,15468],{},[26,15469],{"alt":374,"src":375},[269,15471,15472],{},[10,15473,380],{},[10,15475,15476],{},[26,15477],{"alt":385,"src":386},[156,15479,390],{"id":389},[269,15481,15482,15486,15490,15510],{},[269,15483,15484],{},[10,15485,397],{},[10,15487,400,15488,404],{},[294,15489,403],{},[72,15491,15492],{"className":74,"code":407,"language":76,"meta":77,"style":77},[50,15493,15494,15498,15502,15506],{"__ignoreMap":77},[81,15495,15496],{"class":83,"line":84},[81,15497,414],{},[81,15499,15500],{"class":83,"line":90},[81,15501,419],{},[81,15503,15504],{"class":83,"line":97},[81,15505,424],{},[81,15507,15508],{"class":83,"line":103},[81,15509,429],{},[10,15511,432,15512,436],{},[294,15513,435],{},[10,15515,439],{},[10,15517,442,15518,445],{},[50,15519,76],{},[10,15521,15522],{},[26,15523],{"alt":450,"src":451},[10,15525,454],{},[269,15527,15528,15530,15534],{},[10,15529,459],{},[10,15531,15532],{},[294,15533,464],{},[269,15535,15536,15540,15544],{},[10,15537,469,15538,472],{},[50,15539,76],{},[10,15541,475,15542,478],{},[50,15543,76],{},[10,15545,481,15546,485],{},[294,15547,484],{},[269,15549,15550,15552,15556],{},[10,15551,490],{},[10,15553,15554],{},[294,15555,495],{},[269,15557,15558,15564,15572,15574],{},[10,15559,15560,503,15562,507],{},[50,15561,502],{},[50,15563,506],{},[10,15565,510,15566,513,15568,517,15570,521],{},[50,15567,502],{},[294,15569,516],{},[294,15571,520],{},[10,15573,524],{},[10,15575,15576,530],{},[294,15577,529],{},[269,15579,15580,15582],{},[10,15581,535],{},[269,15583,15584,15588],{},[10,15585,540,15586,544],{},[294,15587,543],{},[10,15589,547],{},[269,15591,15592,15596],{},[10,15593,552,15594],{},[294,15595,555],{},[10,15597,15598],{},[26,15599],{"alt":560,"src":561},[269,15601,15602,15604],{},[10,15603,566],{},[10,15605,15606],{},[26,15607],{"alt":560,"src":571},[156,15609,575],{"id":574},[10,15611,578,15612,582,15614,586],{},[50,15613,581],{},[50,15615,585],{},[72,15617,15618],{"className":589,"code":590,"language":591,"meta":77,"style":77},[50,15619,15620],{"__ignoreMap":77},[81,15621,15622,15624],{"class":83,"line":84},[81,15623,76],{"class":598},[81,15625,602],{"class":601},[10,15627,605],{},[72,15629,15631],{"className":15630,"code":609,"language":127,"meta":77},[125],[50,15632,609],{"__ignoreMap":77},[10,15634,15635],{},[26,15636],{"alt":560,"src":616},[10,15638,619],{},[72,15640,15641],{"className":589,"code":622,"language":591,"meta":77,"style":77},[50,15642,15643],{"__ignoreMap":77},[81,15644,15645,15647,15649,15651],{"class":83,"line":84},[81,15646,76],{"class":598},[81,15648,631],{"class":601},[81,15650,635],{"class":634},[81,15652,602],{"class":601},[10,15654,640,15655,643,15657,647],{},[50,15656,76],{},[50,15658,646],{},[72,15660,15661],{"className":589,"code":650,"language":591,"meta":77,"style":77},[50,15662,15663,15669],{"__ignoreMap":77},[81,15664,15665,15667],{"class":83,"line":84},[81,15666,506],{"class":598},[81,15668,602],{"class":601},[81,15670,15671,15673,15675,15677],{"class":83,"line":90},[81,15672,506],{"class":598},[81,15674,631],{"class":601},[81,15676,635],{"class":634},[81,15678,602],{"class":601},[14,15680,672],{"id":671},[156,15682,676],{"id":675},[10,15684,679],{},[72,15686,15687],{"className":589,"code":682,"language":591,"meta":77,"style":77},[50,15688,15689],{"__ignoreMap":77},[81,15690,15691,15693],{"class":83,"line":84},[81,15692,689],{"class":598},[81,15694,602],{"class":601},[10,15696,694,15697,698],{},[50,15698,697],{},[156,15700,702],{"id":701},[10,15702,333,15703,710,15706,64,15708,717],{},[335,15704,709],{"href":707,"rel":15705},[339],[294,15707,713],{},[50,15709,716],{},[10,15711,720,15712,724],{},[50,15713,723],{},[156,15715,728],{"id":727},[10,15717,731],{},[72,15719,15720],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,15721,15722,15728],{"__ignoreMap":77},[81,15723,15724,15726],{"class":83,"line":84},[81,15725,689],{"class":598},[81,15727,602],{"class":601},[81,15729,15730,15732,15734,15736],{"class":83,"line":90},[81,15731,689],{"class":598},[81,15733,631],{"class":601},[81,15735,635],{"class":634},[81,15737,602],{"class":601},[10,15739,755,15740,758],{},[50,15741,689],{},[14,15743,762],{"id":761},[10,15745,765],{},[156,15747,769],{"id":768},[10,15749,772],{},[72,15751,15752],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,15753,15754,15760],{"__ignoreMap":77},[81,15755,15756,15758],{"class":83,"line":84},[81,15757,689],{"class":598},[81,15759,602],{"class":601},[81,15761,15762,15764,15766,15768],{"class":83,"line":90},[81,15763,689],{"class":598},[81,15765,631],{"class":601},[81,15767,635],{"class":634},[81,15769,602],{"class":601},[10,15771,795],{},[156,15773,799],{"id":798},[10,15775,802],{},[72,15777,15778],{"className":589,"code":805,"language":591,"meta":77,"style":77},[50,15779,15780,15788],{"__ignoreMap":77},[81,15781,15782,15784,15786],{"class":83,"line":84},[81,15783,812],{"class":598},[81,15785,815],{"class":634},[81,15787,818],{"class":634},[81,15789,15790,15792,15794,15796,15798,15800],{"class":83,"line":90},[81,15791,812],{"class":598},[81,15793,815],{"class":634},[81,15795,827],{"class":634},[81,15797,830],{"class":634},[81,15799,833],{"class":634},[81,15801,836],{"class":634},[10,15803,839],{},[72,15805,15806],{"className":589,"code":842,"language":591,"meta":77,"style":77},[50,15807,15808],{"__ignoreMap":77},[81,15809,15810,15812,15814,15816,15818],{"class":83,"line":84},[81,15811,812],{"class":598},[81,15813,851],{"class":634},[81,15815,827],{"class":634},[81,15817,830],{"class":634},[81,15819,858],{"class":634},[10,15821,861],{},[72,15823,15824],{"className":589,"code":864,"language":591,"meta":77,"style":77},[50,15825,15826],{"__ignoreMap":77},[81,15827,15828,15830,15832,15834,15836],{"class":83,"line":84},[81,15829,812],{"class":598},[81,15831,873],{"class":634},[81,15833,876],{"class":601},[81,15835,879],{"class":634},[81,15837,882],{"class":634},[10,15839,15840,887],{},[50,15841,812],{},[156,15843,891],{"id":890},[10,15845,894],{},[72,15847,15848],{"className":589,"code":734,"language":591,"meta":77,"style":77},[50,15849,15850,15856],{"__ignoreMap":77},[81,15851,15852,15854],{"class":83,"line":84},[81,15853,689],{"class":598},[81,15855,602],{"class":601},[81,15857,15858,15860,15862,15864],{"class":83,"line":90},[81,15859,689],{"class":598},[81,15861,631],{"class":601},[81,15863,635],{"class":634},[81,15865,602],{"class":601},[10,15867,917],{},[14,15869,920],{"id":920},[156,15871,924],{"id":923},[10,15873,927,15874,931],{},[50,15875,930],{},[137,15877,15878,15882,15884],{},[40,15879,936,15880,939],{},[50,15881,646],{},[40,15883,942],{},[40,15885,945],{},[10,15887,948],{},[156,15889,952],{"id":951},[10,15891,955],{},[72,15893,15894],{"className":589,"code":682,"language":591,"meta":77,"style":77},[50,15895,15896],{"__ignoreMap":77},[81,15897,15898,15900],{"class":83,"line":84},[81,15899,689],{"class":598},[81,15901,602],{"class":601},[10,15903,968,15904,971,15906,974,15908,64],{},[50,15905,689],{},[50,15907,76],{},[50,15909,689],{},[156,15911,980],{"id":979},[10,15913,983],{},[72,15915,15916],{"className":589,"code":986,"language":591,"meta":77,"style":77},[50,15917,15918],{"__ignoreMap":77},[81,15919,15920,15922,15924,15926],{"class":83,"line":84},[81,15921,689],{"class":598},[81,15923,631],{"class":601},[81,15925,635],{"class":634},[81,15927,602],{"class":601},[10,15929,1001,15930,1004,15932,182,15934,1009,15936,1013],{},[50,15931,689],{},[50,15933,76],{},[50,15935,506],{},[50,15937,1012],{},[210,15939,1016],{},{"title":77,"searchDepth":90,"depth":90,"links":15941},[15942,15943,15944,15949,15954,15959],{"id":248,"depth":90,"text":248},{"id":264,"depth":90,"text":264},{"id":325,"depth":90,"text":326,"children":15945},[15946,15947,15948],{"id":329,"depth":97,"text":330},{"id":389,"depth":97,"text":390},{"id":574,"depth":97,"text":575},{"id":671,"depth":90,"text":672,"children":15950},[15951,15952,15953],{"id":675,"depth":97,"text":676},{"id":701,"depth":97,"text":702},{"id":727,"depth":97,"text":728},{"id":761,"depth":90,"text":762,"children":15955},[15956,15957,15958],{"id":768,"depth":97,"text":769},{"id":798,"depth":97,"text":799},{"id":890,"depth":97,"text":891},{"id":920,"depth":90,"text":920,"children":15960},[15961,15962,15963],{"id":923,"depth":97,"text":924},{"id":951,"depth":97,"text":952},{"id":979,"depth":97,"text":980},{},{"title":243,"description":77},[225,1049,1050],1786973365344]