[{"data":1,"prerenderedAt":15973},["ShallowReactive",2],{"post-python-break-continue":3,"sidebar-posts":242,"post-related-source":9164},{"id":4,"title":5,"body":6,"category":229,"cover":230,"description":12,"extension":231,"meta":232,"navigation":94,"path":233,"pinned":234,"publishedAt":235,"seo":236,"slug":237,"stem":238,"summary":239,"tags":240,"updatedAt":235,"visible":94,"__hash__":241},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":8,"toc":219},"minimark",[9,13,17,20,23,30,41,44,66,69,72,143,146,154,157,160,175,178,195,198,206,209,212,215],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,31,32,36,37,40],{},[33,34,35],"code",{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,38,39],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,42,43],{"id":43},"核心概念",[45,46,47,51,60],"ul",{},[48,49,50],"li",{},"先写普通循环，再在确有需要时加入流程控制语句。",[48,52,53,55,56,59],{},[33,54,35],{}," 前要确认不会跳过 ",[33,57,58],{},"while"," 循环中的状态更新。",[48,61,62,63,65],{},"多层嵌套中 ",[33,64,39],{}," 只结束它所在的最内层循环。",[14,67,68],{"id":68},"跟着示例运行",[10,70,71],{},"把下面代码保存到本课脚本并运行：",[73,74,79],"pre",{"className":75,"code":76,"language":77,"meta":78,"style":78},"language-python shiki shiki-themes github-dark","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","python","",[33,80,81,89,96,102,108,114,120,126,132,137],{"__ignoreMap":78},[82,83,86],"span",{"class":84,"line":85},"line",1,[82,87,88],{},"numbers = [3, -1, 0, 8, 12]\n",[82,90,92],{"class":84,"line":91},2,[82,93,95],{"emptyLinePlaceholder":94},true,"\n",[82,97,99],{"class":84,"line":98},3,[82,100,101],{},"for number in numbers:\n",[82,103,105],{"class":84,"line":104},4,[82,106,107],{},"    if number \u003C 0:\n",[82,109,111],{"class":84,"line":110},5,[82,112,113],{},"        continue\n",[82,115,117],{"class":84,"line":116},6,[82,118,119],{},"    if number == 0:\n",[82,121,123],{"class":84,"line":122},7,[82,124,125],{},"        break\n",[82,127,129],{"class":84,"line":128},8,[82,130,131],{},"    print(number)\n",[82,133,135],{"class":84,"line":134},9,[82,136,95],{"emptyLinePlaceholder":94},[82,138,140],{"class":84,"line":139},10,[82,141,142],{},"print(\"循环结束\")\n",[10,144,145],{},"预期结果：",[73,147,152],{"className":148,"code":150,"language":151,"meta":78},[149],"language-text","3\n循环结束\n","text",[33,153,150],{"__ignoreMap":78},[10,155,156],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,158,159],{"id":159},"按执行顺序拆开看",[161,162,163,169],"ol",{},[48,164,165,166,168],{},"遇到 -1 时 ",[33,167,35],{}," 立即结束本轮，后面的判断和输出都不执行。",[48,170,171,172,174],{},"遇到 0 时 ",[33,173,39],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,176,177],{"id":177},"初学者容易混淆的地方",[45,179,180,186],{},[48,181,182,183,185],{},"把 ",[33,184,35],{}," 当作结束循环，实际它只跳到下一轮。",[48,187,188,189,191,192,194],{},"在 ",[33,190,58],{}," 中把状态更新放在可能被 ",[33,193,35],{}," 跳过的位置，造成无限循环。",[14,196,197],{"id":197},"练习",[161,199,200,203],{},[48,201,202],{},"跳过列表中的空字符串并输出其他内容。",[48,204,205],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,207,208],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,210,211],{"id":211},"本篇边界",[10,213,214],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,217,218],"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":78,"searchDepth":91,"depth":91,"links":220},[221,222,223,224,225,226,227,228],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",false,"2026-08-17",{"title":5,"description":12},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[229,39,35],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",[243,1057,1394,1528,1680,1859,2047,2212,2396,2577,2770,3001,3185,3362,3518,3689,3854,4068,4296,4477,4640,4789,4977,5132,5292,5489,5686,5900,6067,6311,6492,6697,6892,7076,7277,7567,7759,7988,8183,8403,8643,8847],{"id":244,"title":245,"body":246,"category":229,"cover":230,"description":78,"extension":231,"meta":1046,"navigation":94,"path":1047,"pinned":234,"publishedAt":1048,"seo":1049,"slug":1050,"stem":1051,"summary":1052,"tags":1053,"updatedAt":1048,"visible":94,"__hash__":1056},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":247,"toc":1022},[248,251,254,257,264,267,270,309,325,329,334,345,350,356,374,380,385,391,395,441,444,450,456,459,490,535,552,566,576,580,591,607,610,616,621,624,642,652,673,677,681,684,696,703,707,722,729,733,736,757,763,767,770,774,777,797,800,804,807,841,844,863,866,887,892,896,899,919,922,925,929,936,950,953,957,960,970,981,985,988,1003,1019],[14,249,250],{"id":250},"引言",[10,252,253],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,255,256],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,258,259,260,263],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,261,262],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,265,266],{"id":266},"扫盲",[10,268,269],{},"那么这里有几个概念：",[271,272,273,276],"blockquote",{},[10,274,275],{},"为什么需要安装python解释器？",[271,277,278,289,292,300,303],{},[10,279,280,281,284,285,288],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,282,283],{},"0","和",[33,286,287],{},"1","组成的机器指令。",[10,290,291],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,293,294,295,299],{},"这样，我们就能用",[296,297,298],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,301,302],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,304,305],{},[26,306],{"alt":307,"src":308},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[271,310,311,314],{},[10,312,313],{},"pip又是什么？",[271,315,316,319],{},[10,317,318],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,320,321],{},[26,322],{"alt":323,"src":324},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,326,328],{"id":327},"windows-安装","Windows 安装",[330,331,333],"h3",{"id":332},"_1-下载官方安装程序","1. 下载官方安装程序",[10,335,336,337,344],{},"打开 ",[338,339,343],"a",{"href":340,"rel":341},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[342],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[271,346,347],{},[10,348,349],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,351,352],{},[26,353],{"alt":354,"src":355},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[45,357,358,365,371],{},[48,359,360,361,364],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[296,362,363],{},"Windows installer (64-bit)","。",[48,366,367,368,364],{},"搭载 ARM 处理器的 Windows 设备选择 ",[296,369,370],{},"Windows installer (ARM64)",[48,372,373],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,375,376],{},[26,377],{"alt":378,"src":379},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[271,381,382],{},[10,383,384],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,386,387],{},[26,388],{"alt":389,"src":390},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[330,392,394],{"id":393},"_2-安装并加入-path","2. 安装并加入 PATH",[271,396,397,402,409,434],{},[271,398,399],{},[10,400,401],{},"PATH 环境变量",[10,403,404,405,408],{},"Windows 有一个特殊的变量叫 ",[296,406,407],{},"PATH","，它里面存了一串文件夹路径，比如：",[73,410,412],{"className":75,"code":411,"language":77,"meta":78,"style":78},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,413,414,419,424,429],{"__ignoreMap":78},[82,415,416],{"class":84,"line":85},[82,417,418],{},"D:\\Python313\\\n",[82,420,421],{"class":84,"line":91},[82,422,423],{},"D:\\Python313\\Scripts\\\n",[82,425,426],{"class":84,"line":98},[82,427,428],{},"C:\\Windows\\System32\\\n",[82,430,431],{"class":84,"line":104},[82,432,433],{},"...\n",[10,435,436,437,440],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[296,438,439],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,442,443],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,445,446,447,449],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,448,77],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,451,452],{},[26,453],{"alt":454,"src":455},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,457,458],{},"对安装界面最底部的两个勾选项分别解释 :",[271,460,461,464,469],{},[10,462,463],{},"Add python.exe to PATH",[10,465,466],{},[296,467,468],{},"把 Python 添加到系统环境变量",[271,470,471,477,483],{},[10,472,473,474,476],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,475,77],{}," 就能运行",[10,478,479,480,482],{},"不勾选的话，命令行输入 ",[33,481,77],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,484,485,486,489],{},"必须",[296,487,488],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[271,491,492,495,500],{},[10,493,494],{},"Use admin privileges when installing py.exe",[10,496,497],{},[296,498,499],{},"使用管理员权限安装 py.exe（Python 启动器）",[271,501,502,512,526,529],{},[10,503,504,507,508,511],{},[33,505,506],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,509,510],{},"py"," 来启动 Python。",[10,513,514,515,517,518,521,522,525],{},"勾选后，",[33,516,506],{}," 会安装到",[296,519,520],{},"系统级目录","，电脑上",[296,523,524],{},"所有用户账户","都能用",[10,527,528],{},"不勾选，只有当前用户能用",[10,530,531,534],{},[296,532,533],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[271,536,537,540],{},[10,538,539],{},"操作建议",[271,541,542,549],{},[10,543,544,545,548],{},"两个都勾上之后，再点 ",[296,546,547],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,550,551],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[271,553,554,560],{},[10,555,556,557],{},"Python 安装的",[296,558,559],{},"可选功能页",[10,561,562],{},[26,563],{"alt":564,"src":565},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[271,567,568,571],{},[10,569,570],{},"高级选项页",[10,572,573],{},[26,574],{"alt":564,"src":575},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[330,577,579],{"id":578},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,581,582,583,586,587,590],{},"按 ",[33,584,585],{},"Win + R","，输入 ",[33,588,589],{},"cmd"," 并回车，然后执行：",[73,592,596],{"className":593,"code":594,"language":595,"meta":78,"style":78},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,597,598],{"__ignoreMap":78},[82,599,600,603],{"class":84,"line":85},[82,601,77],{"class":602},"svObZ",[82,604,606],{"class":605},"sDLfK"," --version\n",[10,608,609],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[73,611,614],{"className":612,"code":613,"language":151,"meta":78},[149],"Python 3.x.x\n",[33,615,613],{"__ignoreMap":78},[10,617,618],{},[26,619],{"alt":564,"src":620},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,622,623],{},"继续检查 pip：",[73,625,627],{"className":593,"code":626,"language":595,"meta":78,"style":78},"python -m pip --version\n",[33,628,629],{"__ignoreMap":78},[82,630,631,633,636,640],{"class":84,"line":85},[82,632,77],{"class":602},[82,634,635],{"class":605}," -m",[82,637,639],{"class":638},"sU2Wk"," pip",[82,641,606],{"class":605},[10,643,644,645,647,648,651],{},"如果 ",[33,646,77],{}," 无法识别，但 ",[33,649,650],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[73,653,655],{"className":593,"code":654,"language":595,"meta":78,"style":78},"py --version\npy -m pip --version\n",[33,656,657,663],{"__ignoreMap":78},[82,658,659,661],{"class":84,"line":85},[82,660,510],{"class":602},[82,662,606],{"class":605},[82,664,665,667,669,671],{"class":84,"line":91},[82,666,510],{"class":602},[82,668,635],{"class":605},[82,670,639],{"class":638},[82,672,606],{"class":605},[14,674,676],{"id":675},"macos-安装","macOS 安装",[330,678,680],{"id":679},"_1-先检查现有环境","1. 先检查现有环境",[10,682,683],{},"打开“终端”应用，执行：",[73,685,687],{"className":593,"code":686,"language":595,"meta":78,"style":78},"python3 --version\n",[33,688,689],{"__ignoreMap":78},[82,690,691,694],{"class":84,"line":85},[82,692,693],{"class":602},"python3",[82,695,606],{"class":605},[10,697,698,699,702],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,700,701],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[330,704,706],{"id":705},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,708,336,709,714,715,364,718,721],{},[338,710,713],{"href":711,"rel":712},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[342],"Python macOS 下载页","，下载当前稳定版的 ",[296,716,717],{},"macOS 64-bit universal2 installer",[33,719,720],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,723,724,725,728],{},"下载完成后打开 ",[33,726,727],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[330,730,732],{"id":731},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,734,735],{},"安装完成后重新打开终端，执行：",[73,737,739],{"className":593,"code":738,"language":595,"meta":78,"style":78},"python3 --version\npython3 -m pip --version\n",[33,740,741,747],{"__ignoreMap":78},[82,742,743,745],{"class":84,"line":85},[82,744,693],{"class":602},[82,746,606],{"class":605},[82,748,749,751,753,755],{"class":84,"line":91},[82,750,693],{"class":602},[82,752,635],{"class":605},[82,754,639],{"class":638},[82,756,606],{"class":605},[10,758,759,760,762],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,761,693],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,764,766],{"id":765},"linux-安装","Linux 安装",[10,768,769],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[330,771,773],{"id":772},"_1-检查是否已经安装","1. 检查是否已经安装",[10,775,776],{},"打开终端，执行：",[73,778,779],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,780,781,787],{"__ignoreMap":78},[82,782,783,785],{"class":84,"line":85},[82,784,693],{"class":602},[82,786,606],{"class":605},[82,788,789,791,793,795],{"class":84,"line":91},[82,790,693],{"class":602},[82,792,635],{"class":605},[82,794,639],{"class":638},[82,796,606],{"class":605},[10,798,799],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[330,801,803],{"id":802},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,805,806],{},"Ubuntu 或 Debian：",[73,808,810],{"className":593,"code":809,"language":595,"meta":78,"style":78},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,811,812,823],{"__ignoreMap":78},[82,813,814,817,820],{"class":84,"line":85},[82,815,816],{"class":602},"sudo",[82,818,819],{"class":638}," apt",[82,821,822],{"class":638}," update\n",[82,824,825,827,829,832,835,838],{"class":84,"line":91},[82,826,816],{"class":602},[82,828,819],{"class":638},[82,830,831],{"class":638}," install",[82,833,834],{"class":638}," python3",[82,836,837],{"class":638}," python3-pip",[82,839,840],{"class":638}," python3-venv\n",[10,842,843],{},"Fedora：",[73,845,847],{"className":593,"code":846,"language":595,"meta":78,"style":78},"sudo dnf install python3 python3-pip\n",[33,848,849],{"__ignoreMap":78},[82,850,851,853,856,858,860],{"class":84,"line":85},[82,852,816],{"class":602},[82,854,855],{"class":638}," dnf",[82,857,831],{"class":638},[82,859,834],{"class":638},[82,861,862],{"class":638}," python3-pip\n",[10,864,865],{},"Arch Linux：",[73,867,869],{"className":593,"code":868,"language":595,"meta":78,"style":78},"sudo pacman -S python python-pip\n",[33,870,871],{"__ignoreMap":78},[82,872,873,875,878,881,884],{"class":84,"line":85},[82,874,816],{"class":602},[82,876,877],{"class":638}," pacman",[82,879,880],{"class":605}," -S",[82,882,883],{"class":638}," python",[82,885,886],{"class":638}," python-pip\n",[10,888,889,891],{},[33,890,816],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[330,893,895],{"id":894},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,897,898],{},"安装结束后执行：",[73,900,901],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,902,903,909],{"__ignoreMap":78},[82,904,905,907],{"class":84,"line":85},[82,906,693],{"class":602},[82,908,606],{"class":605},[82,910,911,913,915,917],{"class":84,"line":91},[82,912,693],{"class":602},[82,914,635],{"class":605},[82,916,639],{"class":638},[82,918,606],{"class":605},[10,920,921],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,923,924],{"id":924},"常见问题",[330,926,928],{"id":927},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,930,931,932,935],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,933,934],{},"python --version","。如果仍然失败，按下面的顺序检查：",[161,937,938,944,947],{},[48,939,940,941,943],{},"执行 ",[33,942,650],{},"，确认 Python Launcher 是否可用。",[48,945,946],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[48,948,949],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,951,952],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[330,954,956],{"id":955},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,958,959],{},"先尝试：",[73,961,962],{"className":593,"code":686,"language":595,"meta":78,"style":78},[33,963,964],{"__ignoreMap":78},[82,965,966,968],{"class":84,"line":85},[82,967,693],{"class":602},[82,969,606],{"class":605},[10,971,972,973,975,976,978,979,364],{},"在这两个系统中，只有 ",[33,974,693],{}," 命令而没有 ",[33,977,77],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,980,693],{},[330,982,984],{"id":983},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,986,987],{},"先使用模块方式检查：",[73,989,991],{"className":593,"code":990,"language":595,"meta":78,"style":78},"python3 -m pip --version\n",[33,992,993],{"__ignoreMap":78},[82,994,995,997,999,1001],{"class":84,"line":85},[82,996,693],{"class":602},[82,998,635],{"class":605},[82,1000,639],{"class":638},[82,1002,606],{"class":605},[10,1004,1005,1006,1008,1009,1011,1012,1014,1015,1018],{},"Windows 用户将命令中的 ",[33,1007,693],{}," 换成 ",[33,1010,77],{}," 或 ",[33,1013,510],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1016,1017],{},"python3-pip","；不要直接使用其他系统的安装命令。",[216,1020,1021],{},"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":78,"searchDepth":91,"depth":91,"links":1023},[1024,1025,1026,1031,1036,1041],{"id":250,"depth":91,"text":250},{"id":266,"depth":91,"text":266},{"id":327,"depth":91,"text":328,"children":1027},[1028,1029,1030],{"id":332,"depth":98,"text":333},{"id":393,"depth":98,"text":394},{"id":578,"depth":98,"text":579},{"id":675,"depth":91,"text":676,"children":1032},[1033,1034,1035],{"id":679,"depth":98,"text":680},{"id":705,"depth":98,"text":706},{"id":731,"depth":98,"text":732},{"id":765,"depth":91,"text":766,"children":1037},[1038,1039,1040],{"id":772,"depth":98,"text":773},{"id":802,"depth":98,"text":803},{"id":894,"depth":98,"text":895},{"id":924,"depth":91,"text":924,"children":1042},[1043,1044,1045],{"id":927,"depth":98,"text":928},{"id":955,"depth":98,"text":956},{"id":983,"depth":98,"text":984},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":245,"description":78},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[229,1054,1055],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1058,"title":1059,"body":1060,"category":229,"cover":1067,"description":78,"extension":231,"meta":1383,"navigation":94,"path":1384,"pinned":234,"publishedAt":1385,"seo":1386,"slug":1387,"stem":1388,"summary":1389,"tags":1390,"updatedAt":1385,"visible":94,"__hash__":1393},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1061,"toc":1368},[1062,1068,1071,1074,1078,1081,1105,1108,1114,1117,1120,1154,1164,1168,1175,1178,1203,1206,1218,1221,1225,1228,1231,1234,1237,1240,1243,1246,1270,1273,1276,1282,1285,1288,1291,1295,1301,1304,1330,1333,1337,1340,1343,1347,1350,1353,1356,1359,1362,1365],[10,1063,1064],{},[26,1065],{"alt":1066,"src":1067},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1069,1070],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1072,1073],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1075,1077],{"id":1076},"python-代码是什么样的","Python 代码是什么样的",[10,1079,1080],{},"下面是一段简单的 Python 代码：",[73,1082,1084],{"className":75,"code":1083,"language":77,"meta":78,"style":78},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1085,1086,1091,1096,1100],{"__ignoreMap":78},[82,1087,1088],{"class":84,"line":85},[82,1089,1090],{},"name = \"Python\"\n",[82,1092,1093],{"class":84,"line":91},[82,1094,1095],{},"year = 2026\n",[82,1097,1098],{"class":84,"line":98},[82,1099,95],{"emptyLinePlaceholder":94},[82,1101,1102],{"class":84,"line":104},[82,1103,1104],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1106,1107],{},"运行结果：",[73,1109,1112],{"className":1110,"code":1111,"language":151,"meta":78},[149],"正在学习 Python，当前年份是 2026\n",[33,1113,1111],{"__ignoreMap":78},[10,1115,1116],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1118,1119],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[73,1121,1123],{"className":75,"code":1122,"language":77,"meta":78,"style":78},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1124,1125,1130,1134,1139,1144,1149],{"__ignoreMap":78},[82,1126,1127],{"class":84,"line":85},[82,1128,1129],{},"score = 85\n",[82,1131,1132],{"class":84,"line":91},[82,1133,95],{"emptyLinePlaceholder":94},[82,1135,1136],{"class":84,"line":98},[82,1137,1138],{},"if score >= 60:\n",[82,1140,1141],{"class":84,"line":104},[82,1142,1143],{},"    print(\"成绩合格\")\n",[82,1145,1146],{"class":84,"line":110},[82,1147,1148],{},"else:\n",[82,1150,1151],{"class":84,"line":116},[82,1152,1153],{},"    print(\"需要继续学习\")\n",[10,1155,1156,1159,1160,1163],{},[33,1157,1158],{},"if"," 和 ",[33,1161,1162],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1165,1167],{"id":1166},"python-如何运行代码","Python 如何运行代码",[10,1169,1170,1171,1174],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1172,1173],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1176,1177],{},"交互式环境适合快速验证一个表达式：",[73,1179,1181],{"className":75,"code":1180,"language":77,"meta":78,"style":78},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1182,1183,1188,1193,1198],{"__ignoreMap":78},[82,1184,1185],{"class":84,"line":85},[82,1186,1187],{},">>> 10 + 20\n",[82,1189,1190],{"class":84,"line":91},[82,1191,1192],{},"30\n",[82,1194,1195],{"class":84,"line":98},[82,1196,1197],{},">>> \"Python\".lower()\n",[82,1199,1200],{"class":84,"line":104},[82,1201,1202],{},"'python'\n",[10,1204,1205],{},"需要保存和重复运行的程序，则可以写入文件：",[73,1207,1209],{"className":593,"code":1208,"language":595,"meta":78,"style":78},"python3 hello.py\n",[33,1210,1211],{"__ignoreMap":78},[82,1212,1213,1215],{"class":84,"line":85},[82,1214,693],{"class":602},[82,1216,1217],{"class":638}," hello.py\n",[10,1219,1220],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1222,1224],{"id":1223},"python-的特点","Python 的特点",[330,1226,1227],{"id":1227},"语法相对简洁",[10,1229,1230],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[330,1232,1233],{"id":1233},"支持多种编程方式",[10,1235,1236],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[330,1238,1239],{"id":1239},"标准库比较完整",[10,1241,1242],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1244,1245],{},"例如，获取当前时间：",[73,1247,1249],{"className":75,"code":1248,"language":77,"meta":78,"style":78},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1250,1251,1256,1260,1265],{"__ignoreMap":78},[82,1252,1253],{"class":84,"line":85},[82,1254,1255],{},"from datetime import datetime\n",[82,1257,1258],{"class":84,"line":91},[82,1259,95],{"emptyLinePlaceholder":94},[82,1261,1262],{"class":84,"line":98},[82,1263,1264],{},"now = datetime.now()\n",[82,1266,1267],{"class":84,"line":104},[82,1268,1269],{},"print(now)\n",[10,1271,1272],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[330,1274,1275],{"id":1275},"第三方工具丰富",[10,1277,1278,1279,1281],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1280,262],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1283,1284],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[330,1286,1287],{"id":1287},"支持多个操作系统",[10,1289,1290],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1292,1294],{"id":1293},"python-可以做什么","Python 可以做什么",[10,1296,1297],{},[26,1298],{"alt":1299,"src":1300},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1302,1303],{},"Python 的应用范围比较广，常见方向包括：",[45,1305,1306,1309,1312,1315,1318,1321,1324,1327],{},[48,1307,1308],{},"编写自动化脚本，批量处理文件和重复任务；",[48,1310,1311],{},"开发网站后端和 API 服务；",[48,1313,1314],{},"进行数据清洗、统计分析和图表展示；",[48,1316,1317],{},"编写网络爬虫和信息采集工具；",[48,1319,1320],{},"开发自动化测试程序；",[48,1322,1323],{},"进行机器学习和人工智能开发；",[48,1325,1326],{},"编写运维、监控和辅助开发工具；",[48,1328,1329],{},"开发部分桌面应用和插件。",[10,1331,1332],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1334,1336],{"id":1335},"python-的发展","Python 的发展",[10,1338,1339],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1341,1342],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1344,1346],{"id":1345},"python-也有局限","Python 也有局限",[10,1348,1349],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1351,1352],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1354,1355],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1357,1358],{"id":1358},"写在最后",[10,1360,1361],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1363,1364],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[216,1366,1367],{},"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":78,"searchDepth":91,"depth":91,"links":1369},[1370,1371,1372,1379,1380,1381,1382],{"id":1076,"depth":91,"text":1077},{"id":1166,"depth":91,"text":1167},{"id":1223,"depth":91,"text":1224,"children":1373},[1374,1375,1376,1377,1378],{"id":1227,"depth":98,"text":1227},{"id":1233,"depth":98,"text":1233},{"id":1239,"depth":98,"text":1239},{"id":1275,"depth":98,"text":1275},{"id":1287,"depth":98,"text":1287},{"id":1293,"depth":91,"text":1294},{"id":1335,"depth":91,"text":1336},{"id":1345,"depth":91,"text":1346},{"id":1358,"depth":91,"text":1358},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1059,"description":78},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[229,1391,1392],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1395,"title":1396,"body":1397,"category":229,"cover":230,"description":1401,"extension":231,"meta":1519,"navigation":94,"path":1520,"pinned":234,"publishedAt":235,"seo":1521,"slug":1522,"stem":1523,"summary":1524,"tags":1525,"updatedAt":235,"visible":94,"__hash__":1527},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1398,"toc":1509},[1399,1402,1404,1407,1409,1415,1420,1422,1436,1438,1440,1449,1451,1457,1459,1461,1477,1479,1490,1492,1500,1502,1504,1507],[10,1400,1401],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1403,16],{"id":16},[10,1405,1406],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1408,22],{"id":22},[10,1410,1411],{},[26,1412],{"alt":1413,"src":1414},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1416,1417,1419],{},[33,1418,1173],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1421,43],{"id":43},[45,1423,1424,1430,1433],{},[48,1425,1426,1427,1429],{},"源代码是人编写的文本，通常保存在 ",[33,1428,1173],{}," 文件中。",[48,1431,1432],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[48,1434,1435],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1437,68],{"id":68},[10,1439,71],{},[73,1441,1443],{"className":75,"code":1442,"language":77,"meta":78,"style":78},"print(\"你好，Python\")\n",[33,1444,1445],{"__ignoreMap":78},[82,1446,1447],{"class":84,"line":85},[82,1448,1442],{},[10,1450,145],{},[73,1452,1455],{"className":1453,"code":1454,"language":151,"meta":78},[149],"你好，Python\n",[33,1456,1454],{"__ignoreMap":78},[10,1458,156],{},[14,1460,159],{"id":159},[161,1462,1463,1470],{},[48,1464,1465,1466,1469],{},"终端启动解释器后，解释器读取 ",[33,1467,1468],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[48,1471,1472,1473,1476],{},"字符串对象先准备好，再交给 ",[33,1474,1475],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1478,177],{"id":177},[45,1480,1481,1484],{},[48,1482,1483],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[48,1485,1486,1487,1489],{},"认为 ",[33,1488,1173],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1491,197],{"id":197},[161,1493,1494,1497],{},[48,1495,1496],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[48,1498,1499],{},"把示例文字改成自己的学习目标并重新运行。",[10,1501,208],{},[14,1503,211],{"id":211},[10,1505,1506],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,1508,218],{},{"title":78,"searchDepth":91,"depth":91,"links":1510},[1511,1512,1513,1514,1515,1516,1517,1518],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1396,"description":1401},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[229,1391,1526],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1529,"title":1530,"body":1531,"category":229,"cover":230,"description":1535,"extension":231,"meta":1671,"navigation":94,"path":1672,"pinned":234,"publishedAt":235,"seo":1673,"slug":1674,"stem":1675,"summary":1676,"tags":1677,"updatedAt":235,"visible":94,"__hash__":1679},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1532,"toc":1661},[1533,1536,1538,1541,1543,1549,1555,1557,1572,1574,1577,1597,1599,1605,1607,1609,1622,1624,1638,1640,1651,1653,1655,1658],[10,1534,1535],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1537,16],{"id":16},[10,1539,1540],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1542,22],{"id":22},[10,1544,1545],{},[26,1546],{"alt":1547,"src":1548},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1550,1551,1552,1554],{},"终端收到 ",[33,1553,693],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1556,43],{"id":43},[45,1558,1559,1562,1565],{},[48,1560,1561],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[48,1563,1564],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[48,1566,1567,1568,1571],{},"检查 pip 时使用 ",[33,1569,1570],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1573,68],{"id":68},[10,1575,1576],{},"在 macOS 终端执行：",[73,1578,1579],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,1580,1581,1587],{"__ignoreMap":78},[82,1582,1583,1585],{"class":84,"line":85},[82,1584,693],{"class":602},[82,1586,606],{"class":605},[82,1588,1589,1591,1593,1595],{"class":84,"line":91},[82,1590,693],{"class":602},[82,1592,635],{"class":605},[82,1594,639],{"class":638},[82,1596,606],{"class":605},[10,1598,145],{},[73,1600,1603],{"className":1601,"code":1602,"language":151,"meta":78},[149],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1604,1602],{"__ignoreMap":78},[10,1606,156],{},[14,1608,159],{"id":159},[161,1610,1611,1617],{},[48,1612,1613,1616],{},[33,1614,1615],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[48,1618,1619,1621],{},[33,1620,701],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1623,177],{"id":177},[45,1625,1626,1632],{},[48,1627,1628,1629,1631],{},"看到系统已有 ",[33,1630,693],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[48,1633,1634,1635,1637],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1636,693],{},"，不修改系统自带工具。",[14,1639,197],{"id":197},[161,1641,1642,1648],{},[48,1643,940,1644,1647],{},[33,1645,1646],{},"which python3","，记录当前解释器路径。",[48,1649,1650],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1652,208],{},[14,1654,211],{"id":211},[10,1656,1657],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,1659,1660],{},"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":78,"searchDepth":91,"depth":91,"links":1662},[1663,1664,1665,1666,1667,1668,1669,1670],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1530,"description":1535},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[229,1678,1054],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1681,"title":1682,"body":1683,"category":229,"cover":230,"description":1848,"extension":231,"meta":1849,"navigation":94,"path":1850,"pinned":234,"publishedAt":235,"seo":1851,"slug":1852,"stem":1853,"summary":1854,"tags":1855,"updatedAt":235,"visible":94,"__hash__":1858},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1684,"toc":1838},[1685,1691,1693,1696,1698,1704,1707,1709,1733,1735,1737,1764,1766,1772,1774,1776,1794,1796,1810,1812,1826,1828,1830,1836],[10,1686,1687,1688,1690],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1689,1173],{}," 脚本。",[14,1692,16],{"id":16},[10,1694,1695],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1697,22],{"id":22},[10,1699,1700],{},[26,1701],{"alt":1702,"src":1703},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1705,1706],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1708,43],{"id":43},[45,1710,1711,1720,1727],{},[48,1712,1713,1714,1716,1717,364],{},"在终端输入 ",[33,1715,693],{}," 进入 REPL，提示符通常是 ",[33,1718,1719],{},">>>",[48,1721,1722,1723,1726],{},"输入 ",[33,1724,1725],{},"exit()"," 或按 Control-D 退出 REPL。",[48,1728,1729,1730,1732],{},"需要保存、复查或多次运行的代码应写入 ",[33,1731,1173],{}," 文件。",[14,1734,68],{"id":68},[10,1736,71],{},[73,1738,1742],{"className":1739,"code":1740,"language":1741,"meta":78,"style":78},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1743,1744,1749,1754,1759],{"__ignoreMap":78},[82,1745,1746],{"class":84,"line":85},[82,1747,1748],{},">>> 2 + 3\n",[82,1750,1751],{"class":84,"line":91},[82,1752,1753],{},"5\n",[82,1755,1756],{"class":84,"line":98},[82,1757,1758],{},">>> \"python\".upper()\n",[82,1760,1761],{"class":84,"line":104},[82,1762,1763],{},"'PYTHON'\n",[10,1765,145],{},[73,1767,1770],{"className":1768,"code":1769,"language":151,"meta":78},[149],"REPL 会直接显示表达式结果\n",[33,1771,1769],{"__ignoreMap":78},[10,1773,156],{},[14,1775,159],{"id":159},[161,1777,1778,1788],{},[48,1779,1780,1781,1784,1785,364],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1782,1783],{},"2 + 3"," 能直接看到 ",[33,1786,1787],{},"5",[48,1789,1790,1791,1793],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1792,1475],{}," 才会写到标准输出。",[14,1795,177],{"id":177},[45,1797,1798,1807],{},[48,1799,1800,1801,1803,1804,1806],{},"把提示符 ",[33,1802,1719],{}," 复制进 ",[33,1805,1173],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[48,1808,1809],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1811,197],{"id":197},[161,1813,1814,1820],{},[48,1815,1816,1817,364],{},"在 REPL 计算 ",[33,1818,1819],{},"12 * 8",[48,1821,1822,1823,1825],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1824,1475],{}," 时是否显示结果。",[10,1827,208],{},[14,1829,211],{"id":211},[10,1831,1832,1833,1835],{},"本篇目标是根据任务选择 REPL 或 ",[33,1834,1173],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,1837,218],{},{"title":78,"searchDepth":91,"depth":91,"links":1839},[1840,1841,1842,1843,1844,1845,1846,1847],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1682,"description":1848},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[229,1856,1857],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1860,"title":1861,"body":1862,"category":229,"cover":230,"description":1866,"extension":231,"meta":2037,"navigation":94,"path":2038,"pinned":234,"publishedAt":235,"seo":2039,"slug":2040,"stem":2041,"summary":2042,"tags":2043,"updatedAt":235,"visible":94,"__hash__":2046},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1863,"toc":2027},[1864,1867,1869,1872,1874,1880,1886,1888,1906,1908,1910,1955,1957,1963,1965,1967,1989,1991,2003,2005,2017,2019,2021,2024],[10,1865,1866],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1868,16],{"id":16},[10,1870,1871],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1873,22],{"id":22},[10,1875,1876],{},[26,1877],{"alt":1878,"src":1879},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1881,1882,1885],{},[33,1883,1884],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1887,43],{"id":43},[45,1889,1890,1893,1903],{},[48,1891,1892],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[48,1894,1895,1898,1899,1902],{},[33,1896,1897],{},"pwd"," 显示当前目录，",[33,1900,1901],{},"ls"," 显示目录里的文件。",[48,1904,1905],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1907,68],{"id":68},[10,1909,1576],{},[73,1911,1913],{"className":593,"code":1912,"language":595,"meta":78,"style":78},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1914,1915,1923,1930,1935,1949],{"__ignoreMap":78},[82,1916,1917,1920],{"class":84,"line":85},[82,1918,1919],{"class":602},"mkdir",[82,1921,1922],{"class":638}," python-study\n",[82,1924,1925,1928],{"class":84,"line":91},[82,1926,1927],{"class":605},"cd",[82,1929,1922],{"class":638},[82,1931,1932],{"class":84,"line":98},[82,1933,1934],{"class":605},"pwd\n",[82,1936,1937,1940,1943,1947],{"class":84,"line":104},[82,1938,1939],{"class":605},"printf",[82,1941,1942],{"class":638}," 'print(\"项目已经运行\")\\n'",[82,1944,1946],{"class":1945},"snl16"," >",[82,1948,1217],{"class":638},[82,1950,1951,1953],{"class":84,"line":110},[82,1952,693],{"class":602},[82,1954,1217],{"class":638},[10,1956,145],{},[73,1958,1961],{"className":1959,"code":1960,"language":151,"meta":78},[149],"项目已经运行\n",[33,1962,1960],{"__ignoreMap":78},[10,1964,156],{},[14,1966,159],{"id":159},[161,1968,1969,1980],{},[48,1970,1971,1973,1974,1976,1977,1979],{},[33,1972,1919],{}," 创建目录，",[33,1975,1927],{}," 改变终端当前目录，",[33,1978,1897],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[48,1981,1982,1984,1985,1988],{},[33,1983,1884],{}," 会在当前目录寻找 ",[33,1986,1987],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1990,177],{"id":177},[45,1992,1993,2000],{},[48,1994,1995,1996,1159,1998,364],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,1997,1897],{},[33,1999,1901],{},[48,2001,2002],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2004,197],{"id":197},[161,2006,2007,2014],{},[48,2008,2009,2010,2013],{},"新建 ",[33,2011,2012],{},"lesson01.py"," 并输出课程编号。",[48,2015,2016],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2018,208],{},[14,2020,211],{"id":211},[10,2022,2023],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,2025,2026],{},"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":78,"searchDepth":91,"depth":91,"links":2028},[2029,2030,2031,2032,2033,2034,2035,2036],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1861,"description":1866},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[229,2044,2045],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2048,"title":2049,"body":2050,"category":229,"cover":230,"description":2054,"extension":231,"meta":2202,"navigation":94,"path":2203,"pinned":234,"publishedAt":235,"seo":2204,"slug":2205,"stem":2206,"summary":2207,"tags":2208,"updatedAt":235,"visible":94,"__hash__":2211},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2051,"toc":2192},[2052,2055,2057,2060,2062,2068,2079,2081,2101,2103,2105,2125,2127,2133,2135,2137,2156,2158,2166,2168,2183,2185,2187,2190],[10,2053,2054],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2056,16],{"id":16},[10,2058,2059],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2061,22],{"id":22},[10,2063,2064],{},[26,2065],{"alt":2066,"src":2067},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2069,2070,2071,364,2073,2076,2077,364],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2072,1475],{},[33,2074,2075],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2078,1783],{},[14,2080,43],{"id":43},[45,2082,2083,2089,2098],{},[48,2084,2085,2088],{},[33,2086,2087],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[48,2090,2091,2094,2095,364],{},[33,2092,2093],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2096,2097],{},"12",[48,2099,2100],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2102,68],{"id":68},[10,2104,71],{},[73,2106,2108],{"className":75,"code":2107,"language":77,"meta":78,"style":78},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2109,2110,2115,2120],{"__ignoreMap":78},[82,2111,2112],{"class":84,"line":85},[82,2113,2114],{},"print(42)\n",[82,2116,2117],{"class":84,"line":91},[82,2118,2119],{},"print(7 + 5)\n",[82,2121,2122],{"class":84,"line":98},[82,2123,2124],{},"print(\"Python 基础课\")\n",[10,2126,145],{},[73,2128,2131],{"className":2129,"code":2130,"language":151,"meta":78},[149],"42\n12\nPython 基础课\n",[33,2132,2130],{"__ignoreMap":78},[10,2134,156],{},[14,2136,159],{"id":159},[161,2138,2139,2147],{},[48,2140,2141,2144,2145,364],{},[33,2142,2143],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2146,2097],{},[48,2148,2149,2151,2152,2155],{},[33,2150,1475],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2153,2154],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2157,177],{"id":177},[45,2159,2160,2163],{},[48,2161,2162],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[48,2164,2165],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2167,197],{"id":197},[161,2169,2170,2173],{},[48,2171,2172],{},"分别输出一个整数、一个小数和一段文本。",[48,2174,2175,2176,2178,2179,2182],{},"比较 ",[33,2177,2075],{}," 与 ",[33,2180,2181],{},"print(\"2 + 3\")"," 的结果。",[10,2184,208],{},[14,2186,211],{"id":211},[10,2188,2189],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,2191,218],{},{"title":78,"searchDepth":91,"depth":91,"links":2193},[2194,2195,2196,2197,2198,2199,2200,2201],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2049,"description":2054},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[229,2209,2210],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2213,"title":2214,"body":2215,"category":229,"cover":230,"description":2219,"extension":231,"meta":2386,"navigation":94,"path":2387,"pinned":234,"publishedAt":235,"seo":2388,"slug":2389,"stem":2390,"summary":2391,"tags":2392,"updatedAt":235,"visible":94,"__hash__":2395},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2216,"toc":2376},[2217,2220,2222,2225,2227,2233,2236,2238,2264,2266,2268,2296,2298,2304,2306,2308,2332,2334,2350,2352,2367,2369,2371,2374],[10,2218,2219],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2221,16],{"id":16},[10,2223,2224],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2226,22],{"id":22},[10,2228,2229],{},[26,2230],{"alt":2231,"src":2232},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2234,2235],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2237,43],{"id":43},[45,2239,2240,2243,2253],{},[48,2241,2242],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[48,2244,2245,2246,2178,2249,2252],{},"变量名区分大小写，",[33,2247,2248],{},"score",[33,2250,2251],{},"Score"," 是两个名字。",[48,2254,2255,2256,2259,2260,2263],{},"使用能表达含义的名称；不要用 ",[33,2257,2258],{},"list","、",[33,2261,2262],{},"str"," 等内置名称作为普通变量名。",[14,2265,68],{"id":68},[10,2267,71],{},[73,2269,2271],{"className":75,"code":2270,"language":77,"meta":78,"style":78},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2272,2273,2278,2283,2287,2292],{"__ignoreMap":78},[82,2274,2275],{"class":84,"line":85},[82,2276,2277],{},"score = 90\n",[82,2279,2280],{"class":84,"line":91},[82,2281,2282],{},"print(score)\n",[82,2284,2285],{"class":84,"line":98},[82,2286,95],{"emptyLinePlaceholder":94},[82,2288,2289],{"class":84,"line":104},[82,2290,2291],{},"score = 95\n",[82,2293,2294],{"class":84,"line":110},[82,2295,2282],{},[10,2297,145],{},[73,2299,2302],{"className":2300,"code":2301,"language":151,"meta":78},[149],"90\n95\n",[33,2303,2301],{"__ignoreMap":78},[10,2305,156],{},[14,2307,159],{"id":159},[161,2309,2310,2319],{},[48,2311,940,2312,2315,2316,2318],{},[33,2313,2314],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2317,2248],{}," 再绑定到它。",[48,2320,940,2321,2324,2325,2328,2329,364],{},[33,2322,2323],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2326,2327],{},"90"," 没有被改造成 ",[33,2330,2331],{},"95",[14,2333,177],{"id":177},[45,2335,2336,2339],{},[48,2337,2338],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[48,2340,2341,2342,2259,2344,2259,2346,2349],{},"使用 ",[33,2343,2258],{},[33,2345,2262],{},[33,2347,2348],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2351,197],{"id":197},[161,2353,2354,2364],{},[48,2355,2356,2357,1159,2360,2363],{},"创建 ",[33,2358,2359],{},"course_name",[33,2361,2362],{},"lesson_count"," 两个变量并输出。",[48,2365,2366],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2368,208],{},[14,2370,211],{"id":211},[10,2372,2373],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,2375,218],{},{"title":78,"searchDepth":91,"depth":91,"links":2377},[2378,2379,2380,2381,2382,2383,2384,2385],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2214,"description":2219},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[229,2393,2394],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2397,"title":2398,"body":2399,"category":229,"cover":230,"description":2403,"extension":231,"meta":2567,"navigation":94,"path":2568,"pinned":234,"publishedAt":235,"seo":2569,"slug":2570,"stem":2571,"summary":2572,"tags":2573,"updatedAt":235,"visible":94,"__hash__":2576},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2400,"toc":2557},[2401,2404,2406,2409,2411,2417,2420,2422,2451,2453,2455,2499,2501,2507,2509,2511,2525,2527,2538,2540,2548,2550,2552,2555],[10,2402,2403],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2405,16],{"id":16},[10,2407,2408],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2410,22],{"id":22},[10,2412,2413],{},[26,2414],{"alt":2415,"src":2416},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2418,2419],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2421,43],{"id":43},[45,2423,2424,2434,2448],{},[48,2425,2426,2429,2430,2433],{},[33,2427,2428],{},"int"," 表示整数，",[33,2431,2432],{},"float"," 表示浮点数。",[48,2435,2436,2439,2440,2443,2444,2447],{},[33,2437,2438],{},"\u002F"," 总是进行真除法；",[33,2441,2442],{},"\u002F\u002F"," 是向下取整除法，",[33,2445,2446],{},"%"," 得到余数。",[48,2449,2450],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2452,68],{"id":68},[10,2454,71],{},[73,2456,2458],{"className":75,"code":2457,"language":77,"meta":78,"style":78},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2459,2460,2465,2470,2475,2479,2484,2489,2494],{"__ignoreMap":78},[82,2461,2462],{"class":84,"line":85},[82,2463,2464],{},"price = 25\n",[82,2466,2467],{"class":84,"line":91},[82,2468,2469],{},"count = 4\n",[82,2471,2472],{"class":84,"line":98},[82,2473,2474],{},"discount = 0.9\n",[82,2476,2477],{"class":84,"line":104},[82,2478,95],{"emptyLinePlaceholder":94},[82,2480,2481],{"class":84,"line":110},[82,2482,2483],{},"total = price * count * discount\n",[82,2485,2486],{"class":84,"line":116},[82,2487,2488],{},"average = total \u002F count\n",[82,2490,2491],{"class":84,"line":122},[82,2492,2493],{},"print(total)\n",[82,2495,2496],{"class":84,"line":128},[82,2497,2498],{},"print(average)\n",[10,2500,145],{},[73,2502,2505],{"className":2503,"code":2504,"language":151,"meta":78},[149],"90.0\n22.5\n",[33,2506,2504],{"__ignoreMap":78},[10,2508,156],{},[14,2510,159],{"id":159},[161,2512,2513,2519],{},[48,2514,2515,2518],{},[33,2516,2517],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[48,2520,2521,2524],{},[33,2522,2523],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2526,177],{"id":177},[45,2528,2529,2535],{},[48,2530,2531,2532,364],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2533,2534],{},"decimal.Decimal",[48,2536,2537],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2539,197],{"id":197},[161,2541,2542,2545],{},[48,2543,2544],{},"计算 137 除以 10 的商和余数。",[48,2546,2547],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2549,208],{},[14,2551,211],{"id":211},[10,2553,2554],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,2556,218],{},{"title":78,"searchDepth":91,"depth":91,"links":2558},[2559,2560,2561,2562,2563,2564,2565,2566],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2398,"description":2403},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[229,2574,2575],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2578,"title":2579,"body":2580,"category":229,"cover":230,"description":2584,"extension":231,"meta":2760,"navigation":94,"path":2761,"pinned":234,"publishedAt":235,"seo":2762,"slug":2763,"stem":2764,"summary":2765,"tags":2766,"updatedAt":235,"visible":94,"__hash__":2769},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2581,"toc":2748},[2582,2585,2587,2590,2592,2598,2608,2610,2621,2623,2625,2655,2657,2663,2665,2667,2697,2700,2703,2709,2712,2714,2722,2724,2739,2741,2743,2746],[10,2583,2584],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2586,16],{"id":16},[10,2588,2589],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2591,22],{"id":22},[10,2593,2594],{},[26,2595],{"alt":2596,"src":2597},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2599,2600,2601,2604,2605,364],{},"切片 ",[33,2602,2603],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2606,2607],{},"stop - start",[14,2609,43],{"id":43},[45,2611,2612,2615,2618],{},[48,2613,2614],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[48,2616,2617],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[48,2619,2620],{},"切片会创建新的字符串，不会修改原字符串。",[14,2622,68],{"id":68},[10,2624,71],{},[73,2626,2628],{"className":75,"code":2627,"language":77,"meta":78,"style":78},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2629,2630,2635,2640,2645,2650],{"__ignoreMap":78},[82,2631,2632],{"class":84,"line":85},[82,2633,2634],{},"language = \"Python\"\n",[82,2636,2637],{"class":84,"line":91},[82,2638,2639],{},"print(language[0])\n",[82,2641,2642],{"class":84,"line":98},[82,2643,2644],{},"print(language[-1])\n",[82,2646,2647],{"class":84,"line":104},[82,2648,2649],{},"print(language[0:3])\n",[82,2651,2652],{"class":84,"line":110},[82,2653,2654],{},"print(language + \" 3.14\")\n",[10,2656,145],{},[73,2658,2661],{"className":2659,"code":2660,"language":151,"meta":78},[149],"P\nn\nPyt\nPython 3.14\n",[33,2662,2660],{"__ignoreMap":78},[10,2664,156],{},[14,2666,159],{"id":159},[161,2668,2669,2683],{},[48,2670,2671,2672,2674,2675,2678,2679,2682],{},"字符串 ",[33,2673,229],{}," 的正索引从 ",[33,2676,2677],{},"P"," 的 0 开始，负索引从末尾 ",[33,2680,2681],{},"n"," 的 -1 开始。",[48,2684,2685,2688,2689,2692,2693,2696],{},[33,2686,2687],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2690,2691],{},"Pyt","；索引 3 的 ",[33,2694,2695],{},"h"," 不在结果中。",[330,2698,2699],{"id":2699},"再看一个具体细节",[10,2701,2702],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2704,2705],{},[26,2706],{"alt":2707,"src":2708},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2710,2711],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2713,177],{"id":177},[45,2715,2716,2719],{},[48,2717,2718],{},"把第一个字符写成索引 1，造成整体偏移一位。",[48,2720,2721],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2723,197],{"id":197},[161,2725,2726,2736],{},[48,2727,2728,2729,2732,2733,364],{},"从 ",[33,2730,2731],{},"\"programming\""," 中切出 ",[33,2734,2735],{},"\"gram\"",[48,2737,2738],{},"使用负索引取得字符串倒数第二个字符。",[10,2740,208],{},[14,2742,211],{"id":211},[10,2744,2745],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,2747,218],{},{"title":78,"searchDepth":91,"depth":91,"links":2749},[2750,2751,2752,2753,2754,2757,2758,2759],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":2755},[2756],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2579,"description":2584},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[229,2767,2768],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2771,"title":2772,"body":2773,"category":229,"cover":230,"description":2777,"extension":231,"meta":2991,"navigation":94,"path":2992,"pinned":234,"publishedAt":235,"seo":2993,"slug":2994,"stem":2995,"summary":2996,"tags":2997,"updatedAt":235,"visible":94,"__hash__":3000},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2774,"toc":2979},[2775,2778,2780,2783,2785,2791,2801,2803,2836,2838,2840,2884,2886,2892,2894,2896,2917,2919,2922,2928,2936,2938,2952,2954,2970,2972,2974,2977],[10,2776,2777],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2779,16],{"id":16},[10,2781,2782],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2784,22],{"id":22},[10,2786,2787],{},[26,2788],{"alt":2789,"src":2790},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2792,2793,2794,1011,2797,2800],{},"比较表达式先产生 ",[33,2795,2796],{},"True",[33,2798,2799],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2802,43],{"id":43},[45,2804,2805,2819,2833],{},[48,2806,2807,2810,2811,2814,2815,2818],{},[33,2808,2809],{},"=="," 判断是否相等，",[33,2812,2813],{},"!="," 判断是否不等；单个 ",[33,2816,2817],{},"="," 是赋值。",[48,2820,2821,2824,2825,2828,2829,2832],{},[33,2822,2823],{},"and"," 要求两侧都为真，",[33,2826,2827],{},"or"," 只需一侧为真，",[33,2830,2831],{},"not"," 取反。",[48,2834,2835],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2837,68],{"id":68},[10,2839,71],{},[73,2841,2843],{"className":75,"code":2842,"language":77,"meta":78,"style":78},"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",[33,2844,2845,2850,2855,2859,2864,2869,2874,2879],{"__ignoreMap":78},[82,2846,2847],{"class":84,"line":85},[82,2848,2849],{},"age = 20\n",[82,2851,2852],{"class":84,"line":91},[82,2853,2854],{},"has_ticket = True\n",[82,2856,2857],{"class":84,"line":98},[82,2858,95],{"emptyLinePlaceholder":94},[82,2860,2861],{"class":84,"line":104},[82,2862,2863],{},"is_adult = age >= 18\n",[82,2865,2866],{"class":84,"line":110},[82,2867,2868],{},"can_enter = is_adult and has_ticket\n",[82,2870,2871],{"class":84,"line":116},[82,2872,2873],{},"print(is_adult)\n",[82,2875,2876],{"class":84,"line":122},[82,2877,2878],{},"print(can_enter)\n",[82,2880,2881],{"class":84,"line":128},[82,2882,2883],{},"print(not has_ticket)\n",[10,2885,145],{},[73,2887,2890],{"className":2888,"code":2889,"language":151,"meta":78},[149],"True\nTrue\nFalse\n",[33,2891,2889],{"__ignoreMap":78},[10,2893,156],{},[14,2895,159],{"id":159},[161,2897,2898,2908],{},[48,2899,2900,2903,2904,2907],{},[33,2901,2902],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2905,2906],{},"is_adult","，这一步没有任何分支跳转。",[48,2909,2910,2913,2914,2916],{},[33,2911,2912],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2915,2831],{}," 只对紧随其后的值取反。",[330,2918,2699],{"id":2699},[10,2920,2921],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2923,2924],{},[26,2925],{"alt":2926,"src":2927},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2929,2930,2932,2933,2935],{},[33,2931,2823],{}," 只有“真、真”得到真；",[33,2934,2827],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2937,177],{"id":177},[45,2939,2940,2949],{},[48,2941,2942,2943,2945,2946,2948],{},"用单个等号判断相等。",[33,2944,2817],{}," 是赋值，",[33,2947,2809],{}," 才是相等比较。",[48,2950,2951],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2953,197],{"id":197},[161,2955,2956,2963],{},[48,2957,2958,2959,2962],{},"判断数字 ",[33,2960,2961],{},"15"," 是否同时大于 10 且小于 20。",[48,2964,2965,2966,2969],{},"分别修改年龄和票据状态，记录 ",[33,2967,2968],{},"can_enter"," 的四种组合结果。",[10,2971,208],{},[14,2973,211],{"id":211},[10,2975,2976],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,2978,218],{},{"title":78,"searchDepth":91,"depth":91,"links":2980},[2981,2982,2983,2984,2985,2988,2989,2990],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":2986},[2987],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2772,"description":2777},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[229,2998,2999],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3002,"title":3003,"body":3004,"category":229,"cover":230,"description":3008,"extension":231,"meta":3176,"navigation":94,"path":3177,"pinned":234,"publishedAt":235,"seo":3178,"slug":3179,"stem":3180,"summary":3181,"tags":3182,"updatedAt":235,"visible":94,"__hash__":3184},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3005,"toc":3166},[3006,3009,3011,3014,3016,3022,3040,3042,3055,3057,3059,3093,3095,3101,3103,3105,3127,3129,3141,3143,3157,3159,3161,3164],[10,3007,3008],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3010,16],{"id":16},[10,3012,3013],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3015,22],{"id":22},[10,3017,3018],{},[26,3019],{"alt":3020,"src":3021},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3023,3024,3027,3028,3031,3032,3035,3036,3039],{},[33,3025,3026],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3029,3030],{},"18","，程序首先得到的也是 ",[33,3033,3034],{},"\"18\"","，需要 ",[33,3037,3038],{},"int()"," 后才能按整数参与计算。",[14,3041,43],{"id":43},[45,3043,3044,3047,3052],{},[48,3045,3046],{},"提示文字应告诉用户需要输入什么。",[48,3048,3049,3051],{},[33,3050,3038],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[48,3053,3054],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3056,68],{"id":68},[10,3058,71],{},[73,3060,3062],{"className":75,"code":3061,"language":77,"meta":78,"style":78},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3063,3064,3069,3074,3079,3083,3088],{"__ignoreMap":78},[82,3065,3066],{"class":84,"line":85},[82,3067,3068],{},"name = input(\"请输入姓名：\")\n",[82,3070,3071],{"class":84,"line":91},[82,3072,3073],{},"age_text = input(\"请输入年龄：\")\n",[82,3075,3076],{"class":84,"line":98},[82,3077,3078],{},"age = int(age_text)\n",[82,3080,3081],{"class":84,"line":104},[82,3082,95],{"emptyLinePlaceholder":94},[82,3084,3085],{"class":84,"line":110},[82,3086,3087],{},"print(\"你好，\" + name)\n",[82,3089,3090],{"class":84,"line":116},[82,3091,3092],{},"print(age + 1)\n",[10,3094,145],{},[73,3096,3099],{"className":3097,"code":3098,"language":151,"meta":78},[149],"根据输入显示姓名，并输出下一年的年龄\n",[33,3100,3098],{"__ignoreMap":78},[10,3102,156],{},[14,3104,159],{"id":159},[161,3106,3107,3117],{},[48,3108,3109,3110,3112,3113,3116],{},"两次 ",[33,3111,3026],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3114,3115],{},"age_text"," 用来提醒这仍是文本。",[48,3118,3119,3122,3123,3126],{},[33,3120,3121],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3124,3125],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3128,177],{"id":177},[45,3130,3131,3138],{},[48,3132,3133,3134,3137],{},"直接计算 ",[33,3135,3136],{},"input(...) + 1","，忽略输入结果是字符串。",[48,3139,3140],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3142,197],{"id":197},[161,3144,3145,3148],{},[48,3146,3147],{},"接收两个整数并输出它们的和。",[48,3149,1722,3150,3153,3154,3156],{},[33,3151,3152],{},"18.5"," 给 ",[33,3155,3038],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3158,208],{},[14,3160,211],{"id":211},[10,3162,3163],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,3165,218],{},{"title":78,"searchDepth":91,"depth":91,"links":3167},[3168,3169,3170,3171,3172,3173,3174,3175],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3003,"description":3008},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[229,2348,3183],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3186,"title":3187,"body":3188,"category":229,"cover":230,"description":3192,"extension":231,"meta":3352,"navigation":94,"path":3353,"pinned":234,"publishedAt":235,"seo":3354,"slug":3355,"stem":3356,"summary":3357,"tags":3358,"updatedAt":235,"visible":94,"__hash__":3361},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3189,"toc":3342},[3190,3193,3195,3198,3200,3206,3213,3215,3229,3231,3233,3272,3274,3280,3282,3284,3303,3305,3320,3322,3333,3335,3337,3340],[10,3191,3192],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3194,16],{"id":16},[10,3196,3197],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3199,22],{"id":22},[10,3201,3202],{},[26,3203],{"alt":3204,"src":3205},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3207,3208,3209,3212],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3210,3211],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3214,43],{"id":43},[45,3216,3217,3220,3223],{},[48,3218,3219],{},"列表使用方括号，元素之间用逗号分隔。",[48,3221,3222],{},"列表可变，可以替换、追加和删除元素。",[48,3224,3225,3226,364],{},"访问不存在的索引会产生 ",[33,3227,3228],{},"IndexError",[14,3230,68],{"id":68},[10,3232,71],{},[73,3234,3236],{"className":75,"code":3235,"language":77,"meta":78,"style":78},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3237,3238,3243,3248,3252,3257,3262,3267],{"__ignoreMap":78},[82,3239,3240],{"class":84,"line":85},[82,3241,3242],{},"scores = [82, 90, 76]\n",[82,3244,3245],{"class":84,"line":91},[82,3246,3247],{},"print(scores[0])\n",[82,3249,3250],{"class":84,"line":98},[82,3251,95],{"emptyLinePlaceholder":94},[82,3253,3254],{"class":84,"line":104},[82,3255,3256],{},"scores[1] = 95\n",[82,3258,3259],{"class":84,"line":110},[82,3260,3261],{},"scores.append(88)\n",[82,3263,3264],{"class":84,"line":116},[82,3265,3266],{},"print(scores)\n",[82,3268,3269],{"class":84,"line":122},[82,3270,3271],{},"print(len(scores))\n",[10,3273,145],{},[73,3275,3278],{"className":3276,"code":3277,"language":151,"meta":78},[149],"82\n[82, 95, 76, 88]\n4\n",[33,3279,3277],{"__ignoreMap":78},[10,3281,156],{},[14,3283,159],{"id":159},[161,3285,3286,3289],{},[48,3287,3288],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[48,3290,3291,3294,3295,3298,3299,3302],{},[33,3292,3293],{},"scores[1] = 95"," 替换第二个位置，",[33,3296,3297],{},"append(88)"," 在末尾增加新位置，",[33,3300,3301],{},"len()"," 因而从 3 变为 4。",[14,3304,177],{"id":177},[45,3306,3307,3317],{},[48,3308,3309,3310,3313,3314,364],{},"访问 ",[33,3311,3312],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3315,3316],{},"len(scores) - 1",[48,3318,3319],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3321,197],{"id":197},[161,3323,3324,3327],{},[48,3325,3326],{},"建立三项学习任务列表，再追加第四项。",[48,3328,3329,3330,3332],{},"修改第二项，并用 ",[33,3331,3301],{}," 检查元素数量。",[10,3334,208],{},[14,3336,211],{"id":211},[10,3338,3339],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,3341,218],{},{"title":78,"searchDepth":91,"depth":91,"links":3343},[3344,3345,3346,3347,3348,3349,3350,3351],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3187,"description":3192},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[229,3359,3360],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3363,"title":3364,"body":3365,"category":229,"cover":230,"description":3369,"extension":231,"meta":3509,"navigation":94,"path":3510,"pinned":234,"publishedAt":235,"seo":3511,"slug":3512,"stem":3513,"summary":3514,"tags":3515,"updatedAt":235,"visible":94,"__hash__":3517},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3366,"toc":3499},[3367,3370,3372,3375,3377,3383,3386,3388,3399,3401,3403,3437,3439,3445,3447,3449,3463,3465,3476,3478,3490,3492,3494,3497],[10,3368,3369],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3371,16],{"id":16},[10,3373,3374],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3376,22],{"id":22},[10,3378,3379],{},[26,3380],{"alt":3381,"src":3382},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3384,3385],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3387,43],{"id":43},[45,3389,3390,3393,3396],{},[48,3391,3392],{},"元组常用来表达固定数量、固定含义的一组值。",[48,3394,3395],{},"只有一个元素的元组必须保留尾随逗号。",[48,3397,3398],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3400,68],{"id":68},[10,3402,71],{},[73,3404,3406],{"className":75,"code":3405,"language":77,"meta":78,"style":78},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3407,3408,3413,3418,3423,3427,3432],{"__ignoreMap":78},[82,3409,3410],{"class":84,"line":85},[82,3411,3412],{},"point = (120, 80)\n",[82,3414,3415],{"class":84,"line":91},[82,3416,3417],{},"print(point[0])\n",[82,3419,3420],{"class":84,"line":98},[82,3421,3422],{},"print(point[1])\n",[82,3424,3425],{"class":84,"line":104},[82,3426,95],{"emptyLinePlaceholder":94},[82,3428,3429],{"class":84,"line":110},[82,3430,3431],{},"single = (5,)\n",[82,3433,3434],{"class":84,"line":116},[82,3435,3436],{},"print(single)\n",[10,3438,145],{},[73,3440,3443],{"className":3441,"code":3442,"language":151,"meta":78},[149],"120\n80\n(5,)\n",[33,3444,3442],{"__ignoreMap":78},[10,3446,156],{},[14,3448,159],{"id":159},[161,3450,3451,3457],{},[48,3452,3453,3456],{},[33,3454,3455],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[48,3458,3459,3462],{},[33,3460,3461],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3464,177],{"id":177},[45,3466,3467,3473],{},[48,3468,182,3469,3472],{},[33,3470,3471],{},"(5)"," 当作元组，实际它仍是整数。",[48,3474,3475],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3477,197],{"id":197},[161,3479,3480,3483],{},[48,3481,3482],{},"用元组表示宽度和高度。",[48,3484,2175,3485,2178,3487,3489],{},[33,3486,3471],{},[33,3488,3461],{}," 的类型。",[10,3491,208],{},[14,3493,211],{"id":211},[10,3495,3496],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,3498,218],{},{"title":78,"searchDepth":91,"depth":91,"links":3500},[3501,3502,3503,3504,3505,3506,3507,3508],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3364,"description":3369},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[229,3516,3360],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3519,"title":3520,"body":3521,"category":229,"cover":230,"description":3525,"extension":231,"meta":3680,"navigation":94,"path":3681,"pinned":234,"publishedAt":235,"seo":3682,"slug":3683,"stem":3684,"summary":3685,"tags":3686,"updatedAt":235,"visible":94,"__hash__":3688},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3522,"toc":3670},[3523,3526,3528,3531,3533,3539,3549,3551,3565,3567,3569,3603,3605,3611,3613,3615,3630,3632,3651,3653,3661,3663,3665,3668],[10,3524,3525],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3527,16],{"id":16},[10,3529,3530],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3532,22],{"id":22},[10,3534,3535],{},[26,3536],{"alt":3537,"src":3538},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3540,3541,3542,3545,3546,3548],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3543,3544],{},"student[\"score\"]"," 读取的是键 ",[33,3547,2248],{}," 对应的值，而不是“第几个元素”。",[14,3550,43],{"id":43},[45,3552,3553,3556,3562],{},[48,3554,3555],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[48,3557,2341,3558,3561],{},[33,3559,3560],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[48,3563,3564],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3566,68],{"id":68},[10,3568,71],{},[73,3570,3572],{"className":75,"code":3571,"language":77,"meta":78,"style":78},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3573,3574,3579,3584,3588,3593,3598],{"__ignoreMap":78},[82,3575,3576],{"class":84,"line":85},[82,3577,3578],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[82,3580,3581],{"class":84,"line":91},[82,3582,3583],{},"print(student[\"name\"])\n",[82,3585,3586],{"class":84,"line":98},[82,3587,95],{"emptyLinePlaceholder":94},[82,3589,3590],{"class":84,"line":104},[82,3591,3592],{},"student[\"score\"] = 95\n",[82,3594,3595],{"class":84,"line":110},[82,3596,3597],{},"student[\"city\"] = \"郑州\"\n",[82,3599,3600],{"class":84,"line":116},[82,3601,3602],{},"print(student)\n",[10,3604,145],{},[73,3606,3609],{"className":3607,"code":3608,"language":151,"meta":78},[149],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3610,3608],{"__ignoreMap":78},[10,3612,156],{},[14,3614,159],{"id":159},[161,3616,3617,3620],{},[48,3618,3619],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[48,3621,3622,3623,3625,3626,3629],{},"给已有键 ",[33,3624,2248],{}," 赋值会更新映射，给新键 ",[33,3627,3628],{},"city"," 赋值会增加映射。",[14,3631,177],{"id":177},[45,3633,3634,3641],{},[48,3635,3636,3637,3640],{},"按位置理解字典并尝试 ",[33,3638,3639],{},"student[0]","，而实际键是字符串。",[48,3642,3643,3644,3647,3648,364],{},"直接读取不确定存在的键并忽略 ",[33,3645,3646],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3649,3650],{},"get()",[14,3652,197],{"id":197},[161,3654,3655,3658],{},[48,3656,3657],{},"建立一本书的标题、作者和页数字典。",[48,3659,3660],{},"添加分类键，再修改页数。",[10,3662,208],{},[14,3664,211],{"id":211},[10,3666,3667],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,3669,218],{},{"title":78,"searchDepth":91,"depth":91,"links":3671},[3672,3673,3674,3675,3676,3677,3678,3679],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3520,"description":3525},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[229,3687,3360],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3690,"title":3691,"body":3692,"category":229,"cover":230,"description":3696,"extension":231,"meta":3845,"navigation":94,"path":3846,"pinned":234,"publishedAt":235,"seo":3847,"slug":3848,"stem":3849,"summary":3850,"tags":3851,"updatedAt":235,"visible":94,"__hash__":3853},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3693,"toc":3835},[3694,3697,3699,3702,3704,3710,3713,3715,3734,3736,3738,3772,3774,3780,3782,3784,3799,3801,3813,3815,3826,3828,3830,3833],[10,3695,3696],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3698,16],{"id":16},[10,3700,3701],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3703,22],{"id":22},[10,3705,3706],{},[26,3707],{"alt":3708,"src":3709},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3711,3712],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3714,43],{"id":43},[45,3716,3717,3720,3723],{},[48,3718,3719],{},"集合中的元素不重复。",[48,3721,3722],{},"集合是无序容器，不要依赖打印顺序或索引。",[48,3724,3725,3726,3729,3730,3733],{},"创建空集合必须写 ",[33,3727,3728],{},"set()","；",[33,3731,3732],{},"{}"," 创建的是空字典。",[14,3735,68],{"id":68},[10,3737,71],{},[73,3739,3741],{"className":75,"code":3740,"language":77,"meta":78,"style":78},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3742,3743,3748,3753,3757,3762,3767],{"__ignoreMap":78},[82,3744,3745],{"class":84,"line":85},[82,3746,3747],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[82,3749,3750],{"class":84,"line":91},[82,3751,3752],{},"right = {\"Python\", \"Docker\"}\n",[82,3754,3755],{"class":84,"line":98},[82,3756,95],{"emptyLinePlaceholder":94},[82,3758,3759],{"class":84,"line":104},[82,3760,3761],{},"print(left & right)\n",[82,3763,3764],{"class":84,"line":110},[82,3765,3766],{},"print(left | right)\n",[82,3768,3769],{"class":84,"line":116},[82,3770,3771],{},"print(\"Git\" in left)\n",[10,3773,145],{},[73,3775,3778],{"className":3776,"code":3777,"language":151,"meta":78},[149],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3779,3777],{"__ignoreMap":78},[10,3781,156],{},[14,3783,159],{"id":159},[161,3785,3786,3789],{},[48,3787,3788],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[48,3790,3791,3794,3795,3798],{},[33,3792,3793],{},"&"," 计算交集，",[33,3796,3797],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3800,177],{"id":177},[45,3802,3803,3810],{},[48,3804,2341,3805,3807,3808,364],{},[33,3806,3732],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3809,3728],{},[48,3811,3812],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3814,197],{"id":197},[161,3816,3817,3823],{},[48,3818,3819,3820,3822],{},"把包含重复标签的列表交给 ",[33,3821,3728],{}," 去重。",[48,3824,3825],{},"计算两组课程标签的交集和差集。",[10,3827,208],{},[14,3829,211],{"id":211},[10,3831,3832],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,3834,218],{},{"title":78,"searchDepth":91,"depth":91,"links":3836},[3837,3838,3839,3840,3841,3842,3843,3844],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3691,"description":3696},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[229,3852,3360],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3855,"title":3856,"body":3857,"category":229,"cover":230,"description":3861,"extension":231,"meta":4058,"navigation":94,"path":4059,"pinned":234,"publishedAt":235,"seo":4060,"slug":4061,"stem":4062,"summary":4063,"tags":4064,"updatedAt":235,"visible":94,"__hash__":4067},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3858,"toc":4046},[3859,3862,3864,3867,3869,3875,3885,3887,3904,3906,3908,3957,3959,3965,3967,3969,3991,3993,3996,4002,4005,4007,4020,4022,4037,4039,4041,4044],[10,3860,3861],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3863,16],{"id":16},[10,3865,3866],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3868,22],{"id":22},[10,3870,3871],{},[26,3872],{"alt":3873,"src":3874},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3876,3877,3880,3881,3884],{},[33,3878,3879],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3882,3883],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3886,43],{"id":43},[45,3888,3889,3898,3901],{},[48,3890,3891,3893,3894,3897],{},[33,3892,2809],{}," 比较内容是否相等，",[33,3895,3896],{},"is"," 比较是否为同一个对象。",[48,3899,3900],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[48,3902,3903],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3905,68],{"id":68},[10,3907,71],{},[73,3909,3911],{"className":75,"code":3910,"language":77,"meta":78,"style":78},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3912,3913,3918,3923,3928,3932,3937,3942,3947,3952],{"__ignoreMap":78},[82,3914,3915],{"class":84,"line":85},[82,3916,3917],{},"tasks = [\"变量\", \"字符串\"]\n",[82,3919,3920],{"class":84,"line":91},[82,3921,3922],{},"shared = tasks\n",[82,3924,3925],{"class":84,"line":98},[82,3926,3927],{},"backup = tasks.copy()\n",[82,3929,3930],{"class":84,"line":104},[82,3931,95],{"emptyLinePlaceholder":94},[82,3933,3934],{"class":84,"line":110},[82,3935,3936],{},"tasks.append(\"列表\")\n",[82,3938,3939],{"class":84,"line":116},[82,3940,3941],{},"print(shared)\n",[82,3943,3944],{"class":84,"line":122},[82,3945,3946],{},"print(backup)\n",[82,3948,3949],{"class":84,"line":128},[82,3950,3951],{},"print(tasks is shared)\n",[82,3953,3954],{"class":84,"line":134},[82,3955,3956],{},"print(tasks is backup)\n",[10,3958,145],{},[73,3960,3963],{"className":3961,"code":3962,"language":151,"meta":78},[149],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3964,3962],{"__ignoreMap":78},[10,3966,156],{},[14,3968,159],{"id":159},[161,3970,3971,3977],{},[48,3972,3973,3976],{},[33,3974,3975],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[48,3978,3979,3982,3983,3986,3987,3990],{},[33,3980,3981],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3984,3985],{},"shared"," 能观察到变化，",[33,3988,3989],{},"backup"," 不会。",[330,3992,2699],{"id":2699},[10,3994,3995],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3997,3998],{},[26,3999],{"alt":4000,"src":4001},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4003,4004],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4006,177],{"id":177},[45,4008,4009,4017],{},[48,4010,4011,4012,4014,4015,364],{},"用 ",[33,4013,2809],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,4016,3896],{},[48,4018,4019],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4021,197],{"id":197},[161,4023,4024,4027],{},[48,4025,4026],{},"让两个变量引用同一个字典并修改其中一个。",[48,4028,2341,4029,4032,4033,1159,4035,364],{},[33,4030,4031],{},"copy()"," 创建外层副本，再比较 ",[33,4034,3896],{},[33,4036,2809],{},[10,4038,208],{},[14,4040,211],{"id":211},[10,4042,4043],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,4045,218],{},{"title":78,"searchDepth":91,"depth":91,"links":4047},[4048,4049,4050,4051,4052,4055,4056,4057],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":4053},[4054],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3856,"description":3861},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[229,4065,4066],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4069,"title":4070,"body":4071,"category":229,"cover":230,"description":4075,"extension":231,"meta":4287,"navigation":94,"path":4288,"pinned":234,"publishedAt":235,"seo":4289,"slug":4290,"stem":4291,"summary":4292,"tags":4293,"updatedAt":235,"visible":94,"__hash__":4295},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4072,"toc":4274},[4073,4076,4078,4081,4083,4089,4099,4101,4112,4114,4116,4168,4170,4176,4178,4180,4198,4200,4203,4209,4217,4220,4223,4229,4235,4237,4255,4257,4265,4267,4269,4272],[10,4074,4075],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4077,16],{"id":16},[10,4079,4080],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4082,22],{"id":22},[10,4084,4085],{},[26,4086],{"alt":4087,"src":4088},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4090,4091,2259,4093,2259,4096,4098],{},[33,4092,1158],{},[33,4094,4095],{},"elif",[33,4097,1162],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4100,43],{"id":43},[45,4102,4103,4106,4109],{},[48,4104,4105],{},"冒号表示接下来开始一个代码块。",[48,4107,4108],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[48,4110,4111],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4113,68],{"id":68},[10,4115,71],{},[73,4117,4119],{"className":75,"code":4118,"language":77,"meta":78,"style":78},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4120,4121,4126,4130,4135,4140,4145,4150,4154,4159,4163],{"__ignoreMap":78},[82,4122,4123],{"class":84,"line":85},[82,4124,4125],{},"score = int(input(\"请输入分数：\"))\n",[82,4127,4128],{"class":84,"line":91},[82,4129,95],{"emptyLinePlaceholder":94},[82,4131,4132],{"class":84,"line":98},[82,4133,4134],{},"if score >= 90:\n",[82,4136,4137],{"class":84,"line":104},[82,4138,4139],{},"    level = \"优秀\"\n",[82,4141,4142],{"class":84,"line":110},[82,4143,4144],{},"elif score >= 60:\n",[82,4146,4147],{"class":84,"line":116},[82,4148,4149],{},"    level = \"合格\"\n",[82,4151,4152],{"class":84,"line":122},[82,4153,1148],{},[82,4155,4156],{"class":84,"line":128},[82,4157,4158],{},"    level = \"需要继续学习\"\n",[82,4160,4161],{"class":84,"line":134},[82,4162,95],{"emptyLinePlaceholder":94},[82,4164,4165],{"class":84,"line":139},[82,4166,4167],{},"print(level)\n",[10,4169,145],{},[73,4171,4174],{"className":4172,"code":4173,"language":151,"meta":78},[149],"输入 85 时输出：合格\n",[33,4175,4173],{"__ignoreMap":78},[10,4177,156],{},[14,4179,159],{"id":159},[161,4181,4182,4189],{},[48,4183,4184,4185,4188],{},"输入先转换为整数，程序从 ",[33,4186,4187],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[48,4190,4191,4194,4195,4197],{},[33,4192,4193],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4196,1162],{}," 被跳过；最终三个分支只会选择一个。",[330,4199,2699],{"id":2699},[10,4201,4202],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4204,4205],{},[26,4206],{"alt":4207,"src":4208},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4210,4211,4213,4214,4216],{},[33,4212,4187],{}," 必须放在 ",[33,4215,4193],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[330,4218,2699],{"id":4219},"再看一个具体细节-1",[10,4221,4222],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4224,4225],{},[26,4226],{"alt":4227,"src":4228},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4230,4231,4232,4234],{},"同一缩进层级属于同一个代码块；回到 ",[33,4233,1158],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4236,177],{"id":177},[45,4238,4239,4245],{},[48,4240,4241,4242,4244],{},"先写 ",[33,4243,4193],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[48,4246,4247,4248,4250,4251,4254],{},"混用多个独立 ",[33,4249,1158],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4252,4253],{},"if\u002Felif\u002Felse"," 链。",[14,4256,197],{"id":197},[161,4258,4259,4262],{},[48,4260,4261],{},"根据温度输出“冷、适中、热”三个等级。",[48,4263,4264],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4266,208],{},[14,4268,211],{"id":211},[10,4270,4271],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,4273,218],{},{"title":78,"searchDepth":91,"depth":91,"links":4275},[4276,4277,4278,4279,4280,4284,4285,4286],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":4281},[4282,4283],{"id":2699,"depth":98,"text":2699},{"id":4219,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4070,"description":4075},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[229,1158,4294],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4297,"title":4298,"body":4299,"category":229,"cover":230,"description":4303,"extension":231,"meta":4468,"navigation":94,"path":4469,"pinned":234,"publishedAt":235,"seo":4470,"slug":4471,"stem":4472,"summary":4473,"tags":4474,"updatedAt":235,"visible":94,"__hash__":4476},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4300,"toc":4456},[4301,4304,4306,4309,4311,4317,4322,4324,4339,4341,4343,4381,4383,4389,4391,4393,4408,4410,4413,4419,4425,4427,4435,4437,4447,4449,4451,4454],[10,4302,4303],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4305,16],{"id":16},[10,4307,4308],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4310,22],{"id":22},[10,4312,4313],{},[26,4314],{"alt":4315,"src":4316},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4318,4319,4321],{},[33,4320,58],{}," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4323,43],{"id":43},[45,4325,4326,4329,4332],{},[48,4327,4328],{},"进入循环前先准备参与条件判断的状态。",[48,4330,4331],{},"循环体中必须有机会让条件变为假。",[48,4333,4334,4335,4338],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4336,4337],{},"for"," 通常更直接。",[14,4340,68],{"id":68},[10,4342,71],{},[73,4344,4346],{"className":75,"code":4345,"language":77,"meta":78,"style":78},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4347,4348,4353,4357,4362,4367,4372,4376],{"__ignoreMap":78},[82,4349,4350],{"class":84,"line":85},[82,4351,4352],{},"count = 1\n",[82,4354,4355],{"class":84,"line":91},[82,4356,95],{"emptyLinePlaceholder":94},[82,4358,4359],{"class":84,"line":98},[82,4360,4361],{},"while count \u003C= 3:\n",[82,4363,4364],{"class":84,"line":104},[82,4365,4366],{},"    print(\"第\", count, \"次练习\")\n",[82,4368,4369],{"class":84,"line":110},[82,4370,4371],{},"    count = count + 1\n",[82,4373,4374],{"class":84,"line":116},[82,4375,95],{"emptyLinePlaceholder":94},[82,4377,4378],{"class":84,"line":122},[82,4379,4380],{},"print(\"练习结束\")\n",[10,4382,145],{},[73,4384,4387],{"className":4385,"code":4386,"language":151,"meta":78},[149],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4388,4386],{"__ignoreMap":78},[10,4390,156],{},[14,4392,159],{"id":159},[161,4394,4395,4402],{},[48,4396,4397,4398,4401],{},"进入循环前 ",[33,4399,4400],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[48,4403,4404,4405,4407],{},"循环体末尾把 ",[33,4406,4400],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[330,4409,2699],{"id":2699},[10,4411,4412],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4414,4415],{},[26,4416],{"alt":4417,"src":4418},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4420,4421,4422,4424],{},"第4次检查时 ",[33,4423,4400],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4426,177],{"id":177},[45,4428,4429,4432],{},[48,4430,4431],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[48,4433,4434],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4436,197],{"id":197},[161,4438,4439,4444],{},[48,4440,2341,4441,4443],{},[33,4442,58],{}," 输出 1 到 5。",[48,4445,4446],{},"计算 1 到 10 的累加和。",[10,4448,208],{},[14,4450,211],{"id":211},[10,4452,4453],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,4455,218],{},{"title":78,"searchDepth":91,"depth":91,"links":4457},[4458,4459,4460,4461,4462,4465,4466,4467],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":4463},[4464],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4298,"description":4303},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[229,58,4475],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4478,"title":4479,"body":4480,"category":229,"cover":230,"description":4484,"extension":231,"meta":4631,"navigation":94,"path":4632,"pinned":234,"publishedAt":235,"seo":4633,"slug":4634,"stem":4635,"summary":4636,"tags":4637,"updatedAt":235,"visible":94,"__hash__":4639},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4481,"toc":4621},[4482,4485,4487,4490,4492,4498,4503,4505,4519,4521,4523,4560,4562,4568,4570,4572,4589,4591,4599,4601,4612,4614,4616,4619],[10,4483,4484],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4486,16],{"id":16},[10,4488,4489],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4491,22],{"id":22},[10,4493,4494],{},[26,4495],{"alt":4496,"src":4497},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4499,4500,4502],{},[33,4501,4337],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4504,43],{"id":43},[45,4506,4507,4513,4516],{},[48,4508,4509,4512],{},[33,4510,4511],{},"range(1, 4)"," 包含 1，不包含 4。",[48,4514,4515],{},"只需要元素时直接遍历元素，不必手工维护索引。",[48,4517,4518],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4520,68],{"id":68},[10,4522,71],{},[73,4524,4526],{"className":75,"code":4525,"language":77,"meta":78,"style":78},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4527,4528,4533,4537,4542,4547,4551,4556],{"__ignoreMap":78},[82,4529,4530],{"class":84,"line":85},[82,4531,4532],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[82,4534,4535],{"class":84,"line":91},[82,4536,95],{"emptyLinePlaceholder":94},[82,4538,4539],{"class":84,"line":98},[82,4540,4541],{},"for course in courses:\n",[82,4543,4544],{"class":84,"line":104},[82,4545,4546],{},"    print(course)\n",[82,4548,4549],{"class":84,"line":110},[82,4550,95],{"emptyLinePlaceholder":94},[82,4552,4553],{"class":84,"line":116},[82,4554,4555],{},"for number in range(1, 4):\n",[82,4557,4558],{"class":84,"line":122},[82,4559,131],{},[10,4561,145],{},[73,4563,4566],{"className":4564,"code":4565,"language":151,"meta":78},[149],"变量\n字符串\n列表\n1\n2\n3\n",[33,4567,4565],{"__ignoreMap":78},[10,4569,156],{},[14,4571,159],{"id":159},[161,4573,4574,4584],{},[48,4575,4576,4577,4579,4580,4583],{},"第一个 ",[33,4578,4337],{}," 依次从列表取得字符串，循环变量 ",[33,4581,4582],{},"course"," 每轮重新绑定。",[48,4585,4586,4588],{},[33,4587,4511],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4590,177],{"id":177},[45,4592,4593,4596],{},[48,4594,4595],{},"只需要元素却手工维护索引，增加越界风险。",[48,4597,4598],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4600,197],{"id":197},[161,4602,4603,4606],{},[48,4604,4605],{},"逐项输出一个字符串中的字符。",[48,4607,2341,4608,4611],{},[33,4609,4610],{},"range()"," 输出 2、4、6、8。",[10,4613,208],{},[14,4615,211],{"id":211},[10,4617,4618],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,4620,218],{},{"title":78,"searchDepth":91,"depth":91,"links":4622},[4623,4624,4625,4626,4627,4628,4629,4630],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4479,"description":4484},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[229,4337,4638],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4,"title":5,"body":4641,"category":229,"cover":230,"description":12,"extension":231,"meta":4786,"navigation":94,"path":233,"pinned":234,"publishedAt":235,"seo":4787,"slug":237,"stem":238,"summary":239,"tags":4788,"updatedAt":235,"visible":94,"__hash__":241},{"type":7,"value":4642,"toc":4776},[4643,4645,4647,4649,4651,4655,4661,4663,4677,4679,4681,4725,4727,4732,4734,4736,4746,4748,4760,4762,4768,4770,4772,4774],[10,4644,12],{},[14,4646,16],{"id":16},[10,4648,19],{},[14,4650,22],{"id":22},[10,4652,4653],{},[26,4654],{"alt":28,"src":29},[10,4656,4657,36,4659,40],{},[33,4658,35],{},[33,4660,39],{},[14,4662,43],{"id":43},[45,4664,4665,4667,4673],{},[48,4666,50],{},[48,4668,4669,55,4671,59],{},[33,4670,35],{},[33,4672,58],{},[48,4674,62,4675,65],{},[33,4676,39],{},[14,4678,68],{"id":68},[10,4680,71],{},[73,4682,4683],{"className":75,"code":76,"language":77,"meta":78,"style":78},[33,4684,4685,4689,4693,4697,4701,4705,4709,4713,4717,4721],{"__ignoreMap":78},[82,4686,4687],{"class":84,"line":85},[82,4688,88],{},[82,4690,4691],{"class":84,"line":91},[82,4692,95],{"emptyLinePlaceholder":94},[82,4694,4695],{"class":84,"line":98},[82,4696,101],{},[82,4698,4699],{"class":84,"line":104},[82,4700,107],{},[82,4702,4703],{"class":84,"line":110},[82,4704,113],{},[82,4706,4707],{"class":84,"line":116},[82,4708,119],{},[82,4710,4711],{"class":84,"line":122},[82,4712,125],{},[82,4714,4715],{"class":84,"line":128},[82,4716,131],{},[82,4718,4719],{"class":84,"line":134},[82,4720,95],{"emptyLinePlaceholder":94},[82,4722,4723],{"class":84,"line":139},[82,4724,142],{},[10,4726,145],{},[73,4728,4730],{"className":4729,"code":150,"language":151,"meta":78},[149],[33,4731,150],{"__ignoreMap":78},[10,4733,156],{},[14,4735,159],{"id":159},[161,4737,4738,4742],{},[48,4739,165,4740,168],{},[33,4741,35],{},[48,4743,171,4744,174],{},[33,4745,39],{},[14,4747,177],{"id":177},[45,4749,4750,4754],{},[48,4751,182,4752,185],{},[33,4753,35],{},[48,4755,188,4756,191,4758,194],{},[33,4757,58],{},[33,4759,35],{},[14,4761,197],{"id":197},[161,4763,4764,4766],{},[48,4765,202],{},[48,4767,205],{},[10,4769,208],{},[14,4771,211],{"id":211},[10,4773,214],{},[216,4775,218],{},{"title":78,"searchDepth":91,"depth":91,"links":4777},[4778,4779,4780,4781,4782,4783,4784,4785],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5,"description":12},[229,39,35],{"id":4790,"title":4791,"body":4792,"category":229,"cover":230,"description":4796,"extension":231,"meta":4967,"navigation":94,"path":4968,"pinned":234,"publishedAt":235,"seo":4969,"slug":4970,"stem":4971,"summary":4972,"tags":4973,"updatedAt":235,"visible":94,"__hash__":4976},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4793,"toc":4955},[4794,4797,4799,4802,4804,4810,4813,4815,4839,4841,4843,4877,4879,4885,4887,4889,4906,4908,4911,4917,4920,4922,4936,4938,4946,4948,4950,4953],[10,4795,4796],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4798,16],{"id":16},[10,4800,4801],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4803,22],{"id":22},[10,4805,4806],{},[26,4807],{"alt":4808,"src":4809},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4811,4812],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4814,43],{"id":43},[45,4816,4817,4820,4823],{},[48,4818,4819],{},"每增加一层嵌套，阅读成本都会上升。",[48,4821,4822],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[48,4824,4825,4826,2259,4829,4832,4833,2259,4836,364],{},"变量名使用 ",[33,4827,4828],{},"row",[33,4830,4831],{},"cell"," 等层级含义，避免全部写成 ",[33,4834,4835],{},"i",[33,4837,4838],{},"j",[14,4840,68],{"id":68},[10,4842,71],{},[73,4844,4846],{"className":75,"code":4845,"language":77,"meta":78,"style":78},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4847,4848,4853,4857,4862,4867,4872],{"__ignoreMap":78},[82,4849,4850],{"class":84,"line":85},[82,4851,4852],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[82,4854,4855],{"class":84,"line":91},[82,4856,95],{"emptyLinePlaceholder":94},[82,4858,4859],{"class":84,"line":98},[82,4860,4861],{},"for row in table:\n",[82,4863,4864],{"class":84,"line":104},[82,4865,4866],{},"    for cell in row:\n",[82,4868,4869],{"class":84,"line":110},[82,4870,4871],{},"        print(cell)\n",[82,4873,4874],{"class":84,"line":116},[82,4875,4876],{},"    print(\"一行结束\")\n",[10,4878,145],{},[73,4880,4883],{"className":4881,"code":4882,"language":151,"meta":78},[149],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4884,4882],{"__ignoreMap":78},[10,4886,156],{},[14,4888,159],{"id":159},[161,4890,4891,4903],{},[48,4892,4893,4894,4896,4897,1159,4900,364],{},"外层变量 ",[33,4895,4828],{}," 先引用第一行列表，内层才依次处理 ",[33,4898,4899],{},"A1",[33,4901,4902],{},"A2",[48,4904,4905],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[330,4907,2699],{"id":2699},[10,4909,4910],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4912,4913],{},[26,4914],{"alt":4915,"src":4916},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4918,4919],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4921,177],{"id":177},[45,4923,4924,4933],{},[48,4925,4926,4927,1011,4930,4932],{},"把两层循环变量都叫 ",[33,4928,4929],{},"item",[33,4931,4835],{},"，难以确认当前层级。",[48,4934,4935],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4937,197],{"id":197},[161,4939,4940,4943],{},[48,4941,4942],{},"打印一个 2×3 数字表。",[48,4944,4945],{},"在内层增加条件，只输出大于 3 的元素。",[10,4947,208],{},[14,4949,211],{"id":211},[10,4951,4952],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,4954,218],{},{"title":78,"searchDepth":91,"depth":91,"links":4956},[4957,4958,4959,4960,4961,4964,4965,4966],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":4962},[4963],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4791,"description":4796},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[229,4974,4975],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4978,"title":4979,"body":4980,"category":229,"cover":230,"description":4984,"extension":231,"meta":5122,"navigation":94,"path":5123,"pinned":234,"publishedAt":235,"seo":5124,"slug":5125,"stem":5126,"summary":5127,"tags":5128,"updatedAt":235,"visible":94,"__hash__":5131},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4981,"toc":5112},[4982,4985,4987,4990,4992,4998,5001,5003,5014,5016,5018,5056,5058,5064,5066,5068,5080,5082,5093,5095,5103,5105,5107,5110],[10,4983,4984],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4986,16],{"id":16},[10,4988,4989],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4991,22],{"id":22},[10,4993,4994],{},[26,4995],{"alt":4996,"src":4997},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4999,5000],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5002,43],{"id":43},[45,5004,5005,5008,5011],{},[48,5006,5007],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[48,5009,5010],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[48,5012,5013],{},"推导式创建新列表，不修改输入列表。",[14,5015,68],{"id":68},[10,5017,71],{},[73,5019,5021],{"className":75,"code":5020,"language":77,"meta":78,"style":78},"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",[33,5022,5023,5028,5032,5037,5042,5046,5051],{"__ignoreMap":78},[82,5024,5025],{"class":84,"line":85},[82,5026,5027],{},"numbers = [1, 2, 3, 4, 5]\n",[82,5029,5030],{"class":84,"line":91},[82,5031,95],{"emptyLinePlaceholder":94},[82,5033,5034],{"class":84,"line":98},[82,5035,5036],{},"squares = [number * number for number in numbers]\n",[82,5038,5039],{"class":84,"line":104},[82,5040,5041],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[82,5043,5044],{"class":84,"line":110},[82,5045,95],{"emptyLinePlaceholder":94},[82,5047,5048],{"class":84,"line":116},[82,5049,5050],{},"print(squares)\n",[82,5052,5053],{"class":84,"line":122},[82,5054,5055],{},"print(even_squares)\n",[10,5057,145],{},[73,5059,5062],{"className":5060,"code":5061,"language":151,"meta":78},[149],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5063,5061],{"__ignoreMap":78},[10,5065,156],{},[14,5067,159],{"id":159},[161,5069,5070,5073],{},[48,5071,5072],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[48,5074,5075,5076,5079],{},"第二条先用 ",[33,5077,5078],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5081,177],{"id":177},[45,5083,5084,5090],{},[48,5085,5086,5087,5089],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5088,4337],{}," 开始找输入。",[48,5091,5092],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5094,197],{"id":197},[161,5096,5097,5100],{},[48,5098,5099],{},"把字符串列表转换为长度列表。",[48,5101,5102],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5104,208],{},[14,5106,211],{"id":211},[10,5108,5109],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,5111,218],{},{"title":78,"searchDepth":91,"depth":91,"links":5113},[5114,5115,5116,5117,5118,5119,5120,5121],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4979,"description":4984},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[229,5129,5130],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5133,"title":5134,"body":5135,"category":229,"cover":230,"description":5139,"extension":231,"meta":5282,"navigation":94,"path":5283,"pinned":234,"publishedAt":235,"seo":5284,"slug":5285,"stem":5286,"summary":5287,"tags":5288,"updatedAt":235,"visible":94,"__hash__":5291},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5136,"toc":5272},[5137,5140,5142,5145,5147,5153,5156,5158,5169,5171,5173,5212,5214,5220,5222,5224,5239,5241,5249,5251,5263,5265,5267,5270],[10,5138,5139],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5141,16],{"id":16},[10,5143,5144],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5146,22],{"id":22},[10,5148,5149],{},[26,5150],{"alt":5151,"src":5152},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5154,5155],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5157,43],{"id":43},[45,5159,5160,5163,5166],{},[48,5161,5162],{},"函数名描述动作，使用小写字母和下划线。",[48,5164,5165],{},"函数定义要先执行，之后才能调用。",[48,5167,5168],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5170,68],{"id":68},[10,5172,71],{},[73,5174,5176],{"className":75,"code":5175,"language":77,"meta":78,"style":78},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5177,5178,5183,5188,5193,5197,5202,5207],{"__ignoreMap":78},[82,5179,5180],{"class":84,"line":85},[82,5181,5182],{},"def show_progress():\n",[82,5184,5185],{"class":84,"line":91},[82,5186,5187],{},"    print(\"正在学习函数\")\n",[82,5189,5190],{"class":84,"line":98},[82,5191,5192],{},"    print(\"本节完成 50%\")\n",[82,5194,5195],{"class":84,"line":104},[82,5196,95],{"emptyLinePlaceholder":94},[82,5198,5199],{"class":84,"line":110},[82,5200,5201],{},"print(\"调用前\")\n",[82,5203,5204],{"class":84,"line":116},[82,5205,5206],{},"show_progress()\n",[82,5208,5209],{"class":84,"line":122},[82,5210,5211],{},"print(\"调用后\")\n",[10,5213,145],{},[73,5215,5218],{"className":5216,"code":5217,"language":151,"meta":78},[149],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5219,5217],{"__ignoreMap":78},[10,5221,156],{},[14,5223,159],{"id":159},[161,5225,5226,5232],{},[48,5227,940,5228,5231],{},[33,5229,5230],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[48,5233,5234,5235,5238],{},"运行到 ",[33,5236,5237],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5240,177],{"id":177},[45,5242,5243,5246],{},[48,5244,5245],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[48,5247,5248],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5250,197],{"id":197},[161,5252,5253,5260],{},[48,5254,5255,5256,5259],{},"定义 ",[33,5257,5258],{},"show_plan()"," 输出两行学习计划。",[48,5261,5262],{},"连续调用同一个函数两次，观察执行顺序。",[10,5264,208],{},[14,5266,211],{"id":211},[10,5268,5269],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,5271,218],{},{"title":78,"searchDepth":91,"depth":91,"links":5273},[5274,5275,5276,5277,5278,5279,5280,5281],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5134,"description":5139},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[229,5289,5290],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5293,"title":5294,"body":5295,"category":229,"cover":230,"description":5299,"extension":231,"meta":5479,"navigation":94,"path":5480,"pinned":234,"publishedAt":235,"seo":5481,"slug":5482,"stem":5483,"summary":5484,"tags":5485,"updatedAt":235,"visible":94,"__hash__":5488},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5296,"toc":5467},[5297,5300,5302,5305,5307,5313,5320,5322,5339,5341,5343,5377,5379,5385,5387,5389,5410,5412,5415,5421,5431,5433,5448,5450,5458,5460,5462,5465],[10,5298,5299],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5301,16],{"id":16},[10,5303,5304],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5306,22],{"id":22},[10,5308,5309],{},[26,5310],{"alt":5311,"src":5312},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5314,5315,5316,5319],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5317,5318],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5321,43],{"id":43},[45,5323,5324,5327,5330],{},[48,5325,5326],{},"形参出现在函数定义中，实参出现在函数调用中。",[48,5328,5329],{},"局部变量默认只在函数内部可见。",[48,5331,5332,5333,5335,5336,364],{},"没有显式 ",[33,5334,5318],{}," 的函数会返回 ",[33,5337,5338],{},"None",[14,5340,68],{"id":68},[10,5342,71],{},[73,5344,5346],{"className":75,"code":5345,"language":77,"meta":78,"style":78},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5347,5348,5353,5358,5363,5367,5372],{"__ignoreMap":78},[82,5349,5350],{"class":84,"line":85},[82,5351,5352],{},"def calculate_total(price, count):\n",[82,5354,5355],{"class":84,"line":91},[82,5356,5357],{},"    total = price * count\n",[82,5359,5360],{"class":84,"line":98},[82,5361,5362],{},"    return total\n",[82,5364,5365],{"class":84,"line":104},[82,5366,95],{"emptyLinePlaceholder":94},[82,5368,5369],{"class":84,"line":110},[82,5370,5371],{},"result = calculate_total(25, 4)\n",[82,5373,5374],{"class":84,"line":116},[82,5375,5376],{},"print(result)\n",[10,5378,145],{},[73,5380,5383],{"className":5381,"code":5382,"language":151,"meta":78},[149],"100\n",[33,5384,5382],{"__ignoreMap":78},[10,5386,156],{},[14,5388,159],{"id":159},[161,5390,5391,5400],{},[48,5392,5393,5394,2259,5397,5399],{},"调用时 25 和 4 分别绑定到 ",[33,5395,5396],{},"price",[33,5398,4400],{},"，它们只在本次函数调用的局部范围中使用。",[48,5401,5402,5405,5406,5409],{},[33,5403,5404],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5407,5408],{},"result"," 并输出。",[330,5411,2699],{"id":2699},[10,5413,5414],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5416,5417],{},[26,5418],{"alt":5419,"src":5420},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5422,5423,2259,5425,1159,5427,5430],{},[33,5424,5396],{},[33,5426,4400],{},[33,5428,5429],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5432,177],{"id":177},[45,5434,5435,5442],{},[48,5436,5437,5438,5441],{},"在函数内部只 ",[33,5439,5440],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[48,5443,5444,5445,5447],{},"试图在函数外直接访问局部变量 ",[33,5446,5429],{},"，它的名字只在调用期间的局部作用域存在。",[14,5449,197],{"id":197},[161,5451,5452,5455],{},[48,5453,5454],{},"编写计算长方形面积的函数。",[48,5456,5457],{},"让函数返回结果后在调用方加上单位再输出。",[10,5459,208],{},[14,5461,211],{"id":211},[10,5463,5464],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,5466,218],{},{"title":78,"searchDepth":91,"depth":91,"links":5468},[5469,5470,5471,5472,5473,5476,5477,5478],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":5474},[5475],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5294,"description":5299},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[229,5486,5487],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5490,"title":5491,"body":5492,"category":229,"cover":230,"description":5496,"extension":231,"meta":5676,"navigation":94,"path":5677,"pinned":234,"publishedAt":235,"seo":5678,"slug":5679,"stem":5680,"summary":5681,"tags":5682,"updatedAt":235,"visible":94,"__hash__":5685},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5493,"toc":5664},[5494,5497,5499,5502,5504,5510,5513,5515,5532,5534,5536,5588,5590,5596,5598,5600,5618,5620,5623,5629,5632,5634,5645,5647,5655,5657,5659,5662],[10,5495,5496],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5498,16],{"id":16},[10,5500,5501],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5503,22],{"id":22},[10,5505,5506],{},[26,5507],{"alt":5508,"src":5509},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5511,5512],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5514,43],{"id":43},[45,5516,5517,5520,5526],{},[48,5518,5519],{},"必需参数应放在有默认值的参数之前。",[48,5521,5522,5525],{},[33,5523,5524],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[48,5527,5528,5531],{},[33,5529,5530],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5533,68],{"id":68},[10,5535,71],{},[73,5537,5539],{"className":75,"code":5538,"language":77,"meta":78,"style":78},"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",[33,5540,5541,5546,5551,5555,5560,5565,5569,5574,5579,5583],{"__ignoreMap":78},[82,5542,5543],{"class":84,"line":85},[82,5544,5545],{},"def build_title(name, level=\"基础\"):\n",[82,5547,5548],{"class":84,"line":91},[82,5549,5550],{},"    return name + \"｜\" + level\n",[82,5552,5553],{"class":84,"line":98},[82,5554,95],{"emptyLinePlaceholder":94},[82,5556,5557],{"class":84,"line":104},[82,5558,5559],{},"print(build_title(\"Python\"))\n",[82,5561,5562],{"class":84,"line":110},[82,5563,5564],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[82,5566,5567],{"class":84,"line":116},[82,5568,95],{"emptyLinePlaceholder":94},[82,5570,5571],{"class":84,"line":122},[82,5572,5573],{},"def total(*numbers):\n",[82,5575,5576],{"class":84,"line":128},[82,5577,5578],{},"    return sum(numbers)\n",[82,5580,5581],{"class":84,"line":134},[82,5582,95],{"emptyLinePlaceholder":94},[82,5584,5585],{"class":84,"line":139},[82,5586,5587],{},"print(total(10, 20, 30))\n",[10,5589,145],{},[73,5591,5594],{"className":5592,"code":5593,"language":151,"meta":78},[149],"Python｜基础\n异常处理｜进阶\n60\n",[33,5595,5593],{"__ignoreMap":78},[10,5597,156],{},[14,5599,159],{"id":159},[161,5601,5602,5609],{},[48,5603,5604,5605,5608],{},"第一次调用只提供必需参数，",[33,5606,5607],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[48,5610,5611,5614,5615,364],{},[33,5612,5613],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5616,5617],{},"sum()",[330,5619,2699],{"id":2699},[10,5621,5622],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5624,5625],{},[26,5626],{"alt":5627,"src":5628},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5630,5631],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5633,177],{"id":177},[45,5635,5636,5642],{},[48,5637,5638,5639,5641],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5640,5338],{}," 再在函数内创建。",[48,5643,5644],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5646,197],{"id":197},[161,5648,5649,5652],{},[48,5650,5651],{},"给问候函数增加默认称呼。",[48,5653,5654],{},"编写接收任意数量分数并返回总分的函数。",[10,5656,208],{},[14,5658,211],{"id":211},[10,5660,5661],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,5663,218],{},{"title":78,"searchDepth":91,"depth":91,"links":5665},[5666,5667,5668,5669,5670,5673,5674,5675],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":5671},[5672],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5491,"description":5496},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[229,5683,5684],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5687,"title":5688,"body":5689,"category":229,"cover":230,"description":5693,"extension":231,"meta":5890,"navigation":94,"path":5891,"pinned":234,"publishedAt":235,"seo":5892,"slug":5893,"stem":5894,"summary":5895,"tags":5896,"updatedAt":235,"visible":94,"__hash__":5899},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5690,"toc":5878},[5691,5694,5696,5699,5701,5707,5710,5712,5729,5731,5733,5796,5798,5804,5806,5808,5835,5837,5840,5846,5849,5851,5859,5861,5869,5871,5873,5876],[10,5692,5693],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5695,16],{"id":16},[10,5697,5698],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5700,22],{"id":22},[10,5702,5703],{},[26,5704],{"alt":5705,"src":5706},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5708,5709],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5711,43],{"id":43},[45,5713,5714,5717,5720],{},[48,5715,5716],{},"函数内部赋值默认创建局部变量。",[48,5718,5719],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[48,5721,5722,2178,5725,5728],{},[33,5723,5724],{},"global",[33,5726,5727],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5730,68],{"id":68},[10,5732,71],{},[73,5734,5736],{"className":75,"code":5735,"language":77,"meta":78,"style":78},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[33,5737,5738,5743,5747,5752,5757,5761,5766,5771,5776,5780,5785,5790],{"__ignoreMap":78},[82,5739,5740],{"class":84,"line":85},[82,5741,5742],{},"course = \"Python\"\n",[82,5744,5745],{"class":84,"line":91},[82,5746,95],{"emptyLinePlaceholder":94},[82,5748,5749],{"class":84,"line":98},[82,5750,5751],{},"def outer():\n",[82,5753,5754],{"class":84,"line":104},[82,5755,5756],{},"    level = \"基础\"\n",[82,5758,5759],{"class":84,"line":110},[82,5760,95],{"emptyLinePlaceholder":94},[82,5762,5763],{"class":84,"line":116},[82,5764,5765],{},"    def show():\n",[82,5767,5768],{"class":84,"line":122},[82,5769,5770],{},"        lesson = \"作用域\"\n",[82,5772,5773],{"class":84,"line":128},[82,5774,5775],{},"        print(course, level, lesson)\n",[82,5777,5778],{"class":84,"line":134},[82,5779,95],{"emptyLinePlaceholder":94},[82,5781,5782],{"class":84,"line":139},[82,5783,5784],{},"    show()\n",[82,5786,5788],{"class":84,"line":5787},11,[82,5789,95],{"emptyLinePlaceholder":94},[82,5791,5793],{"class":84,"line":5792},12,[82,5794,5795],{},"outer()\n",[10,5797,145],{},[73,5799,5802],{"className":5800,"code":5801,"language":151,"meta":78},[149],"Python 基础 作用域\n",[33,5803,5801],{"__ignoreMap":78},[10,5805,156],{},[14,5807,159],{"id":159},[161,5809,5810,5827],{},[48,5811,5812,5815,5816,5819,5820,5822,5823,5826],{},[33,5813,5814],{},"show()"," 中查找 ",[33,5817,5818],{},"lesson"," 时先在局部找到，查找 ",[33,5821,5607],{}," 时到外层 ",[33,5824,5825],{},"outer()"," 找到。",[48,5828,5829,5831,5832,5834],{},[33,5830,4582],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5833,2210],{}," 最后在内置作用域找到。",[330,5836,2699],{"id":2699},[10,5838,5839],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5841,5842],{},[26,5843],{"alt":5844,"src":5845},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5847,5848],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5850,177],{"id":177},[45,5852,5853,5856],{},[48,5854,5855],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[48,5857,5858],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5860,197],{"id":197},[161,5862,5863,5866],{},[48,5864,5865],{},"在内外层定义同名变量，观察最近作用域优先。",[48,5867,5868],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5870,208],{},[14,5872,211],{"id":211},[10,5874,5875],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,5877,218],{},{"title":78,"searchDepth":91,"depth":91,"links":5879},[5880,5881,5882,5883,5884,5887,5888,5889],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":5885},[5886],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5688,"description":5693},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[229,5897,5898],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5901,"title":5902,"body":5903,"category":229,"cover":230,"description":5907,"extension":231,"meta":6057,"navigation":94,"path":6058,"pinned":234,"publishedAt":235,"seo":6059,"slug":6060,"stem":6061,"summary":6062,"tags":6063,"updatedAt":235,"visible":94,"__hash__":6066},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5904,"toc":6047},[5905,5908,5910,5913,5915,5921,5924,5926,5945,5947,5949,5983,5985,5991,5993,5995,6010,6012,6024,6026,6038,6040,6042,6045],[10,5906,5907],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5909,16],{"id":16},[10,5911,5912],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5914,22],{"id":22},[10,5916,5917],{},[26,5918],{"alt":5919,"src":5920},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5922,5923],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5925,43],{"id":43},[45,5927,5928,5931,5934],{},[48,5929,5930],{},"文档字符串紧跟在函数定义后的第一条语句。",[48,5932,5933],{},"注解表达接口意图，不代替输入校验和测试。",[48,5935,5936,5937,2259,5939,2259,5941,5944],{},"基础注解优先使用 ",[33,5938,2262],{},[33,5940,2428],{},[33,5942,5943],{},"list[str]"," 等直接写法。",[14,5946,68],{"id":68},[10,5948,71],{},[73,5950,5952],{"className":75,"code":5951,"language":77,"meta":78,"style":78},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[33,5953,5954,5959,5964,5969,5973,5978],{"__ignoreMap":78},[82,5955,5956],{"class":84,"line":85},[82,5957,5958],{},"def format_score(name: str, score: int) -> str:\n",[82,5960,5961],{"class":84,"line":91},[82,5962,5963],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[82,5965,5966],{"class":84,"line":98},[82,5967,5968],{},"    return name + \"：\" + str(score)\n",[82,5970,5971],{"class":84,"line":104},[82,5972,95],{"emptyLinePlaceholder":94},[82,5974,5975],{"class":84,"line":110},[82,5976,5977],{},"print(format_score(\"小郑\", 95))\n",[82,5979,5980],{"class":84,"line":116},[82,5981,5982],{},"print(format_score.__doc__)\n",[10,5984,145],{},[73,5986,5989],{"className":5987,"code":5988,"language":151,"meta":78},[149],"小郑：95\n返回带姓名的分数文本。\n",[33,5990,5988],{"__ignoreMap":78},[10,5992,156],{},[14,5994,159],{"id":159},[161,5996,5997,6007],{},[48,5998,5999,6000,6003,6004,6006],{},"函数签名说明 ",[33,6001,6002],{},"name"," 预期为字符串、",[33,6005,2248],{}," 预期为整数，返回值预期为字符串。",[48,6008,6009],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6011,177],{"id":177},[45,6013,6014,6021],{},[48,6015,6016,6017,6020],{},"认为加了 ",[33,6018,6019],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[48,6022,6023],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6025,197],{"id":197},[161,6027,6028,6031],{},[48,6029,6030],{},"为面积函数补充参数和返回值注解。",[48,6032,6033,6034,6037],{},"通过 ",[33,6035,6036],{},"函数名.__doc__"," 查看文档字符串。",[10,6039,208],{},[14,6041,211],{"id":211},[10,6043,6044],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,6046,218],{},{"title":78,"searchDepth":91,"depth":91,"links":6048},[6049,6050,6051,6052,6053,6054,6055,6056],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5902,"description":5907},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[229,6064,6065],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6068,"title":6069,"body":6070,"category":229,"cover":230,"description":6074,"extension":231,"meta":6301,"navigation":94,"path":6302,"pinned":234,"publishedAt":235,"seo":6303,"slug":6304,"stem":6305,"summary":6306,"tags":6307,"updatedAt":235,"visible":94,"__hash__":6310},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6071,"toc":6289},[6072,6075,6077,6083,6085,6091,6102,6104,6122,6124,6131,6160,6167,6186,6195,6197,6203,6205,6207,6230,6232,6235,6241,6247,6249,6265,6267,6280,6282,6284,6287],[10,6073,6074],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6076,16],{"id":16},[10,6078,6079,6080,6082],{},"本篇只处理“模块、import 与 ",[296,6081,6002],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6084,22],{"id":22},[10,6086,6087],{},[26,6088],{"alt":6089,"src":6090},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6092,6093,6094,6097,6098,6101],{},"同一个文件直接运行时 ",[33,6095,6096],{},"__name__"," 等于 ",[33,6099,6100],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6103,43],{"id":43},[45,6105,6106,6112,6115],{},[48,6107,6108,6109,6111],{},"一个 ",[33,6110,1173],{}," 文件就是一个模块。",[48,6113,6114],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[48,6116,6117,6118,6121],{},"避免使用 ",[33,6119,6120],{},"from module import *","，它会让名字来源不清楚。",[14,6123,68],{"id":68},[10,6125,6126,6127,6130],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6128,6129],{},"calculator.py","：",[73,6132,6134],{"className":75,"code":6133,"language":77,"meta":78,"style":78},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6135,6136,6141,6146,6150,6155],{"__ignoreMap":78},[82,6137,6138],{"class":84,"line":85},[82,6139,6140],{},"def add(left, right):\n",[82,6142,6143],{"class":84,"line":91},[82,6144,6145],{},"    return left + right\n",[82,6147,6148],{"class":84,"line":98},[82,6149,95],{"emptyLinePlaceholder":94},[82,6151,6152],{"class":84,"line":104},[82,6153,6154],{},"if __name__ == \"__main__\":\n",[82,6156,6157],{"class":84,"line":110},[82,6158,6159],{},"    print(add(2, 3))\n",[10,6161,6162,6163,6166],{},"再创建 ",[33,6164,6165],{},"app.py","，从模块中导入函数：",[73,6168,6170],{"className":75,"code":6169,"language":77,"meta":78,"style":78},"from calculator import add\n\nprint(add(10, 20))\n",[33,6171,6172,6177,6181],{"__ignoreMap":78},[82,6173,6174],{"class":84,"line":85},[82,6175,6176],{},"from calculator import add\n",[82,6178,6179],{"class":84,"line":91},[82,6180,95],{"emptyLinePlaceholder":94},[82,6182,6183],{"class":84,"line":98},[82,6184,6185],{},"print(add(10, 20))\n",[10,6187,6188,6189,1159,6192,364],{},"分别执行 ",[33,6190,6191],{},"python3 calculator.py",[33,6193,6194],{},"python3 app.py",[10,6196,145],{},[73,6198,6201],{"className":6199,"code":6200,"language":151,"meta":78},[149],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6202,6200],{"__ignoreMap":78},[10,6204,156],{},[14,6206,159],{"id":159},[161,6208,6209,6219],{},[48,6210,6211,6212,6214,6215,6218],{},"直接运行 ",[33,6213,6129],{}," 时，模块名是 ",[33,6216,6217],{},"__main__","，入口代码输出 5。",[48,6220,6221,6223,6224,6226,6227,6229],{},[33,6222,6165],{}," 导入模块时，",[33,6225,6129],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6228,6165],{}," 调用函数输出 30。",[330,6231,2699],{"id":2699},[10,6233,6234],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6236,6237],{},[26,6238],{"alt":6239,"src":6240},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6242,6243,6244,6246],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6245,6217],{}," 保护下的演示代码。",[14,6248,177],{"id":177},[45,6250,6251,6258],{},[48,6252,6253,6254,1159,6256,364],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6255,6129],{},[33,6257,6165],{},[48,6259,6260,6261,6264],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6262,6263],{},"json.py","，导致导入目标被遮蔽。",[14,6266,197],{"id":197},[161,6268,6269,6275],{},[48,6270,2356,6271,6274],{},[33,6272,6273],{},"text_tools.py"," 并导出一个格式化函数。",[48,6276,6277,6278,364],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6279,6096],{},[10,6281,208],{},[14,6283,211],{"id":211},[10,6285,6286],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,6288,218],{},{"title":78,"searchDepth":91,"depth":91,"links":6290},[6291,6292,6293,6294,6295,6298,6299,6300],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":6296},[6297],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6069,"description":6074},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[229,6308,6309],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6312,"title":6313,"body":6314,"category":229,"cover":230,"description":6318,"extension":231,"meta":6483,"navigation":94,"path":6484,"pinned":234,"publishedAt":235,"seo":6485,"slug":6486,"stem":6487,"summary":6488,"tags":6489,"updatedAt":235,"visible":94,"__hash__":6491},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6315,"toc":6473},[6316,6319,6321,6324,6326,6332,6335,6337,6351,6353,6355,6401,6403,6409,6411,6413,6439,6441,6451,6453,6464,6466,6468,6471],[10,6317,6318],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6320,16],{"id":16},[10,6322,6323],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6325,22],{"id":22},[10,6327,6328],{},[26,6329],{"alt":6330,"src":6331},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6333,6334],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6336,43],{"id":43},[45,6338,6339,6345,6348],{},[48,6340,6341,6344],{},[33,6342,6343],{},".venv"," 是常见目录名，不应提交到 Git。",[48,6346,6347],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[48,6349,6350],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6352,68],{"id":68},[10,6354,1576],{},[73,6356,6358],{"className":593,"code":6357,"language":595,"meta":78,"style":78},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6359,6360,6372,6380,6386,6396],{"__ignoreMap":78},[82,6361,6362,6364,6366,6369],{"class":84,"line":85},[82,6363,693],{"class":602},[82,6365,635],{"class":605},[82,6367,6368],{"class":638}," venv",[82,6370,6371],{"class":638}," .venv\n",[82,6373,6374,6377],{"class":84,"line":91},[82,6375,6376],{"class":605},"source",[82,6378,6379],{"class":638}," .venv\u002Fbin\u002Factivate\n",[82,6381,6382,6384],{"class":84,"line":98},[82,6383,77],{"class":602},[82,6385,606],{"class":605},[82,6387,6388,6390,6392,6394],{"class":84,"line":104},[82,6389,77],{"class":602},[82,6391,635],{"class":605},[82,6393,639],{"class":638},[82,6395,606],{"class":605},[82,6397,6398],{"class":84,"line":110},[82,6399,6400],{"class":602},"deactivate\n",[10,6402,145],{},[73,6404,6407],{"className":6405,"code":6406,"language":151,"meta":78},[149],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6408,6406],{"__ignoreMap":78},[10,6410,156],{},[14,6412,159],{"id":159},[161,6414,6415,6424],{},[48,6416,6417,6420,6421,6423],{},[33,6418,6419],{},"venv"," 根据当前 ",[33,6422,693],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[48,6425,6426,6427,2178,6429,6432,6433,3729,6435,6438],{},"激活后 ",[33,6428,77],{},[33,6430,6431],{},"python -m pip"," 优先指向 ",[33,6434,6343],{},[33,6436,6437],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6440,177],{"id":177},[45,6442,6443,6446],{},[48,6444,6445],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[48,6447,182,6448,6450],{},[33,6449,6343],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6452,197],{"id":197},[161,6454,6455,6461],{},[48,6456,6457,6458,364],{},"创建虚拟环境并记录激活前后的 ",[33,6459,6460],{},"which python",[48,6462,6463],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6465,208],{},[14,6467,211],{"id":211},[10,6469,6470],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,6472,1660],{},{"title":78,"searchDepth":91,"depth":91,"links":6474},[6475,6476,6477,6478,6479,6480,6481,6482],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6313,"description":6318},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[229,6490,262],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6493,"title":6494,"body":6495,"category":229,"cover":230,"description":6499,"extension":231,"meta":6687,"navigation":94,"path":6688,"pinned":234,"publishedAt":235,"seo":6689,"slug":6690,"stem":6691,"summary":6692,"tags":6693,"updatedAt":235,"visible":94,"__hash__":6696},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6496,"toc":6677},[6497,6500,6502,6505,6507,6513,6522,6524,6548,6550,6552,6605,6607,6613,6615,6617,6633,6635,6654,6656,6668,6670,6672,6675],[10,6498,6499],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6501,16],{"id":16},[10,6503,6504],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6506,22],{"id":22},[10,6508,6509],{},[26,6510],{"alt":6511,"src":6512},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6514,6515,6518,6519,6521],{},[33,6516,6517],{},"Path"," 使用 ",[33,6520,2438],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6523,43],{"id":43},[45,6525,6526,6529,6541],{},[48,6527,6528],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[48,6530,6531,2259,6534,2259,6537,6540],{},[33,6532,6533],{},"exists()",[33,6535,6536],{},"is_file()",[33,6538,6539],{},"is_dir()"," 检查真实文件系统状态。",[48,6542,6543,6544,6547],{},"创建目录前明确目标；",[33,6545,6546],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6549,68],{"id":68},[10,6551,71],{},[73,6553,6555],{"className":75,"code":6554,"language":77,"meta":78,"style":78},"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",[33,6556,6557,6562,6566,6571,6576,6581,6585,6590,6595,6600],{"__ignoreMap":78},[82,6558,6559],{"class":84,"line":85},[82,6560,6561],{},"from pathlib import Path\n",[82,6563,6564],{"class":84,"line":91},[82,6565,95],{"emptyLinePlaceholder":94},[82,6567,6568],{"class":84,"line":98},[82,6569,6570],{},"project = Path.cwd()\n",[82,6572,6573],{"class":84,"line":104},[82,6574,6575],{},"data_dir = project \u002F \"data\"\n",[82,6577,6578],{"class":84,"line":110},[82,6579,6580],{},"file_path = data_dir \u002F \"records.json\"\n",[82,6582,6583],{"class":84,"line":116},[82,6584,95],{"emptyLinePlaceholder":94},[82,6586,6587],{"class":84,"line":122},[82,6588,6589],{},"print(project)\n",[82,6591,6592],{"class":84,"line":128},[82,6593,6594],{},"print(file_path.name)\n",[82,6596,6597],{"class":84,"line":134},[82,6598,6599],{},"print(file_path.suffix)\n",[82,6601,6602],{"class":84,"line":139},[82,6603,6604],{},"print(file_path.exists())\n",[10,6606,145],{},[73,6608,6611],{"className":6609,"code":6610,"language":151,"meta":78},[149],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6612,6610],{"__ignoreMap":78},[10,6614,156],{},[14,6616,159],{"id":159},[161,6618,6619,6625],{},[48,6620,6621,6624],{},[33,6622,6623],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[48,6626,2341,6627,6629,6630,6632],{},[33,6628,2438],{}," 组合路径片段只创建新的 ",[33,6631,6517],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6634,177],{"id":177},[45,6636,6637,6645],{},[48,6638,182,6639,6641,6642,6644],{},[33,6640,6517],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6643,6533],{}," 等方法确认。",[48,6646,6647,6648,1011,6650,6653],{},"手工拼接 ",[33,6649,2438],{},[33,6651,6652],{},"\\"," 分隔符，降低跨平台可读性。",[14,6655,197],{"id":197},[161,6657,6658,6665],{},[48,6659,6660,6661,6664],{},"组合 ",[33,6662,6663],{},"output\u002Freport.txt"," 路径但先不创建文件。",[48,6666,6667],{},"输出路径的父目录、文件名和扩展名。",[10,6669,208],{},[14,6671,211],{"id":211},[10,6673,6674],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,6676,218],{},{"title":78,"searchDepth":91,"depth":91,"links":6678},[6679,6680,6681,6682,6683,6684,6685,6686],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6494,"description":6499},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[229,6694,6695],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6698,"title":6699,"body":6700,"category":229,"cover":230,"description":6704,"extension":231,"meta":6882,"navigation":94,"path":6883,"pinned":234,"publishedAt":235,"seo":6884,"slug":6885,"stem":6886,"summary":6887,"tags":6888,"updatedAt":235,"visible":94,"__hash__":6891},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6701,"toc":6872},[6702,6705,6707,6710,6712,6718,6721,6723,6751,6753,6755,6812,6814,6820,6822,6824,6835,6837,6850,6852,6863,6865,6867,6870],[10,6703,6704],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6706,16],{"id":16},[10,6708,6709],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6711,22],{"id":22},[10,6713,6714],{},[26,6715],{"alt":6716,"src":6717},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6719,6720],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6722,43],{"id":43},[45,6724,6725,6731,6740],{},[48,6726,6727,6730],{},[33,6728,6729],{},"w"," 模式会截断原文件，写入前必须确认目标。",[48,6732,6733,6736,6737,364],{},[33,6734,6735],{},"r"," 模式读取不存在文件会产生 ",[33,6738,6739],{},"FileNotFoundError",[48,6741,6742,6743,6746,6747,6750],{},"本篇显式调用 ",[33,6744,6745],{},"close()","；第 34 篇会用 ",[33,6748,6749],{},"with"," 更可靠地管理关闭动作。",[14,6752,68],{"id":68},[10,6754,71],{},[73,6756,6758],{"className":75,"code":6757,"language":77,"meta":78,"style":78},"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",[33,6759,6760,6764,6768,6773,6778,6783,6788,6792,6797,6802,6807],{"__ignoreMap":78},[82,6761,6762],{"class":84,"line":85},[82,6763,6561],{},[82,6765,6766],{"class":84,"line":91},[82,6767,95],{"emptyLinePlaceholder":94},[82,6769,6770],{"class":84,"line":98},[82,6771,6772],{},"file_path = Path(\"notes.txt\")\n",[82,6774,6775],{"class":84,"line":104},[82,6776,6777],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[82,6779,6780],{"class":84,"line":110},[82,6781,6782],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[82,6784,6785],{"class":84,"line":116},[82,6786,6787],{},"writer.close()\n",[82,6789,6790],{"class":84,"line":122},[82,6791,95],{"emptyLinePlaceholder":94},[82,6793,6794],{"class":84,"line":128},[82,6795,6796],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[82,6798,6799],{"class":84,"line":134},[82,6800,6801],{},"content = reader.read()\n",[82,6803,6804],{"class":84,"line":139},[82,6805,6806],{},"reader.close()\n",[82,6808,6809],{"class":84,"line":5787},[82,6810,6811],{},"print(content)\n",[10,6813,145],{},[73,6815,6818],{"className":6816,"code":6817,"language":151,"meta":78},[149],"变量\n循环\n函数\n",[33,6819,6817],{"__ignoreMap":78},[10,6821,156],{},[14,6823,159],{"id":159},[161,6825,6826,6832],{},[48,6827,6828,6829,6831],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6830,6745],{}," 确保缓冲内容交给文件系统。",[48,6833,6834],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6836,177],{"id":177},[45,6838,6839,6844],{},[48,6840,2341,6841,6843],{},[33,6842,6729],{}," 模式打开重要文件却未确认覆盖风险。",[48,6845,6846,6847,364],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6848,6849],{},"encoding=\"utf-8\"",[14,6851,197],{"id":197},[161,6853,6854,6857],{},[48,6855,6856],{},"写入三行学习记录并读取。",[48,6858,6859,6860,6862],{},"改用 ",[33,6861,338],{}," 模式追加一行，确认原内容仍保留。",[10,6864,208],{},[14,6866,211],{"id":211},[10,6868,6869],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,6871,218],{},{"title":78,"searchDepth":91,"depth":91,"links":6873},[6874,6875,6876,6877,6878,6879,6880,6881],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6699,"description":6704},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[229,6889,6890],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6893,"title":6894,"body":6895,"category":229,"cover":230,"description":6899,"extension":231,"meta":7066,"navigation":94,"path":7067,"pinned":234,"publishedAt":235,"seo":7068,"slug":7069,"stem":7070,"summary":7071,"tags":7072,"updatedAt":235,"visible":94,"__hash__":7075},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6896,"toc":7056},[6897,6900,6902,6905,6907,6913,6923,6925,6939,6941,6943,7003,7005,7011,7013,7015,7027,7029,7037,7039,7047,7049,7051,7054],[10,6898,6899],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6901,16],{"id":16},[10,6903,6904],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6906,22],{"id":22},[10,6908,6909],{},[26,6910],{"alt":6911,"src":6912},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6914,6915,6918,6919,6922],{},[33,6916,6917],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6920,6921],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6924,43],{"id":43},[45,6926,6927,6930,6936],{},[48,6928,6929],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[48,6931,6932,6935],{},[33,6933,6934],{},"ensure_ascii=False"," 让中文以可读字符写入。",[48,6937,6938],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6940,68],{"id":68},[10,6942,71],{},[73,6944,6946],{"className":75,"code":6945,"language":77,"meta":78,"style":78},"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",[33,6947,6948,6953,6957,6962,6966,6971,6976,6980,6984,6989,6994,6998],{"__ignoreMap":78},[82,6949,6950],{"class":84,"line":85},[82,6951,6952],{},"import json\n",[82,6954,6955],{"class":84,"line":91},[82,6956,95],{"emptyLinePlaceholder":94},[82,6958,6959],{"class":84,"line":98},[82,6960,6961],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[82,6963,6964],{"class":84,"line":104},[82,6965,95],{"emptyLinePlaceholder":94},[82,6967,6968],{"class":84,"line":110},[82,6969,6970],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[82,6972,6973],{"class":84,"line":116},[82,6974,6975],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[82,6977,6978],{"class":84,"line":122},[82,6979,6787],{},[82,6981,6982],{"class":84,"line":128},[82,6983,95],{"emptyLinePlaceholder":94},[82,6985,6986],{"class":84,"line":134},[82,6987,6988],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[82,6990,6991],{"class":84,"line":139},[82,6992,6993],{},"loaded = json.load(reader)\n",[82,6995,6996],{"class":84,"line":5787},[82,6997,6806],{},[82,6999,7000],{"class":84,"line":5792},[82,7001,7002],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7004,145],{},[73,7006,7009],{"className":7007,"code":7008,"language":151,"meta":78},[149],"Python 60\n",[33,7010,7008],{"__ignoreMap":78},[10,7012,156],{},[14,7014,159],{"id":159},[161,7016,7017,7022],{},[48,7018,7019,7021],{},[33,7020,6917],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[48,7023,7024,7026],{},[33,7025,6921],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7028,177],{"id":177},[45,7030,7031,7034],{},[48,7032,7033],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[48,7035,7036],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7038,197],{"id":197},[161,7040,7041,7044],{},[48,7042,7043],{},"保存包含两条学习记录的列表。",[48,7045,7046],{},"读取后修改进度，再重新写回文件。",[10,7048,208],{},[14,7050,211],{"id":211},[10,7052,7053],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,7055,218],{},{"title":78,"searchDepth":91,"depth":91,"links":7057},[7058,7059,7060,7061,7062,7063,7064,7065],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6894,"description":6899},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[229,7073,7074],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7077,"title":7078,"body":7079,"category":229,"cover":230,"description":7083,"extension":231,"meta":7267,"navigation":94,"path":7268,"pinned":234,"publishedAt":235,"seo":7269,"slug":7270,"stem":7271,"summary":7272,"tags":7273,"updatedAt":235,"visible":94,"__hash__":7276},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7080,"toc":7257},[7081,7084,7086,7089,7091,7097,7103,7105,7127,7129,7131,7194,7196,7202,7204,7206,7222,7224,7238,7240,7248,7250,7252,7255],[10,7082,7083],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7085,16],{"id":16},[10,7087,7088],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7090,22],{"id":22},[10,7092,7093],{},[26,7094],{"alt":7095,"src":7096},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7098,7099,7102],{},[33,7100,7101],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7104,43],{"id":43},[45,7106,7107,7117,7124],{},[48,7108,2341,7109,7112,7113,7116],{},[33,7110,7111],{},"newline=\"\""," 让 ",[33,7114,7115],{},"csv"," 模块正确处理换行。",[48,7118,7119,7120,7123],{},"字段顺序由 ",[33,7121,7122],{},"fieldnames"," 决定，字典键需要与字段名一致。",[48,7125,7126],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7128,68],{"id":68},[10,7130,71],{},[73,7132,7134],{"className":75,"code":7133,"language":77,"meta":78,"style":78},"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",[33,7135,7136,7141,7145,7150,7155,7160,7165,7170,7174,7179,7184,7189],{"__ignoreMap":78},[82,7137,7138],{"class":84,"line":85},[82,7139,7140],{},"import csv\n",[82,7142,7143],{"class":84,"line":91},[82,7144,95],{"emptyLinePlaceholder":94},[82,7146,7147],{"class":84,"line":98},[82,7148,7149],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[82,7151,7152],{"class":84,"line":104},[82,7153,7154],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[82,7156,7157],{"class":84,"line":110},[82,7158,7159],{},"writer.writeheader()\n",[82,7161,7162],{"class":84,"line":116},[82,7163,7164],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[82,7166,7167],{"class":84,"line":122},[82,7168,7169],{},"writer_file.close()\n",[82,7171,7172],{"class":84,"line":128},[82,7173,95],{"emptyLinePlaceholder":94},[82,7175,7176],{"class":84,"line":134},[82,7177,7178],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[82,7180,7181],{"class":84,"line":139},[82,7182,7183],{},"for row in csv.DictReader(reader_file):\n",[82,7185,7186],{"class":84,"line":5787},[82,7187,7188],{},"    print(row[\"name\"], row[\"score\"])\n",[82,7190,7191],{"class":84,"line":5792},[82,7192,7193],{},"reader_file.close()\n",[10,7195,145],{},[73,7197,7200],{"className":7198,"code":7199,"language":151,"meta":78},[149],"小郑 95\n",[33,7201,7199],{"__ignoreMap":78},[10,7203,156],{},[14,7205,159],{"id":159},[161,7207,7208,7217],{},[48,7209,7210,7213,7214,7216],{},[33,7211,7212],{},"DictWriter"," 按 ",[33,7215,7122],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[48,7218,7219,7221],{},[33,7220,7101],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7223,177],{"id":177},[45,7225,7226,7229],{},[48,7227,7228],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[48,7230,7231,7232,7234,7235,7237],{},"在 macOS 以外环境忽略 ",[33,7233,7111],{}," 可能出现额外空行；统一交给 ",[33,7236,7115],{}," 模块管理换行。",[14,7239,197],{"id":197},[161,7241,7242,7245],{},[48,7243,7244],{},"写入三名学习者的课程和分数。",[48,7246,7247],{},"读取 CSV 后把分数字符串转换为整数。",[10,7249,208],{},[14,7251,211],{"id":211},[10,7253,7254],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,7256,218],{},{"title":78,"searchDepth":91,"depth":91,"links":7258},[7259,7260,7261,7262,7263,7264,7265,7266],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7078,"description":7083},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[229,7274,7275],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7278,"title":7279,"body":7280,"category":229,"cover":230,"description":7284,"extension":231,"meta":7557,"navigation":94,"path":7558,"pinned":234,"publishedAt":235,"seo":7559,"slug":7560,"stem":7561,"summary":7562,"tags":7563,"updatedAt":235,"visible":94,"__hash__":7566},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7281,"toc":7544},[7282,7285,7287,7290,7292,7298,7309,7311,7328,7330,7332,7407,7409,7415,7417,7419,7444,7446,7455,7461,7472,7474,7480,7486,7495,7497,7512,7514,7535,7537,7539,7542],[10,7283,7284],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7286,16],{"id":16},[10,7288,7289],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7291,22],{"id":22},[10,7293,7294],{},[26,7295],{"alt":7296,"src":7297},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7299,7300,7301,7304,7305,7308],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7302,7303],{},"except","；无论是否异常，",[33,7306,7307],{},"finally"," 都会在离开结构前执行。",[14,7310,43],{"id":43},[45,7312,7313,7319,7325],{},[48,7314,7315,7316,7318],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7317,7303],{}," 吞掉全部错误。",[48,7320,7321,7324],{},[33,7322,7323],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[48,7326,7327],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7329,68],{"id":68},[10,7331,71],{},[73,7333,7335],{"className":75,"code":7334,"language":77,"meta":78,"style":78},"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",[33,7336,7337,7342,7347,7352,7357,7362,7366,7371,7376,7381,7386,7390,7395,7401],{"__ignoreMap":78},[82,7338,7339],{"class":84,"line":85},[82,7340,7341],{},"def parse_age(text):\n",[82,7343,7344],{"class":84,"line":91},[82,7345,7346],{},"    age = int(text)\n",[82,7348,7349],{"class":84,"line":98},[82,7350,7351],{},"    if age \u003C 0:\n",[82,7353,7354],{"class":84,"line":104},[82,7355,7356],{},"        raise ValueError(\"年龄不能为负数\")\n",[82,7358,7359],{"class":84,"line":110},[82,7360,7361],{},"    return age\n",[82,7363,7364],{"class":84,"line":116},[82,7365,95],{"emptyLinePlaceholder":94},[82,7367,7368],{"class":84,"line":122},[82,7369,7370],{},"try:\n",[82,7372,7373],{"class":84,"line":128},[82,7374,7375],{},"    age = parse_age(\"18\")\n",[82,7377,7378],{"class":84,"line":134},[82,7379,7380],{},"except ValueError as error:\n",[82,7382,7383],{"class":84,"line":139},[82,7384,7385],{},"    print(\"输入错误：\", error)\n",[82,7387,7388],{"class":84,"line":5787},[82,7389,1148],{},[82,7391,7392],{"class":84,"line":5792},[82,7393,7394],{},"    print(\"年龄：\", age)\n",[82,7396,7398],{"class":84,"line":7397},13,[82,7399,7400],{},"finally:\n",[82,7402,7404],{"class":84,"line":7403},14,[82,7405,7406],{},"    print(\"处理结束\")\n",[10,7408,145],{},[73,7410,7413],{"className":7411,"code":7412,"language":151,"meta":78},[149],"年龄： 18\n处理结束\n",[33,7414,7412],{"__ignoreMap":78},[10,7416,156],{},[14,7418,159],{"id":159},[161,7420,7421,7433],{},[48,7422,7423,7425,7426,7428,7429,7432],{},[33,7424,3038],{}," 或主动 ",[33,7427,7323],{}," 都可能产生 ",[33,7430,7431],{},"ValueError","，控制流立即离开当前正常路径。",[48,7434,7435,7436,7438,7439,7441,7442,364],{},"有异常时进入匹配的 ",[33,7437,7303],{},"；没有异常时执行 ",[33,7440,1162],{},"；两种情况最后都会执行 ",[33,7443,7307],{},[330,7445,2699],{"id":2699},[10,7447,7448,2259,7450,1159,7452,7454],{},[33,7449,7303],{},[33,7451,1162],{},[33,7453,7307],{}," 的职责不同，不能只看它们出现的顺序。",[10,7456,7457],{},[26,7458],{"alt":7459,"src":7460},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7462,7463,7465,7466,7468,7469,7471],{},[33,7464,7303],{}," 处理匹配异常，",[33,7467,1162],{}," 只在无异常时运行，",[33,7470,7307],{}," 负责两条路径都需要的清理动作。",[330,7473,2699],{"id":4219},[10,7475,7476,7479],{},[33,7477,7478],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7481,7482],{},[26,7483],{"alt":7484,"src":7485},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7487,7488,7489,7491,7492,7494],{},"只把可能产生预期异常的操作放进 ",[33,7490,7478],{},"，后续正常业务放进 ",[33,7493,1162],{},"，错误边界会更清楚。",[14,7496,177],{"id":177},[45,7498,7499,7506],{},[48,7500,7501,7502,7505],{},"使用裸 ",[33,7503,7504],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[48,7507,7508,7509,7511],{},"把整个程序包在一个巨大 ",[33,7510,7478],{}," 中，无法判断究竟哪一步允许失败。",[14,7513,197],{"id":197},[161,7515,7516,7529],{},[48,7517,7518,7519,7522,7523,1159,7526,364],{},"让 ",[33,7520,7521],{},"parse_age"," 分别处理 ",[33,7524,7525],{},"\"abc\"",[33,7527,7528],{},"\"-1\"",[48,7530,7531,7532,7534],{},"为文件读取捕获 ",[33,7533,6739],{}," 并给出清晰提示。",[10,7536,208],{},[14,7538,211],{"id":211},[10,7540,7541],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,7543,218],{},{"title":78,"searchDepth":91,"depth":91,"links":7545},[7546,7547,7548,7549,7550,7554,7555,7556],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":7551},[7552,7553],{"id":2699,"depth":98,"text":2699},{"id":4219,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7279,"description":7284},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[229,7564,7565],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7568,"title":7569,"body":7570,"category":229,"cover":230,"description":7574,"extension":231,"meta":7750,"navigation":94,"path":7751,"pinned":234,"publishedAt":235,"seo":7752,"slug":7753,"stem":7754,"summary":7755,"tags":7756,"updatedAt":235,"visible":94,"__hash__":7758},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7571,"toc":7740},[7572,7575,7577,7580,7582,7588,7594,7596,7612,7614,7616,7670,7672,7678,7680,7682,7695,7697,7710,7712,7731,7733,7735,7738],[10,7573,7574],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7576,16],{"id":16},[10,7578,7579],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7581,22],{"id":22},[10,7583,7584],{},[26,7585],{"alt":7586,"src":7587},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7589,7590,7591,7593],{},"进入 ",[33,7592,6749],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7595,43],{"id":43},[45,7597,7598,7603,7609],{},[48,7599,7600,7602],{},[33,7601,6749],{}," 把资源获取和释放配成一个清晰边界。",[48,7604,7605,7608],{},[33,7606,7607],{},"as file"," 得到的是上下文返回的资源对象。",[48,7610,7611],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7613,68],{"id":68},[10,7615,71],{},[73,7617,7619],{"className":75,"code":7618,"language":77,"meta":78,"style":78},"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",[33,7620,7621,7625,7629,7633,7637,7642,7647,7651,7656,7661,7665],{"__ignoreMap":78},[82,7622,7623],{"class":84,"line":85},[82,7624,6561],{},[82,7626,7627],{"class":84,"line":91},[82,7628,95],{"emptyLinePlaceholder":94},[82,7630,7631],{"class":84,"line":98},[82,7632,6772],{},[82,7634,7635],{"class":84,"line":104},[82,7636,95],{"emptyLinePlaceholder":94},[82,7638,7639],{"class":84,"line":110},[82,7640,7641],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[82,7643,7644],{"class":84,"line":116},[82,7645,7646],{},"    file.write(\"上下文管理器\\n\")\n",[82,7648,7649],{"class":84,"line":122},[82,7650,95],{"emptyLinePlaceholder":94},[82,7652,7653],{"class":84,"line":128},[82,7654,7655],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[82,7657,7658],{"class":84,"line":134},[82,7659,7660],{},"    print(file.read())\n",[82,7662,7663],{"class":84,"line":139},[82,7664,95],{"emptyLinePlaceholder":94},[82,7666,7667],{"class":84,"line":5787},[82,7668,7669],{},"print(file.closed)\n",[10,7671,145],{},[73,7673,7676],{"className":7674,"code":7675,"language":151,"meta":78},[149],"上下文管理器\n\nTrue\n",[33,7677,7675],{"__ignoreMap":78},[10,7679,156],{},[14,7681,159],{"id":159},[161,7683,7684,7692],{},[48,7685,7590,7686,7688,7689,364],{},[33,7687,6749],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7690,7691],{},"file",[48,7693,7694],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7696,177],{"id":177},[45,7698,7699,7704],{},[48,7700,188,7701,7703],{},[33,7702,6749],{}," 代码块外继续读写已经关闭的文件对象。",[48,7705,7706,7707,7709],{},"误以为 ",[33,7708,6749],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7711,197],{"id":197},[161,7713,7714,7723],{},[48,7715,7716,7717,7720,7721,364],{},"把第 30 篇的手动 ",[33,7718,7719],{},"open\u002Fclose"," 改写为 ",[33,7722,6749],{},[48,7724,188,7725,7727,7728,364],{},[33,7726,6749],{}," 块后检查 ",[33,7729,7730],{},"file.closed",[10,7732,208],{},[14,7734,211],{"id":211},[10,7736,7737],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,7739,218],{},{"title":78,"searchDepth":91,"depth":91,"links":7741},[7742,7743,7744,7745,7746,7747,7748,7749],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7569,"description":7574},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[229,6749,7757],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7760,"title":7761,"body":7762,"category":229,"cover":230,"description":7766,"extension":231,"meta":7978,"navigation":94,"path":7979,"pinned":234,"publishedAt":235,"seo":7980,"slug":7981,"stem":7982,"summary":7983,"tags":7984,"updatedAt":235,"visible":94,"__hash__":7987},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7763,"toc":7966},[7764,7767,7769,7772,7774,7780,7783,7785,7802,7804,7806,7874,7876,7882,7884,7886,7911,7913,7916,7922,7931,7933,7944,7946,7957,7959,7961,7964],[10,7765,7766],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7768,16],{"id":16},[10,7770,7771],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7773,22],{"id":22},[10,7775,7776],{},[26,7777],{"alt":7778,"src":7779},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7781,7782],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7784,43],{"id":43},[45,7786,7787,7793,7799],{},[48,7788,7789,7792],{},[33,7790,7791],{},"self"," 表示当前实例，由方法调用自动传入。",[48,7794,7795,7798],{},[33,7796,7797],{},"__init__"," 在实例创建过程中初始化属性。",[48,7800,7801],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7803,68],{"id":68},[10,7805,71],{},[73,7807,7809],{"className":75,"code":7808,"language":77,"meta":78,"style":78},"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",[33,7810,7811,7816,7821,7826,7831,7835,7840,7845,7850,7855,7859,7864,7869],{"__ignoreMap":78},[82,7812,7813],{"class":84,"line":85},[82,7814,7815],{},"class LearningRecord:\n",[82,7817,7818],{"class":84,"line":91},[82,7819,7820],{},"    def __init__(self, course, progress=0):\n",[82,7822,7823],{"class":84,"line":98},[82,7824,7825],{},"        self.course = course\n",[82,7827,7828],{"class":84,"line":104},[82,7829,7830],{},"        self.progress = progress\n",[82,7832,7833],{"class":84,"line":110},[82,7834,95],{"emptyLinePlaceholder":94},[82,7836,7837],{"class":84,"line":116},[82,7838,7839],{},"    def advance(self, amount):\n",[82,7841,7842],{"class":84,"line":122},[82,7843,7844],{},"        self.progress = self.progress + amount\n",[82,7846,7847],{"class":84,"line":128},[82,7848,7849],{},"        if self.progress > 100:\n",[82,7851,7852],{"class":84,"line":134},[82,7853,7854],{},"            self.progress = 100\n",[82,7856,7857],{"class":84,"line":139},[82,7858,95],{"emptyLinePlaceholder":94},[82,7860,7861],{"class":84,"line":5787},[82,7862,7863],{},"record = LearningRecord(\"Python\", 40)\n",[82,7865,7866],{"class":84,"line":5792},[82,7867,7868],{},"record.advance(15)\n",[82,7870,7871],{"class":84,"line":7397},[82,7872,7873],{},"print(record.course, record.progress)\n",[10,7875,145],{},[73,7877,7880],{"className":7878,"code":7879,"language":151,"meta":78},[149],"Python 55\n",[33,7881,7879],{"__ignoreMap":78},[10,7883,156],{},[14,7885,159],{"id":159},[161,7887,7888,7898],{},[48,7889,7890,7891,7894,7895,7897],{},"调用 ",[33,7892,7893],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7896,7797],{}," 把课程和进度保存在该实例属性中。",[48,7899,7900,7903,7904,7907,7908,7910],{},[33,7901,7902],{},"record.advance(15)"," 自动把 ",[33,7905,7906],{},"record"," 作为 ",[33,7909,7791],{},"，方法更新同一实例的进度并限制上限。",[330,7912,2699],{"id":2699},[10,7914,7915],{},"类是共同定义，实例则各自保存状态。",[10,7917,7918],{},[26,7919],{"alt":7920,"src":7921},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7923,7924,7925,1159,7927,7930],{},"两个实例共享同一套方法定义，但 ",[33,7926,4582],{},[33,7928,7929],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7932,177],{"id":177},[45,7934,7935,7941],{},[48,7936,7937,7938,7940],{},"调用实例方法时手工再传一次 ",[33,7939,7791],{},"。通过实例调用时 Python 会自动绑定。",[48,7942,7943],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7945,197],{"id":197},[161,7947,7948,7954],{},[48,7949,5255,7950,7953],{},[33,7951,7952],{},"Book"," 类，保存标题和阅读页数。",[48,7955,7956],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7958,208],{},[14,7960,211],{"id":211},[10,7962,7963],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,7965,218],{},{"title":78,"searchDepth":91,"depth":91,"links":7967},[7968,7969,7970,7971,7972,7975,7976,7977],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":7973},[7974],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7761,"description":7766},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[229,7985,7986],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7989,"title":7990,"body":7991,"category":229,"cover":230,"description":7995,"extension":231,"meta":8173,"navigation":94,"path":8174,"pinned":234,"publishedAt":235,"seo":8175,"slug":8176,"stem":8177,"summary":8178,"tags":8179,"updatedAt":235,"visible":94,"__hash__":8182},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7992,"toc":8163},[7993,7996,7998,8001,8003,8009,8012,8014,8025,8027,8029,8096,8098,8104,8106,8108,8127,8129,8137,8139,8154,8156,8158,8161],[10,7994,7995],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7997,16],{"id":16},[10,7999,8000],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8002,22],{"id":22},[10,8004,8005],{},[26,8006],{"alt":8007,"src":8008},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8010,8011],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8013,43],{"id":43},[45,8015,8016,8019,8022],{},[48,8017,8018],{},"封装让对象通过方法维护自己的有效状态。",[48,8020,8021],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[48,8023,8024],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8026,68],{"id":68},[10,8028,71],{},[73,8030,8032],{"className":75,"code":8031,"language":77,"meta":78,"style":78},"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",[33,8033,8034,8039,8044,8049,8053,8058,8063,8068,8072,8077,8082,8086,8091],{"__ignoreMap":78},[82,8035,8036],{"class":84,"line":85},[82,8037,8038],{},"class Storage:\n",[82,8040,8041],{"class":84,"line":91},[82,8042,8043],{},"    def save(self, text):\n",[82,8045,8046],{"class":84,"line":98},[82,8047,8048],{},"        print(\"保存：\", text)\n",[82,8050,8051],{"class":84,"line":104},[82,8052,95],{"emptyLinePlaceholder":94},[82,8054,8055],{"class":84,"line":110},[82,8056,8057],{},"class LearningService:\n",[82,8059,8060],{"class":84,"line":116},[82,8061,8062],{},"    def __init__(self, storage):\n",[82,8064,8065],{"class":84,"line":122},[82,8066,8067],{},"        self.storage = storage\n",[82,8069,8070],{"class":84,"line":128},[82,8071,95],{"emptyLinePlaceholder":94},[82,8073,8074],{"class":84,"line":134},[82,8075,8076],{},"    def finish_lesson(self, title):\n",[82,8078,8079],{"class":84,"line":139},[82,8080,8081],{},"        self.storage.save(title)\n",[82,8083,8084],{"class":84,"line":5787},[82,8085,95],{"emptyLinePlaceholder":94},[82,8087,8088],{"class":84,"line":5792},[82,8089,8090],{},"service = LearningService(Storage())\n",[82,8092,8093],{"class":84,"line":7397},[82,8094,8095],{},"service.finish_lesson(\"异常处理\")\n",[10,8097,145],{},[73,8099,8102],{"className":8100,"code":8101,"language":151,"meta":78},[149],"保存： 异常处理\n",[33,8103,8101],{"__ignoreMap":78},[10,8105,156],{},[14,8107,159],{"id":159},[161,8109,8110,8120],{},[48,8111,8112,8115,8116,8119],{},[33,8113,8114],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8117,8118],{},"save()"," 的协作对象。",[48,8121,8122,8123,8126],{},"调用业务方法时，服务把保存动作委托给 ",[33,8124,8125],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8128,177],{"id":177},[45,8130,8131,8134],{},[48,8132,8133],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[48,8135,8136],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8138,197],{"id":197},[161,8140,8141,8151],{},[48,8142,8143,8144,8147,8148,364],{},"用组合让 ",[33,8145,8146],{},"OrderService"," 使用一个 ",[33,8149,8150],{},"Notifier",[48,8152,8153],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8155,208],{},[14,8157,211],{"id":211},[10,8159,8160],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,8162,218],{},{"title":78,"searchDepth":91,"depth":91,"links":8164},[8165,8166,8167,8168,8169,8170,8171,8172],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7990,"description":7995},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[229,8180,8181],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8184,"title":8185,"body":8186,"category":229,"cover":230,"description":8190,"extension":231,"meta":8393,"navigation":94,"path":8394,"pinned":234,"publishedAt":235,"seo":8395,"slug":8396,"stem":8397,"summary":8398,"tags":8399,"updatedAt":235,"visible":94,"__hash__":8402},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8187,"toc":8381},[8188,8191,8193,8196,8198,8204,8211,8213,8238,8240,8242,8294,8296,8302,8304,8306,8327,8329,8335,8341,8347,8349,8357,8359,8372,8374,8376,8379],[10,8189,8190],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8192,16],{"id":16},[10,8194,8195],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8197,22],{"id":22},[10,8199,8200],{},[26,8201],{"alt":8202,"src":8203},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8205,8206,8207,8210],{},"生成器运行到 ",[33,8208,8209],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8212,43],{"id":43},[45,8214,8215,8225,8235],{},[48,8216,8217,8220,8221,8224],{},[33,8218,8219],{},"iter()"," 从可迭代对象取得迭代器，",[33,8222,8223],{},"next()"," 请求下一个值。",[48,8226,8227,8228,8231,8232,8234],{},"没有更多值时迭代器抛出 ",[33,8229,8230],{},"StopIteration","，",[33,8233,4337],{}," 会自动处理。",[48,8236,8237],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8239,68],{"id":68},[10,8241,71],{},[73,8243,8245],{"className":75,"code":8244,"language":77,"meta":78,"style":78},"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",[33,8246,8247,8252,8257,8262,8267,8272,8276,8281,8286,8290],{"__ignoreMap":78},[82,8248,8249],{"class":84,"line":85},[82,8250,8251],{},"def countdown(start):\n",[82,8253,8254],{"class":84,"line":91},[82,8255,8256],{},"    current = start\n",[82,8258,8259],{"class":84,"line":98},[82,8260,8261],{},"    while current > 0:\n",[82,8263,8264],{"class":84,"line":104},[82,8265,8266],{},"        yield current\n",[82,8268,8269],{"class":84,"line":110},[82,8270,8271],{},"        current = current - 1\n",[82,8273,8274],{"class":84,"line":116},[82,8275,95],{"emptyLinePlaceholder":94},[82,8277,8278],{"class":84,"line":122},[82,8279,8280],{},"iterator = countdown(3)\n",[82,8282,8283],{"class":84,"line":128},[82,8284,8285],{},"print(next(iterator))\n",[82,8287,8288],{"class":84,"line":134},[82,8289,8285],{},[82,8291,8292],{"class":84,"line":139},[82,8293,8285],{},[10,8295,145],{},[73,8297,8300],{"className":8298,"code":8299,"language":151,"meta":78},[149],"3\n2\n1\n",[33,8301,8299],{"__ignoreMap":78},[10,8303,156],{},[14,8305,159],{"id":159},[161,8307,8308,8314],{},[48,8309,7890,8310,8313],{},[33,8311,8312],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[48,8315,8316,8317,8319,8320,8322,8323,8326],{},"每次 ",[33,8318,8223],{}," 运行到下一个 ",[33,8321,8209],{}," 并暂停，局部变量 ",[33,8324,8325],{},"current"," 和执行位置被保留。",[330,8328,2699],{"id":2699},[10,8330,8331,8332,8334],{},"生成器的暂停位置可以展开成多次 ",[33,8333,8223],{}," 的时间线。",[10,8336,8337],{},[26,8338],{"alt":8339,"src":8340},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8342,8343,8344,8346],{},"每次请求只推进到下一个 ",[33,8345,8209],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8348,177],{"id":177},[45,8350,8351,8354],{},[48,8352,8353],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[48,8355,8356],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8358,197],{"id":197},[161,8360,8361,8364],{},[48,8362,8363],{},"编写产生 1 到指定上限偶数的生成器。",[48,8365,4011,8366,8368,8369,8371],{},[33,8367,4337],{}," 遍历生成器，比较手动 ",[33,8370,8223],{}," 的差异。",[10,8373,208],{},[14,8375,211],{"id":211},[10,8377,8378],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,8380,218],{},{"title":78,"searchDepth":91,"depth":91,"links":8382},[8383,8384,8385,8386,8387,8390,8391,8392],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":8388},[8389],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8185,"description":8190},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[229,8400,8401],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8404,"title":8405,"body":8406,"category":229,"cover":230,"description":8410,"extension":231,"meta":8634,"navigation":94,"path":8635,"pinned":234,"publishedAt":235,"seo":8636,"slug":8637,"stem":8638,"summary":8639,"tags":8640,"updatedAt":235,"visible":94,"__hash__":8642},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8407,"toc":8622},[8408,8411,8413,8416,8418,8424,8427,8429,8449,8451,8453,8535,8537,8543,8545,8547,8569,8571,8574,8580,8587,8589,8599,8601,8613,8615,8617,8620],[10,8409,8410],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8412,16],{"id":16},[10,8414,8415],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8417,22],{"id":22},[10,8419,8420],{},[26,8421],{"alt":8422,"src":8423},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8425,8426],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8428,43],{"id":43},[45,8430,8431,8440,8443],{},[48,8432,8433,8436,8437,364],{},[33,8434,8435],{},"@trace"," 等价于 ",[33,8438,8439],{},"add = trace(add)",[48,8441,8442],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[48,8444,8445,8448],{},[33,8446,8447],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8450,68],{"id":68},[10,8452,71],{},[73,8454,8456],{"className":75,"code":8455,"language":77,"meta":78,"style":78},"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",[33,8457,8458,8463,8467,8472,8477,8482,8487,8492,8497,8502,8507,8511,8516,8520,8524,8529],{"__ignoreMap":78},[82,8459,8460],{"class":84,"line":85},[82,8461,8462],{},"from functools import wraps\n",[82,8464,8465],{"class":84,"line":91},[82,8466,95],{"emptyLinePlaceholder":94},[82,8468,8469],{"class":84,"line":98},[82,8470,8471],{},"def trace(function):\n",[82,8473,8474],{"class":84,"line":104},[82,8475,8476],{},"    @wraps(function)\n",[82,8478,8479],{"class":84,"line":110},[82,8480,8481],{},"    def wrapper(*args, **kwargs):\n",[82,8483,8484],{"class":84,"line":116},[82,8485,8486],{},"        print(\"开始：\", function.__name__)\n",[82,8488,8489],{"class":84,"line":122},[82,8490,8491],{},"        result = function(*args, **kwargs)\n",[82,8493,8494],{"class":84,"line":128},[82,8495,8496],{},"        print(\"结束：\", function.__name__)\n",[82,8498,8499],{"class":84,"line":134},[82,8500,8501],{},"        return result\n",[82,8503,8504],{"class":84,"line":139},[82,8505,8506],{},"    return wrapper\n",[82,8508,8509],{"class":84,"line":5787},[82,8510,95],{"emptyLinePlaceholder":94},[82,8512,8513],{"class":84,"line":5792},[82,8514,8515],{},"@trace\n",[82,8517,8518],{"class":84,"line":7397},[82,8519,6140],{},[82,8521,8522],{"class":84,"line":7403},[82,8523,6145],{},[82,8525,8527],{"class":84,"line":8526},15,[82,8528,95],{"emptyLinePlaceholder":94},[82,8530,8532],{"class":84,"line":8531},16,[82,8533,8534],{},"print(add(2, 3))\n",[10,8536,145],{},[73,8538,8541],{"className":8539,"code":8540,"language":151,"meta":78},[149],"开始： add\n结束： add\n5\n",[33,8542,8540],{"__ignoreMap":78},[10,8544,156],{},[14,8546,159],{"id":159},[161,8548,8549,8566],{},[48,8550,8551,8552,8555,8556,8559,8560,8563,8564,364],{},"解释器执行定义时，把原 ",[33,8553,8554],{},"add"," 函数交给 ",[33,8557,8558],{},"trace","，返回的 ",[33,8561,8562],{},"wrapper"," 重新绑定到名字 ",[33,8565,8554],{},[48,8567,8568],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[330,8570,2699],{"id":2699},[10,8572,8573],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8575,8576],{},[26,8577],{"alt":8578,"src":8579},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8581,8582,8584,8585,364],{},[33,8583,8435],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8586,8439],{},[14,8588,177],{"id":177},[45,8590,8591,8596],{},[48,8592,8593,8594,364],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8595,5338],{},[48,8597,8598],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8600,197],{"id":197},[161,8602,8603,8606],{},[48,8604,8605],{},"编写只记录调用次数的简单装饰器。",[48,8607,8608,8609,8612],{},"删除包装函数的 ",[33,8610,8611],{},"return result","，观察调用方得到什么。",[10,8614,208],{},[14,8616,211],{"id":211},[10,8618,8619],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,8621,218],{},{"title":78,"searchDepth":91,"depth":91,"links":8623},[8624,8625,8626,8627,8628,8631,8632,8633],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":8629},[8630],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8405,"description":8410},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[229,8641,5289],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8644,"title":8645,"body":8646,"category":229,"cover":230,"description":8650,"extension":231,"meta":8837,"navigation":94,"path":8838,"pinned":234,"publishedAt":235,"seo":8839,"slug":8840,"stem":8841,"summary":8842,"tags":8843,"updatedAt":235,"visible":94,"__hash__":8846},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8647,"toc":8825},[8648,8651,8653,8656,8658,8664,8667,8669,8680,8682,8684,8759,8761,8767,8769,8771,8782,8784,8787,8793,8796,8798,8806,8808,8816,8818,8820,8823],[10,8649,8650],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8652,16],{"id":16},[10,8654,8655],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8657,22],{"id":22},[10,8659,8660],{},[26,8661],{"alt":8662,"src":8663},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8665,8666],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8668,43],{"id":43},[45,8670,8671,8674,8677],{},[48,8672,8673],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[48,8675,8676],{},"日志记录运行状态，测试判断结果是否符合约定。",[48,8678,8679],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8681,68],{"id":68},[10,8683,71],{},[73,8685,8687],{"className":75,"code":8686,"language":77,"meta":78,"style":78},"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",[33,8688,8689,8694,8699,8703,8708,8712,8717,8722,8727,8731,8736,8741,8746,8750,8754],{"__ignoreMap":78},[82,8690,8691],{"class":84,"line":85},[82,8692,8693],{},"import logging\n",[82,8695,8696],{"class":84,"line":91},[82,8697,8698],{},"import unittest\n",[82,8700,8701],{"class":84,"line":98},[82,8702,95],{"emptyLinePlaceholder":94},[82,8704,8705],{"class":84,"line":104},[82,8706,8707],{},"logging.basicConfig(level=logging.INFO)\n",[82,8709,8710],{"class":84,"line":110},[82,8711,95],{"emptyLinePlaceholder":94},[82,8713,8714],{"class":84,"line":116},[82,8715,8716],{},"def clamp_progress(value):\n",[82,8718,8719],{"class":84,"line":122},[82,8720,8721],{},"    logging.info(\"检查进度：%s\", value)\n",[82,8723,8724],{"class":84,"line":128},[82,8725,8726],{},"    return max(0, min(100, value))\n",[82,8728,8729],{"class":84,"line":134},[82,8730,95],{"emptyLinePlaceholder":94},[82,8732,8733],{"class":84,"line":139},[82,8734,8735],{},"class ProgressTest(unittest.TestCase):\n",[82,8737,8738],{"class":84,"line":5787},[82,8739,8740],{},"    def test_upper_limit(self):\n",[82,8742,8743],{"class":84,"line":5792},[82,8744,8745],{},"        self.assertEqual(clamp_progress(120), 100)\n",[82,8747,8748],{"class":84,"line":7397},[82,8749,95],{"emptyLinePlaceholder":94},[82,8751,8752],{"class":84,"line":7403},[82,8753,6154],{},[82,8755,8756],{"class":84,"line":8526},[82,8757,8758],{},"    unittest.main()\n",[10,8760,145],{},[73,8762,8765],{"className":8763,"code":8764,"language":151,"meta":78},[149],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8766,8764],{"__ignoreMap":78},[10,8768,156],{},[14,8770,159],{"id":159},[161,8772,8773,8779],{},[48,8774,8775,8778],{},[33,8776,8777],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[48,8780,8781],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[330,8783,2699],{"id":2699},[10,8785,8786],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8788,8789],{},[26,8790],{"alt":8791,"src":8792},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8794,8795],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8797,177],{"id":177},[45,8799,8800,8803],{},[48,8801,8802],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[48,8804,8805],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8807,197],{"id":197},[161,8809,8810,8813],{},[48,8811,8812],{},"为负数进度增加测试。",[48,8814,8815],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8817,208],{},[14,8819,211],{"id":211},[10,8821,8822],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,8824,218],{},{"title":78,"searchDepth":91,"depth":91,"links":8826},[8827,8828,8829,8830,8831,8834,8835,8836],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":8832},[8833],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8645,"description":8650},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[229,8844,8845],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8848,"title":8849,"body":8850,"category":229,"cover":230,"description":8854,"extension":231,"meta":9154,"navigation":94,"path":9155,"pinned":234,"publishedAt":235,"seo":9156,"slug":9157,"stem":9158,"summary":9159,"tags":9160,"updatedAt":235,"visible":94,"__hash__":9163},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8851,"toc":9141},[8852,8855,8857,8860,8862,8868,8871,8873,8888,8890,8892,9039,9041,9047,9049,9051,9064,9066,9069,9075,9078,9080,9083,9089,9096,9098,9109,9111,9132,9134,9136,9139],[10,8853,8854],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8856,16],{"id":16},[10,8858,8859],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8861,22],{"id":22},[10,8863,8864],{},[26,8865],{"alt":8866,"src":8867},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8869,8870],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8872,43],{"id":43},[45,8874,8875,8878,8881],{},[48,8876,8877],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[48,8879,8880],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[48,8882,8883,8884,8887],{},"实际扩展前先为 ",[33,8885,8886],{},"add()"," 和存储边界补充测试。",[14,8889,68],{"id":68},[10,8891,71],{},[73,8893,8895],{"className":75,"code":8894,"language":77,"meta":78,"style":78},"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",[33,8896,8897,8901,8905,8909,8914,8919,8924,8929,8933,8938,8943,8948,8953,8958,8962,8967,8972,8978,8983,8989,8994,8999,9005,9011,9017,9022,9028,9033],{"__ignoreMap":78},[82,8898,8899],{"class":84,"line":85},[82,8900,6952],{},[82,8902,8903],{"class":84,"line":91},[82,8904,6561],{},[82,8906,8907],{"class":84,"line":98},[82,8908,95],{"emptyLinePlaceholder":94},[82,8910,8911],{"class":84,"line":104},[82,8912,8913],{},"class LearningRecords:\n",[82,8915,8916],{"class":84,"line":110},[82,8917,8918],{},"    def __init__(self, file_path):\n",[82,8920,8921],{"class":84,"line":116},[82,8922,8923],{},"        self.file_path = Path(file_path)\n",[82,8925,8926],{"class":84,"line":122},[82,8927,8928],{},"        self.items = []\n",[82,8930,8931],{"class":84,"line":128},[82,8932,95],{"emptyLinePlaceholder":94},[82,8934,8935],{"class":84,"line":134},[82,8936,8937],{},"    def add(self, title):\n",[82,8939,8940],{"class":84,"line":139},[82,8941,8942],{},"        title = title.strip()\n",[82,8944,8945],{"class":84,"line":5787},[82,8946,8947],{},"        if not title:\n",[82,8949,8950],{"class":84,"line":5792},[82,8951,8952],{},"            raise ValueError(\"课程名称不能为空\")\n",[82,8954,8955],{"class":84,"line":7397},[82,8956,8957],{},"        self.items.append({\"title\": title, \"done\": False})\n",[82,8959,8960],{"class":84,"line":7403},[82,8961,95],{"emptyLinePlaceholder":94},[82,8963,8964],{"class":84,"line":8526},[82,8965,8966],{},"    def save(self):\n",[82,8968,8969],{"class":84,"line":8531},[82,8970,8971],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[82,8973,8975],{"class":84,"line":8974},17,[82,8976,8977],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[82,8979,8981],{"class":84,"line":8980},18,[82,8982,95],{"emptyLinePlaceholder":94},[82,8984,8986],{"class":84,"line":8985},19,[82,8987,8988],{},"records = LearningRecords(\"learning-records.json\")\n",[82,8990,8992],{"class":84,"line":8991},20,[82,8993,95],{"emptyLinePlaceholder":94},[82,8995,8997],{"class":84,"line":8996},21,[82,8998,7370],{},[82,9000,9002],{"class":84,"line":9001},22,[82,9003,9004],{},"    title = input(\"输入已学习课程：\")\n",[82,9006,9008],{"class":84,"line":9007},23,[82,9009,9010],{},"    records.add(title)\n",[82,9012,9014],{"class":84,"line":9013},24,[82,9015,9016],{},"    records.save()\n",[82,9018,9020],{"class":84,"line":9019},25,[82,9021,7380],{},[82,9023,9025],{"class":84,"line":9024},26,[82,9026,9027],{},"    print(\"无法保存：\", error)\n",[82,9029,9031],{"class":84,"line":9030},27,[82,9032,1148],{},[82,9034,9036],{"class":84,"line":9035},28,[82,9037,9038],{},"    print(\"已保存 1 条学习记录\")\n",[10,9040,145],{},[73,9042,9045],{"className":9043,"code":9044,"language":151,"meta":78},[149],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9046,9044],{"__ignoreMap":78},[10,9048,156],{},[14,9050,159],{"id":159},[161,9052,9053,9059],{},[48,9054,9055,9056,9058],{},"输入层取得课程名后，",[33,9057,8886],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[48,9060,9061,9063],{},[33,9062,8118],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[330,9065,2699],{"id":2699},[10,9067,9068],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9070,9071],{},[26,9072],{"alt":9073,"src":9074},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9076,9077],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[330,9079,2699],{"id":4219},[10,9081,9082],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9084,9085],{},[26,9086],{"alt":9087,"src":9088},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9090,9091,9092,9095],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9093,9094],{},"load()"," 把文件状态恢复到内存。",[14,9097,177],{"id":177},[45,9099,9100,9103],{},[48,9101,9102],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[48,9104,9105,9106,9108],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9107,9094],{}," 是下一项必要扩展。",[14,9110,197],{"id":197},[161,9112,9113,9119,9122],{},[48,9114,9115,9116,9118],{},"增加 ",[33,9117,9094],{},"，文件不存在时从空列表开始。",[48,9120,9121],{},"增加按序号标记完成的功能，并校验序号范围。",[48,9123,9124,9125,9128,9129,9131],{},"把输入循环放进 ",[33,9126,9127],{},"main()","，通过 ",[33,9130,6096],{}," 控制程序入口。",[10,9133,208],{},[14,9135,211],{"id":211},[10,9137,9138],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[216,9140,218],{},{"title":78,"searchDepth":91,"depth":91,"links":9142},[9143,9144,9145,9146,9147,9151,9152,9153],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":9148},[9149,9150],{"id":2699,"depth":98,"text":2699},{"id":4219,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8849,"description":8854},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[229,9161,9162],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9165,9268,9387,9518,9661,9786,9923,10060,10201,10370,10507,10640,10763,10892,11019,11182,11358,11499,11628,11777,11920,12041,12164,12313,12466,12631,12758,12939,13082,13239,13390,13537,13692,13910,14065,14240,14391,14558,14745,14908,15150,15390],{"id":1395,"title":1396,"body":9166,"category":229,"cover":230,"description":1401,"extension":231,"meta":9265,"navigation":94,"path":1520,"pinned":234,"publishedAt":235,"seo":9266,"slug":1522,"stem":1523,"summary":1524,"tags":9267,"updatedAt":235,"visible":94,"__hash__":1527},{"type":7,"value":9167,"toc":9255},[9168,9170,9172,9174,9176,9180,9184,9186,9196,9198,9200,9208,9210,9215,9217,9219,9229,9231,9239,9241,9247,9249,9251,9253],[10,9169,1401],{},[14,9171,16],{"id":16},[10,9173,1406],{},[14,9175,22],{"id":22},[10,9177,9178],{},[26,9179],{"alt":1413,"src":1414},[10,9181,9182,1419],{},[33,9183,1173],{},[14,9185,43],{"id":43},[45,9187,9188,9192,9194],{},[48,9189,1426,9190,1429],{},[33,9191,1173],{},[48,9193,1432],{},[48,9195,1435],{},[14,9197,68],{"id":68},[10,9199,71],{},[73,9201,9202],{"className":75,"code":1442,"language":77,"meta":78,"style":78},[33,9203,9204],{"__ignoreMap":78},[82,9205,9206],{"class":84,"line":85},[82,9207,1442],{},[10,9209,145],{},[73,9211,9213],{"className":9212,"code":1454,"language":151,"meta":78},[149],[33,9214,1454],{"__ignoreMap":78},[10,9216,156],{},[14,9218,159],{"id":159},[161,9220,9221,9225],{},[48,9222,1465,9223,1469],{},[33,9224,1468],{},[48,9226,1472,9227,1476],{},[33,9228,1475],{},[14,9230,177],{"id":177},[45,9232,9233,9235],{},[48,9234,1483],{},[48,9236,1486,9237,1489],{},[33,9238,1173],{},[14,9240,197],{"id":197},[161,9242,9243,9245],{},[48,9244,1496],{},[48,9246,1499],{},[10,9248,208],{},[14,9250,211],{"id":211},[10,9252,1506],{},[216,9254,218],{},{"title":78,"searchDepth":91,"depth":91,"links":9256},[9257,9258,9259,9260,9261,9262,9263,9264],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":1396,"description":1401},[229,1391,1526],{"id":1529,"title":1530,"body":9269,"category":229,"cover":230,"description":1535,"extension":231,"meta":9384,"navigation":94,"path":1672,"pinned":234,"publishedAt":235,"seo":9385,"slug":1674,"stem":1675,"summary":1676,"tags":9386,"updatedAt":235,"visible":94,"__hash__":1679},{"type":7,"value":9270,"toc":9374},[9271,9273,9275,9277,9279,9283,9287,9289,9299,9301,9303,9323,9325,9330,9332,9334,9344,9346,9356,9358,9366,9368,9370,9372],[10,9272,1535],{},[14,9274,16],{"id":16},[10,9276,1540],{},[14,9278,22],{"id":22},[10,9280,9281],{},[26,9282],{"alt":1547,"src":1548},[10,9284,1551,9285,1554],{},[33,9286,693],{},[14,9288,43],{"id":43},[45,9290,9291,9293,9295],{},[48,9292,1561],{},[48,9294,1564],{},[48,9296,1567,9297,1571],{},[33,9298,1570],{},[14,9300,68],{"id":68},[10,9302,1576],{},[73,9304,9305],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,9306,9307,9313],{"__ignoreMap":78},[82,9308,9309,9311],{"class":84,"line":85},[82,9310,693],{"class":602},[82,9312,606],{"class":605},[82,9314,9315,9317,9319,9321],{"class":84,"line":91},[82,9316,693],{"class":602},[82,9318,635],{"class":605},[82,9320,639],{"class":638},[82,9322,606],{"class":605},[10,9324,145],{},[73,9326,9328],{"className":9327,"code":1602,"language":151,"meta":78},[149],[33,9329,1602],{"__ignoreMap":78},[10,9331,156],{},[14,9333,159],{"id":159},[161,9335,9336,9340],{},[48,9337,9338,1616],{},[33,9339,1615],{},[48,9341,9342,1621],{},[33,9343,701],{},[14,9345,177],{"id":177},[45,9347,9348,9352],{},[48,9349,1628,9350,1631],{},[33,9351,693],{},[48,9353,1634,9354,1637],{},[33,9355,693],{},[14,9357,197],{"id":197},[161,9359,9360,9364],{},[48,9361,940,9362,1647],{},[33,9363,1646],{},[48,9365,1650],{},[10,9367,208],{},[14,9369,211],{"id":211},[10,9371,1657],{},[216,9373,1660],{},{"title":78,"searchDepth":91,"depth":91,"links":9375},[9376,9377,9378,9379,9380,9381,9382,9383],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":1530,"description":1535},[229,1678,1054],{"id":1681,"title":1682,"body":9388,"category":229,"cover":230,"description":1848,"extension":231,"meta":9515,"navigation":94,"path":1850,"pinned":234,"publishedAt":235,"seo":9516,"slug":1852,"stem":1853,"summary":1854,"tags":9517,"updatedAt":235,"visible":94,"__hash__":1858},{"type":7,"value":9389,"toc":9505},[9390,9394,9396,9398,9400,9404,9406,9408,9424,9426,9428,9448,9450,9455,9457,9459,9471,9473,9483,9485,9495,9497,9499,9503],[10,9391,1687,9392,1690],{},[33,9393,1173],{},[14,9395,16],{"id":16},[10,9397,1695],{},[14,9399,22],{"id":22},[10,9401,9402],{},[26,9403],{"alt":1702,"src":1703},[10,9405,1706],{},[14,9407,43],{"id":43},[45,9409,9410,9416,9420],{},[48,9411,1713,9412,1716,9414,364],{},[33,9413,693],{},[33,9415,1719],{},[48,9417,1722,9418,1726],{},[33,9419,1725],{},[48,9421,1729,9422,1732],{},[33,9423,1173],{},[14,9425,68],{"id":68},[10,9427,71],{},[73,9429,9430],{"className":1739,"code":1740,"language":1741,"meta":78,"style":78},[33,9431,9432,9436,9440,9444],{"__ignoreMap":78},[82,9433,9434],{"class":84,"line":85},[82,9435,1748],{},[82,9437,9438],{"class":84,"line":91},[82,9439,1753],{},[82,9441,9442],{"class":84,"line":98},[82,9443,1758],{},[82,9445,9446],{"class":84,"line":104},[82,9447,1763],{},[10,9449,145],{},[73,9451,9453],{"className":9452,"code":1769,"language":151,"meta":78},[149],[33,9454,1769],{"__ignoreMap":78},[10,9456,156],{},[14,9458,159],{"id":159},[161,9460,9461,9467],{},[48,9462,1780,9463,1784,9465,364],{},[33,9464,1783],{},[33,9466,1787],{},[48,9468,1790,9469,1793],{},[33,9470,1475],{},[14,9472,177],{"id":177},[45,9474,9475,9481],{},[48,9476,1800,9477,1803,9479,1806],{},[33,9478,1719],{},[33,9480,1173],{},[48,9482,1809],{},[14,9484,197],{"id":197},[161,9486,9487,9491],{},[48,9488,1816,9489,364],{},[33,9490,1819],{},[48,9492,1822,9493,1825],{},[33,9494,1475],{},[10,9496,208],{},[14,9498,211],{"id":211},[10,9500,1832,9501,1835],{},[33,9502,1173],{},[216,9504,218],{},{"title":78,"searchDepth":91,"depth":91,"links":9506},[9507,9508,9509,9510,9511,9512,9513,9514],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":1682,"description":1848},[229,1856,1857],{"id":1860,"title":1861,"body":9519,"category":229,"cover":230,"description":1866,"extension":231,"meta":9658,"navigation":94,"path":2038,"pinned":234,"publishedAt":235,"seo":9659,"slug":2040,"stem":2041,"summary":2042,"tags":9660,"updatedAt":235,"visible":94,"__hash__":2046},{"type":7,"value":9520,"toc":9648},[9521,9523,9525,9527,9529,9533,9537,9539,9551,9553,9555,9591,9593,9598,9600,9602,9618,9620,9630,9632,9640,9642,9644,9646],[10,9522,1866],{},[14,9524,16],{"id":16},[10,9526,1871],{},[14,9528,22],{"id":22},[10,9530,9531],{},[26,9532],{"alt":1878,"src":1879},[10,9534,9535,1885],{},[33,9536,1884],{},[14,9538,43],{"id":43},[45,9540,9541,9543,9549],{},[48,9542,1892],{},[48,9544,9545,1898,9547,1902],{},[33,9546,1897],{},[33,9548,1901],{},[48,9550,1905],{},[14,9552,68],{"id":68},[10,9554,1576],{},[73,9556,9557],{"className":593,"code":1912,"language":595,"meta":78,"style":78},[33,9558,9559,9565,9571,9575,9585],{"__ignoreMap":78},[82,9560,9561,9563],{"class":84,"line":85},[82,9562,1919],{"class":602},[82,9564,1922],{"class":638},[82,9566,9567,9569],{"class":84,"line":91},[82,9568,1927],{"class":605},[82,9570,1922],{"class":638},[82,9572,9573],{"class":84,"line":98},[82,9574,1934],{"class":605},[82,9576,9577,9579,9581,9583],{"class":84,"line":104},[82,9578,1939],{"class":605},[82,9580,1942],{"class":638},[82,9582,1946],{"class":1945},[82,9584,1217],{"class":638},[82,9586,9587,9589],{"class":84,"line":110},[82,9588,693],{"class":602},[82,9590,1217],{"class":638},[10,9592,145],{},[73,9594,9596],{"className":9595,"code":1960,"language":151,"meta":78},[149],[33,9597,1960],{"__ignoreMap":78},[10,9599,156],{},[14,9601,159],{"id":159},[161,9603,9604,9612],{},[48,9605,9606,1973,9608,1976,9610,1979],{},[33,9607,1919],{},[33,9609,1927],{},[33,9611,1897],{},[48,9613,9614,1984,9616,1988],{},[33,9615,1884],{},[33,9617,1987],{},[14,9619,177],{"id":177},[45,9621,9622,9628],{},[48,9623,1995,9624,1159,9626,364],{},[33,9625,1897],{},[33,9627,1901],{},[48,9629,2002],{},[14,9631,197],{"id":197},[161,9633,9634,9638],{},[48,9635,2009,9636,2013],{},[33,9637,2012],{},[48,9639,2016],{},[10,9641,208],{},[14,9643,211],{"id":211},[10,9645,2023],{},[216,9647,2026],{},{"title":78,"searchDepth":91,"depth":91,"links":9649},[9650,9651,9652,9653,9654,9655,9656,9657],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":1861,"description":1866},[229,2044,2045],{"id":2048,"title":2049,"body":9662,"category":229,"cover":230,"description":2054,"extension":231,"meta":9783,"navigation":94,"path":2203,"pinned":234,"publishedAt":235,"seo":9784,"slug":2205,"stem":2206,"summary":2207,"tags":9785,"updatedAt":235,"visible":94,"__hash__":2211},{"type":7,"value":9663,"toc":9773},[9664,9666,9668,9670,9672,9676,9684,9686,9700,9702,9704,9720,9722,9727,9729,9731,9745,9747,9753,9755,9765,9767,9769,9771],[10,9665,2054],{},[14,9667,16],{"id":16},[10,9669,2059],{},[14,9671,22],{"id":22},[10,9673,9674],{},[26,9675],{"alt":2066,"src":2067},[10,9677,2070,9678,364,9680,2076,9682,364],{},[33,9679,1475],{},[33,9681,2075],{},[33,9683,1783],{},[14,9685,43],{"id":43},[45,9687,9688,9692,9698],{},[48,9689,9690,2088],{},[33,9691,2087],{},[48,9693,9694,2094,9696,364],{},[33,9695,2093],{},[33,9697,2097],{},[48,9699,2100],{},[14,9701,68],{"id":68},[10,9703,71],{},[73,9705,9706],{"className":75,"code":2107,"language":77,"meta":78,"style":78},[33,9707,9708,9712,9716],{"__ignoreMap":78},[82,9709,9710],{"class":84,"line":85},[82,9711,2114],{},[82,9713,9714],{"class":84,"line":91},[82,9715,2119],{},[82,9717,9718],{"class":84,"line":98},[82,9719,2124],{},[10,9721,145],{},[73,9723,9725],{"className":9724,"code":2130,"language":151,"meta":78},[149],[33,9726,2130],{"__ignoreMap":78},[10,9728,156],{},[14,9730,159],{"id":159},[161,9732,9733,9739],{},[48,9734,9735,2144,9737,364],{},[33,9736,2143],{},[33,9738,2097],{},[48,9740,9741,2151,9743,2155],{},[33,9742,1475],{},[33,9744,2154],{},[14,9746,177],{"id":177},[45,9748,9749,9751],{},[48,9750,2162],{},[48,9752,2165],{},[14,9754,197],{"id":197},[161,9756,9757,9759],{},[48,9758,2172],{},[48,9760,2175,9761,2178,9763,2182],{},[33,9762,2075],{},[33,9764,2181],{},[10,9766,208],{},[14,9768,211],{"id":211},[10,9770,2189],{},[216,9772,218],{},{"title":78,"searchDepth":91,"depth":91,"links":9774},[9775,9776,9777,9778,9779,9780,9781,9782],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":2049,"description":2054},[229,2209,2210],{"id":2213,"title":2214,"body":9787,"category":229,"cover":230,"description":2219,"extension":231,"meta":9920,"navigation":94,"path":2387,"pinned":234,"publishedAt":235,"seo":9921,"slug":2389,"stem":2390,"summary":2391,"tags":9922,"updatedAt":235,"visible":94,"__hash__":2395},{"type":7,"value":9788,"toc":9910},[9789,9791,9793,9795,9797,9801,9803,9805,9821,9823,9825,9849,9851,9856,9858,9860,9876,9878,9890,9892,9902,9904,9906,9908],[10,9790,2219],{},[14,9792,16],{"id":16},[10,9794,2224],{},[14,9796,22],{"id":22},[10,9798,9799],{},[26,9800],{"alt":2231,"src":2232},[10,9802,2235],{},[14,9804,43],{"id":43},[45,9806,9807,9809,9815],{},[48,9808,2242],{},[48,9810,2245,9811,2178,9813,2252],{},[33,9812,2248],{},[33,9814,2251],{},[48,9816,2255,9817,2259,9819,2263],{},[33,9818,2258],{},[33,9820,2262],{},[14,9822,68],{"id":68},[10,9824,71],{},[73,9826,9827],{"className":75,"code":2270,"language":77,"meta":78,"style":78},[33,9828,9829,9833,9837,9841,9845],{"__ignoreMap":78},[82,9830,9831],{"class":84,"line":85},[82,9832,2277],{},[82,9834,9835],{"class":84,"line":91},[82,9836,2282],{},[82,9838,9839],{"class":84,"line":98},[82,9840,95],{"emptyLinePlaceholder":94},[82,9842,9843],{"class":84,"line":104},[82,9844,2291],{},[82,9846,9847],{"class":84,"line":110},[82,9848,2282],{},[10,9850,145],{},[73,9852,9854],{"className":9853,"code":2301,"language":151,"meta":78},[149],[33,9855,2301],{"__ignoreMap":78},[10,9857,156],{},[14,9859,159],{"id":159},[161,9861,9862,9868],{},[48,9863,940,9864,2315,9866,2318],{},[33,9865,2314],{},[33,9867,2248],{},[48,9869,940,9870,2324,9872,2328,9874,364],{},[33,9871,2323],{},[33,9873,2327],{},[33,9875,2331],{},[14,9877,177],{"id":177},[45,9879,9880,9882],{},[48,9881,2338],{},[48,9883,2341,9884,2259,9886,2259,9888,2349],{},[33,9885,2258],{},[33,9887,2262],{},[33,9889,2348],{},[14,9891,197],{"id":197},[161,9893,9894,9900],{},[48,9895,2356,9896,1159,9898,2363],{},[33,9897,2359],{},[33,9899,2362],{},[48,9901,2366],{},[10,9903,208],{},[14,9905,211],{"id":211},[10,9907,2373],{},[216,9909,218],{},{"title":78,"searchDepth":91,"depth":91,"links":9911},[9912,9913,9914,9915,9916,9917,9918,9919],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":2214,"description":2219},[229,2393,2394],{"id":2397,"title":2398,"body":9924,"category":229,"cover":230,"description":2403,"extension":231,"meta":10057,"navigation":94,"path":2568,"pinned":234,"publishedAt":235,"seo":10058,"slug":2570,"stem":2571,"summary":2572,"tags":10059,"updatedAt":235,"visible":94,"__hash__":2576},{"type":7,"value":9925,"toc":10047},[9926,9928,9930,9932,9934,9938,9940,9942,9960,9962,9964,10000,10002,10007,10009,10011,10021,10023,10031,10033,10039,10041,10043,10045],[10,9927,2403],{},[14,9929,16],{"id":16},[10,9931,2408],{},[14,9933,22],{"id":22},[10,9935,9936],{},[26,9937],{"alt":2415,"src":2416},[10,9939,2419],{},[14,9941,43],{"id":43},[45,9943,9944,9950,9958],{},[48,9945,9946,2429,9948,2433],{},[33,9947,2428],{},[33,9949,2432],{},[48,9951,9952,2439,9954,2443,9956,2447],{},[33,9953,2438],{},[33,9955,2442],{},[33,9957,2446],{},[48,9959,2450],{},[14,9961,68],{"id":68},[10,9963,71],{},[73,9965,9966],{"className":75,"code":2457,"language":77,"meta":78,"style":78},[33,9967,9968,9972,9976,9980,9984,9988,9992,9996],{"__ignoreMap":78},[82,9969,9970],{"class":84,"line":85},[82,9971,2464],{},[82,9973,9974],{"class":84,"line":91},[82,9975,2469],{},[82,9977,9978],{"class":84,"line":98},[82,9979,2474],{},[82,9981,9982],{"class":84,"line":104},[82,9983,95],{"emptyLinePlaceholder":94},[82,9985,9986],{"class":84,"line":110},[82,9987,2483],{},[82,9989,9990],{"class":84,"line":116},[82,9991,2488],{},[82,9993,9994],{"class":84,"line":122},[82,9995,2493],{},[82,9997,9998],{"class":84,"line":128},[82,9999,2498],{},[10,10001,145],{},[73,10003,10005],{"className":10004,"code":2504,"language":151,"meta":78},[149],[33,10006,2504],{"__ignoreMap":78},[10,10008,156],{},[14,10010,159],{"id":159},[161,10012,10013,10017],{},[48,10014,10015,2518],{},[33,10016,2517],{},[48,10018,10019,2524],{},[33,10020,2523],{},[14,10022,177],{"id":177},[45,10024,10025,10029],{},[48,10026,2531,10027,364],{},[33,10028,2534],{},[48,10030,2537],{},[14,10032,197],{"id":197},[161,10034,10035,10037],{},[48,10036,2544],{},[48,10038,2547],{},[10,10040,208],{},[14,10042,211],{"id":211},[10,10044,2554],{},[216,10046,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10048},[10049,10050,10051,10052,10053,10054,10055,10056],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":2398,"description":2403},[229,2574,2575],{"id":2578,"title":2579,"body":10061,"category":229,"cover":230,"description":2584,"extension":231,"meta":10198,"navigation":94,"path":2761,"pinned":234,"publishedAt":235,"seo":10199,"slug":2763,"stem":2764,"summary":2765,"tags":10200,"updatedAt":235,"visible":94,"__hash__":2769},{"type":7,"value":10062,"toc":10186},[10063,10065,10067,10069,10071,10075,10081,10083,10091,10093,10095,10119,10121,10126,10128,10130,10148,10150,10152,10156,10158,10160,10166,10168,10178,10180,10182,10184],[10,10064,2584],{},[14,10066,16],{"id":16},[10,10068,2589],{},[14,10070,22],{"id":22},[10,10072,10073],{},[26,10074],{"alt":2596,"src":2597},[10,10076,2600,10077,2604,10079,364],{},[33,10078,2603],{},[33,10080,2607],{},[14,10082,43],{"id":43},[45,10084,10085,10087,10089],{},[48,10086,2614],{},[48,10088,2617],{},[48,10090,2620],{},[14,10092,68],{"id":68},[10,10094,71],{},[73,10096,10097],{"className":75,"code":2627,"language":77,"meta":78,"style":78},[33,10098,10099,10103,10107,10111,10115],{"__ignoreMap":78},[82,10100,10101],{"class":84,"line":85},[82,10102,2634],{},[82,10104,10105],{"class":84,"line":91},[82,10106,2639],{},[82,10108,10109],{"class":84,"line":98},[82,10110,2644],{},[82,10112,10113],{"class":84,"line":104},[82,10114,2649],{},[82,10116,10117],{"class":84,"line":110},[82,10118,2654],{},[10,10120,145],{},[73,10122,10124],{"className":10123,"code":2660,"language":151,"meta":78},[149],[33,10125,2660],{"__ignoreMap":78},[10,10127,156],{},[14,10129,159],{"id":159},[161,10131,10132,10140],{},[48,10133,2671,10134,2674,10136,2678,10138,2682],{},[33,10135,229],{},[33,10137,2677],{},[33,10139,2681],{},[48,10141,10142,2688,10144,2692,10146,2696],{},[33,10143,2687],{},[33,10145,2691],{},[33,10147,2695],{},[330,10149,2699],{"id":2699},[10,10151,2702],{},[10,10153,10154],{},[26,10155],{"alt":2707,"src":2708},[10,10157,2711],{},[14,10159,177],{"id":177},[45,10161,10162,10164],{},[48,10163,2718],{},[48,10165,2721],{},[14,10167,197],{"id":197},[161,10169,10170,10176],{},[48,10171,2728,10172,2732,10174,364],{},[33,10173,2731],{},[33,10175,2735],{},[48,10177,2738],{},[10,10179,208],{},[14,10181,211],{"id":211},[10,10183,2745],{},[216,10185,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10187},[10188,10189,10190,10191,10192,10195,10196,10197],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":10193},[10194],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":2579,"description":2584},[229,2767,2768],{"id":2771,"title":2772,"body":10202,"category":229,"cover":230,"description":2777,"extension":231,"meta":10367,"navigation":94,"path":2992,"pinned":234,"publishedAt":235,"seo":10368,"slug":2994,"stem":2995,"summary":2996,"tags":10369,"updatedAt":235,"visible":94,"__hash__":3000},{"type":7,"value":10203,"toc":10355},[10204,10206,10208,10210,10212,10216,10222,10224,10244,10246,10248,10284,10286,10291,10293,10295,10309,10311,10313,10317,10323,10325,10335,10337,10347,10349,10351,10353],[10,10205,2777],{},[14,10207,16],{"id":16},[10,10209,2782],{},[14,10211,22],{"id":22},[10,10213,10214],{},[26,10215],{"alt":2789,"src":2790},[10,10217,2793,10218,1011,10220,2800],{},[33,10219,2796],{},[33,10221,2799],{},[14,10223,43],{"id":43},[45,10225,10226,10234,10242],{},[48,10227,10228,2810,10230,2814,10232,2818],{},[33,10229,2809],{},[33,10231,2813],{},[33,10233,2817],{},[48,10235,10236,2824,10238,2828,10240,2832],{},[33,10237,2823],{},[33,10239,2827],{},[33,10241,2831],{},[48,10243,2835],{},[14,10245,68],{"id":68},[10,10247,71],{},[73,10249,10250],{"className":75,"code":2842,"language":77,"meta":78,"style":78},[33,10251,10252,10256,10260,10264,10268,10272,10276,10280],{"__ignoreMap":78},[82,10253,10254],{"class":84,"line":85},[82,10255,2849],{},[82,10257,10258],{"class":84,"line":91},[82,10259,2854],{},[82,10261,10262],{"class":84,"line":98},[82,10263,95],{"emptyLinePlaceholder":94},[82,10265,10266],{"class":84,"line":104},[82,10267,2863],{},[82,10269,10270],{"class":84,"line":110},[82,10271,2868],{},[82,10273,10274],{"class":84,"line":116},[82,10275,2873],{},[82,10277,10278],{"class":84,"line":122},[82,10279,2878],{},[82,10281,10282],{"class":84,"line":128},[82,10283,2883],{},[10,10285,145],{},[73,10287,10289],{"className":10288,"code":2889,"language":151,"meta":78},[149],[33,10290,2889],{"__ignoreMap":78},[10,10292,156],{},[14,10294,159],{"id":159},[161,10296,10297,10303],{},[48,10298,10299,2903,10301,2907],{},[33,10300,2902],{},[33,10302,2906],{},[48,10304,10305,2913,10307,2916],{},[33,10306,2912],{},[33,10308,2831],{},[330,10310,2699],{"id":2699},[10,10312,2921],{},[10,10314,10315],{},[26,10316],{"alt":2926,"src":2927},[10,10318,10319,2932,10321,2935],{},[33,10320,2823],{},[33,10322,2827],{},[14,10324,177],{"id":177},[45,10326,10327,10333],{},[48,10328,2942,10329,2945,10331,2948],{},[33,10330,2817],{},[33,10332,2809],{},[48,10334,2951],{},[14,10336,197],{"id":197},[161,10338,10339,10343],{},[48,10340,2958,10341,2962],{},[33,10342,2961],{},[48,10344,2965,10345,2969],{},[33,10346,2968],{},[10,10348,208],{},[14,10350,211],{"id":211},[10,10352,2976],{},[216,10354,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10356},[10357,10358,10359,10360,10361,10364,10365,10366],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":10362},[10363],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":2772,"description":2777},[229,2998,2999],{"id":3002,"title":3003,"body":10371,"category":229,"cover":230,"description":3008,"extension":231,"meta":10504,"navigation":94,"path":3177,"pinned":234,"publishedAt":235,"seo":10505,"slug":3179,"stem":3180,"summary":3181,"tags":10506,"updatedAt":235,"visible":94,"__hash__":3184},{"type":7,"value":10372,"toc":10494},[10373,10375,10377,10379,10381,10385,10395,10397,10407,10409,10411,10439,10441,10446,10448,10450,10464,10466,10474,10476,10486,10488,10490,10492],[10,10374,3008],{},[14,10376,16],{"id":16},[10,10378,3013],{},[14,10380,22],{"id":22},[10,10382,10383],{},[26,10384],{"alt":3020,"src":3021},[10,10386,10387,3027,10389,3031,10391,3035,10393,3039],{},[33,10388,3026],{},[33,10390,3030],{},[33,10392,3034],{},[33,10394,3038],{},[14,10396,43],{"id":43},[45,10398,10399,10401,10405],{},[48,10400,3046],{},[48,10402,10403,3051],{},[33,10404,3038],{},[48,10406,3054],{},[14,10408,68],{"id":68},[10,10410,71],{},[73,10412,10413],{"className":75,"code":3061,"language":77,"meta":78,"style":78},[33,10414,10415,10419,10423,10427,10431,10435],{"__ignoreMap":78},[82,10416,10417],{"class":84,"line":85},[82,10418,3068],{},[82,10420,10421],{"class":84,"line":91},[82,10422,3073],{},[82,10424,10425],{"class":84,"line":98},[82,10426,3078],{},[82,10428,10429],{"class":84,"line":104},[82,10430,95],{"emptyLinePlaceholder":94},[82,10432,10433],{"class":84,"line":110},[82,10434,3087],{},[82,10436,10437],{"class":84,"line":116},[82,10438,3092],{},[10,10440,145],{},[73,10442,10444],{"className":10443,"code":3098,"language":151,"meta":78},[149],[33,10445,3098],{"__ignoreMap":78},[10,10447,156],{},[14,10449,159],{"id":159},[161,10451,10452,10458],{},[48,10453,3109,10454,3112,10456,3116],{},[33,10455,3026],{},[33,10457,3115],{},[48,10459,10460,3122,10462,3126],{},[33,10461,3121],{},[33,10463,3125],{},[14,10465,177],{"id":177},[45,10467,10468,10472],{},[48,10469,3133,10470,3137],{},[33,10471,3136],{},[48,10473,3140],{},[14,10475,197],{"id":197},[161,10477,10478,10480],{},[48,10479,3147],{},[48,10481,1722,10482,3153,10484,3156],{},[33,10483,3152],{},[33,10485,3038],{},[10,10487,208],{},[14,10489,211],{"id":211},[10,10491,3163],{},[216,10493,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10495},[10496,10497,10498,10499,10500,10501,10502,10503],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":3003,"description":3008},[229,2348,3183],{"id":3186,"title":3187,"body":10508,"category":229,"cover":230,"description":3192,"extension":231,"meta":10637,"navigation":94,"path":3353,"pinned":234,"publishedAt":235,"seo":10638,"slug":3355,"stem":3356,"summary":3357,"tags":10639,"updatedAt":235,"visible":94,"__hash__":3361},{"type":7,"value":10509,"toc":10627},[10510,10512,10514,10516,10518,10522,10526,10528,10538,10540,10542,10574,10576,10581,10583,10585,10597,10599,10609,10611,10619,10621,10623,10625],[10,10511,3192],{},[14,10513,16],{"id":16},[10,10515,3197],{},[14,10517,22],{"id":22},[10,10519,10520],{},[26,10521],{"alt":3204,"src":3205},[10,10523,3208,10524,3212],{},[33,10525,3211],{},[14,10527,43],{"id":43},[45,10529,10530,10532,10534],{},[48,10531,3219],{},[48,10533,3222],{},[48,10535,3225,10536,364],{},[33,10537,3228],{},[14,10539,68],{"id":68},[10,10541,71],{},[73,10543,10544],{"className":75,"code":3235,"language":77,"meta":78,"style":78},[33,10545,10546,10550,10554,10558,10562,10566,10570],{"__ignoreMap":78},[82,10547,10548],{"class":84,"line":85},[82,10549,3242],{},[82,10551,10552],{"class":84,"line":91},[82,10553,3247],{},[82,10555,10556],{"class":84,"line":98},[82,10557,95],{"emptyLinePlaceholder":94},[82,10559,10560],{"class":84,"line":104},[82,10561,3256],{},[82,10563,10564],{"class":84,"line":110},[82,10565,3261],{},[82,10567,10568],{"class":84,"line":116},[82,10569,3266],{},[82,10571,10572],{"class":84,"line":122},[82,10573,3271],{},[10,10575,145],{},[73,10577,10579],{"className":10578,"code":3277,"language":151,"meta":78},[149],[33,10580,3277],{"__ignoreMap":78},[10,10582,156],{},[14,10584,159],{"id":159},[161,10586,10587,10589],{},[48,10588,3288],{},[48,10590,10591,3294,10593,3298,10595,3302],{},[33,10592,3293],{},[33,10594,3297],{},[33,10596,3301],{},[14,10598,177],{"id":177},[45,10600,10601,10607],{},[48,10602,3309,10603,3313,10605,364],{},[33,10604,3312],{},[33,10606,3316],{},[48,10608,3319],{},[14,10610,197],{"id":197},[161,10612,10613,10615],{},[48,10614,3326],{},[48,10616,3329,10617,3332],{},[33,10618,3301],{},[10,10620,208],{},[14,10622,211],{"id":211},[10,10624,3339],{},[216,10626,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10628},[10629,10630,10631,10632,10633,10634,10635,10636],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":3187,"description":3192},[229,3359,3360],{"id":3363,"title":3364,"body":10641,"category":229,"cover":230,"description":3369,"extension":231,"meta":10760,"navigation":94,"path":3510,"pinned":234,"publishedAt":235,"seo":10761,"slug":3512,"stem":3513,"summary":3514,"tags":10762,"updatedAt":235,"visible":94,"__hash__":3517},{"type":7,"value":10642,"toc":10750},[10643,10645,10647,10649,10651,10655,10657,10659,10667,10669,10671,10699,10701,10706,10708,10710,10720,10722,10730,10732,10742,10744,10746,10748],[10,10644,3369],{},[14,10646,16],{"id":16},[10,10648,3374],{},[14,10650,22],{"id":22},[10,10652,10653],{},[26,10654],{"alt":3381,"src":3382},[10,10656,3385],{},[14,10658,43],{"id":43},[45,10660,10661,10663,10665],{},[48,10662,3392],{},[48,10664,3395],{},[48,10666,3398],{},[14,10668,68],{"id":68},[10,10670,71],{},[73,10672,10673],{"className":75,"code":3405,"language":77,"meta":78,"style":78},[33,10674,10675,10679,10683,10687,10691,10695],{"__ignoreMap":78},[82,10676,10677],{"class":84,"line":85},[82,10678,3412],{},[82,10680,10681],{"class":84,"line":91},[82,10682,3417],{},[82,10684,10685],{"class":84,"line":98},[82,10686,3422],{},[82,10688,10689],{"class":84,"line":104},[82,10690,95],{"emptyLinePlaceholder":94},[82,10692,10693],{"class":84,"line":110},[82,10694,3431],{},[82,10696,10697],{"class":84,"line":116},[82,10698,3436],{},[10,10700,145],{},[73,10702,10704],{"className":10703,"code":3442,"language":151,"meta":78},[149],[33,10705,3442],{"__ignoreMap":78},[10,10707,156],{},[14,10709,159],{"id":159},[161,10711,10712,10716],{},[48,10713,10714,3456],{},[33,10715,3455],{},[48,10717,10718,3462],{},[33,10719,3461],{},[14,10721,177],{"id":177},[45,10723,10724,10728],{},[48,10725,182,10726,3472],{},[33,10727,3471],{},[48,10729,3475],{},[14,10731,197],{"id":197},[161,10733,10734,10736],{},[48,10735,3482],{},[48,10737,2175,10738,2178,10740,3489],{},[33,10739,3471],{},[33,10741,3461],{},[10,10743,208],{},[14,10745,211],{"id":211},[10,10747,3496],{},[216,10749,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10751},[10752,10753,10754,10755,10756,10757,10758,10759],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":3364,"description":3369},[229,3516,3360],{"id":3519,"title":3520,"body":10764,"category":229,"cover":230,"description":3525,"extension":231,"meta":10889,"navigation":94,"path":3681,"pinned":234,"publishedAt":235,"seo":10890,"slug":3683,"stem":3684,"summary":3685,"tags":10891,"updatedAt":235,"visible":94,"__hash__":3688},{"type":7,"value":10765,"toc":10879},[10766,10768,10770,10772,10774,10778,10784,10786,10796,10798,10800,10828,10830,10835,10837,10839,10849,10851,10863,10865,10871,10873,10875,10877],[10,10767,3525],{},[14,10769,16],{"id":16},[10,10771,3530],{},[14,10773,22],{"id":22},[10,10775,10776],{},[26,10777],{"alt":3537,"src":3538},[10,10779,3541,10780,3545,10782,3548],{},[33,10781,3544],{},[33,10783,2248],{},[14,10785,43],{"id":43},[45,10787,10788,10790,10794],{},[48,10789,3555],{},[48,10791,2341,10792,3561],{},[33,10793,3560],{},[48,10795,3564],{},[14,10797,68],{"id":68},[10,10799,71],{},[73,10801,10802],{"className":75,"code":3571,"language":77,"meta":78,"style":78},[33,10803,10804,10808,10812,10816,10820,10824],{"__ignoreMap":78},[82,10805,10806],{"class":84,"line":85},[82,10807,3578],{},[82,10809,10810],{"class":84,"line":91},[82,10811,3583],{},[82,10813,10814],{"class":84,"line":98},[82,10815,95],{"emptyLinePlaceholder":94},[82,10817,10818],{"class":84,"line":104},[82,10819,3592],{},[82,10821,10822],{"class":84,"line":110},[82,10823,3597],{},[82,10825,10826],{"class":84,"line":116},[82,10827,3602],{},[10,10829,145],{},[73,10831,10833],{"className":10832,"code":3608,"language":151,"meta":78},[149],[33,10834,3608],{"__ignoreMap":78},[10,10836,156],{},[14,10838,159],{"id":159},[161,10840,10841,10843],{},[48,10842,3619],{},[48,10844,3622,10845,3625,10847,3629],{},[33,10846,2248],{},[33,10848,3628],{},[14,10850,177],{"id":177},[45,10852,10853,10857],{},[48,10854,3636,10855,3640],{},[33,10856,3639],{},[48,10858,3643,10859,3647,10861,364],{},[33,10860,3646],{},[33,10862,3650],{},[14,10864,197],{"id":197},[161,10866,10867,10869],{},[48,10868,3657],{},[48,10870,3660],{},[10,10872,208],{},[14,10874,211],{"id":211},[10,10876,3667],{},[216,10878,218],{},{"title":78,"searchDepth":91,"depth":91,"links":10880},[10881,10882,10883,10884,10885,10886,10887,10888],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":3520,"description":3525},[229,3687,3360],{"id":3690,"title":3691,"body":10893,"category":229,"cover":230,"description":3696,"extension":231,"meta":11016,"navigation":94,"path":3846,"pinned":234,"publishedAt":235,"seo":11017,"slug":3848,"stem":3849,"summary":3850,"tags":11018,"updatedAt":235,"visible":94,"__hash__":3853},{"type":7,"value":10894,"toc":11006},[10895,10897,10899,10901,10903,10907,10909,10911,10923,10925,10927,10955,10957,10962,10964,10966,10976,10978,10988,10990,10998,11000,11002,11004],[10,10896,3696],{},[14,10898,16],{"id":16},[10,10900,3701],{},[14,10902,22],{"id":22},[10,10904,10905],{},[26,10906],{"alt":3708,"src":3709},[10,10908,3712],{},[14,10910,43],{"id":43},[45,10912,10913,10915,10917],{},[48,10914,3719],{},[48,10916,3722],{},[48,10918,3725,10919,3729,10921,3733],{},[33,10920,3728],{},[33,10922,3732],{},[14,10924,68],{"id":68},[10,10926,71],{},[73,10928,10929],{"className":75,"code":3740,"language":77,"meta":78,"style":78},[33,10930,10931,10935,10939,10943,10947,10951],{"__ignoreMap":78},[82,10932,10933],{"class":84,"line":85},[82,10934,3747],{},[82,10936,10937],{"class":84,"line":91},[82,10938,3752],{},[82,10940,10941],{"class":84,"line":98},[82,10942,95],{"emptyLinePlaceholder":94},[82,10944,10945],{"class":84,"line":104},[82,10946,3761],{},[82,10948,10949],{"class":84,"line":110},[82,10950,3766],{},[82,10952,10953],{"class":84,"line":116},[82,10954,3771],{},[10,10956,145],{},[73,10958,10960],{"className":10959,"code":3777,"language":151,"meta":78},[149],[33,10961,3777],{"__ignoreMap":78},[10,10963,156],{},[14,10965,159],{"id":159},[161,10967,10968,10970],{},[48,10969,3788],{},[48,10971,10972,3794,10974,3798],{},[33,10973,3793],{},[33,10975,3797],{},[14,10977,177],{"id":177},[45,10979,10980,10986],{},[48,10981,2341,10982,3807,10984,364],{},[33,10983,3732],{},[33,10985,3728],{},[48,10987,3812],{},[14,10989,197],{"id":197},[161,10991,10992,10996],{},[48,10993,3819,10994,3822],{},[33,10995,3728],{},[48,10997,3825],{},[10,10999,208],{},[14,11001,211],{"id":211},[10,11003,3832],{},[216,11005,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11007},[11008,11009,11010,11011,11012,11013,11014,11015],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":3691,"description":3696},[229,3852,3360],{"id":3855,"title":3856,"body":11020,"category":229,"cover":230,"description":3861,"extension":231,"meta":11179,"navigation":94,"path":4059,"pinned":234,"publishedAt":235,"seo":11180,"slug":4061,"stem":4062,"summary":4063,"tags":11181,"updatedAt":235,"visible":94,"__hash__":4067},{"type":7,"value":11021,"toc":11167},[11022,11024,11026,11028,11030,11034,11040,11042,11054,11056,11058,11098,11100,11105,11107,11109,11123,11125,11127,11131,11133,11135,11145,11147,11159,11161,11163,11165],[10,11023,3861],{},[14,11025,16],{"id":16},[10,11027,3866],{},[14,11029,22],{"id":22},[10,11031,11032],{},[26,11033],{"alt":3873,"src":3874},[10,11035,11036,3880,11038,3884],{},[33,11037,3879],{},[33,11039,3883],{},[14,11041,43],{"id":43},[45,11043,11044,11050,11052],{},[48,11045,11046,3893,11048,3897],{},[33,11047,2809],{},[33,11049,3896],{},[48,11051,3900],{},[48,11053,3903],{},[14,11055,68],{"id":68},[10,11057,71],{},[73,11059,11060],{"className":75,"code":3910,"language":77,"meta":78,"style":78},[33,11061,11062,11066,11070,11074,11078,11082,11086,11090,11094],{"__ignoreMap":78},[82,11063,11064],{"class":84,"line":85},[82,11065,3917],{},[82,11067,11068],{"class":84,"line":91},[82,11069,3922],{},[82,11071,11072],{"class":84,"line":98},[82,11073,3927],{},[82,11075,11076],{"class":84,"line":104},[82,11077,95],{"emptyLinePlaceholder":94},[82,11079,11080],{"class":84,"line":110},[82,11081,3936],{},[82,11083,11084],{"class":84,"line":116},[82,11085,3941],{},[82,11087,11088],{"class":84,"line":122},[82,11089,3946],{},[82,11091,11092],{"class":84,"line":128},[82,11093,3951],{},[82,11095,11096],{"class":84,"line":134},[82,11097,3956],{},[10,11099,145],{},[73,11101,11103],{"className":11102,"code":3962,"language":151,"meta":78},[149],[33,11104,3962],{"__ignoreMap":78},[10,11106,156],{},[14,11108,159],{"id":159},[161,11110,11111,11115],{},[48,11112,11113,3976],{},[33,11114,3975],{},[48,11116,11117,3982,11119,3986,11121,3990],{},[33,11118,3981],{},[33,11120,3985],{},[33,11122,3989],{},[330,11124,2699],{"id":2699},[10,11126,3995],{},[10,11128,11129],{},[26,11130],{"alt":4000,"src":4001},[10,11132,4004],{},[14,11134,177],{"id":177},[45,11136,11137,11143],{},[48,11138,4011,11139,4014,11141,364],{},[33,11140,2809],{},[33,11142,3896],{},[48,11144,4019],{},[14,11146,197],{"id":197},[161,11148,11149,11151],{},[48,11150,4026],{},[48,11152,2341,11153,4032,11155,1159,11157,364],{},[33,11154,4031],{},[33,11156,3896],{},[33,11158,2809],{},[10,11160,208],{},[14,11162,211],{"id":211},[10,11164,4043],{},[216,11166,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11168},[11169,11170,11171,11172,11173,11176,11177,11178],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":11174},[11175],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":3856,"description":3861},[229,4065,4066],{"id":4069,"title":4070,"body":11183,"category":229,"cover":230,"description":4075,"extension":231,"meta":11355,"navigation":94,"path":4288,"pinned":234,"publishedAt":235,"seo":11356,"slug":4290,"stem":4291,"summary":4292,"tags":11357,"updatedAt":235,"visible":94,"__hash__":4295},{"type":7,"value":11184,"toc":11342},[11185,11187,11189,11191,11193,11197,11205,11207,11215,11217,11219,11263,11265,11270,11272,11274,11286,11288,11290,11294,11300,11302,11304,11308,11312,11314,11326,11328,11334,11336,11338,11340],[10,11186,4075],{},[14,11188,16],{"id":16},[10,11190,4080],{},[14,11192,22],{"id":22},[10,11194,11195],{},[26,11196],{"alt":4087,"src":4088},[10,11198,11199,2259,11201,2259,11203,4098],{},[33,11200,1158],{},[33,11202,4095],{},[33,11204,1162],{},[14,11206,43],{"id":43},[45,11208,11209,11211,11213],{},[48,11210,4105],{},[48,11212,4108],{},[48,11214,4111],{},[14,11216,68],{"id":68},[10,11218,71],{},[73,11220,11221],{"className":75,"code":4118,"language":77,"meta":78,"style":78},[33,11222,11223,11227,11231,11235,11239,11243,11247,11251,11255,11259],{"__ignoreMap":78},[82,11224,11225],{"class":84,"line":85},[82,11226,4125],{},[82,11228,11229],{"class":84,"line":91},[82,11230,95],{"emptyLinePlaceholder":94},[82,11232,11233],{"class":84,"line":98},[82,11234,4134],{},[82,11236,11237],{"class":84,"line":104},[82,11238,4139],{},[82,11240,11241],{"class":84,"line":110},[82,11242,4144],{},[82,11244,11245],{"class":84,"line":116},[82,11246,4149],{},[82,11248,11249],{"class":84,"line":122},[82,11250,1148],{},[82,11252,11253],{"class":84,"line":128},[82,11254,4158],{},[82,11256,11257],{"class":84,"line":134},[82,11258,95],{"emptyLinePlaceholder":94},[82,11260,11261],{"class":84,"line":139},[82,11262,4167],{},[10,11264,145],{},[73,11266,11268],{"className":11267,"code":4173,"language":151,"meta":78},[149],[33,11269,4173],{"__ignoreMap":78},[10,11271,156],{},[14,11273,159],{"id":159},[161,11275,11276,11280],{},[48,11277,4184,11278,4188],{},[33,11279,4187],{},[48,11281,11282,4194,11284,4197],{},[33,11283,4193],{},[33,11285,1162],{},[330,11287,2699],{"id":2699},[10,11289,4202],{},[10,11291,11292],{},[26,11293],{"alt":4207,"src":4208},[10,11295,11296,4213,11298,4216],{},[33,11297,4187],{},[33,11299,4193],{},[330,11301,2699],{"id":4219},[10,11303,4222],{},[10,11305,11306],{},[26,11307],{"alt":4227,"src":4228},[10,11309,4231,11310,4234],{},[33,11311,1158],{},[14,11313,177],{"id":177},[45,11315,11316,11320],{},[48,11317,4241,11318,4244],{},[33,11319,4193],{},[48,11321,4247,11322,4250,11324,4254],{},[33,11323,1158],{},[33,11325,4253],{},[14,11327,197],{"id":197},[161,11329,11330,11332],{},[48,11331,4261],{},[48,11333,4264],{},[10,11335,208],{},[14,11337,211],{"id":211},[10,11339,4271],{},[216,11341,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11343},[11344,11345,11346,11347,11348,11352,11353,11354],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":11349},[11350,11351],{"id":2699,"depth":98,"text":2699},{"id":4219,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":4070,"description":4075},[229,1158,4294],{"id":4297,"title":4298,"body":11359,"category":229,"cover":230,"description":4303,"extension":231,"meta":11496,"navigation":94,"path":4469,"pinned":234,"publishedAt":235,"seo":11497,"slug":4471,"stem":4472,"summary":4473,"tags":11498,"updatedAt":235,"visible":94,"__hash__":4476},{"type":7,"value":11360,"toc":11484},[11361,11363,11365,11367,11369,11373,11377,11379,11389,11391,11393,11425,11427,11432,11434,11436,11446,11448,11450,11454,11458,11460,11466,11468,11476,11478,11480,11482],[10,11362,4303],{},[14,11364,16],{"id":16},[10,11366,4308],{},[14,11368,22],{"id":22},[10,11370,11371],{},[26,11372],{"alt":4315,"src":4316},[10,11374,11375,4321],{},[33,11376,58],{},[14,11378,43],{"id":43},[45,11380,11381,11383,11385],{},[48,11382,4328],{},[48,11384,4331],{},[48,11386,4334,11387,4338],{},[33,11388,4337],{},[14,11390,68],{"id":68},[10,11392,71],{},[73,11394,11395],{"className":75,"code":4345,"language":77,"meta":78,"style":78},[33,11396,11397,11401,11405,11409,11413,11417,11421],{"__ignoreMap":78},[82,11398,11399],{"class":84,"line":85},[82,11400,4352],{},[82,11402,11403],{"class":84,"line":91},[82,11404,95],{"emptyLinePlaceholder":94},[82,11406,11407],{"class":84,"line":98},[82,11408,4361],{},[82,11410,11411],{"class":84,"line":104},[82,11412,4366],{},[82,11414,11415],{"class":84,"line":110},[82,11416,4371],{},[82,11418,11419],{"class":84,"line":116},[82,11420,95],{"emptyLinePlaceholder":94},[82,11422,11423],{"class":84,"line":122},[82,11424,4380],{},[10,11426,145],{},[73,11428,11430],{"className":11429,"code":4386,"language":151,"meta":78},[149],[33,11431,4386],{"__ignoreMap":78},[10,11433,156],{},[14,11435,159],{"id":159},[161,11437,11438,11442],{},[48,11439,4397,11440,4401],{},[33,11441,4400],{},[48,11443,4404,11444,4407],{},[33,11445,4400],{},[330,11447,2699],{"id":2699},[10,11449,4412],{},[10,11451,11452],{},[26,11453],{"alt":4417,"src":4418},[10,11455,4421,11456,4424],{},[33,11457,4400],{},[14,11459,177],{"id":177},[45,11461,11462,11464],{},[48,11463,4431],{},[48,11465,4434],{},[14,11467,197],{"id":197},[161,11469,11470,11474],{},[48,11471,2341,11472,4443],{},[33,11473,58],{},[48,11475,4446],{},[10,11477,208],{},[14,11479,211],{"id":211},[10,11481,4453],{},[216,11483,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11485},[11486,11487,11488,11489,11490,11493,11494,11495],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":11491},[11492],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":4298,"description":4303},[229,58,4475],{"id":4478,"title":4479,"body":11500,"category":229,"cover":230,"description":4484,"extension":231,"meta":11625,"navigation":94,"path":4632,"pinned":234,"publishedAt":235,"seo":11626,"slug":4634,"stem":4635,"summary":4636,"tags":11627,"updatedAt":235,"visible":94,"__hash__":4639},{"type":7,"value":11501,"toc":11615},[11502,11504,11506,11508,11510,11514,11518,11520,11530,11532,11534,11566,11568,11573,11575,11577,11589,11591,11597,11599,11607,11609,11611,11613],[10,11503,4484],{},[14,11505,16],{"id":16},[10,11507,4489],{},[14,11509,22],{"id":22},[10,11511,11512],{},[26,11513],{"alt":4496,"src":4497},[10,11515,11516,4502],{},[33,11517,4337],{},[14,11519,43],{"id":43},[45,11521,11522,11526,11528],{},[48,11523,11524,4512],{},[33,11525,4511],{},[48,11527,4515],{},[48,11529,4518],{},[14,11531,68],{"id":68},[10,11533,71],{},[73,11535,11536],{"className":75,"code":4525,"language":77,"meta":78,"style":78},[33,11537,11538,11542,11546,11550,11554,11558,11562],{"__ignoreMap":78},[82,11539,11540],{"class":84,"line":85},[82,11541,4532],{},[82,11543,11544],{"class":84,"line":91},[82,11545,95],{"emptyLinePlaceholder":94},[82,11547,11548],{"class":84,"line":98},[82,11549,4541],{},[82,11551,11552],{"class":84,"line":104},[82,11553,4546],{},[82,11555,11556],{"class":84,"line":110},[82,11557,95],{"emptyLinePlaceholder":94},[82,11559,11560],{"class":84,"line":116},[82,11561,4555],{},[82,11563,11564],{"class":84,"line":122},[82,11565,131],{},[10,11567,145],{},[73,11569,11571],{"className":11570,"code":4565,"language":151,"meta":78},[149],[33,11572,4565],{"__ignoreMap":78},[10,11574,156],{},[14,11576,159],{"id":159},[161,11578,11579,11585],{},[48,11580,4576,11581,4579,11583,4583],{},[33,11582,4337],{},[33,11584,4582],{},[48,11586,11587,4588],{},[33,11588,4511],{},[14,11590,177],{"id":177},[45,11592,11593,11595],{},[48,11594,4595],{},[48,11596,4598],{},[14,11598,197],{"id":197},[161,11600,11601,11603],{},[48,11602,4605],{},[48,11604,2341,11605,4611],{},[33,11606,4610],{},[10,11608,208],{},[14,11610,211],{"id":211},[10,11612,4618],{},[216,11614,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11616},[11617,11618,11619,11620,11621,11622,11623,11624],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":4479,"description":4484},[229,4337,4638],{"id":4,"title":5,"body":11629,"category":229,"cover":230,"description":12,"extension":231,"meta":11774,"navigation":94,"path":233,"pinned":234,"publishedAt":235,"seo":11775,"slug":237,"stem":238,"summary":239,"tags":11776,"updatedAt":235,"visible":94,"__hash__":241},{"type":7,"value":11630,"toc":11764},[11631,11633,11635,11637,11639,11643,11649,11651,11665,11667,11669,11713,11715,11720,11722,11724,11734,11736,11748,11750,11756,11758,11760,11762],[10,11632,12],{},[14,11634,16],{"id":16},[10,11636,19],{},[14,11638,22],{"id":22},[10,11640,11641],{},[26,11642],{"alt":28,"src":29},[10,11644,11645,36,11647,40],{},[33,11646,35],{},[33,11648,39],{},[14,11650,43],{"id":43},[45,11652,11653,11655,11661],{},[48,11654,50],{},[48,11656,11657,55,11659,59],{},[33,11658,35],{},[33,11660,58],{},[48,11662,62,11663,65],{},[33,11664,39],{},[14,11666,68],{"id":68},[10,11668,71],{},[73,11670,11671],{"className":75,"code":76,"language":77,"meta":78,"style":78},[33,11672,11673,11677,11681,11685,11689,11693,11697,11701,11705,11709],{"__ignoreMap":78},[82,11674,11675],{"class":84,"line":85},[82,11676,88],{},[82,11678,11679],{"class":84,"line":91},[82,11680,95],{"emptyLinePlaceholder":94},[82,11682,11683],{"class":84,"line":98},[82,11684,101],{},[82,11686,11687],{"class":84,"line":104},[82,11688,107],{},[82,11690,11691],{"class":84,"line":110},[82,11692,113],{},[82,11694,11695],{"class":84,"line":116},[82,11696,119],{},[82,11698,11699],{"class":84,"line":122},[82,11700,125],{},[82,11702,11703],{"class":84,"line":128},[82,11704,131],{},[82,11706,11707],{"class":84,"line":134},[82,11708,95],{"emptyLinePlaceholder":94},[82,11710,11711],{"class":84,"line":139},[82,11712,142],{},[10,11714,145],{},[73,11716,11718],{"className":11717,"code":150,"language":151,"meta":78},[149],[33,11719,150],{"__ignoreMap":78},[10,11721,156],{},[14,11723,159],{"id":159},[161,11725,11726,11730],{},[48,11727,165,11728,168],{},[33,11729,35],{},[48,11731,171,11732,174],{},[33,11733,39],{},[14,11735,177],{"id":177},[45,11737,11738,11742],{},[48,11739,182,11740,185],{},[33,11741,35],{},[48,11743,188,11744,191,11746,194],{},[33,11745,58],{},[33,11747,35],{},[14,11749,197],{"id":197},[161,11751,11752,11754],{},[48,11753,202],{},[48,11755,205],{},[10,11757,208],{},[14,11759,211],{"id":211},[10,11761,214],{},[216,11763,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11765},[11766,11767,11768,11769,11770,11771,11772,11773],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5,"description":12},[229,39,35],{"id":4790,"title":4791,"body":11778,"category":229,"cover":230,"description":4796,"extension":231,"meta":11917,"navigation":94,"path":4968,"pinned":234,"publishedAt":235,"seo":11918,"slug":4970,"stem":4971,"summary":4972,"tags":11919,"updatedAt":235,"visible":94,"__hash__":4976},{"type":7,"value":11779,"toc":11905},[11780,11782,11784,11786,11788,11792,11794,11796,11812,11814,11816,11844,11846,11851,11853,11855,11867,11869,11871,11875,11877,11879,11889,11891,11897,11899,11901,11903],[10,11781,4796],{},[14,11783,16],{"id":16},[10,11785,4801],{},[14,11787,22],{"id":22},[10,11789,11790],{},[26,11791],{"alt":4808,"src":4809},[10,11793,4812],{},[14,11795,43],{"id":43},[45,11797,11798,11800,11802],{},[48,11799,4819],{},[48,11801,4822],{},[48,11803,4825,11804,2259,11806,4832,11808,2259,11810,364],{},[33,11805,4828],{},[33,11807,4831],{},[33,11809,4835],{},[33,11811,4838],{},[14,11813,68],{"id":68},[10,11815,71],{},[73,11817,11818],{"className":75,"code":4845,"language":77,"meta":78,"style":78},[33,11819,11820,11824,11828,11832,11836,11840],{"__ignoreMap":78},[82,11821,11822],{"class":84,"line":85},[82,11823,4852],{},[82,11825,11826],{"class":84,"line":91},[82,11827,95],{"emptyLinePlaceholder":94},[82,11829,11830],{"class":84,"line":98},[82,11831,4861],{},[82,11833,11834],{"class":84,"line":104},[82,11835,4866],{},[82,11837,11838],{"class":84,"line":110},[82,11839,4871],{},[82,11841,11842],{"class":84,"line":116},[82,11843,4876],{},[10,11845,145],{},[73,11847,11849],{"className":11848,"code":4882,"language":151,"meta":78},[149],[33,11850,4882],{"__ignoreMap":78},[10,11852,156],{},[14,11854,159],{"id":159},[161,11856,11857,11865],{},[48,11858,4893,11859,4896,11861,1159,11863,364],{},[33,11860,4828],{},[33,11862,4899],{},[33,11864,4902],{},[48,11866,4905],{},[330,11868,2699],{"id":2699},[10,11870,4910],{},[10,11872,11873],{},[26,11874],{"alt":4915,"src":4916},[10,11876,4919],{},[14,11878,177],{"id":177},[45,11880,11881,11887],{},[48,11882,4926,11883,1011,11885,4932],{},[33,11884,4929],{},[33,11886,4835],{},[48,11888,4935],{},[14,11890,197],{"id":197},[161,11892,11893,11895],{},[48,11894,4942],{},[48,11896,4945],{},[10,11898,208],{},[14,11900,211],{"id":211},[10,11902,4952],{},[216,11904,218],{},{"title":78,"searchDepth":91,"depth":91,"links":11906},[11907,11908,11909,11910,11911,11914,11915,11916],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":11912},[11913],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":4791,"description":4796},[229,4974,4975],{"id":4978,"title":4979,"body":11921,"category":229,"cover":230,"description":4984,"extension":231,"meta":12038,"navigation":94,"path":5123,"pinned":234,"publishedAt":235,"seo":12039,"slug":5125,"stem":5126,"summary":5127,"tags":12040,"updatedAt":235,"visible":94,"__hash__":5131},{"type":7,"value":11922,"toc":12028},[11923,11925,11927,11929,11931,11935,11937,11939,11947,11949,11951,11983,11985,11990,11992,11994,12002,12004,12012,12014,12020,12022,12024,12026],[10,11924,4984],{},[14,11926,16],{"id":16},[10,11928,4989],{},[14,11930,22],{"id":22},[10,11932,11933],{},[26,11934],{"alt":4996,"src":4997},[10,11936,5000],{},[14,11938,43],{"id":43},[45,11940,11941,11943,11945],{},[48,11942,5007],{},[48,11944,5010],{},[48,11946,5013],{},[14,11948,68],{"id":68},[10,11950,71],{},[73,11952,11953],{"className":75,"code":5020,"language":77,"meta":78,"style":78},[33,11954,11955,11959,11963,11967,11971,11975,11979],{"__ignoreMap":78},[82,11956,11957],{"class":84,"line":85},[82,11958,5027],{},[82,11960,11961],{"class":84,"line":91},[82,11962,95],{"emptyLinePlaceholder":94},[82,11964,11965],{"class":84,"line":98},[82,11966,5036],{},[82,11968,11969],{"class":84,"line":104},[82,11970,5041],{},[82,11972,11973],{"class":84,"line":110},[82,11974,95],{"emptyLinePlaceholder":94},[82,11976,11977],{"class":84,"line":116},[82,11978,5050],{},[82,11980,11981],{"class":84,"line":122},[82,11982,5055],{},[10,11984,145],{},[73,11986,11988],{"className":11987,"code":5061,"language":151,"meta":78},[149],[33,11989,5061],{"__ignoreMap":78},[10,11991,156],{},[14,11993,159],{"id":159},[161,11995,11996,11998],{},[48,11997,5072],{},[48,11999,5075,12000,5079],{},[33,12001,5078],{},[14,12003,177],{"id":177},[45,12005,12006,12010],{},[48,12007,5086,12008,5089],{},[33,12009,4337],{},[48,12011,5092],{},[14,12013,197],{"id":197},[161,12015,12016,12018],{},[48,12017,5099],{},[48,12019,5102],{},[10,12021,208],{},[14,12023,211],{"id":211},[10,12025,5109],{},[216,12027,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12029},[12030,12031,12032,12033,12034,12035,12036,12037],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":4979,"description":4984},[229,5129,5130],{"id":5133,"title":5134,"body":12042,"category":229,"cover":230,"description":5139,"extension":231,"meta":12161,"navigation":94,"path":5283,"pinned":234,"publishedAt":235,"seo":12162,"slug":5285,"stem":5286,"summary":5287,"tags":12163,"updatedAt":235,"visible":94,"__hash__":5291},{"type":7,"value":12043,"toc":12151},[12044,12046,12048,12050,12052,12056,12058,12060,12068,12070,12072,12104,12106,12111,12113,12115,12125,12127,12133,12135,12143,12145,12147,12149],[10,12045,5139],{},[14,12047,16],{"id":16},[10,12049,5144],{},[14,12051,22],{"id":22},[10,12053,12054],{},[26,12055],{"alt":5151,"src":5152},[10,12057,5155],{},[14,12059,43],{"id":43},[45,12061,12062,12064,12066],{},[48,12063,5162],{},[48,12065,5165],{},[48,12067,5168],{},[14,12069,68],{"id":68},[10,12071,71],{},[73,12073,12074],{"className":75,"code":5175,"language":77,"meta":78,"style":78},[33,12075,12076,12080,12084,12088,12092,12096,12100],{"__ignoreMap":78},[82,12077,12078],{"class":84,"line":85},[82,12079,5182],{},[82,12081,12082],{"class":84,"line":91},[82,12083,5187],{},[82,12085,12086],{"class":84,"line":98},[82,12087,5192],{},[82,12089,12090],{"class":84,"line":104},[82,12091,95],{"emptyLinePlaceholder":94},[82,12093,12094],{"class":84,"line":110},[82,12095,5201],{},[82,12097,12098],{"class":84,"line":116},[82,12099,5206],{},[82,12101,12102],{"class":84,"line":122},[82,12103,5211],{},[10,12105,145],{},[73,12107,12109],{"className":12108,"code":5217,"language":151,"meta":78},[149],[33,12110,5217],{"__ignoreMap":78},[10,12112,156],{},[14,12114,159],{"id":159},[161,12116,12117,12121],{},[48,12118,940,12119,5231],{},[33,12120,5230],{},[48,12122,5234,12123,5238],{},[33,12124,5237],{},[14,12126,177],{"id":177},[45,12128,12129,12131],{},[48,12130,5245],{},[48,12132,5248],{},[14,12134,197],{"id":197},[161,12136,12137,12141],{},[48,12138,5255,12139,5259],{},[33,12140,5258],{},[48,12142,5262],{},[10,12144,208],{},[14,12146,211],{"id":211},[10,12148,5269],{},[216,12150,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12152},[12153,12154,12155,12156,12157,12158,12159,12160],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5134,"description":5139},[229,5289,5290],{"id":5293,"title":5294,"body":12165,"category":229,"cover":230,"description":5299,"extension":231,"meta":12310,"navigation":94,"path":5480,"pinned":234,"publishedAt":235,"seo":12311,"slug":5482,"stem":5483,"summary":5484,"tags":12312,"updatedAt":235,"visible":94,"__hash__":5488},{"type":7,"value":12166,"toc":12298},[12167,12169,12171,12173,12175,12179,12183,12185,12197,12199,12201,12229,12231,12236,12238,12240,12254,12256,12258,12262,12270,12272,12282,12284,12290,12292,12294,12296],[10,12168,5299],{},[14,12170,16],{"id":16},[10,12172,5304],{},[14,12174,22],{"id":22},[10,12176,12177],{},[26,12178],{"alt":5311,"src":5312},[10,12180,5315,12181,5319],{},[33,12182,5318],{},[14,12184,43],{"id":43},[45,12186,12187,12189,12191],{},[48,12188,5326],{},[48,12190,5329],{},[48,12192,5332,12193,5335,12195,364],{},[33,12194,5318],{},[33,12196,5338],{},[14,12198,68],{"id":68},[10,12200,71],{},[73,12202,12203],{"className":75,"code":5345,"language":77,"meta":78,"style":78},[33,12204,12205,12209,12213,12217,12221,12225],{"__ignoreMap":78},[82,12206,12207],{"class":84,"line":85},[82,12208,5352],{},[82,12210,12211],{"class":84,"line":91},[82,12212,5357],{},[82,12214,12215],{"class":84,"line":98},[82,12216,5362],{},[82,12218,12219],{"class":84,"line":104},[82,12220,95],{"emptyLinePlaceholder":94},[82,12222,12223],{"class":84,"line":110},[82,12224,5371],{},[82,12226,12227],{"class":84,"line":116},[82,12228,5376],{},[10,12230,145],{},[73,12232,12234],{"className":12233,"code":5382,"language":151,"meta":78},[149],[33,12235,5382],{"__ignoreMap":78},[10,12237,156],{},[14,12239,159],{"id":159},[161,12241,12242,12248],{},[48,12243,5393,12244,2259,12246,5399],{},[33,12245,5396],{},[33,12247,4400],{},[48,12249,12250,5405,12252,5409],{},[33,12251,5404],{},[33,12253,5408],{},[330,12255,2699],{"id":2699},[10,12257,5414],{},[10,12259,12260],{},[26,12261],{"alt":5419,"src":5420},[10,12263,12264,2259,12266,1159,12268,5430],{},[33,12265,5396],{},[33,12267,4400],{},[33,12269,5429],{},[14,12271,177],{"id":177},[45,12273,12274,12278],{},[48,12275,5437,12276,5441],{},[33,12277,5440],{},[48,12279,5444,12280,5447],{},[33,12281,5429],{},[14,12283,197],{"id":197},[161,12285,12286,12288],{},[48,12287,5454],{},[48,12289,5457],{},[10,12291,208],{},[14,12293,211],{"id":211},[10,12295,5464],{},[216,12297,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12299},[12300,12301,12302,12303,12304,12307,12308,12309],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":12305},[12306],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5294,"description":5299},[229,5486,5487],{"id":5490,"title":5491,"body":12314,"category":229,"cover":230,"description":5496,"extension":231,"meta":12463,"navigation":94,"path":5677,"pinned":234,"publishedAt":235,"seo":12464,"slug":5679,"stem":5680,"summary":5681,"tags":12465,"updatedAt":235,"visible":94,"__hash__":5685},{"type":7,"value":12315,"toc":12451},[12316,12318,12320,12322,12324,12328,12330,12332,12344,12346,12348,12392,12394,12399,12401,12403,12415,12417,12419,12423,12425,12427,12435,12437,12443,12445,12447,12449],[10,12317,5496],{},[14,12319,16],{"id":16},[10,12321,5501],{},[14,12323,22],{"id":22},[10,12325,12326],{},[26,12327],{"alt":5508,"src":5509},[10,12329,5512],{},[14,12331,43],{"id":43},[45,12333,12334,12336,12340],{},[48,12335,5519],{},[48,12337,12338,5525],{},[33,12339,5524],{},[48,12341,12342,5531],{},[33,12343,5530],{},[14,12345,68],{"id":68},[10,12347,71],{},[73,12349,12350],{"className":75,"code":5538,"language":77,"meta":78,"style":78},[33,12351,12352,12356,12360,12364,12368,12372,12376,12380,12384,12388],{"__ignoreMap":78},[82,12353,12354],{"class":84,"line":85},[82,12355,5545],{},[82,12357,12358],{"class":84,"line":91},[82,12359,5550],{},[82,12361,12362],{"class":84,"line":98},[82,12363,95],{"emptyLinePlaceholder":94},[82,12365,12366],{"class":84,"line":104},[82,12367,5559],{},[82,12369,12370],{"class":84,"line":110},[82,12371,5564],{},[82,12373,12374],{"class":84,"line":116},[82,12375,95],{"emptyLinePlaceholder":94},[82,12377,12378],{"class":84,"line":122},[82,12379,5573],{},[82,12381,12382],{"class":84,"line":128},[82,12383,5578],{},[82,12385,12386],{"class":84,"line":134},[82,12387,95],{"emptyLinePlaceholder":94},[82,12389,12390],{"class":84,"line":139},[82,12391,5587],{},[10,12393,145],{},[73,12395,12397],{"className":12396,"code":5593,"language":151,"meta":78},[149],[33,12398,5593],{"__ignoreMap":78},[10,12400,156],{},[14,12402,159],{"id":159},[161,12404,12405,12409],{},[48,12406,5604,12407,5608],{},[33,12408,5607],{},[48,12410,12411,5614,12413,364],{},[33,12412,5613],{},[33,12414,5617],{},[330,12416,2699],{"id":2699},[10,12418,5622],{},[10,12420,12421],{},[26,12422],{"alt":5627,"src":5628},[10,12424,5631],{},[14,12426,177],{"id":177},[45,12428,12429,12433],{},[48,12430,5638,12431,5641],{},[33,12432,5338],{},[48,12434,5644],{},[14,12436,197],{"id":197},[161,12438,12439,12441],{},[48,12440,5651],{},[48,12442,5654],{},[10,12444,208],{},[14,12446,211],{"id":211},[10,12448,5661],{},[216,12450,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12452},[12453,12454,12455,12456,12457,12460,12461,12462],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":12458},[12459],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5491,"description":5496},[229,5683,5684],{"id":5687,"title":5688,"body":12467,"category":229,"cover":230,"description":5693,"extension":231,"meta":12628,"navigation":94,"path":5891,"pinned":234,"publishedAt":235,"seo":12629,"slug":5893,"stem":5894,"summary":5895,"tags":12630,"updatedAt":235,"visible":94,"__hash__":5899},{"type":7,"value":12468,"toc":12616},[12469,12471,12473,12475,12477,12481,12483,12485,12497,12499,12501,12553,12555,12560,12562,12564,12582,12584,12586,12590,12592,12594,12600,12602,12608,12610,12612,12614],[10,12470,5693],{},[14,12472,16],{"id":16},[10,12474,5698],{},[14,12476,22],{"id":22},[10,12478,12479],{},[26,12480],{"alt":5705,"src":5706},[10,12482,5709],{},[14,12484,43],{"id":43},[45,12486,12487,12489,12491],{},[48,12488,5716],{},[48,12490,5719],{},[48,12492,12493,2178,12495,5728],{},[33,12494,5724],{},[33,12496,5727],{},[14,12498,68],{"id":68},[10,12500,71],{},[73,12502,12503],{"className":75,"code":5735,"language":77,"meta":78,"style":78},[33,12504,12505,12509,12513,12517,12521,12525,12529,12533,12537,12541,12545,12549],{"__ignoreMap":78},[82,12506,12507],{"class":84,"line":85},[82,12508,5742],{},[82,12510,12511],{"class":84,"line":91},[82,12512,95],{"emptyLinePlaceholder":94},[82,12514,12515],{"class":84,"line":98},[82,12516,5751],{},[82,12518,12519],{"class":84,"line":104},[82,12520,5756],{},[82,12522,12523],{"class":84,"line":110},[82,12524,95],{"emptyLinePlaceholder":94},[82,12526,12527],{"class":84,"line":116},[82,12528,5765],{},[82,12530,12531],{"class":84,"line":122},[82,12532,5770],{},[82,12534,12535],{"class":84,"line":128},[82,12536,5775],{},[82,12538,12539],{"class":84,"line":134},[82,12540,95],{"emptyLinePlaceholder":94},[82,12542,12543],{"class":84,"line":139},[82,12544,5784],{},[82,12546,12547],{"class":84,"line":5787},[82,12548,95],{"emptyLinePlaceholder":94},[82,12550,12551],{"class":84,"line":5792},[82,12552,5795],{},[10,12554,145],{},[73,12556,12558],{"className":12557,"code":5801,"language":151,"meta":78},[149],[33,12559,5801],{"__ignoreMap":78},[10,12561,156],{},[14,12563,159],{"id":159},[161,12565,12566,12576],{},[48,12567,12568,5815,12570,5819,12572,5822,12574,5826],{},[33,12569,5814],{},[33,12571,5818],{},[33,12573,5607],{},[33,12575,5825],{},[48,12577,12578,5831,12580,5834],{},[33,12579,4582],{},[33,12581,2210],{},[330,12583,2699],{"id":2699},[10,12585,5839],{},[10,12587,12588],{},[26,12589],{"alt":5844,"src":5845},[10,12591,5848],{},[14,12593,177],{"id":177},[45,12595,12596,12598],{},[48,12597,5855],{},[48,12599,5858],{},[14,12601,197],{"id":197},[161,12603,12604,12606],{},[48,12605,5865],{},[48,12607,5868],{},[10,12609,208],{},[14,12611,211],{"id":211},[10,12613,5875],{},[216,12615,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12617},[12618,12619,12620,12621,12622,12625,12626,12627],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":12623},[12624],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5688,"description":5693},[229,5897,5898],{"id":5901,"title":5902,"body":12632,"category":229,"cover":230,"description":5907,"extension":231,"meta":12755,"navigation":94,"path":6058,"pinned":234,"publishedAt":235,"seo":12756,"slug":6060,"stem":6061,"summary":6062,"tags":12757,"updatedAt":235,"visible":94,"__hash__":6066},{"type":7,"value":12633,"toc":12745},[12634,12636,12638,12640,12642,12646,12648,12650,12664,12666,12668,12696,12698,12703,12705,12707,12717,12719,12727,12729,12737,12739,12741,12743],[10,12635,5907],{},[14,12637,16],{"id":16},[10,12639,5912],{},[14,12641,22],{"id":22},[10,12643,12644],{},[26,12645],{"alt":5919,"src":5920},[10,12647,5923],{},[14,12649,43],{"id":43},[45,12651,12652,12654,12656],{},[48,12653,5930],{},[48,12655,5933],{},[48,12657,5936,12658,2259,12660,2259,12662,5944],{},[33,12659,2262],{},[33,12661,2428],{},[33,12663,5943],{},[14,12665,68],{"id":68},[10,12667,71],{},[73,12669,12670],{"className":75,"code":5951,"language":77,"meta":78,"style":78},[33,12671,12672,12676,12680,12684,12688,12692],{"__ignoreMap":78},[82,12673,12674],{"class":84,"line":85},[82,12675,5958],{},[82,12677,12678],{"class":84,"line":91},[82,12679,5963],{},[82,12681,12682],{"class":84,"line":98},[82,12683,5968],{},[82,12685,12686],{"class":84,"line":104},[82,12687,95],{"emptyLinePlaceholder":94},[82,12689,12690],{"class":84,"line":110},[82,12691,5977],{},[82,12693,12694],{"class":84,"line":116},[82,12695,5982],{},[10,12697,145],{},[73,12699,12701],{"className":12700,"code":5988,"language":151,"meta":78},[149],[33,12702,5988],{"__ignoreMap":78},[10,12704,156],{},[14,12706,159],{"id":159},[161,12708,12709,12715],{},[48,12710,5999,12711,6003,12713,6006],{},[33,12712,6002],{},[33,12714,2248],{},[48,12716,6009],{},[14,12718,177],{"id":177},[45,12720,12721,12725],{},[48,12722,6016,12723,6020],{},[33,12724,6019],{},[48,12726,6023],{},[14,12728,197],{"id":197},[161,12730,12731,12733],{},[48,12732,6030],{},[48,12734,6033,12735,6037],{},[33,12736,6036],{},[10,12738,208],{},[14,12740,211],{"id":211},[10,12742,6044],{},[216,12744,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12746},[12747,12748,12749,12750,12751,12752,12753,12754],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":5902,"description":5907},[229,6064,6065],{"id":6068,"title":6069,"body":12759,"category":229,"cover":230,"description":6074,"extension":231,"meta":12936,"navigation":94,"path":6302,"pinned":234,"publishedAt":235,"seo":12937,"slug":6304,"stem":6305,"summary":6306,"tags":12938,"updatedAt":235,"visible":94,"__hash__":6310},{"type":7,"value":12760,"toc":12924},[12761,12763,12765,12769,12771,12775,12781,12783,12795,12797,12801,12825,12829,12845,12851,12853,12858,12860,12862,12878,12880,12882,12886,12890,12892,12904,12906,12916,12918,12920,12922],[10,12762,6074],{},[14,12764,16],{"id":16},[10,12766,6079,12767,6082],{},[296,12768,6002],{},[14,12770,22],{"id":22},[10,12772,12773],{},[26,12774],{"alt":6089,"src":6090},[10,12776,6093,12777,6097,12779,6101],{},[33,12778,6096],{},[33,12780,6100],{},[14,12782,43],{"id":43},[45,12784,12785,12789,12791],{},[48,12786,6108,12787,6111],{},[33,12788,1173],{},[48,12790,6114],{},[48,12792,6117,12793,6121],{},[33,12794,6120],{},[14,12796,68],{"id":68},[10,12798,6126,12799,6130],{},[33,12800,6129],{},[73,12802,12803],{"className":75,"code":6133,"language":77,"meta":78,"style":78},[33,12804,12805,12809,12813,12817,12821],{"__ignoreMap":78},[82,12806,12807],{"class":84,"line":85},[82,12808,6140],{},[82,12810,12811],{"class":84,"line":91},[82,12812,6145],{},[82,12814,12815],{"class":84,"line":98},[82,12816,95],{"emptyLinePlaceholder":94},[82,12818,12819],{"class":84,"line":104},[82,12820,6154],{},[82,12822,12823],{"class":84,"line":110},[82,12824,6159],{},[10,12826,6162,12827,6166],{},[33,12828,6165],{},[73,12830,12831],{"className":75,"code":6169,"language":77,"meta":78,"style":78},[33,12832,12833,12837,12841],{"__ignoreMap":78},[82,12834,12835],{"class":84,"line":85},[82,12836,6176],{},[82,12838,12839],{"class":84,"line":91},[82,12840,95],{"emptyLinePlaceholder":94},[82,12842,12843],{"class":84,"line":98},[82,12844,6185],{},[10,12846,6188,12847,1159,12849,364],{},[33,12848,6191],{},[33,12850,6194],{},[10,12852,145],{},[73,12854,12856],{"className":12855,"code":6200,"language":151,"meta":78},[149],[33,12857,6200],{"__ignoreMap":78},[10,12859,156],{},[14,12861,159],{"id":159},[161,12863,12864,12870],{},[48,12865,6211,12866,6214,12868,6218],{},[33,12867,6129],{},[33,12869,6217],{},[48,12871,12872,6223,12874,6226,12876,6229],{},[33,12873,6165],{},[33,12875,6129],{},[33,12877,6165],{},[330,12879,2699],{"id":2699},[10,12881,6234],{},[10,12883,12884],{},[26,12885],{"alt":6239,"src":6240},[10,12887,6243,12888,6246],{},[33,12889,6217],{},[14,12891,177],{"id":177},[45,12893,12894,12900],{},[48,12895,6253,12896,1159,12898,364],{},[33,12897,6129],{},[33,12899,6165],{},[48,12901,6260,12902,6264],{},[33,12903,6263],{},[14,12905,197],{"id":197},[161,12907,12908,12912],{},[48,12909,2356,12910,6274],{},[33,12911,6273],{},[48,12913,6277,12914,364],{},[33,12915,6096],{},[10,12917,208],{},[14,12919,211],{"id":211},[10,12921,6286],{},[216,12923,218],{},{"title":78,"searchDepth":91,"depth":91,"links":12925},[12926,12927,12928,12929,12930,12933,12934,12935],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":12931},[12932],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":6069,"description":6074},[229,6308,6309],{"id":6312,"title":6313,"body":12940,"category":229,"cover":230,"description":6318,"extension":231,"meta":13079,"navigation":94,"path":6484,"pinned":234,"publishedAt":235,"seo":13080,"slug":6486,"stem":6487,"summary":6488,"tags":13081,"updatedAt":235,"visible":94,"__hash__":6491},{"type":7,"value":12941,"toc":13069},[12942,12944,12946,12948,12950,12954,12956,12958,12968,12970,12972,13012,13014,13019,13021,13023,13041,13043,13051,13053,13061,13063,13065,13067],[10,12943,6318],{},[14,12945,16],{"id":16},[10,12947,6323],{},[14,12949,22],{"id":22},[10,12951,12952],{},[26,12953],{"alt":6330,"src":6331},[10,12955,6334],{},[14,12957,43],{"id":43},[45,12959,12960,12964,12966],{},[48,12961,12962,6344],{},[33,12963,6343],{},[48,12965,6347],{},[48,12967,6350],{},[14,12969,68],{"id":68},[10,12971,1576],{},[73,12973,12974],{"className":593,"code":6357,"language":595,"meta":78,"style":78},[33,12975,12976,12986,12992,12998,13008],{"__ignoreMap":78},[82,12977,12978,12980,12982,12984],{"class":84,"line":85},[82,12979,693],{"class":602},[82,12981,635],{"class":605},[82,12983,6368],{"class":638},[82,12985,6371],{"class":638},[82,12987,12988,12990],{"class":84,"line":91},[82,12989,6376],{"class":605},[82,12991,6379],{"class":638},[82,12993,12994,12996],{"class":84,"line":98},[82,12995,77],{"class":602},[82,12997,606],{"class":605},[82,12999,13000,13002,13004,13006],{"class":84,"line":104},[82,13001,77],{"class":602},[82,13003,635],{"class":605},[82,13005,639],{"class":638},[82,13007,606],{"class":605},[82,13009,13010],{"class":84,"line":110},[82,13011,6400],{"class":602},[10,13013,145],{},[73,13015,13017],{"className":13016,"code":6406,"language":151,"meta":78},[149],[33,13018,6406],{"__ignoreMap":78},[10,13020,156],{},[14,13022,159],{"id":159},[161,13024,13025,13031],{},[48,13026,13027,6420,13029,6423],{},[33,13028,6419],{},[33,13030,693],{},[48,13032,6426,13033,2178,13035,6432,13037,3729,13039,6438],{},[33,13034,77],{},[33,13036,6431],{},[33,13038,6343],{},[33,13040,6437],{},[14,13042,177],{"id":177},[45,13044,13045,13047],{},[48,13046,6445],{},[48,13048,182,13049,6450],{},[33,13050,6343],{},[14,13052,197],{"id":197},[161,13054,13055,13059],{},[48,13056,6457,13057,364],{},[33,13058,6460],{},[48,13060,6463],{},[10,13062,208],{},[14,13064,211],{"id":211},[10,13066,6470],{},[216,13068,1660],{},{"title":78,"searchDepth":91,"depth":91,"links":13070},[13071,13072,13073,13074,13075,13076,13077,13078],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":6313,"description":6318},[229,6490,262],{"id":6493,"title":6494,"body":13083,"category":229,"cover":230,"description":6499,"extension":231,"meta":13236,"navigation":94,"path":6688,"pinned":234,"publishedAt":235,"seo":13237,"slug":6690,"stem":6691,"summary":6692,"tags":13238,"updatedAt":235,"visible":94,"__hash__":6696},{"type":7,"value":13084,"toc":13226},[13085,13087,13089,13091,13093,13097,13103,13105,13121,13123,13125,13169,13171,13176,13178,13180,13192,13194,13208,13210,13218,13220,13222,13224],[10,13086,6499],{},[14,13088,16],{"id":16},[10,13090,6504],{},[14,13092,22],{"id":22},[10,13094,13095],{},[26,13096],{"alt":6511,"src":6512},[10,13098,13099,6518,13101,6521],{},[33,13100,6517],{},[33,13102,2438],{},[14,13104,43],{"id":43},[45,13106,13107,13109,13117],{},[48,13108,6528],{},[48,13110,13111,2259,13113,2259,13115,6540],{},[33,13112,6533],{},[33,13114,6536],{},[33,13116,6539],{},[48,13118,6543,13119,6547],{},[33,13120,6546],{},[14,13122,68],{"id":68},[10,13124,71],{},[73,13126,13127],{"className":75,"code":6554,"language":77,"meta":78,"style":78},[33,13128,13129,13133,13137,13141,13145,13149,13153,13157,13161,13165],{"__ignoreMap":78},[82,13130,13131],{"class":84,"line":85},[82,13132,6561],{},[82,13134,13135],{"class":84,"line":91},[82,13136,95],{"emptyLinePlaceholder":94},[82,13138,13139],{"class":84,"line":98},[82,13140,6570],{},[82,13142,13143],{"class":84,"line":104},[82,13144,6575],{},[82,13146,13147],{"class":84,"line":110},[82,13148,6580],{},[82,13150,13151],{"class":84,"line":116},[82,13152,95],{"emptyLinePlaceholder":94},[82,13154,13155],{"class":84,"line":122},[82,13156,6589],{},[82,13158,13159],{"class":84,"line":128},[82,13160,6594],{},[82,13162,13163],{"class":84,"line":134},[82,13164,6599],{},[82,13166,13167],{"class":84,"line":139},[82,13168,6604],{},[10,13170,145],{},[73,13172,13174],{"className":13173,"code":6610,"language":151,"meta":78},[149],[33,13175,6610],{"__ignoreMap":78},[10,13177,156],{},[14,13179,159],{"id":159},[161,13181,13182,13186],{},[48,13183,13184,6624],{},[33,13185,6623],{},[48,13187,2341,13188,6629,13190,6632],{},[33,13189,2438],{},[33,13191,6517],{},[14,13193,177],{"id":177},[45,13195,13196,13202],{},[48,13197,182,13198,6641,13200,6644],{},[33,13199,6517],{},[33,13201,6533],{},[48,13203,6647,13204,1011,13206,6653],{},[33,13205,2438],{},[33,13207,6652],{},[14,13209,197],{"id":197},[161,13211,13212,13216],{},[48,13213,6660,13214,6664],{},[33,13215,6663],{},[48,13217,6667],{},[10,13219,208],{},[14,13221,211],{"id":211},[10,13223,6674],{},[216,13225,218],{},{"title":78,"searchDepth":91,"depth":91,"links":13227},[13228,13229,13230,13231,13232,13233,13234,13235],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":6494,"description":6499},[229,6694,6695],{"id":6698,"title":6699,"body":13240,"category":229,"cover":230,"description":6704,"extension":231,"meta":13387,"navigation":94,"path":6883,"pinned":234,"publishedAt":235,"seo":13388,"slug":6885,"stem":6886,"summary":6887,"tags":13389,"updatedAt":235,"visible":94,"__hash__":6891},{"type":7,"value":13241,"toc":13377},[13242,13244,13246,13248,13250,13254,13256,13258,13276,13278,13280,13328,13330,13335,13337,13339,13347,13349,13359,13361,13369,13371,13373,13375],[10,13243,6704],{},[14,13245,16],{"id":16},[10,13247,6709],{},[14,13249,22],{"id":22},[10,13251,13252],{},[26,13253],{"alt":6716,"src":6717},[10,13255,6720],{},[14,13257,43],{"id":43},[45,13259,13260,13264,13270],{},[48,13261,13262,6730],{},[33,13263,6729],{},[48,13265,13266,6736,13268,364],{},[33,13267,6735],{},[33,13269,6739],{},[48,13271,6742,13272,6746,13274,6750],{},[33,13273,6745],{},[33,13275,6749],{},[14,13277,68],{"id":68},[10,13279,71],{},[73,13281,13282],{"className":75,"code":6757,"language":77,"meta":78,"style":78},[33,13283,13284,13288,13292,13296,13300,13304,13308,13312,13316,13320,13324],{"__ignoreMap":78},[82,13285,13286],{"class":84,"line":85},[82,13287,6561],{},[82,13289,13290],{"class":84,"line":91},[82,13291,95],{"emptyLinePlaceholder":94},[82,13293,13294],{"class":84,"line":98},[82,13295,6772],{},[82,13297,13298],{"class":84,"line":104},[82,13299,6777],{},[82,13301,13302],{"class":84,"line":110},[82,13303,6782],{},[82,13305,13306],{"class":84,"line":116},[82,13307,6787],{},[82,13309,13310],{"class":84,"line":122},[82,13311,95],{"emptyLinePlaceholder":94},[82,13313,13314],{"class":84,"line":128},[82,13315,6796],{},[82,13317,13318],{"class":84,"line":134},[82,13319,6801],{},[82,13321,13322],{"class":84,"line":139},[82,13323,6806],{},[82,13325,13326],{"class":84,"line":5787},[82,13327,6811],{},[10,13329,145],{},[73,13331,13333],{"className":13332,"code":6817,"language":151,"meta":78},[149],[33,13334,6817],{"__ignoreMap":78},[10,13336,156],{},[14,13338,159],{"id":159},[161,13340,13341,13345],{},[48,13342,6828,13343,6831],{},[33,13344,6745],{},[48,13346,6834],{},[14,13348,177],{"id":177},[45,13350,13351,13355],{},[48,13352,2341,13353,6843],{},[33,13354,6729],{},[48,13356,6846,13357,364],{},[33,13358,6849],{},[14,13360,197],{"id":197},[161,13362,13363,13365],{},[48,13364,6856],{},[48,13366,6859,13367,6862],{},[33,13368,338],{},[10,13370,208],{},[14,13372,211],{"id":211},[10,13374,6869],{},[216,13376,218],{},{"title":78,"searchDepth":91,"depth":91,"links":13378},[13379,13380,13381,13382,13383,13384,13385,13386],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":6699,"description":6704},[229,6889,6890],{"id":6893,"title":6894,"body":13391,"category":229,"cover":230,"description":6899,"extension":231,"meta":13534,"navigation":94,"path":7067,"pinned":234,"publishedAt":235,"seo":13535,"slug":7069,"stem":7070,"summary":7071,"tags":13536,"updatedAt":235,"visible":94,"__hash__":7075},{"type":7,"value":13392,"toc":13524},[13393,13395,13397,13399,13401,13405,13411,13413,13423,13425,13427,13479,13481,13486,13488,13490,13500,13502,13508,13510,13516,13518,13520,13522],[10,13394,6899],{},[14,13396,16],{"id":16},[10,13398,6904],{},[14,13400,22],{"id":22},[10,13402,13403],{},[26,13404],{"alt":6911,"src":6912},[10,13406,13407,6918,13409,6922],{},[33,13408,6917],{},[33,13410,6921],{},[14,13412,43],{"id":43},[45,13414,13415,13417,13421],{},[48,13416,6929],{},[48,13418,13419,6935],{},[33,13420,6934],{},[48,13422,6938],{},[14,13424,68],{"id":68},[10,13426,71],{},[73,13428,13429],{"className":75,"code":6945,"language":77,"meta":78,"style":78},[33,13430,13431,13435,13439,13443,13447,13451,13455,13459,13463,13467,13471,13475],{"__ignoreMap":78},[82,13432,13433],{"class":84,"line":85},[82,13434,6952],{},[82,13436,13437],{"class":84,"line":91},[82,13438,95],{"emptyLinePlaceholder":94},[82,13440,13441],{"class":84,"line":98},[82,13442,6961],{},[82,13444,13445],{"class":84,"line":104},[82,13446,95],{"emptyLinePlaceholder":94},[82,13448,13449],{"class":84,"line":110},[82,13450,6970],{},[82,13452,13453],{"class":84,"line":116},[82,13454,6975],{},[82,13456,13457],{"class":84,"line":122},[82,13458,6787],{},[82,13460,13461],{"class":84,"line":128},[82,13462,95],{"emptyLinePlaceholder":94},[82,13464,13465],{"class":84,"line":134},[82,13466,6988],{},[82,13468,13469],{"class":84,"line":139},[82,13470,6993],{},[82,13472,13473],{"class":84,"line":5787},[82,13474,6806],{},[82,13476,13477],{"class":84,"line":5792},[82,13478,7002],{},[10,13480,145],{},[73,13482,13484],{"className":13483,"code":7008,"language":151,"meta":78},[149],[33,13485,7008],{"__ignoreMap":78},[10,13487,156],{},[14,13489,159],{"id":159},[161,13491,13492,13496],{},[48,13493,13494,7021],{},[33,13495,6917],{},[48,13497,13498,7026],{},[33,13499,6921],{},[14,13501,177],{"id":177},[45,13503,13504,13506],{},[48,13505,7033],{},[48,13507,7036],{},[14,13509,197],{"id":197},[161,13511,13512,13514],{},[48,13513,7043],{},[48,13515,7046],{},[10,13517,208],{},[14,13519,211],{"id":211},[10,13521,7053],{},[216,13523,218],{},{"title":78,"searchDepth":91,"depth":91,"links":13525},[13526,13527,13528,13529,13530,13531,13532,13533],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":6894,"description":6899},[229,7073,7074],{"id":7077,"title":7078,"body":13538,"category":229,"cover":230,"description":7083,"extension":231,"meta":13689,"navigation":94,"path":7268,"pinned":234,"publishedAt":235,"seo":13690,"slug":7270,"stem":7271,"summary":7272,"tags":13691,"updatedAt":235,"visible":94,"__hash__":7276},{"type":7,"value":13539,"toc":13679},[13540,13542,13544,13546,13548,13552,13556,13558,13572,13574,13576,13628,13630,13635,13637,13639,13651,13653,13663,13665,13671,13673,13675,13677],[10,13541,7083],{},[14,13543,16],{"id":16},[10,13545,7088],{},[14,13547,22],{"id":22},[10,13549,13550],{},[26,13551],{"alt":7095,"src":7096},[10,13553,13554,7102],{},[33,13555,7101],{},[14,13557,43],{"id":43},[45,13559,13560,13566,13570],{},[48,13561,2341,13562,7112,13564,7116],{},[33,13563,7111],{},[33,13565,7115],{},[48,13567,7119,13568,7123],{},[33,13569,7122],{},[48,13571,7126],{},[14,13573,68],{"id":68},[10,13575,71],{},[73,13577,13578],{"className":75,"code":7133,"language":77,"meta":78,"style":78},[33,13579,13580,13584,13588,13592,13596,13600,13604,13608,13612,13616,13620,13624],{"__ignoreMap":78},[82,13581,13582],{"class":84,"line":85},[82,13583,7140],{},[82,13585,13586],{"class":84,"line":91},[82,13587,95],{"emptyLinePlaceholder":94},[82,13589,13590],{"class":84,"line":98},[82,13591,7149],{},[82,13593,13594],{"class":84,"line":104},[82,13595,7154],{},[82,13597,13598],{"class":84,"line":110},[82,13599,7159],{},[82,13601,13602],{"class":84,"line":116},[82,13603,7164],{},[82,13605,13606],{"class":84,"line":122},[82,13607,7169],{},[82,13609,13610],{"class":84,"line":128},[82,13611,95],{"emptyLinePlaceholder":94},[82,13613,13614],{"class":84,"line":134},[82,13615,7178],{},[82,13617,13618],{"class":84,"line":139},[82,13619,7183],{},[82,13621,13622],{"class":84,"line":5787},[82,13623,7188],{},[82,13625,13626],{"class":84,"line":5792},[82,13627,7193],{},[10,13629,145],{},[73,13631,13633],{"className":13632,"code":7199,"language":151,"meta":78},[149],[33,13634,7199],{"__ignoreMap":78},[10,13636,156],{},[14,13638,159],{"id":159},[161,13640,13641,13647],{},[48,13642,13643,7213,13645,7216],{},[33,13644,7212],{},[33,13646,7122],{},[48,13648,13649,7221],{},[33,13650,7101],{},[14,13652,177],{"id":177},[45,13654,13655,13657],{},[48,13656,7228],{},[48,13658,7231,13659,7234,13661,7237],{},[33,13660,7111],{},[33,13662,7115],{},[14,13664,197],{"id":197},[161,13666,13667,13669],{},[48,13668,7244],{},[48,13670,7247],{},[10,13672,208],{},[14,13674,211],{"id":211},[10,13676,7254],{},[216,13678,218],{},{"title":78,"searchDepth":91,"depth":91,"links":13680},[13681,13682,13683,13684,13685,13686,13687,13688],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":7078,"description":7083},[229,7274,7275],{"id":7278,"title":7279,"body":13693,"category":229,"cover":230,"description":7284,"extension":231,"meta":13907,"navigation":94,"path":7558,"pinned":234,"publishedAt":235,"seo":13908,"slug":7560,"stem":7561,"summary":7562,"tags":13909,"updatedAt":235,"visible":94,"__hash__":7566},{"type":7,"value":13694,"toc":13894},[13695,13697,13699,13701,13703,13707,13713,13715,13727,13729,13731,13791,13793,13798,13800,13802,13820,13822,13830,13834,13842,13844,13848,13852,13858,13860,13870,13872,13886,13888,13890,13892],[10,13696,7284],{},[14,13698,16],{"id":16},[10,13700,7289],{},[14,13702,22],{"id":22},[10,13704,13705],{},[26,13706],{"alt":7296,"src":7297},[10,13708,7300,13709,7304,13711,7308],{},[33,13710,7303],{},[33,13712,7307],{},[14,13714,43],{"id":43},[45,13716,13717,13721,13725],{},[48,13718,7315,13719,7318],{},[33,13720,7303],{},[48,13722,13723,7324],{},[33,13724,7323],{},[48,13726,7327],{},[14,13728,68],{"id":68},[10,13730,71],{},[73,13732,13733],{"className":75,"code":7334,"language":77,"meta":78,"style":78},[33,13734,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775,13779,13783,13787],{"__ignoreMap":78},[82,13736,13737],{"class":84,"line":85},[82,13738,7341],{},[82,13740,13741],{"class":84,"line":91},[82,13742,7346],{},[82,13744,13745],{"class":84,"line":98},[82,13746,7351],{},[82,13748,13749],{"class":84,"line":104},[82,13750,7356],{},[82,13752,13753],{"class":84,"line":110},[82,13754,7361],{},[82,13756,13757],{"class":84,"line":116},[82,13758,95],{"emptyLinePlaceholder":94},[82,13760,13761],{"class":84,"line":122},[82,13762,7370],{},[82,13764,13765],{"class":84,"line":128},[82,13766,7375],{},[82,13768,13769],{"class":84,"line":134},[82,13770,7380],{},[82,13772,13773],{"class":84,"line":139},[82,13774,7385],{},[82,13776,13777],{"class":84,"line":5787},[82,13778,1148],{},[82,13780,13781],{"class":84,"line":5792},[82,13782,7394],{},[82,13784,13785],{"class":84,"line":7397},[82,13786,7400],{},[82,13788,13789],{"class":84,"line":7403},[82,13790,7406],{},[10,13792,145],{},[73,13794,13796],{"className":13795,"code":7412,"language":151,"meta":78},[149],[33,13797,7412],{"__ignoreMap":78},[10,13799,156],{},[14,13801,159],{"id":159},[161,13803,13804,13812],{},[48,13805,13806,7425,13808,7428,13810,7432],{},[33,13807,3038],{},[33,13809,7323],{},[33,13811,7431],{},[48,13813,7435,13814,7438,13816,7441,13818,364],{},[33,13815,7303],{},[33,13817,1162],{},[33,13819,7307],{},[330,13821,2699],{"id":2699},[10,13823,13824,2259,13826,1159,13828,7454],{},[33,13825,7303],{},[33,13827,1162],{},[33,13829,7307],{},[10,13831,13832],{},[26,13833],{"alt":7459,"src":7460},[10,13835,13836,7465,13838,7468,13840,7471],{},[33,13837,7303],{},[33,13839,1162],{},[33,13841,7307],{},[330,13843,2699],{"id":4219},[10,13845,13846,7479],{},[33,13847,7478],{},[10,13849,13850],{},[26,13851],{"alt":7484,"src":7485},[10,13853,7488,13854,7491,13856,7494],{},[33,13855,7478],{},[33,13857,1162],{},[14,13859,177],{"id":177},[45,13861,13862,13866],{},[48,13863,7501,13864,7505],{},[33,13865,7504],{},[48,13867,7508,13868,7511],{},[33,13869,7478],{},[14,13871,197],{"id":197},[161,13873,13874,13882],{},[48,13875,7518,13876,7522,13878,1159,13880,364],{},[33,13877,7521],{},[33,13879,7525],{},[33,13881,7528],{},[48,13883,7531,13884,7534],{},[33,13885,6739],{},[10,13887,208],{},[14,13889,211],{"id":211},[10,13891,7541],{},[216,13893,218],{},{"title":78,"searchDepth":91,"depth":91,"links":13895},[13896,13897,13898,13899,13900,13904,13905,13906],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":13901},[13902,13903],{"id":2699,"depth":98,"text":2699},{"id":4219,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":7279,"description":7284},[229,7564,7565],{"id":7568,"title":7569,"body":13911,"category":229,"cover":230,"description":7574,"extension":231,"meta":14062,"navigation":94,"path":7751,"pinned":234,"publishedAt":235,"seo":14063,"slug":7753,"stem":7754,"summary":7755,"tags":14064,"updatedAt":235,"visible":94,"__hash__":7758},{"type":7,"value":13912,"toc":14052},[13913,13915,13917,13919,13921,13925,13929,13931,13943,13945,13947,13995,13997,14002,14004,14006,14016,14018,14028,14030,14044,14046,14048,14050],[10,13914,7574],{},[14,13916,16],{"id":16},[10,13918,7579],{},[14,13920,22],{"id":22},[10,13922,13923],{},[26,13924],{"alt":7586,"src":7587},[10,13926,7590,13927,7593],{},[33,13928,6749],{},[14,13930,43],{"id":43},[45,13932,13933,13937,13941],{},[48,13934,13935,7602],{},[33,13936,6749],{},[48,13938,13939,7608],{},[33,13940,7607],{},[48,13942,7611],{},[14,13944,68],{"id":68},[10,13946,71],{},[73,13948,13949],{"className":75,"code":7618,"language":77,"meta":78,"style":78},[33,13950,13951,13955,13959,13963,13967,13971,13975,13979,13983,13987,13991],{"__ignoreMap":78},[82,13952,13953],{"class":84,"line":85},[82,13954,6561],{},[82,13956,13957],{"class":84,"line":91},[82,13958,95],{"emptyLinePlaceholder":94},[82,13960,13961],{"class":84,"line":98},[82,13962,6772],{},[82,13964,13965],{"class":84,"line":104},[82,13966,95],{"emptyLinePlaceholder":94},[82,13968,13969],{"class":84,"line":110},[82,13970,7641],{},[82,13972,13973],{"class":84,"line":116},[82,13974,7646],{},[82,13976,13977],{"class":84,"line":122},[82,13978,95],{"emptyLinePlaceholder":94},[82,13980,13981],{"class":84,"line":128},[82,13982,7655],{},[82,13984,13985],{"class":84,"line":134},[82,13986,7660],{},[82,13988,13989],{"class":84,"line":139},[82,13990,95],{"emptyLinePlaceholder":94},[82,13992,13993],{"class":84,"line":5787},[82,13994,7669],{},[10,13996,145],{},[73,13998,14000],{"className":13999,"code":7675,"language":151,"meta":78},[149],[33,14001,7675],{"__ignoreMap":78},[10,14003,156],{},[14,14005,159],{"id":159},[161,14007,14008,14014],{},[48,14009,7590,14010,7688,14012,364],{},[33,14011,6749],{},[33,14013,7691],{},[48,14015,7694],{},[14,14017,177],{"id":177},[45,14019,14020,14024],{},[48,14021,188,14022,7703],{},[33,14023,6749],{},[48,14025,7706,14026,7709],{},[33,14027,6749],{},[14,14029,197],{"id":197},[161,14031,14032,14038],{},[48,14033,7716,14034,7720,14036,364],{},[33,14035,7719],{},[33,14037,6749],{},[48,14039,188,14040,7727,14042,364],{},[33,14041,6749],{},[33,14043,7730],{},[10,14045,208],{},[14,14047,211],{"id":211},[10,14049,7737],{},[216,14051,218],{},{"title":78,"searchDepth":91,"depth":91,"links":14053},[14054,14055,14056,14057,14058,14059,14060,14061],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":7569,"description":7574},[229,6749,7757],{"id":7760,"title":7761,"body":14066,"category":229,"cover":230,"description":7766,"extension":231,"meta":14237,"navigation":94,"path":7979,"pinned":234,"publishedAt":235,"seo":14238,"slug":7981,"stem":7982,"summary":7983,"tags":14239,"updatedAt":235,"visible":94,"__hash__":7987},{"type":7,"value":14067,"toc":14225},[14068,14070,14072,14074,14076,14080,14082,14084,14096,14098,14100,14156,14158,14163,14165,14167,14183,14185,14187,14191,14197,14199,14207,14209,14217,14219,14221,14223],[10,14069,7766],{},[14,14071,16],{"id":16},[10,14073,7771],{},[14,14075,22],{"id":22},[10,14077,14078],{},[26,14079],{"alt":7778,"src":7779},[10,14081,7782],{},[14,14083,43],{"id":43},[45,14085,14086,14090,14094],{},[48,14087,14088,7792],{},[33,14089,7791],{},[48,14091,14092,7798],{},[33,14093,7797],{},[48,14095,7801],{},[14,14097,68],{"id":68},[10,14099,71],{},[73,14101,14102],{"className":75,"code":7808,"language":77,"meta":78,"style":78},[33,14103,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140,14144,14148,14152],{"__ignoreMap":78},[82,14105,14106],{"class":84,"line":85},[82,14107,7815],{},[82,14109,14110],{"class":84,"line":91},[82,14111,7820],{},[82,14113,14114],{"class":84,"line":98},[82,14115,7825],{},[82,14117,14118],{"class":84,"line":104},[82,14119,7830],{},[82,14121,14122],{"class":84,"line":110},[82,14123,95],{"emptyLinePlaceholder":94},[82,14125,14126],{"class":84,"line":116},[82,14127,7839],{},[82,14129,14130],{"class":84,"line":122},[82,14131,7844],{},[82,14133,14134],{"class":84,"line":128},[82,14135,7849],{},[82,14137,14138],{"class":84,"line":134},[82,14139,7854],{},[82,14141,14142],{"class":84,"line":139},[82,14143,95],{"emptyLinePlaceholder":94},[82,14145,14146],{"class":84,"line":5787},[82,14147,7863],{},[82,14149,14150],{"class":84,"line":5792},[82,14151,7868],{},[82,14153,14154],{"class":84,"line":7397},[82,14155,7873],{},[10,14157,145],{},[73,14159,14161],{"className":14160,"code":7879,"language":151,"meta":78},[149],[33,14162,7879],{"__ignoreMap":78},[10,14164,156],{},[14,14166,159],{"id":159},[161,14168,14169,14175],{},[48,14170,7890,14171,7894,14173,7897],{},[33,14172,7893],{},[33,14174,7797],{},[48,14176,14177,7903,14179,7907,14181,7910],{},[33,14178,7902],{},[33,14180,7906],{},[33,14182,7791],{},[330,14184,2699],{"id":2699},[10,14186,7915],{},[10,14188,14189],{},[26,14190],{"alt":7920,"src":7921},[10,14192,7924,14193,1159,14195,7930],{},[33,14194,4582],{},[33,14196,7929],{},[14,14198,177],{"id":177},[45,14200,14201,14205],{},[48,14202,7937,14203,7940],{},[33,14204,7791],{},[48,14206,7943],{},[14,14208,197],{"id":197},[161,14210,14211,14215],{},[48,14212,5255,14213,7953],{},[33,14214,7952],{},[48,14216,7956],{},[10,14218,208],{},[14,14220,211],{"id":211},[10,14222,7963],{},[216,14224,218],{},{"title":78,"searchDepth":91,"depth":91,"links":14226},[14227,14228,14229,14230,14231,14234,14235,14236],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":14232},[14233],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":7761,"description":7766},[229,7985,7986],{"id":7989,"title":7990,"body":14241,"category":229,"cover":230,"description":7995,"extension":231,"meta":14388,"navigation":94,"path":8174,"pinned":234,"publishedAt":235,"seo":14389,"slug":8176,"stem":8177,"summary":8178,"tags":14390,"updatedAt":235,"visible":94,"__hash__":8182},{"type":7,"value":14242,"toc":14378},[14243,14245,14247,14249,14251,14255,14257,14259,14267,14269,14271,14327,14329,14334,14336,14338,14350,14352,14358,14360,14370,14372,14374,14376],[10,14244,7995],{},[14,14246,16],{"id":16},[10,14248,8000],{},[14,14250,22],{"id":22},[10,14252,14253],{},[26,14254],{"alt":8007,"src":8008},[10,14256,8011],{},[14,14258,43],{"id":43},[45,14260,14261,14263,14265],{},[48,14262,8018],{},[48,14264,8021],{},[48,14266,8024],{},[14,14268,68],{"id":68},[10,14270,71],{},[73,14272,14273],{"className":75,"code":8031,"language":77,"meta":78,"style":78},[33,14274,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311,14315,14319,14323],{"__ignoreMap":78},[82,14276,14277],{"class":84,"line":85},[82,14278,8038],{},[82,14280,14281],{"class":84,"line":91},[82,14282,8043],{},[82,14284,14285],{"class":84,"line":98},[82,14286,8048],{},[82,14288,14289],{"class":84,"line":104},[82,14290,95],{"emptyLinePlaceholder":94},[82,14292,14293],{"class":84,"line":110},[82,14294,8057],{},[82,14296,14297],{"class":84,"line":116},[82,14298,8062],{},[82,14300,14301],{"class":84,"line":122},[82,14302,8067],{},[82,14304,14305],{"class":84,"line":128},[82,14306,95],{"emptyLinePlaceholder":94},[82,14308,14309],{"class":84,"line":134},[82,14310,8076],{},[82,14312,14313],{"class":84,"line":139},[82,14314,8081],{},[82,14316,14317],{"class":84,"line":5787},[82,14318,95],{"emptyLinePlaceholder":94},[82,14320,14321],{"class":84,"line":5792},[82,14322,8090],{},[82,14324,14325],{"class":84,"line":7397},[82,14326,8095],{},[10,14328,145],{},[73,14330,14332],{"className":14331,"code":8101,"language":151,"meta":78},[149],[33,14333,8101],{"__ignoreMap":78},[10,14335,156],{},[14,14337,159],{"id":159},[161,14339,14340,14346],{},[48,14341,14342,8115,14344,8119],{},[33,14343,8114],{},[33,14345,8118],{},[48,14347,8122,14348,8126],{},[33,14349,8125],{},[14,14351,177],{"id":177},[45,14353,14354,14356],{},[48,14355,8133],{},[48,14357,8136],{},[14,14359,197],{"id":197},[161,14361,14362,14368],{},[48,14363,8143,14364,8147,14366,364],{},[33,14365,8146],{},[33,14367,8150],{},[48,14369,8153],{},[10,14371,208],{},[14,14373,211],{"id":211},[10,14375,8160],{},[216,14377,218],{},{"title":78,"searchDepth":91,"depth":91,"links":14379},[14380,14381,14382,14383,14384,14385,14386,14387],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":7990,"description":7995},[229,8180,8181],{"id":8184,"title":8185,"body":14392,"category":229,"cover":230,"description":8190,"extension":231,"meta":14555,"navigation":94,"path":8394,"pinned":234,"publishedAt":235,"seo":14556,"slug":8396,"stem":8397,"summary":8398,"tags":14557,"updatedAt":235,"visible":94,"__hash__":8402},{"type":7,"value":14393,"toc":14543},[14394,14396,14398,14400,14402,14406,14410,14412,14428,14430,14432,14476,14478,14483,14485,14487,14501,14503,14507,14511,14515,14517,14523,14525,14535,14537,14539,14541],[10,14395,8190],{},[14,14397,16],{"id":16},[10,14399,8195],{},[14,14401,22],{"id":22},[10,14403,14404],{},[26,14405],{"alt":8202,"src":8203},[10,14407,8206,14408,8210],{},[33,14409,8209],{},[14,14411,43],{"id":43},[45,14413,14414,14420,14426],{},[48,14415,14416,8220,14418,8224],{},[33,14417,8219],{},[33,14419,8223],{},[48,14421,8227,14422,8231,14424,8234],{},[33,14423,8230],{},[33,14425,4337],{},[48,14427,8237],{},[14,14429,68],{"id":68},[10,14431,71],{},[73,14433,14434],{"className":75,"code":8244,"language":77,"meta":78,"style":78},[33,14435,14436,14440,14444,14448,14452,14456,14460,14464,14468,14472],{"__ignoreMap":78},[82,14437,14438],{"class":84,"line":85},[82,14439,8251],{},[82,14441,14442],{"class":84,"line":91},[82,14443,8256],{},[82,14445,14446],{"class":84,"line":98},[82,14447,8261],{},[82,14449,14450],{"class":84,"line":104},[82,14451,8266],{},[82,14453,14454],{"class":84,"line":110},[82,14455,8271],{},[82,14457,14458],{"class":84,"line":116},[82,14459,95],{"emptyLinePlaceholder":94},[82,14461,14462],{"class":84,"line":122},[82,14463,8280],{},[82,14465,14466],{"class":84,"line":128},[82,14467,8285],{},[82,14469,14470],{"class":84,"line":134},[82,14471,8285],{},[82,14473,14474],{"class":84,"line":139},[82,14475,8285],{},[10,14477,145],{},[73,14479,14481],{"className":14480,"code":8299,"language":151,"meta":78},[149],[33,14482,8299],{"__ignoreMap":78},[10,14484,156],{},[14,14486,159],{"id":159},[161,14488,14489,14493],{},[48,14490,7890,14491,8313],{},[33,14492,8312],{},[48,14494,8316,14495,8319,14497,8322,14499,8326],{},[33,14496,8223],{},[33,14498,8209],{},[33,14500,8325],{},[330,14502,2699],{"id":2699},[10,14504,8331,14505,8334],{},[33,14506,8223],{},[10,14508,14509],{},[26,14510],{"alt":8339,"src":8340},[10,14512,8343,14513,8346],{},[33,14514,8209],{},[14,14516,177],{"id":177},[45,14518,14519,14521],{},[48,14520,8353],{},[48,14522,8356],{},[14,14524,197],{"id":197},[161,14526,14527,14529],{},[48,14528,8363],{},[48,14530,4011,14531,8368,14533,8371],{},[33,14532,4337],{},[33,14534,8223],{},[10,14536,208],{},[14,14538,211],{"id":211},[10,14540,8378],{},[216,14542,218],{},{"title":78,"searchDepth":91,"depth":91,"links":14544},[14545,14546,14547,14548,14549,14552,14553,14554],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":14550},[14551],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":8185,"description":8190},[229,8400,8401],{"id":8404,"title":8405,"body":14559,"category":229,"cover":230,"description":8410,"extension":231,"meta":14742,"navigation":94,"path":8635,"pinned":234,"publishedAt":235,"seo":14743,"slug":8637,"stem":8638,"summary":8639,"tags":14744,"updatedAt":235,"visible":94,"__hash__":8642},{"type":7,"value":14560,"toc":14730},[14561,14563,14565,14567,14569,14573,14575,14577,14591,14593,14595,14663,14665,14670,14672,14674,14688,14690,14692,14696,14702,14704,14712,14714,14722,14724,14726,14728],[10,14562,8410],{},[14,14564,16],{"id":16},[10,14566,8415],{},[14,14568,22],{"id":22},[10,14570,14571],{},[26,14572],{"alt":8422,"src":8423},[10,14574,8426],{},[14,14576,43],{"id":43},[45,14578,14579,14585,14587],{},[48,14580,14581,8436,14583,364],{},[33,14582,8435],{},[33,14584,8439],{},[48,14586,8442],{},[48,14588,14589,8448],{},[33,14590,8447],{},[14,14592,68],{"id":68},[10,14594,71],{},[73,14596,14597],{"className":75,"code":8455,"language":77,"meta":78,"style":78},[33,14598,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647,14651,14655,14659],{"__ignoreMap":78},[82,14600,14601],{"class":84,"line":85},[82,14602,8462],{},[82,14604,14605],{"class":84,"line":91},[82,14606,95],{"emptyLinePlaceholder":94},[82,14608,14609],{"class":84,"line":98},[82,14610,8471],{},[82,14612,14613],{"class":84,"line":104},[82,14614,8476],{},[82,14616,14617],{"class":84,"line":110},[82,14618,8481],{},[82,14620,14621],{"class":84,"line":116},[82,14622,8486],{},[82,14624,14625],{"class":84,"line":122},[82,14626,8491],{},[82,14628,14629],{"class":84,"line":128},[82,14630,8496],{},[82,14632,14633],{"class":84,"line":134},[82,14634,8501],{},[82,14636,14637],{"class":84,"line":139},[82,14638,8506],{},[82,14640,14641],{"class":84,"line":5787},[82,14642,95],{"emptyLinePlaceholder":94},[82,14644,14645],{"class":84,"line":5792},[82,14646,8515],{},[82,14648,14649],{"class":84,"line":7397},[82,14650,6140],{},[82,14652,14653],{"class":84,"line":7403},[82,14654,6145],{},[82,14656,14657],{"class":84,"line":8526},[82,14658,95],{"emptyLinePlaceholder":94},[82,14660,14661],{"class":84,"line":8531},[82,14662,8534],{},[10,14664,145],{},[73,14666,14668],{"className":14667,"code":8540,"language":151,"meta":78},[149],[33,14669,8540],{"__ignoreMap":78},[10,14671,156],{},[14,14673,159],{"id":159},[161,14675,14676,14686],{},[48,14677,8551,14678,8555,14680,8559,14682,8563,14684,364],{},[33,14679,8554],{},[33,14681,8558],{},[33,14683,8562],{},[33,14685,8554],{},[48,14687,8568],{},[330,14689,2699],{"id":2699},[10,14691,8573],{},[10,14693,14694],{},[26,14695],{"alt":8578,"src":8579},[10,14697,14698,8584,14700,364],{},[33,14699,8435],{},[33,14701,8439],{},[14,14703,177],{"id":177},[45,14705,14706,14710],{},[48,14707,8593,14708,364],{},[33,14709,5338],{},[48,14711,8598],{},[14,14713,197],{"id":197},[161,14715,14716,14718],{},[48,14717,8605],{},[48,14719,8608,14720,8612],{},[33,14721,8611],{},[10,14723,208],{},[14,14725,211],{"id":211},[10,14727,8619],{},[216,14729,218],{},{"title":78,"searchDepth":91,"depth":91,"links":14731},[14732,14733,14734,14735,14736,14739,14740,14741],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":14737},[14738],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":8405,"description":8410},[229,8641,5289],{"id":8644,"title":8645,"body":14746,"category":229,"cover":230,"description":8650,"extension":231,"meta":14905,"navigation":94,"path":8838,"pinned":234,"publishedAt":235,"seo":14906,"slug":8840,"stem":8841,"summary":8842,"tags":14907,"updatedAt":235,"visible":94,"__hash__":8846},{"type":7,"value":14747,"toc":14893},[14748,14750,14752,14754,14756,14760,14762,14764,14772,14774,14776,14840,14842,14847,14849,14851,14859,14861,14863,14867,14869,14871,14877,14879,14885,14887,14889,14891],[10,14749,8650],{},[14,14751,16],{"id":16},[10,14753,8655],{},[14,14755,22],{"id":22},[10,14757,14758],{},[26,14759],{"alt":8662,"src":8663},[10,14761,8666],{},[14,14763,43],{"id":43},[45,14765,14766,14768,14770],{},[48,14767,8673],{},[48,14769,8676],{},[48,14771,8679],{},[14,14773,68],{"id":68},[10,14775,71],{},[73,14777,14778],{"className":75,"code":8686,"language":77,"meta":78,"style":78},[33,14779,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824,14828,14832,14836],{"__ignoreMap":78},[82,14781,14782],{"class":84,"line":85},[82,14783,8693],{},[82,14785,14786],{"class":84,"line":91},[82,14787,8698],{},[82,14789,14790],{"class":84,"line":98},[82,14791,95],{"emptyLinePlaceholder":94},[82,14793,14794],{"class":84,"line":104},[82,14795,8707],{},[82,14797,14798],{"class":84,"line":110},[82,14799,95],{"emptyLinePlaceholder":94},[82,14801,14802],{"class":84,"line":116},[82,14803,8716],{},[82,14805,14806],{"class":84,"line":122},[82,14807,8721],{},[82,14809,14810],{"class":84,"line":128},[82,14811,8726],{},[82,14813,14814],{"class":84,"line":134},[82,14815,95],{"emptyLinePlaceholder":94},[82,14817,14818],{"class":84,"line":139},[82,14819,8735],{},[82,14821,14822],{"class":84,"line":5787},[82,14823,8740],{},[82,14825,14826],{"class":84,"line":5792},[82,14827,8745],{},[82,14829,14830],{"class":84,"line":7397},[82,14831,95],{"emptyLinePlaceholder":94},[82,14833,14834],{"class":84,"line":7403},[82,14835,6154],{},[82,14837,14838],{"class":84,"line":8526},[82,14839,8758],{},[10,14841,145],{},[73,14843,14845],{"className":14844,"code":8764,"language":151,"meta":78},[149],[33,14846,8764],{"__ignoreMap":78},[10,14848,156],{},[14,14850,159],{"id":159},[161,14852,14853,14857],{},[48,14854,14855,8778],{},[33,14856,8777],{},[48,14858,8781],{},[330,14860,2699],{"id":2699},[10,14862,8786],{},[10,14864,14865],{},[26,14866],{"alt":8791,"src":8792},[10,14868,8795],{},[14,14870,177],{"id":177},[45,14872,14873,14875],{},[48,14874,8802],{},[48,14876,8805],{},[14,14878,197],{"id":197},[161,14880,14881,14883],{},[48,14882,8812],{},[48,14884,8815],{},[10,14886,208],{},[14,14888,211],{"id":211},[10,14890,8822],{},[216,14892,218],{},{"title":78,"searchDepth":91,"depth":91,"links":14894},[14895,14896,14897,14898,14899,14902,14903,14904],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":14900},[14901],{"id":2699,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":8645,"description":8650},[229,8844,8845],{"id":8848,"title":8849,"body":14909,"category":229,"cover":230,"description":8854,"extension":231,"meta":15147,"navigation":94,"path":9155,"pinned":234,"publishedAt":235,"seo":15148,"slug":9157,"stem":9158,"summary":9159,"tags":15149,"updatedAt":235,"visible":94,"__hash__":9163},{"type":7,"value":14910,"toc":15134},[14911,14913,14915,14917,14919,14923,14925,14927,14937,14939,14941,15057,15059,15064,15066,15068,15078,15080,15082,15086,15088,15090,15092,15096,15100,15102,15110,15112,15126,15128,15130,15132],[10,14912,8854],{},[14,14914,16],{"id":16},[10,14916,8859],{},[14,14918,22],{"id":22},[10,14920,14921],{},[26,14922],{"alt":8866,"src":8867},[10,14924,8870],{},[14,14926,43],{"id":43},[45,14928,14929,14931,14933],{},[48,14930,8877],{},[48,14932,8880],{},[48,14934,8883,14935,8887],{},[33,14936,8886],{},[14,14938,68],{"id":68},[10,14940,71],{},[73,14942,14943],{"className":75,"code":8894,"language":77,"meta":78,"style":78},[33,14944,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041,15045,15049,15053],{"__ignoreMap":78},[82,14946,14947],{"class":84,"line":85},[82,14948,6952],{},[82,14950,14951],{"class":84,"line":91},[82,14952,6561],{},[82,14954,14955],{"class":84,"line":98},[82,14956,95],{"emptyLinePlaceholder":94},[82,14958,14959],{"class":84,"line":104},[82,14960,8913],{},[82,14962,14963],{"class":84,"line":110},[82,14964,8918],{},[82,14966,14967],{"class":84,"line":116},[82,14968,8923],{},[82,14970,14971],{"class":84,"line":122},[82,14972,8928],{},[82,14974,14975],{"class":84,"line":128},[82,14976,95],{"emptyLinePlaceholder":94},[82,14978,14979],{"class":84,"line":134},[82,14980,8937],{},[82,14982,14983],{"class":84,"line":139},[82,14984,8942],{},[82,14986,14987],{"class":84,"line":5787},[82,14988,8947],{},[82,14990,14991],{"class":84,"line":5792},[82,14992,8952],{},[82,14994,14995],{"class":84,"line":7397},[82,14996,8957],{},[82,14998,14999],{"class":84,"line":7403},[82,15000,95],{"emptyLinePlaceholder":94},[82,15002,15003],{"class":84,"line":8526},[82,15004,8966],{},[82,15006,15007],{"class":84,"line":8531},[82,15008,8971],{},[82,15010,15011],{"class":84,"line":8974},[82,15012,8977],{},[82,15014,15015],{"class":84,"line":8980},[82,15016,95],{"emptyLinePlaceholder":94},[82,15018,15019],{"class":84,"line":8985},[82,15020,8988],{},[82,15022,15023],{"class":84,"line":8991},[82,15024,95],{"emptyLinePlaceholder":94},[82,15026,15027],{"class":84,"line":8996},[82,15028,7370],{},[82,15030,15031],{"class":84,"line":9001},[82,15032,9004],{},[82,15034,15035],{"class":84,"line":9007},[82,15036,9010],{},[82,15038,15039],{"class":84,"line":9013},[82,15040,9016],{},[82,15042,15043],{"class":84,"line":9019},[82,15044,7380],{},[82,15046,15047],{"class":84,"line":9024},[82,15048,9027],{},[82,15050,15051],{"class":84,"line":9030},[82,15052,1148],{},[82,15054,15055],{"class":84,"line":9035},[82,15056,9038],{},[10,15058,145],{},[73,15060,15062],{"className":15061,"code":9044,"language":151,"meta":78},[149],[33,15063,9044],{"__ignoreMap":78},[10,15065,156],{},[14,15067,159],{"id":159},[161,15069,15070,15074],{},[48,15071,9055,15072,9058],{},[33,15073,8886],{},[48,15075,15076,9063],{},[33,15077,8118],{},[330,15079,2699],{"id":2699},[10,15081,9068],{},[10,15083,15084],{},[26,15085],{"alt":9073,"src":9074},[10,15087,9077],{},[330,15089,2699],{"id":4219},[10,15091,9082],{},[10,15093,15094],{},[26,15095],{"alt":9087,"src":9088},[10,15097,9091,15098,9095],{},[33,15099,9094],{},[14,15101,177],{"id":177},[45,15103,15104,15106],{},[48,15105,9102],{},[48,15107,9105,15108,9108],{},[33,15109,9094],{},[14,15111,197],{"id":197},[161,15113,15114,15118,15120],{},[48,15115,9115,15116,9118],{},[33,15117,9094],{},[48,15119,9121],{},[48,15121,9124,15122,9128,15124,9131],{},[33,15123,9127],{},[33,15125,6096],{},[10,15127,208],{},[14,15129,211],{"id":211},[10,15131,9138],{},[216,15133,218],{},{"title":78,"searchDepth":91,"depth":91,"links":15135},[15136,15137,15138,15139,15140,15144,15145,15146],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":43,"depth":91,"text":43},{"id":68,"depth":91,"text":68},{"id":159,"depth":91,"text":159,"children":15141},[15142,15143],{"id":2699,"depth":98,"text":2699},{"id":4219,"depth":98,"text":2699},{"id":177,"depth":91,"text":177},{"id":197,"depth":91,"text":197},{"id":211,"depth":91,"text":211},{},{"title":8849,"description":8854},[229,9161,9162],{"id":1058,"title":1059,"body":15151,"category":229,"cover":1067,"description":78,"extension":231,"meta":15387,"navigation":94,"path":1384,"pinned":234,"publishedAt":1385,"seo":15388,"slug":1387,"stem":1388,"summary":1389,"tags":15389,"updatedAt":1385,"visible":94,"__hash__":1393},{"type":7,"value":15152,"toc":15372},[15153,15157,15159,15161,15163,15165,15185,15187,15192,15194,15196,15224,15230,15232,15236,15238,15258,15260,15270,15272,15274,15276,15278,15280,15282,15284,15286,15288,15308,15310,15312,15316,15318,15320,15322,15324,15328,15330,15348,15350,15352,15354,15356,15358,15360,15362,15364,15366,15368,15370],[10,15154,15155],{},[26,15156],{"alt":1066,"src":1067},[10,15158,1070],{},[10,15160,1073],{},[14,15162,1077],{"id":1076},[10,15164,1080],{},[73,15166,15167],{"className":75,"code":1083,"language":77,"meta":78,"style":78},[33,15168,15169,15173,15177,15181],{"__ignoreMap":78},[82,15170,15171],{"class":84,"line":85},[82,15172,1090],{},[82,15174,15175],{"class":84,"line":91},[82,15176,1095],{},[82,15178,15179],{"class":84,"line":98},[82,15180,95],{"emptyLinePlaceholder":94},[82,15182,15183],{"class":84,"line":104},[82,15184,1104],{},[10,15186,1107],{},[73,15188,15190],{"className":15189,"code":1111,"language":151,"meta":78},[149],[33,15191,1111],{"__ignoreMap":78},[10,15193,1116],{},[10,15195,1119],{},[73,15197,15198],{"className":75,"code":1122,"language":77,"meta":78,"style":78},[33,15199,15200,15204,15208,15212,15216,15220],{"__ignoreMap":78},[82,15201,15202],{"class":84,"line":85},[82,15203,1129],{},[82,15205,15206],{"class":84,"line":91},[82,15207,95],{"emptyLinePlaceholder":94},[82,15209,15210],{"class":84,"line":98},[82,15211,1138],{},[82,15213,15214],{"class":84,"line":104},[82,15215,1143],{},[82,15217,15218],{"class":84,"line":110},[82,15219,1148],{},[82,15221,15222],{"class":84,"line":116},[82,15223,1153],{},[10,15225,15226,1159,15228,1163],{},[33,15227,1158],{},[33,15229,1162],{},[14,15231,1167],{"id":1166},[10,15233,1170,15234,1174],{},[33,15235,1173],{},[10,15237,1177],{},[73,15239,15240],{"className":75,"code":1180,"language":77,"meta":78,"style":78},[33,15241,15242,15246,15250,15254],{"__ignoreMap":78},[82,15243,15244],{"class":84,"line":85},[82,15245,1187],{},[82,15247,15248],{"class":84,"line":91},[82,15249,1192],{},[82,15251,15252],{"class":84,"line":98},[82,15253,1197],{},[82,15255,15256],{"class":84,"line":104},[82,15257,1202],{},[10,15259,1205],{},[73,15261,15262],{"className":593,"code":1208,"language":595,"meta":78,"style":78},[33,15263,15264],{"__ignoreMap":78},[82,15265,15266,15268],{"class":84,"line":85},[82,15267,693],{"class":602},[82,15269,1217],{"class":638},[10,15271,1220],{},[14,15273,1224],{"id":1223},[330,15275,1227],{"id":1227},[10,15277,1230],{},[330,15279,1233],{"id":1233},[10,15281,1236],{},[330,15283,1239],{"id":1239},[10,15285,1242],{},[10,15287,1245],{},[73,15289,15290],{"className":75,"code":1248,"language":77,"meta":78,"style":78},[33,15291,15292,15296,15300,15304],{"__ignoreMap":78},[82,15293,15294],{"class":84,"line":85},[82,15295,1255],{},[82,15297,15298],{"class":84,"line":91},[82,15299,95],{"emptyLinePlaceholder":94},[82,15301,15302],{"class":84,"line":98},[82,15303,1264],{},[82,15305,15306],{"class":84,"line":104},[82,15307,1269],{},[10,15309,1272],{},[330,15311,1275],{"id":1275},[10,15313,1278,15314,1281],{},[33,15315,262],{},[10,15317,1284],{},[330,15319,1287],{"id":1287},[10,15321,1290],{},[14,15323,1294],{"id":1293},[10,15325,15326],{},[26,15327],{"alt":1299,"src":1300},[10,15329,1303],{},[45,15331,15332,15334,15336,15338,15340,15342,15344,15346],{},[48,15333,1308],{},[48,15335,1311],{},[48,15337,1314],{},[48,15339,1317],{},[48,15341,1320],{},[48,15343,1323],{},[48,15345,1326],{},[48,15347,1329],{},[10,15349,1332],{},[14,15351,1336],{"id":1335},[10,15353,1339],{},[10,15355,1342],{},[14,15357,1346],{"id":1345},[10,15359,1349],{},[10,15361,1352],{},[10,15363,1355],{},[14,15365,1358],{"id":1358},[10,15367,1361],{},[10,15369,1364],{},[216,15371,1367],{},{"title":78,"searchDepth":91,"depth":91,"links":15373},[15374,15375,15376,15383,15384,15385,15386],{"id":1076,"depth":91,"text":1077},{"id":1166,"depth":91,"text":1167},{"id":1223,"depth":91,"text":1224,"children":15377},[15378,15379,15380,15381,15382],{"id":1227,"depth":98,"text":1227},{"id":1233,"depth":98,"text":1233},{"id":1239,"depth":98,"text":1239},{"id":1275,"depth":98,"text":1275},{"id":1287,"depth":98,"text":1287},{"id":1293,"depth":91,"text":1294},{"id":1335,"depth":91,"text":1336},{"id":1345,"depth":91,"text":1346},{"id":1358,"depth":91,"text":1358},{},{"title":1059,"description":78},[229,1391,1392],{"id":244,"title":245,"body":15391,"category":229,"cover":230,"description":78,"extension":231,"meta":15970,"navigation":94,"path":1047,"pinned":234,"publishedAt":1048,"seo":15971,"slug":1050,"stem":1051,"summary":1052,"tags":15972,"updatedAt":1048,"visible":94,"__hash__":1056},{"type":7,"value":15392,"toc":15946},[15393,15395,15397,15399,15403,15405,15407,15431,15443,15445,15447,15452,15456,15460,15472,15476,15480,15484,15486,15520,15522,15526,15530,15532,15554,15584,15596,15606,15614,15616,15622,15632,15634,15639,15643,15645,15659,15665,15685,15687,15689,15691,15701,15705,15707,15716,15720,15722,15724,15744,15748,15750,15752,15754,15756,15776,15778,15780,15782,15808,15810,15826,15828,15844,15848,15850,15852,15872,15874,15876,15878,15882,15892,15894,15896,15898,15908,15916,15918,15920,15934,15944],[14,15394,250],{"id":250},[10,15396,253],{},[10,15398,256],{},[10,15400,259,15401,263],{},[33,15402,262],{},[14,15404,266],{"id":266},[10,15406,269],{},[271,15408,15409,15411],{},[10,15410,275],{},[271,15412,15413,15419,15421,15425,15427],{},[10,15414,280,15415,284,15417,288],{},[33,15416,283],{},[33,15418,287],{},[10,15420,291],{},[10,15422,294,15423,299],{},[296,15424,298],{},[10,15426,302],{},[10,15428,15429],{},[26,15430],{"alt":307,"src":308},[271,15432,15433,15435],{},[10,15434,313],{},[271,15436,15437,15439],{},[10,15438,318],{},[10,15440,15441],{},[26,15442],{"alt":323,"src":324},[14,15444,328],{"id":327},[330,15446,333],{"id":332},[10,15448,336,15449,344],{},[338,15450,343],{"href":340,"rel":15451},[342],[271,15453,15454],{},[10,15455,349],{},[10,15457,15458],{},[26,15459],{"alt":354,"src":355},[45,15461,15462,15466,15470],{},[48,15463,360,15464,364],{},[296,15465,363],{},[48,15467,367,15468,364],{},[296,15469,370],{},[48,15471,373],{},[10,15473,15474],{},[26,15475],{"alt":378,"src":379},[271,15477,15478],{},[10,15479,384],{},[10,15481,15482],{},[26,15483],{"alt":389,"src":390},[330,15485,394],{"id":393},[271,15487,15488,15492,15496,15516],{},[271,15489,15490],{},[10,15491,401],{},[10,15493,404,15494,408],{},[296,15495,407],{},[73,15497,15498],{"className":75,"code":411,"language":77,"meta":78,"style":78},[33,15499,15500,15504,15508,15512],{"__ignoreMap":78},[82,15501,15502],{"class":84,"line":85},[82,15503,418],{},[82,15505,15506],{"class":84,"line":91},[82,15507,423],{},[82,15509,15510],{"class":84,"line":98},[82,15511,428],{},[82,15513,15514],{"class":84,"line":104},[82,15515,433],{},[10,15517,436,15518,440],{},[296,15519,439],{},[10,15521,443],{},[10,15523,446,15524,449],{},[33,15525,77],{},[10,15527,15528],{},[26,15529],{"alt":454,"src":455},[10,15531,458],{},[271,15533,15534,15536,15540],{},[10,15535,463],{},[10,15537,15538],{},[296,15539,468],{},[271,15541,15542,15546,15550],{},[10,15543,473,15544,476],{},[33,15545,77],{},[10,15547,479,15548,482],{},[33,15549,77],{},[10,15551,485,15552,489],{},[296,15553,488],{},[271,15555,15556,15558,15562],{},[10,15557,494],{},[10,15559,15560],{},[296,15561,499],{},[271,15563,15564,15570,15578,15580],{},[10,15565,15566,507,15568,511],{},[33,15567,506],{},[33,15569,510],{},[10,15571,514,15572,517,15574,521,15576,525],{},[33,15573,506],{},[296,15575,520],{},[296,15577,524],{},[10,15579,528],{},[10,15581,15582,534],{},[296,15583,533],{},[271,15585,15586,15588],{},[10,15587,539],{},[271,15589,15590,15594],{},[10,15591,544,15592,548],{},[296,15593,547],{},[10,15595,551],{},[271,15597,15598,15602],{},[10,15599,556,15600],{},[296,15601,559],{},[10,15603,15604],{},[26,15605],{"alt":564,"src":565},[271,15607,15608,15610],{},[10,15609,570],{},[10,15611,15612],{},[26,15613],{"alt":564,"src":575},[330,15615,579],{"id":578},[10,15617,582,15618,586,15620,590],{},[33,15619,585],{},[33,15621,589],{},[73,15623,15624],{"className":593,"code":594,"language":595,"meta":78,"style":78},[33,15625,15626],{"__ignoreMap":78},[82,15627,15628,15630],{"class":84,"line":85},[82,15629,77],{"class":602},[82,15631,606],{"class":605},[10,15633,609],{},[73,15635,15637],{"className":15636,"code":613,"language":151,"meta":78},[149],[33,15638,613],{"__ignoreMap":78},[10,15640,15641],{},[26,15642],{"alt":564,"src":620},[10,15644,623],{},[73,15646,15647],{"className":593,"code":626,"language":595,"meta":78,"style":78},[33,15648,15649],{"__ignoreMap":78},[82,15650,15651,15653,15655,15657],{"class":84,"line":85},[82,15652,77],{"class":602},[82,15654,635],{"class":605},[82,15656,639],{"class":638},[82,15658,606],{"class":605},[10,15660,644,15661,647,15663,651],{},[33,15662,77],{},[33,15664,650],{},[73,15666,15667],{"className":593,"code":654,"language":595,"meta":78,"style":78},[33,15668,15669,15675],{"__ignoreMap":78},[82,15670,15671,15673],{"class":84,"line":85},[82,15672,510],{"class":602},[82,15674,606],{"class":605},[82,15676,15677,15679,15681,15683],{"class":84,"line":91},[82,15678,510],{"class":602},[82,15680,635],{"class":605},[82,15682,639],{"class":638},[82,15684,606],{"class":605},[14,15686,676],{"id":675},[330,15688,680],{"id":679},[10,15690,683],{},[73,15692,15693],{"className":593,"code":686,"language":595,"meta":78,"style":78},[33,15694,15695],{"__ignoreMap":78},[82,15696,15697,15699],{"class":84,"line":85},[82,15698,693],{"class":602},[82,15700,606],{"class":605},[10,15702,698,15703,702],{},[33,15704,701],{},[330,15706,706],{"id":705},[10,15708,336,15709,714,15712,364,15714,721],{},[338,15710,713],{"href":711,"rel":15711},[342],[296,15713,717],{},[33,15715,720],{},[10,15717,724,15718,728],{},[33,15719,727],{},[330,15721,732],{"id":731},[10,15723,735],{},[73,15725,15726],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,15727,15728,15734],{"__ignoreMap":78},[82,15729,15730,15732],{"class":84,"line":85},[82,15731,693],{"class":602},[82,15733,606],{"class":605},[82,15735,15736,15738,15740,15742],{"class":84,"line":91},[82,15737,693],{"class":602},[82,15739,635],{"class":605},[82,15741,639],{"class":638},[82,15743,606],{"class":605},[10,15745,759,15746,762],{},[33,15747,693],{},[14,15749,766],{"id":765},[10,15751,769],{},[330,15753,773],{"id":772},[10,15755,776],{},[73,15757,15758],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,15759,15760,15766],{"__ignoreMap":78},[82,15761,15762,15764],{"class":84,"line":85},[82,15763,693],{"class":602},[82,15765,606],{"class":605},[82,15767,15768,15770,15772,15774],{"class":84,"line":91},[82,15769,693],{"class":602},[82,15771,635],{"class":605},[82,15773,639],{"class":638},[82,15775,606],{"class":605},[10,15777,799],{},[330,15779,803],{"id":802},[10,15781,806],{},[73,15783,15784],{"className":593,"code":809,"language":595,"meta":78,"style":78},[33,15785,15786,15794],{"__ignoreMap":78},[82,15787,15788,15790,15792],{"class":84,"line":85},[82,15789,816],{"class":602},[82,15791,819],{"class":638},[82,15793,822],{"class":638},[82,15795,15796,15798,15800,15802,15804,15806],{"class":84,"line":91},[82,15797,816],{"class":602},[82,15799,819],{"class":638},[82,15801,831],{"class":638},[82,15803,834],{"class":638},[82,15805,837],{"class":638},[82,15807,840],{"class":638},[10,15809,843],{},[73,15811,15812],{"className":593,"code":846,"language":595,"meta":78,"style":78},[33,15813,15814],{"__ignoreMap":78},[82,15815,15816,15818,15820,15822,15824],{"class":84,"line":85},[82,15817,816],{"class":602},[82,15819,855],{"class":638},[82,15821,831],{"class":638},[82,15823,834],{"class":638},[82,15825,862],{"class":638},[10,15827,865],{},[73,15829,15830],{"className":593,"code":868,"language":595,"meta":78,"style":78},[33,15831,15832],{"__ignoreMap":78},[82,15833,15834,15836,15838,15840,15842],{"class":84,"line":85},[82,15835,816],{"class":602},[82,15837,877],{"class":638},[82,15839,880],{"class":605},[82,15841,883],{"class":638},[82,15843,886],{"class":638},[10,15845,15846,891],{},[33,15847,816],{},[330,15849,895],{"id":894},[10,15851,898],{},[73,15853,15854],{"className":593,"code":738,"language":595,"meta":78,"style":78},[33,15855,15856,15862],{"__ignoreMap":78},[82,15857,15858,15860],{"class":84,"line":85},[82,15859,693],{"class":602},[82,15861,606],{"class":605},[82,15863,15864,15866,15868,15870],{"class":84,"line":91},[82,15865,693],{"class":602},[82,15867,635],{"class":605},[82,15869,639],{"class":638},[82,15871,606],{"class":605},[10,15873,921],{},[14,15875,924],{"id":924},[330,15877,928],{"id":927},[10,15879,931,15880,935],{},[33,15881,934],{},[161,15883,15884,15888,15890],{},[48,15885,940,15886,943],{},[33,15887,650],{},[48,15889,946],{},[48,15891,949],{},[10,15893,952],{},[330,15895,956],{"id":955},[10,15897,959],{},[73,15899,15900],{"className":593,"code":686,"language":595,"meta":78,"style":78},[33,15901,15902],{"__ignoreMap":78},[82,15903,15904,15906],{"class":84,"line":85},[82,15905,693],{"class":602},[82,15907,606],{"class":605},[10,15909,972,15910,975,15912,978,15914,364],{},[33,15911,693],{},[33,15913,77],{},[33,15915,693],{},[330,15917,984],{"id":983},[10,15919,987],{},[73,15921,15922],{"className":593,"code":990,"language":595,"meta":78,"style":78},[33,15923,15924],{"__ignoreMap":78},[82,15925,15926,15928,15930,15932],{"class":84,"line":85},[82,15927,693],{"class":602},[82,15929,635],{"class":605},[82,15931,639],{"class":638},[82,15933,606],{"class":605},[10,15935,1005,15936,1008,15938,1011,15940,1014,15942,1018],{},[33,15937,693],{},[33,15939,77],{},[33,15941,510],{},[33,15943,1017],{},[216,15945,1021],{},{"title":78,"searchDepth":91,"depth":91,"links":15947},[15948,15949,15950,15955,15960,15965],{"id":250,"depth":91,"text":250},{"id":266,"depth":91,"text":266},{"id":327,"depth":91,"text":328,"children":15951},[15952,15953,15954],{"id":332,"depth":98,"text":333},{"id":393,"depth":98,"text":394},{"id":578,"depth":98,"text":579},{"id":675,"depth":91,"text":676,"children":15956},[15957,15958,15959],{"id":679,"depth":98,"text":680},{"id":705,"depth":98,"text":706},{"id":731,"depth":98,"text":732},{"id":765,"depth":91,"text":766,"children":15961},[15962,15963,15964],{"id":772,"depth":98,"text":773},{"id":802,"depth":98,"text":803},{"id":894,"depth":98,"text":895},{"id":924,"depth":91,"text":924,"children":15966},[15967,15968,15969],{"id":927,"depth":98,"text":928},{"id":955,"depth":98,"text":956},{"id":983,"depth":98,"text":984},{},{"title":245,"description":78},[229,1054,1055],1786973365333]