[{"data":1,"prerenderedAt":15957},["ShallowReactive",2],{"post-python-list-basics":3,"sidebar-posts":225,"post-related-source":9148},{"id":4,"title":5,"body":6,"category":210,"cover":211,"description":12,"extension":212,"meta":213,"navigation":92,"path":214,"pinned":215,"publishedAt":216,"seo":217,"slug":218,"stem":219,"summary":220,"tags":221,"updatedAt":216,"visible":92,"__hash__":224},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":8,"toc":200},"minimark",[9,13,17,20,23,30,38,41,58,61,64,118,121,129,132,135,155,158,173,176,187,190,193,196],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,31,32,33,37],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,35,36],"code",{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,39,40],{"id":40},"核心概念",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"列表使用方括号，元素之间用逗号分隔。",[45,49,50],{},"列表可变，可以替换、追加和删除元素。",[45,52,53,54,57],{},"访问不存在的索引会产生 ",[34,55,56],{},"IndexError","。",[14,59,60],{"id":60},"跟着示例运行",[10,62,63],{},"把下面代码保存到本课脚本并运行：",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-python shiki shiki-themes github-dark","scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n","python","",[34,72,73,81,87,94,100,106,112],{"__ignoreMap":70},[74,75,78],"span",{"class":76,"line":77},"line",1,[74,79,80],{},"scores = [82, 90, 76]\n",[74,82,84],{"class":76,"line":83},2,[74,85,86],{},"print(scores[0])\n",[74,88,90],{"class":76,"line":89},3,[74,91,93],{"emptyLinePlaceholder":92},true,"\n",[74,95,97],{"class":76,"line":96},4,[74,98,99],{},"scores[1] = 95\n",[74,101,103],{"class":76,"line":102},5,[74,104,105],{},"scores.append(88)\n",[74,107,109],{"class":76,"line":108},6,[74,110,111],{},"print(scores)\n",[74,113,115],{"class":76,"line":114},7,[74,116,117],{},"print(len(scores))\n",[10,119,120],{},"预期结果：",[65,122,127],{"className":123,"code":125,"language":126,"meta":70},[124],"language-text","82\n[82, 95, 76, 88]\n4\n","text",[34,128,125],{"__ignoreMap":70},[10,130,131],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,133,134],{"id":134},"按执行顺序拆开看",[136,137,138,141],"ol",{},[45,139,140],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[45,142,143,146,147,150,151,154],{},[34,144,145],{},"scores[1] = 95"," 替换第二个位置，",[34,148,149],{},"append(88)"," 在末尾增加新位置，",[34,152,153],{},"len()"," 因而从 3 变为 4。",[14,156,157],{"id":157},"初学者容易混淆的地方",[42,159,160,170],{},[45,161,162,163,166,167,57],{},"访问 ",[34,164,165],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,168,169],{},"len(scores) - 1",[45,171,172],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,174,175],{"id":175},"练习",[136,177,178,181],{},[45,179,180],{},"建立三项学习任务列表，再追加第四项。",[45,182,183,184,186],{},"修改第二项，并用 ",[34,185,153],{}," 检查元素数量。",[10,188,189],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,191,192],{"id":192},"本篇边界",[10,194,195],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,198,199],"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":70,"searchDepth":83,"depth":83,"links":201},[202,203,204,205,206,207,208,209],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",false,"2026-08-17",{"title":5,"description":12},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[210,222,223],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",[226,1039,1376,1510,1662,1841,2029,2194,2378,2560,2753,2984,3168,3301,3458,3629,3794,4009,4238,4420,4584,4773,4961,5116,5276,5473,5670,5884,6051,6295,6476,6681,6876,7060,7261,7551,7743,7972,8167,8387,8627,8831],{"id":227,"title":228,"body":229,"category":210,"cover":211,"description":70,"extension":212,"meta":1028,"navigation":92,"path":1029,"pinned":215,"publishedAt":1030,"seo":1031,"slug":1032,"stem":1033,"summary":1034,"tags":1035,"updatedAt":1030,"visible":92,"__hash__":1038},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":230,"toc":1004},[231,234,237,240,247,250,253,292,308,312,317,328,333,339,356,362,367,373,377,423,426,432,438,441,472,517,534,548,558,562,573,589,592,598,603,606,624,634,655,659,663,666,678,685,689,704,711,715,718,739,745,749,752,756,759,779,782,786,789,823,826,845,848,869,874,878,881,901,904,907,911,918,932,935,939,942,952,963,967,970,985,1001],[14,232,233],{"id":233},"引言",[10,235,236],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,238,239],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,241,242,243,246],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,244,245],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,248,249],{"id":249},"扫盲",[10,251,252],{},"那么这里有几个概念：",[254,255,256,259],"blockquote",{},[10,257,258],{},"为什么需要安装python解释器？",[254,260,261,272,275,283,286],{},[10,262,263,264,267,268,271],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,265,266],{},"0","和",[34,269,270],{},"1","组成的机器指令。",[10,273,274],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,276,277,278,282],{},"这样，我们就能用",[279,280,281],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,284,285],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,287,288],{},[26,289],{"alt":290,"src":291},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[254,293,294,297],{},[10,295,296],{},"pip又是什么？",[254,298,299,302],{},[10,300,301],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,303,304],{},[26,305],{"alt":306,"src":307},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,309,311],{"id":310},"windows-安装","Windows 安装",[313,314,316],"h3",{"id":315},"_1-下载官方安装程序","1. 下载官方安装程序",[10,318,319,320,327],{},"打开 ",[321,322,326],"a",{"href":323,"rel":324},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[325],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[254,329,330],{},[10,331,332],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,334,335],{},[26,336],{"alt":337,"src":338},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[42,340,341,347,353],{},[45,342,343,344,57],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[279,345,346],{},"Windows installer (64-bit)",[45,348,349,350,57],{},"搭载 ARM 处理器的 Windows 设备选择 ",[279,351,352],{},"Windows installer (ARM64)",[45,354,355],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,357,358],{},[26,359],{"alt":360,"src":361},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[254,363,364],{},[10,365,366],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,368,369],{},[26,370],{"alt":371,"src":372},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[313,374,376],{"id":375},"_2-安装并加入-path","2. 安装并加入 PATH",[254,378,379,384,391,416],{},[254,380,381],{},[10,382,383],{},"PATH 环境变量",[10,385,386,387,390],{},"Windows 有一个特殊的变量叫 ",[279,388,389],{},"PATH","，它里面存了一串文件夹路径，比如：",[65,392,394],{"className":67,"code":393,"language":69,"meta":70,"style":70},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,395,396,401,406,411],{"__ignoreMap":70},[74,397,398],{"class":76,"line":77},[74,399,400],{},"D:\\Python313\\\n",[74,402,403],{"class":76,"line":83},[74,404,405],{},"D:\\Python313\\Scripts\\\n",[74,407,408],{"class":76,"line":89},[74,409,410],{},"C:\\Windows\\System32\\\n",[74,412,413],{"class":76,"line":96},[74,414,415],{},"...\n",[10,417,418,419,422],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[279,420,421],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,424,425],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,427,428,429,431],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,430,69],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,433,434],{},[26,435],{"alt":436,"src":437},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,439,440],{},"对安装界面最底部的两个勾选项分别解释 :",[254,442,443,446,451],{},[10,444,445],{},"Add python.exe to PATH",[10,447,448],{},[279,449,450],{},"把 Python 添加到系统环境变量",[254,452,453,459,465],{},[10,454,455,456,458],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,457,69],{}," 就能运行",[10,460,461,462,464],{},"不勾选的话，命令行输入 ",[34,463,69],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,466,467,468,471],{},"必须",[279,469,470],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[254,473,474,477,482],{},[10,475,476],{},"Use admin privileges when installing py.exe",[10,478,479],{},[279,480,481],{},"使用管理员权限安装 py.exe（Python 启动器）",[254,483,484,494,508,511],{},[10,485,486,489,490,493],{},[34,487,488],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,491,492],{},"py"," 来启动 Python。",[10,495,496,497,499,500,503,504,507],{},"勾选后，",[34,498,488],{}," 会安装到",[279,501,502],{},"系统级目录","，电脑上",[279,505,506],{},"所有用户账户","都能用",[10,509,510],{},"不勾选，只有当前用户能用",[10,512,513,516],{},[279,514,515],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[254,518,519,522],{},[10,520,521],{},"操作建议",[254,523,524,531],{},[10,525,526,527,530],{},"两个都勾上之后，再点 ",[279,528,529],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,532,533],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[254,535,536,542],{},[10,537,538,539],{},"Python 安装的",[279,540,541],{},"可选功能页",[10,543,544],{},[26,545],{"alt":546,"src":547},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[254,549,550,553],{},[10,551,552],{},"高级选项页",[10,554,555],{},[26,556],{"alt":546,"src":557},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[313,559,561],{"id":560},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,563,564,565,568,569,572],{},"按 ",[34,566,567],{},"Win + R","，输入 ",[34,570,571],{},"cmd"," 并回车，然后执行：",[65,574,578],{"className":575,"code":576,"language":577,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,579,580],{"__ignoreMap":70},[74,581,582,585],{"class":76,"line":77},[74,583,69],{"class":584},"svObZ",[74,586,588],{"class":587},"sDLfK"," --version\n",[10,590,591],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[65,593,596],{"className":594,"code":595,"language":126,"meta":70},[124],"Python 3.x.x\n",[34,597,595],{"__ignoreMap":70},[10,599,600],{},[26,601],{"alt":546,"src":602},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,604,605],{},"继续检查 pip：",[65,607,609],{"className":575,"code":608,"language":577,"meta":70,"style":70},"python -m pip --version\n",[34,610,611],{"__ignoreMap":70},[74,612,613,615,618,622],{"class":76,"line":77},[74,614,69],{"class":584},[74,616,617],{"class":587}," -m",[74,619,621],{"class":620},"sU2Wk"," pip",[74,623,588],{"class":587},[10,625,626,627,629,630,633],{},"如果 ",[34,628,69],{}," 无法识别，但 ",[34,631,632],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[65,635,637],{"className":575,"code":636,"language":577,"meta":70,"style":70},"py --version\npy -m pip --version\n",[34,638,639,645],{"__ignoreMap":70},[74,640,641,643],{"class":76,"line":77},[74,642,492],{"class":584},[74,644,588],{"class":587},[74,646,647,649,651,653],{"class":76,"line":83},[74,648,492],{"class":584},[74,650,617],{"class":587},[74,652,621],{"class":620},[74,654,588],{"class":587},[14,656,658],{"id":657},"macos-安装","macOS 安装",[313,660,662],{"id":661},"_1-先检查现有环境","1. 先检查现有环境",[10,664,665],{},"打开“终端”应用，执行：",[65,667,669],{"className":575,"code":668,"language":577,"meta":70,"style":70},"python3 --version\n",[34,670,671],{"__ignoreMap":70},[74,672,673,676],{"class":76,"line":77},[74,674,675],{"class":584},"python3",[74,677,588],{"class":587},[10,679,680,681,684],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,682,683],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[313,686,688],{"id":687},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,690,319,691,696,697,57,700,703],{},[321,692,695],{"href":693,"rel":694},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[325],"Python macOS 下载页","，下载当前稳定版的 ",[279,698,699],{},"macOS 64-bit universal2 installer",[34,701,702],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,705,706,707,710],{},"下载完成后打开 ",[34,708,709],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[313,712,714],{"id":713},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,716,717],{},"安装完成后重新打开终端，执行：",[65,719,721],{"className":575,"code":720,"language":577,"meta":70,"style":70},"python3 --version\npython3 -m pip --version\n",[34,722,723,729],{"__ignoreMap":70},[74,724,725,727],{"class":76,"line":77},[74,726,675],{"class":584},[74,728,588],{"class":587},[74,730,731,733,735,737],{"class":76,"line":83},[74,732,675],{"class":584},[74,734,617],{"class":587},[74,736,621],{"class":620},[74,738,588],{"class":587},[10,740,741,742,744],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,743,675],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,746,748],{"id":747},"linux-安装","Linux 安装",[10,750,751],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[313,753,755],{"id":754},"_1-检查是否已经安装","1. 检查是否已经安装",[10,757,758],{},"打开终端，执行：",[65,760,761],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,762,763,769],{"__ignoreMap":70},[74,764,765,767],{"class":76,"line":77},[74,766,675],{"class":584},[74,768,588],{"class":587},[74,770,771,773,775,777],{"class":76,"line":83},[74,772,675],{"class":584},[74,774,617],{"class":587},[74,776,621],{"class":620},[74,778,588],{"class":587},[10,780,781],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[313,783,785],{"id":784},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,787,788],{},"Ubuntu 或 Debian：",[65,790,792],{"className":575,"code":791,"language":577,"meta":70,"style":70},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,793,794,805],{"__ignoreMap":70},[74,795,796,799,802],{"class":76,"line":77},[74,797,798],{"class":584},"sudo",[74,800,801],{"class":620}," apt",[74,803,804],{"class":620}," update\n",[74,806,807,809,811,814,817,820],{"class":76,"line":83},[74,808,798],{"class":584},[74,810,801],{"class":620},[74,812,813],{"class":620}," install",[74,815,816],{"class":620}," python3",[74,818,819],{"class":620}," python3-pip",[74,821,822],{"class":620}," python3-venv\n",[10,824,825],{},"Fedora：",[65,827,829],{"className":575,"code":828,"language":577,"meta":70,"style":70},"sudo dnf install python3 python3-pip\n",[34,830,831],{"__ignoreMap":70},[74,832,833,835,838,840,842],{"class":76,"line":77},[74,834,798],{"class":584},[74,836,837],{"class":620}," dnf",[74,839,813],{"class":620},[74,841,816],{"class":620},[74,843,844],{"class":620}," python3-pip\n",[10,846,847],{},"Arch Linux：",[65,849,851],{"className":575,"code":850,"language":577,"meta":70,"style":70},"sudo pacman -S python python-pip\n",[34,852,853],{"__ignoreMap":70},[74,854,855,857,860,863,866],{"class":76,"line":77},[74,856,798],{"class":584},[74,858,859],{"class":620}," pacman",[74,861,862],{"class":587}," -S",[74,864,865],{"class":620}," python",[74,867,868],{"class":620}," python-pip\n",[10,870,871,873],{},[34,872,798],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[313,875,877],{"id":876},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,879,880],{},"安装结束后执行：",[65,882,883],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,884,885,891],{"__ignoreMap":70},[74,886,887,889],{"class":76,"line":77},[74,888,675],{"class":584},[74,890,588],{"class":587},[74,892,893,895,897,899],{"class":76,"line":83},[74,894,675],{"class":584},[74,896,617],{"class":587},[74,898,621],{"class":620},[74,900,588],{"class":587},[10,902,903],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,905,906],{"id":906},"常见问题",[313,908,910],{"id":909},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,912,913,914,917],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,915,916],{},"python --version","。如果仍然失败，按下面的顺序检查：",[136,919,920,926,929],{},[45,921,922,923,925],{},"执行 ",[34,924,632],{},"，确认 Python Launcher 是否可用。",[45,927,928],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[45,930,931],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,933,934],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[313,936,938],{"id":937},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,940,941],{},"先尝试：",[65,943,944],{"className":575,"code":668,"language":577,"meta":70,"style":70},[34,945,946],{"__ignoreMap":70},[74,947,948,950],{"class":76,"line":77},[74,949,675],{"class":584},[74,951,588],{"class":587},[10,953,954,955,957,958,960,961,57],{},"在这两个系统中，只有 ",[34,956,675],{}," 命令而没有 ",[34,959,69],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,962,675],{},[313,964,966],{"id":965},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,968,969],{},"先使用模块方式检查：",[65,971,973],{"className":575,"code":972,"language":577,"meta":70,"style":70},"python3 -m pip --version\n",[34,974,975],{"__ignoreMap":70},[74,976,977,979,981,983],{"class":76,"line":77},[74,978,675],{"class":584},[74,980,617],{"class":587},[74,982,621],{"class":620},[74,984,588],{"class":587},[10,986,987,988,990,991,993,994,996,997,1000],{},"Windows 用户将命令中的 ",[34,989,675],{}," 换成 ",[34,992,69],{}," 或 ",[34,995,492],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,998,999],{},"python3-pip","；不要直接使用其他系统的安装命令。",[197,1002,1003],{},"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":70,"searchDepth":83,"depth":83,"links":1005},[1006,1007,1008,1013,1018,1023],{"id":233,"depth":83,"text":233},{"id":249,"depth":83,"text":249},{"id":310,"depth":83,"text":311,"children":1009},[1010,1011,1012],{"id":315,"depth":89,"text":316},{"id":375,"depth":89,"text":376},{"id":560,"depth":89,"text":561},{"id":657,"depth":83,"text":658,"children":1014},[1015,1016,1017],{"id":661,"depth":89,"text":662},{"id":687,"depth":89,"text":688},{"id":713,"depth":89,"text":714},{"id":747,"depth":83,"text":748,"children":1019},[1020,1021,1022],{"id":754,"depth":89,"text":755},{"id":784,"depth":89,"text":785},{"id":876,"depth":89,"text":877},{"id":906,"depth":83,"text":906,"children":1024},[1025,1026,1027],{"id":909,"depth":89,"text":910},{"id":937,"depth":89,"text":938},{"id":965,"depth":89,"text":966},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":228,"description":70},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[210,1036,1037],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1040,"title":1041,"body":1042,"category":210,"cover":1049,"description":70,"extension":212,"meta":1365,"navigation":92,"path":1366,"pinned":215,"publishedAt":1367,"seo":1368,"slug":1369,"stem":1370,"summary":1371,"tags":1372,"updatedAt":1367,"visible":92,"__hash__":1375},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1043,"toc":1350},[1044,1050,1053,1056,1060,1063,1087,1090,1096,1099,1102,1136,1146,1150,1157,1160,1185,1188,1200,1203,1207,1210,1213,1216,1219,1222,1225,1228,1252,1255,1258,1264,1267,1270,1273,1277,1283,1286,1312,1315,1319,1322,1325,1329,1332,1335,1338,1341,1344,1347],[10,1045,1046],{},[26,1047],{"alt":1048,"src":1049},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1051,1052],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1054,1055],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1057,1059],{"id":1058},"python-代码是什么样的","Python 代码是什么样的",[10,1061,1062],{},"下面是一段简单的 Python 代码：",[65,1064,1066],{"className":67,"code":1065,"language":69,"meta":70,"style":70},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1067,1068,1073,1078,1082],{"__ignoreMap":70},[74,1069,1070],{"class":76,"line":77},[74,1071,1072],{},"name = \"Python\"\n",[74,1074,1075],{"class":76,"line":83},[74,1076,1077],{},"year = 2026\n",[74,1079,1080],{"class":76,"line":89},[74,1081,93],{"emptyLinePlaceholder":92},[74,1083,1084],{"class":76,"line":96},[74,1085,1086],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1088,1089],{},"运行结果：",[65,1091,1094],{"className":1092,"code":1093,"language":126,"meta":70},[124],"正在学习 Python，当前年份是 2026\n",[34,1095,1093],{"__ignoreMap":70},[10,1097,1098],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1100,1101],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[65,1103,1105],{"className":67,"code":1104,"language":69,"meta":70,"style":70},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1106,1107,1112,1116,1121,1126,1131],{"__ignoreMap":70},[74,1108,1109],{"class":76,"line":77},[74,1110,1111],{},"score = 85\n",[74,1113,1114],{"class":76,"line":83},[74,1115,93],{"emptyLinePlaceholder":92},[74,1117,1118],{"class":76,"line":89},[74,1119,1120],{},"if score >= 60:\n",[74,1122,1123],{"class":76,"line":96},[74,1124,1125],{},"    print(\"成绩合格\")\n",[74,1127,1128],{"class":76,"line":102},[74,1129,1130],{},"else:\n",[74,1132,1133],{"class":76,"line":108},[74,1134,1135],{},"    print(\"需要继续学习\")\n",[10,1137,1138,1141,1142,1145],{},[34,1139,1140],{},"if"," 和 ",[34,1143,1144],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1147,1149],{"id":1148},"python-如何运行代码","Python 如何运行代码",[10,1151,1152,1153,1156],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1154,1155],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1158,1159],{},"交互式环境适合快速验证一个表达式：",[65,1161,1163],{"className":67,"code":1162,"language":69,"meta":70,"style":70},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1164,1165,1170,1175,1180],{"__ignoreMap":70},[74,1166,1167],{"class":76,"line":77},[74,1168,1169],{},">>> 10 + 20\n",[74,1171,1172],{"class":76,"line":83},[74,1173,1174],{},"30\n",[74,1176,1177],{"class":76,"line":89},[74,1178,1179],{},">>> \"Python\".lower()\n",[74,1181,1182],{"class":76,"line":96},[74,1183,1184],{},"'python'\n",[10,1186,1187],{},"需要保存和重复运行的程序，则可以写入文件：",[65,1189,1191],{"className":575,"code":1190,"language":577,"meta":70,"style":70},"python3 hello.py\n",[34,1192,1193],{"__ignoreMap":70},[74,1194,1195,1197],{"class":76,"line":77},[74,1196,675],{"class":584},[74,1198,1199],{"class":620}," hello.py\n",[10,1201,1202],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1204,1206],{"id":1205},"python-的特点","Python 的特点",[313,1208,1209],{"id":1209},"语法相对简洁",[10,1211,1212],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[313,1214,1215],{"id":1215},"支持多种编程方式",[10,1217,1218],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[313,1220,1221],{"id":1221},"标准库比较完整",[10,1223,1224],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1226,1227],{},"例如，获取当前时间：",[65,1229,1231],{"className":67,"code":1230,"language":69,"meta":70,"style":70},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1232,1233,1238,1242,1247],{"__ignoreMap":70},[74,1234,1235],{"class":76,"line":77},[74,1236,1237],{},"from datetime import datetime\n",[74,1239,1240],{"class":76,"line":83},[74,1241,93],{"emptyLinePlaceholder":92},[74,1243,1244],{"class":76,"line":89},[74,1245,1246],{},"now = datetime.now()\n",[74,1248,1249],{"class":76,"line":96},[74,1250,1251],{},"print(now)\n",[10,1253,1254],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[313,1256,1257],{"id":1257},"第三方工具丰富",[10,1259,1260,1261,1263],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1262,245],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1265,1266],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[313,1268,1269],{"id":1269},"支持多个操作系统",[10,1271,1272],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1274,1276],{"id":1275},"python-可以做什么","Python 可以做什么",[10,1278,1279],{},[26,1280],{"alt":1281,"src":1282},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1284,1285],{},"Python 的应用范围比较广，常见方向包括：",[42,1287,1288,1291,1294,1297,1300,1303,1306,1309],{},[45,1289,1290],{},"编写自动化脚本，批量处理文件和重复任务；",[45,1292,1293],{},"开发网站后端和 API 服务；",[45,1295,1296],{},"进行数据清洗、统计分析和图表展示；",[45,1298,1299],{},"编写网络爬虫和信息采集工具；",[45,1301,1302],{},"开发自动化测试程序；",[45,1304,1305],{},"进行机器学习和人工智能开发；",[45,1307,1308],{},"编写运维、监控和辅助开发工具；",[45,1310,1311],{},"开发部分桌面应用和插件。",[10,1313,1314],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1316,1318],{"id":1317},"python-的发展","Python 的发展",[10,1320,1321],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1323,1324],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1326,1328],{"id":1327},"python-也有局限","Python 也有局限",[10,1330,1331],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1333,1334],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1336,1337],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1339,1340],{"id":1340},"写在最后",[10,1342,1343],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1345,1346],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[197,1348,1349],{},"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":70,"searchDepth":83,"depth":83,"links":1351},[1352,1353,1354,1361,1362,1363,1364],{"id":1058,"depth":83,"text":1059},{"id":1148,"depth":83,"text":1149},{"id":1205,"depth":83,"text":1206,"children":1355},[1356,1357,1358,1359,1360],{"id":1209,"depth":89,"text":1209},{"id":1215,"depth":89,"text":1215},{"id":1221,"depth":89,"text":1221},{"id":1257,"depth":89,"text":1257},{"id":1269,"depth":89,"text":1269},{"id":1275,"depth":83,"text":1276},{"id":1317,"depth":83,"text":1318},{"id":1327,"depth":83,"text":1328},{"id":1340,"depth":83,"text":1340},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1041,"description":70},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[210,1373,1374],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1377,"title":1378,"body":1379,"category":210,"cover":211,"description":1383,"extension":212,"meta":1501,"navigation":92,"path":1502,"pinned":215,"publishedAt":216,"seo":1503,"slug":1504,"stem":1505,"summary":1506,"tags":1507,"updatedAt":216,"visible":92,"__hash__":1509},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1380,"toc":1491},[1381,1384,1386,1389,1391,1397,1402,1404,1418,1420,1422,1431,1433,1439,1441,1443,1459,1461,1472,1474,1482,1484,1486,1489],[10,1382,1383],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1385,16],{"id":16},[10,1387,1388],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1390,22],{"id":22},[10,1392,1393],{},[26,1394],{"alt":1395,"src":1396},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1398,1399,1401],{},[34,1400,1155],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1403,40],{"id":40},[42,1405,1406,1412,1415],{},[45,1407,1408,1409,1411],{},"源代码是人编写的文本，通常保存在 ",[34,1410,1155],{}," 文件中。",[45,1413,1414],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[45,1416,1417],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1419,60],{"id":60},[10,1421,63],{},[65,1423,1425],{"className":67,"code":1424,"language":69,"meta":70,"style":70},"print(\"你好，Python\")\n",[34,1426,1427],{"__ignoreMap":70},[74,1428,1429],{"class":76,"line":77},[74,1430,1424],{},[10,1432,120],{},[65,1434,1437],{"className":1435,"code":1436,"language":126,"meta":70},[124],"你好，Python\n",[34,1438,1436],{"__ignoreMap":70},[10,1440,131],{},[14,1442,134],{"id":134},[136,1444,1445,1452],{},[45,1446,1447,1448,1451],{},"终端启动解释器后，解释器读取 ",[34,1449,1450],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[45,1453,1454,1455,1458],{},"字符串对象先准备好，再交给 ",[34,1456,1457],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1460,157],{"id":157},[42,1462,1463,1466],{},[45,1464,1465],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[45,1467,1468,1469,1471],{},"认为 ",[34,1470,1155],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1473,175],{"id":175},[136,1475,1476,1479],{},[45,1477,1478],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[45,1480,1481],{},"把示例文字改成自己的学习目标并重新运行。",[10,1483,189],{},[14,1485,192],{"id":192},[10,1487,1488],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,1490,199],{},{"title":70,"searchDepth":83,"depth":83,"links":1492},[1493,1494,1495,1496,1497,1498,1499,1500],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1378,"description":1383},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[210,1373,1508],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1511,"title":1512,"body":1513,"category":210,"cover":211,"description":1517,"extension":212,"meta":1653,"navigation":92,"path":1654,"pinned":215,"publishedAt":216,"seo":1655,"slug":1656,"stem":1657,"summary":1658,"tags":1659,"updatedAt":216,"visible":92,"__hash__":1661},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1514,"toc":1643},[1515,1518,1520,1523,1525,1531,1537,1539,1554,1556,1559,1579,1581,1587,1589,1591,1604,1606,1620,1622,1633,1635,1637,1640],[10,1516,1517],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1519,16],{"id":16},[10,1521,1522],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1524,22],{"id":22},[10,1526,1527],{},[26,1528],{"alt":1529,"src":1530},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1532,1533,1534,1536],{},"终端收到 ",[34,1535,675],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1538,40],{"id":40},[42,1540,1541,1544,1547],{},[45,1542,1543],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[45,1545,1546],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[45,1548,1549,1550,1553],{},"检查 pip 时使用 ",[34,1551,1552],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1555,60],{"id":60},[10,1557,1558],{},"在 macOS 终端执行：",[65,1560,1561],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,1562,1563,1569],{"__ignoreMap":70},[74,1564,1565,1567],{"class":76,"line":77},[74,1566,675],{"class":584},[74,1568,588],{"class":587},[74,1570,1571,1573,1575,1577],{"class":76,"line":83},[74,1572,675],{"class":584},[74,1574,617],{"class":587},[74,1576,621],{"class":620},[74,1578,588],{"class":587},[10,1580,120],{},[65,1582,1585],{"className":1583,"code":1584,"language":126,"meta":70},[124],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1586,1584],{"__ignoreMap":70},[10,1588,131],{},[14,1590,134],{"id":134},[136,1592,1593,1599],{},[45,1594,1595,1598],{},[34,1596,1597],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[45,1600,1601,1603],{},[34,1602,683],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1605,157],{"id":157},[42,1607,1608,1614],{},[45,1609,1610,1611,1613],{},"看到系统已有 ",[34,1612,675],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[45,1615,1616,1617,1619],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1618,675],{},"，不修改系统自带工具。",[14,1621,175],{"id":175},[136,1623,1624,1630],{},[45,1625,922,1626,1629],{},[34,1627,1628],{},"which python3","，记录当前解释器路径。",[45,1631,1632],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1634,189],{},[14,1636,192],{"id":192},[10,1638,1639],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,1641,1642],{},"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":70,"searchDepth":83,"depth":83,"links":1644},[1645,1646,1647,1648,1649,1650,1651,1652],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1512,"description":1517},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[210,1660,1036],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1663,"title":1664,"body":1665,"category":210,"cover":211,"description":1830,"extension":212,"meta":1831,"navigation":92,"path":1832,"pinned":215,"publishedAt":216,"seo":1833,"slug":1834,"stem":1835,"summary":1836,"tags":1837,"updatedAt":216,"visible":92,"__hash__":1840},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1666,"toc":1820},[1667,1673,1675,1678,1680,1686,1689,1691,1715,1717,1719,1746,1748,1754,1756,1758,1776,1778,1792,1794,1808,1810,1812,1818],[10,1668,1669,1670,1672],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1671,1155],{}," 脚本。",[14,1674,16],{"id":16},[10,1676,1677],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1679,22],{"id":22},[10,1681,1682],{},[26,1683],{"alt":1684,"src":1685},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1687,1688],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1690,40],{"id":40},[42,1692,1693,1702,1709],{},[45,1694,1695,1696,1698,1699,57],{},"在终端输入 ",[34,1697,675],{}," 进入 REPL，提示符通常是 ",[34,1700,1701],{},">>>",[45,1703,1704,1705,1708],{},"输入 ",[34,1706,1707],{},"exit()"," 或按 Control-D 退出 REPL。",[45,1710,1711,1712,1714],{},"需要保存、复查或多次运行的代码应写入 ",[34,1713,1155],{}," 文件。",[14,1716,60],{"id":60},[10,1718,63],{},[65,1720,1724],{"className":1721,"code":1722,"language":1723,"meta":70,"style":70},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1725,1726,1731,1736,1741],{"__ignoreMap":70},[74,1727,1728],{"class":76,"line":77},[74,1729,1730],{},">>> 2 + 3\n",[74,1732,1733],{"class":76,"line":83},[74,1734,1735],{},"5\n",[74,1737,1738],{"class":76,"line":89},[74,1739,1740],{},">>> \"python\".upper()\n",[74,1742,1743],{"class":76,"line":96},[74,1744,1745],{},"'PYTHON'\n",[10,1747,120],{},[65,1749,1752],{"className":1750,"code":1751,"language":126,"meta":70},[124],"REPL 会直接显示表达式结果\n",[34,1753,1751],{"__ignoreMap":70},[10,1755,131],{},[14,1757,134],{"id":134},[136,1759,1760,1770],{},[45,1761,1762,1763,1766,1767,57],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1764,1765],{},"2 + 3"," 能直接看到 ",[34,1768,1769],{},"5",[45,1771,1772,1773,1775],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1774,1457],{}," 才会写到标准输出。",[14,1777,157],{"id":157},[42,1779,1780,1789],{},[45,1781,1782,1783,1785,1786,1788],{},"把提示符 ",[34,1784,1701],{}," 复制进 ",[34,1787,1155],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[45,1790,1791],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1793,175],{"id":175},[136,1795,1796,1802],{},[45,1797,1798,1799,57],{},"在 REPL 计算 ",[34,1800,1801],{},"12 * 8",[45,1803,1804,1805,1807],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1806,1457],{}," 时是否显示结果。",[10,1809,189],{},[14,1811,192],{"id":192},[10,1813,1814,1815,1817],{},"本篇目标是根据任务选择 REPL 或 ",[34,1816,1155],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,1819,199],{},{"title":70,"searchDepth":83,"depth":83,"links":1821},[1822,1823,1824,1825,1826,1827,1828,1829],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1664,"description":1830},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[210,1838,1839],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1842,"title":1843,"body":1844,"category":210,"cover":211,"description":1848,"extension":212,"meta":2019,"navigation":92,"path":2020,"pinned":215,"publishedAt":216,"seo":2021,"slug":2022,"stem":2023,"summary":2024,"tags":2025,"updatedAt":216,"visible":92,"__hash__":2028},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1845,"toc":2009},[1846,1849,1851,1854,1856,1862,1868,1870,1888,1890,1892,1937,1939,1945,1947,1949,1971,1973,1985,1987,1999,2001,2003,2006],[10,1847,1848],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1850,16],{"id":16},[10,1852,1853],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1855,22],{"id":22},[10,1857,1858],{},[26,1859],{"alt":1860,"src":1861},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1863,1864,1867],{},[34,1865,1866],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1869,40],{"id":40},[42,1871,1872,1875,1885],{},[45,1873,1874],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[45,1876,1877,1880,1881,1884],{},[34,1878,1879],{},"pwd"," 显示当前目录，",[34,1882,1883],{},"ls"," 显示目录里的文件。",[45,1886,1887],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1889,60],{"id":60},[10,1891,1558],{},[65,1893,1895],{"className":575,"code":1894,"language":577,"meta":70,"style":70},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1896,1897,1905,1912,1917,1931],{"__ignoreMap":70},[74,1898,1899,1902],{"class":76,"line":77},[74,1900,1901],{"class":584},"mkdir",[74,1903,1904],{"class":620}," python-study\n",[74,1906,1907,1910],{"class":76,"line":83},[74,1908,1909],{"class":587},"cd",[74,1911,1904],{"class":620},[74,1913,1914],{"class":76,"line":89},[74,1915,1916],{"class":587},"pwd\n",[74,1918,1919,1922,1925,1929],{"class":76,"line":96},[74,1920,1921],{"class":587},"printf",[74,1923,1924],{"class":620}," 'print(\"项目已经运行\")\\n'",[74,1926,1928],{"class":1927},"snl16"," >",[74,1930,1199],{"class":620},[74,1932,1933,1935],{"class":76,"line":102},[74,1934,675],{"class":584},[74,1936,1199],{"class":620},[10,1938,120],{},[65,1940,1943],{"className":1941,"code":1942,"language":126,"meta":70},[124],"项目已经运行\n",[34,1944,1942],{"__ignoreMap":70},[10,1946,131],{},[14,1948,134],{"id":134},[136,1950,1951,1962],{},[45,1952,1953,1955,1956,1958,1959,1961],{},[34,1954,1901],{}," 创建目录，",[34,1957,1909],{}," 改变终端当前目录，",[34,1960,1879],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[45,1963,1964,1966,1967,1970],{},[34,1965,1866],{}," 会在当前目录寻找 ",[34,1968,1969],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1972,157],{"id":157},[42,1974,1975,1982],{},[45,1976,1977,1978,1141,1980,57],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,1979,1879],{},[34,1981,1883],{},[45,1983,1984],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1986,175],{"id":175},[136,1988,1989,1996],{},[45,1990,1991,1992,1995],{},"新建 ",[34,1993,1994],{},"lesson01.py"," 并输出课程编号。",[45,1997,1998],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2000,189],{},[14,2002,192],{"id":192},[10,2004,2005],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,2007,2008],{},"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":70,"searchDepth":83,"depth":83,"links":2010},[2011,2012,2013,2014,2015,2016,2017,2018],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1843,"description":1848},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[210,2026,2027],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2030,"title":2031,"body":2032,"category":210,"cover":211,"description":2036,"extension":212,"meta":2184,"navigation":92,"path":2185,"pinned":215,"publishedAt":216,"seo":2186,"slug":2187,"stem":2188,"summary":2189,"tags":2190,"updatedAt":216,"visible":92,"__hash__":2193},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2033,"toc":2174},[2034,2037,2039,2042,2044,2050,2061,2063,2083,2085,2087,2107,2109,2115,2117,2119,2138,2140,2148,2150,2165,2167,2169,2172],[10,2035,2036],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2038,16],{"id":16},[10,2040,2041],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2043,22],{"id":22},[10,2045,2046],{},[26,2047],{"alt":2048,"src":2049},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2051,2052,2053,57,2055,2058,2059,57],{},"Python 先计算表达式，再把得到的对象交给 ",[34,2054,1457],{},[34,2056,2057],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2060,1765],{},[14,2062,40],{"id":40},[42,2064,2065,2071,2080],{},[45,2066,2067,2070],{},[34,2068,2069],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[45,2072,2073,2076,2077,57],{},[34,2074,2075],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2078,2079],{},"12",[45,2081,2082],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2084,60],{"id":60},[10,2086,63],{},[65,2088,2090],{"className":67,"code":2089,"language":69,"meta":70,"style":70},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2091,2092,2097,2102],{"__ignoreMap":70},[74,2093,2094],{"class":76,"line":77},[74,2095,2096],{},"print(42)\n",[74,2098,2099],{"class":76,"line":83},[74,2100,2101],{},"print(7 + 5)\n",[74,2103,2104],{"class":76,"line":89},[74,2105,2106],{},"print(\"Python 基础课\")\n",[10,2108,120],{},[65,2110,2113],{"className":2111,"code":2112,"language":126,"meta":70},[124],"42\n12\nPython 基础课\n",[34,2114,2112],{"__ignoreMap":70},[10,2116,131],{},[14,2118,134],{"id":134},[136,2120,2121,2129],{},[45,2122,2123,2126,2127,57],{},[34,2124,2125],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2128,2079],{},[45,2130,2131,2133,2134,2137],{},[34,2132,1457],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2135,2136],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2139,157],{"id":157},[42,2141,2142,2145],{},[45,2143,2144],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[45,2146,2147],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2149,175],{"id":175},[136,2151,2152,2155],{},[45,2153,2154],{},"分别输出一个整数、一个小数和一段文本。",[45,2156,2157,2158,2160,2161,2164],{},"比较 ",[34,2159,2057],{}," 与 ",[34,2162,2163],{},"print(\"2 + 3\")"," 的结果。",[10,2166,189],{},[14,2168,192],{"id":192},[10,2170,2171],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,2173,199],{},{"title":70,"searchDepth":83,"depth":83,"links":2175},[2176,2177,2178,2179,2180,2181,2182,2183],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2031,"description":2036},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[210,2191,2192],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2195,"title":2196,"body":2197,"category":210,"cover":211,"description":2201,"extension":212,"meta":2368,"navigation":92,"path":2369,"pinned":215,"publishedAt":216,"seo":2370,"slug":2371,"stem":2372,"summary":2373,"tags":2374,"updatedAt":216,"visible":92,"__hash__":2377},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2198,"toc":2358},[2199,2202,2204,2207,2209,2215,2218,2220,2246,2248,2250,2278,2280,2286,2288,2290,2314,2316,2332,2334,2349,2351,2353,2356],[10,2200,2201],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2203,16],{"id":16},[10,2205,2206],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2208,22],{"id":22},[10,2210,2211],{},[26,2212],{"alt":2213,"src":2214},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2216,2217],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2219,40],{"id":40},[42,2221,2222,2225,2235],{},[45,2223,2224],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[45,2226,2227,2228,2160,2231,2234],{},"变量名区分大小写，",[34,2229,2230],{},"score",[34,2232,2233],{},"Score"," 是两个名字。",[45,2236,2237,2238,2241,2242,2245],{},"使用能表达含义的名称；不要用 ",[34,2239,2240],{},"list","、",[34,2243,2244],{},"str"," 等内置名称作为普通变量名。",[14,2247,60],{"id":60},[10,2249,63],{},[65,2251,2253],{"className":67,"code":2252,"language":69,"meta":70,"style":70},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2254,2255,2260,2265,2269,2274],{"__ignoreMap":70},[74,2256,2257],{"class":76,"line":77},[74,2258,2259],{},"score = 90\n",[74,2261,2262],{"class":76,"line":83},[74,2263,2264],{},"print(score)\n",[74,2266,2267],{"class":76,"line":89},[74,2268,93],{"emptyLinePlaceholder":92},[74,2270,2271],{"class":76,"line":96},[74,2272,2273],{},"score = 95\n",[74,2275,2276],{"class":76,"line":102},[74,2277,2264],{},[10,2279,120],{},[65,2281,2284],{"className":2282,"code":2283,"language":126,"meta":70},[124],"90\n95\n",[34,2285,2283],{"__ignoreMap":70},[10,2287,131],{},[14,2289,134],{"id":134},[136,2291,2292,2301],{},[45,2293,922,2294,2297,2298,2300],{},[34,2295,2296],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2299,2230],{}," 再绑定到它。",[45,2302,922,2303,2306,2307,2310,2311,57],{},[34,2304,2305],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2308,2309],{},"90"," 没有被改造成 ",[34,2312,2313],{},"95",[14,2315,157],{"id":157},[42,2317,2318,2321],{},[45,2319,2320],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[45,2322,2323,2324,2241,2326,2241,2328,2331],{},"使用 ",[34,2325,2240],{},[34,2327,2244],{},[34,2329,2330],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2333,175],{"id":175},[136,2335,2336,2346],{},[45,2337,2338,2339,1141,2342,2345],{},"创建 ",[34,2340,2341],{},"course_name",[34,2343,2344],{},"lesson_count"," 两个变量并输出。",[45,2347,2348],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2350,189],{},[14,2352,192],{"id":192},[10,2354,2355],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,2357,199],{},{"title":70,"searchDepth":83,"depth":83,"links":2359},[2360,2361,2362,2363,2364,2365,2366,2367],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2196,"description":2201},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[210,2375,2376],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2379,"title":2380,"body":2381,"category":210,"cover":211,"description":2385,"extension":212,"meta":2550,"navigation":92,"path":2551,"pinned":215,"publishedAt":216,"seo":2552,"slug":2553,"stem":2554,"summary":2555,"tags":2556,"updatedAt":216,"visible":92,"__hash__":2559},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2382,"toc":2540},[2383,2386,2388,2391,2393,2399,2402,2404,2433,2435,2437,2482,2484,2490,2492,2494,2508,2510,2521,2523,2531,2533,2535,2538],[10,2384,2385],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2387,16],{"id":16},[10,2389,2390],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2392,22],{"id":22},[10,2394,2395],{},[26,2396],{"alt":2397,"src":2398},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2400,2401],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2403,40],{"id":40},[42,2405,2406,2416,2430],{},[45,2407,2408,2411,2412,2415],{},[34,2409,2410],{},"int"," 表示整数，",[34,2413,2414],{},"float"," 表示浮点数。",[45,2417,2418,2421,2422,2425,2426,2429],{},[34,2419,2420],{},"\u002F"," 总是进行真除法；",[34,2423,2424],{},"\u002F\u002F"," 是向下取整除法，",[34,2427,2428],{},"%"," 得到余数。",[45,2431,2432],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2434,60],{"id":60},[10,2436,63],{},[65,2438,2440],{"className":67,"code":2439,"language":69,"meta":70,"style":70},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2441,2442,2447,2452,2457,2461,2466,2471,2476],{"__ignoreMap":70},[74,2443,2444],{"class":76,"line":77},[74,2445,2446],{},"price = 25\n",[74,2448,2449],{"class":76,"line":83},[74,2450,2451],{},"count = 4\n",[74,2453,2454],{"class":76,"line":89},[74,2455,2456],{},"discount = 0.9\n",[74,2458,2459],{"class":76,"line":96},[74,2460,93],{"emptyLinePlaceholder":92},[74,2462,2463],{"class":76,"line":102},[74,2464,2465],{},"total = price * count * discount\n",[74,2467,2468],{"class":76,"line":108},[74,2469,2470],{},"average = total \u002F count\n",[74,2472,2473],{"class":76,"line":114},[74,2474,2475],{},"print(total)\n",[74,2477,2479],{"class":76,"line":2478},8,[74,2480,2481],{},"print(average)\n",[10,2483,120],{},[65,2485,2488],{"className":2486,"code":2487,"language":126,"meta":70},[124],"90.0\n22.5\n",[34,2489,2487],{"__ignoreMap":70},[10,2491,131],{},[14,2493,134],{"id":134},[136,2495,2496,2502],{},[45,2497,2498,2501],{},[34,2499,2500],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[45,2503,2504,2507],{},[34,2505,2506],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2509,157],{"id":157},[42,2511,2512,2518],{},[45,2513,2514,2515,57],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2516,2517],{},"decimal.Decimal",[45,2519,2520],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2522,175],{"id":175},[136,2524,2525,2528],{},[45,2526,2527],{},"计算 137 除以 10 的商和余数。",[45,2529,2530],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2532,189],{},[14,2534,192],{"id":192},[10,2536,2537],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,2539,199],{},{"title":70,"searchDepth":83,"depth":83,"links":2541},[2542,2543,2544,2545,2546,2547,2548,2549],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2380,"description":2385},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[210,2557,2558],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2561,"title":2562,"body":2563,"category":210,"cover":211,"description":2567,"extension":212,"meta":2743,"navigation":92,"path":2744,"pinned":215,"publishedAt":216,"seo":2745,"slug":2746,"stem":2747,"summary":2748,"tags":2749,"updatedAt":216,"visible":92,"__hash__":2752},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2564,"toc":2731},[2565,2568,2570,2573,2575,2581,2591,2593,2604,2606,2608,2638,2640,2646,2648,2650,2680,2683,2686,2692,2695,2697,2705,2707,2722,2724,2726,2729],[10,2566,2567],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2569,16],{"id":16},[10,2571,2572],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2574,22],{"id":22},[10,2576,2577],{},[26,2578],{"alt":2579,"src":2580},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2582,2583,2584,2587,2588,57],{},"切片 ",[34,2585,2586],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2589,2590],{},"stop - start",[14,2592,40],{"id":40},[42,2594,2595,2598,2601],{},[45,2596,2597],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[45,2599,2600],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[45,2602,2603],{},"切片会创建新的字符串，不会修改原字符串。",[14,2605,60],{"id":60},[10,2607,63],{},[65,2609,2611],{"className":67,"code":2610,"language":69,"meta":70,"style":70},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2612,2613,2618,2623,2628,2633],{"__ignoreMap":70},[74,2614,2615],{"class":76,"line":77},[74,2616,2617],{},"language = \"Python\"\n",[74,2619,2620],{"class":76,"line":83},[74,2621,2622],{},"print(language[0])\n",[74,2624,2625],{"class":76,"line":89},[74,2626,2627],{},"print(language[-1])\n",[74,2629,2630],{"class":76,"line":96},[74,2631,2632],{},"print(language[0:3])\n",[74,2634,2635],{"class":76,"line":102},[74,2636,2637],{},"print(language + \" 3.14\")\n",[10,2639,120],{},[65,2641,2644],{"className":2642,"code":2643,"language":126,"meta":70},[124],"P\nn\nPyt\nPython 3.14\n",[34,2645,2643],{"__ignoreMap":70},[10,2647,131],{},[14,2649,134],{"id":134},[136,2651,2652,2666],{},[45,2653,2654,2655,2657,2658,2661,2662,2665],{},"字符串 ",[34,2656,210],{}," 的正索引从 ",[34,2659,2660],{},"P"," 的 0 开始，负索引从末尾 ",[34,2663,2664],{},"n"," 的 -1 开始。",[45,2667,2668,2671,2672,2675,2676,2679],{},[34,2669,2670],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2673,2674],{},"Pyt","；索引 3 的 ",[34,2677,2678],{},"h"," 不在结果中。",[313,2681,2682],{"id":2682},"再看一个具体细节",[10,2684,2685],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2687,2688],{},[26,2689],{"alt":2690,"src":2691},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2693,2694],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2696,157],{"id":157},[42,2698,2699,2702],{},[45,2700,2701],{},"把第一个字符写成索引 1，造成整体偏移一位。",[45,2703,2704],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2706,175],{"id":175},[136,2708,2709,2719],{},[45,2710,2711,2712,2715,2716,57],{},"从 ",[34,2713,2714],{},"\"programming\""," 中切出 ",[34,2717,2718],{},"\"gram\"",[45,2720,2721],{},"使用负索引取得字符串倒数第二个字符。",[10,2723,189],{},[14,2725,192],{"id":192},[10,2727,2728],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,2730,199],{},{"title":70,"searchDepth":83,"depth":83,"links":2732},[2733,2734,2735,2736,2737,2740,2741,2742],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":2738},[2739],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2562,"description":2567},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[210,2750,2751],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2754,"title":2755,"body":2756,"category":210,"cover":211,"description":2760,"extension":212,"meta":2974,"navigation":92,"path":2975,"pinned":215,"publishedAt":216,"seo":2976,"slug":2977,"stem":2978,"summary":2979,"tags":2980,"updatedAt":216,"visible":92,"__hash__":2983},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2757,"toc":2962},[2758,2761,2763,2766,2768,2774,2784,2786,2819,2821,2823,2867,2869,2875,2877,2879,2900,2902,2905,2911,2919,2921,2935,2937,2953,2955,2957,2960],[10,2759,2760],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2762,16],{"id":16},[10,2764,2765],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2767,22],{"id":22},[10,2769,2770],{},[26,2771],{"alt":2772,"src":2773},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2775,2776,2777,993,2780,2783],{},"比较表达式先产生 ",[34,2778,2779],{},"True",[34,2781,2782],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2785,40],{"id":40},[42,2787,2788,2802,2816],{},[45,2789,2790,2793,2794,2797,2798,2801],{},[34,2791,2792],{},"=="," 判断是否相等，",[34,2795,2796],{},"!="," 判断是否不等；单个 ",[34,2799,2800],{},"="," 是赋值。",[45,2803,2804,2807,2808,2811,2812,2815],{},[34,2805,2806],{},"and"," 要求两侧都为真，",[34,2809,2810],{},"or"," 只需一侧为真，",[34,2813,2814],{},"not"," 取反。",[45,2817,2818],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2820,60],{"id":60},[10,2822,63],{},[65,2824,2826],{"className":67,"code":2825,"language":69,"meta":70,"style":70},"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",[34,2827,2828,2833,2838,2842,2847,2852,2857,2862],{"__ignoreMap":70},[74,2829,2830],{"class":76,"line":77},[74,2831,2832],{},"age = 20\n",[74,2834,2835],{"class":76,"line":83},[74,2836,2837],{},"has_ticket = True\n",[74,2839,2840],{"class":76,"line":89},[74,2841,93],{"emptyLinePlaceholder":92},[74,2843,2844],{"class":76,"line":96},[74,2845,2846],{},"is_adult = age >= 18\n",[74,2848,2849],{"class":76,"line":102},[74,2850,2851],{},"can_enter = is_adult and has_ticket\n",[74,2853,2854],{"class":76,"line":108},[74,2855,2856],{},"print(is_adult)\n",[74,2858,2859],{"class":76,"line":114},[74,2860,2861],{},"print(can_enter)\n",[74,2863,2864],{"class":76,"line":2478},[74,2865,2866],{},"print(not has_ticket)\n",[10,2868,120],{},[65,2870,2873],{"className":2871,"code":2872,"language":126,"meta":70},[124],"True\nTrue\nFalse\n",[34,2874,2872],{"__ignoreMap":70},[10,2876,131],{},[14,2878,134],{"id":134},[136,2880,2881,2891],{},[45,2882,2883,2886,2887,2890],{},[34,2884,2885],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2888,2889],{},"is_adult","，这一步没有任何分支跳转。",[45,2892,2893,2896,2897,2899],{},[34,2894,2895],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2898,2814],{}," 只对紧随其后的值取反。",[313,2901,2682],{"id":2682},[10,2903,2904],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2906,2907],{},[26,2908],{"alt":2909,"src":2910},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2912,2913,2915,2916,2918],{},[34,2914,2806],{}," 只有“真、真”得到真；",[34,2917,2810],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2920,157],{"id":157},[42,2922,2923,2932],{},[45,2924,2925,2926,2928,2929,2931],{},"用单个等号判断相等。",[34,2927,2800],{}," 是赋值，",[34,2930,2792],{}," 才是相等比较。",[45,2933,2934],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2936,175],{"id":175},[136,2938,2939,2946],{},[45,2940,2941,2942,2945],{},"判断数字 ",[34,2943,2944],{},"15"," 是否同时大于 10 且小于 20。",[45,2947,2948,2949,2952],{},"分别修改年龄和票据状态，记录 ",[34,2950,2951],{},"can_enter"," 的四种组合结果。",[10,2954,189],{},[14,2956,192],{"id":192},[10,2958,2959],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,2961,199],{},{"title":70,"searchDepth":83,"depth":83,"links":2963},[2964,2965,2966,2967,2968,2971,2972,2973],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":2969},[2970],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2755,"description":2760},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[210,2981,2982],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2985,"title":2986,"body":2987,"category":210,"cover":211,"description":2991,"extension":212,"meta":3159,"navigation":92,"path":3160,"pinned":215,"publishedAt":216,"seo":3161,"slug":3162,"stem":3163,"summary":3164,"tags":3165,"updatedAt":216,"visible":92,"__hash__":3167},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2988,"toc":3149},[2989,2992,2994,2997,2999,3005,3023,3025,3038,3040,3042,3076,3078,3084,3086,3088,3110,3112,3124,3126,3140,3142,3144,3147],[10,2990,2991],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2993,16],{"id":16},[10,2995,2996],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2998,22],{"id":22},[10,3000,3001],{},[26,3002],{"alt":3003,"src":3004},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3006,3007,3010,3011,3014,3015,3018,3019,3022],{},[34,3008,3009],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,3012,3013],{},"18","，程序首先得到的也是 ",[34,3016,3017],{},"\"18\"","，需要 ",[34,3020,3021],{},"int()"," 后才能按整数参与计算。",[14,3024,40],{"id":40},[42,3026,3027,3030,3035],{},[45,3028,3029],{},"提示文字应告诉用户需要输入什么。",[45,3031,3032,3034],{},[34,3033,3021],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[45,3036,3037],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3039,60],{"id":60},[10,3041,63],{},[65,3043,3045],{"className":67,"code":3044,"language":69,"meta":70,"style":70},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,3046,3047,3052,3057,3062,3066,3071],{"__ignoreMap":70},[74,3048,3049],{"class":76,"line":77},[74,3050,3051],{},"name = input(\"请输入姓名：\")\n",[74,3053,3054],{"class":76,"line":83},[74,3055,3056],{},"age_text = input(\"请输入年龄：\")\n",[74,3058,3059],{"class":76,"line":89},[74,3060,3061],{},"age = int(age_text)\n",[74,3063,3064],{"class":76,"line":96},[74,3065,93],{"emptyLinePlaceholder":92},[74,3067,3068],{"class":76,"line":102},[74,3069,3070],{},"print(\"你好，\" + name)\n",[74,3072,3073],{"class":76,"line":108},[74,3074,3075],{},"print(age + 1)\n",[10,3077,120],{},[65,3079,3082],{"className":3080,"code":3081,"language":126,"meta":70},[124],"根据输入显示姓名，并输出下一年的年龄\n",[34,3083,3081],{"__ignoreMap":70},[10,3085,131],{},[14,3087,134],{"id":134},[136,3089,3090,3100],{},[45,3091,3092,3093,3095,3096,3099],{},"两次 ",[34,3094,3009],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3097,3098],{},"age_text"," 用来提醒这仍是文本。",[45,3101,3102,3105,3106,3109],{},[34,3103,3104],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3107,3108],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3111,157],{"id":157},[42,3113,3114,3121],{},[45,3115,3116,3117,3120],{},"直接计算 ",[34,3118,3119],{},"input(...) + 1","，忽略输入结果是字符串。",[45,3122,3123],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3125,175],{"id":175},[136,3127,3128,3131],{},[45,3129,3130],{},"接收两个整数并输出它们的和。",[45,3132,1704,3133,3136,3137,3139],{},[34,3134,3135],{},"18.5"," 给 ",[34,3138,3021],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3141,189],{},[14,3143,192],{"id":192},[10,3145,3146],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,3148,199],{},{"title":70,"searchDepth":83,"depth":83,"links":3150},[3151,3152,3153,3154,3155,3156,3157,3158],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2986,"description":2991},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[210,2330,3166],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":4,"title":5,"body":3169,"category":210,"cover":211,"description":12,"extension":212,"meta":3298,"navigation":92,"path":214,"pinned":215,"publishedAt":216,"seo":3299,"slug":218,"stem":219,"summary":220,"tags":3300,"updatedAt":216,"visible":92,"__hash__":224},{"type":7,"value":3170,"toc":3288},[3171,3173,3175,3177,3179,3183,3187,3189,3199,3201,3203,3235,3237,3242,3244,3246,3258,3260,3270,3272,3280,3282,3284,3286],[10,3172,12],{},[14,3174,16],{"id":16},[10,3176,19],{},[14,3178,22],{"id":22},[10,3180,3181],{},[26,3182],{"alt":28,"src":29},[10,3184,32,3185,37],{},[34,3186,36],{},[14,3188,40],{"id":40},[42,3190,3191,3193,3195],{},[45,3192,47],{},[45,3194,50],{},[45,3196,53,3197,57],{},[34,3198,56],{},[14,3200,60],{"id":60},[10,3202,63],{},[65,3204,3205],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,3206,3207,3211,3215,3219,3223,3227,3231],{"__ignoreMap":70},[74,3208,3209],{"class":76,"line":77},[74,3210,80],{},[74,3212,3213],{"class":76,"line":83},[74,3214,86],{},[74,3216,3217],{"class":76,"line":89},[74,3218,93],{"emptyLinePlaceholder":92},[74,3220,3221],{"class":76,"line":96},[74,3222,99],{},[74,3224,3225],{"class":76,"line":102},[74,3226,105],{},[74,3228,3229],{"class":76,"line":108},[74,3230,111],{},[74,3232,3233],{"class":76,"line":114},[74,3234,117],{},[10,3236,120],{},[65,3238,3240],{"className":3239,"code":125,"language":126,"meta":70},[124],[34,3241,125],{"__ignoreMap":70},[10,3243,131],{},[14,3245,134],{"id":134},[136,3247,3248,3250],{},[45,3249,140],{},[45,3251,3252,146,3254,150,3256,154],{},[34,3253,145],{},[34,3255,149],{},[34,3257,153],{},[14,3259,157],{"id":157},[42,3261,3262,3268],{},[45,3263,162,3264,166,3266,57],{},[34,3265,165],{},[34,3267,169],{},[45,3269,172],{},[14,3271,175],{"id":175},[136,3273,3274,3276],{},[45,3275,180],{},[45,3277,183,3278,186],{},[34,3279,153],{},[10,3281,189],{},[14,3283,192],{"id":192},[10,3285,195],{},[197,3287,199],{},{"title":70,"searchDepth":83,"depth":83,"links":3289},[3290,3291,3292,3293,3294,3295,3296,3297],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5,"description":12},[210,222,223],{"id":3302,"title":3303,"body":3304,"category":210,"cover":211,"description":3308,"extension":212,"meta":3449,"navigation":92,"path":3450,"pinned":215,"publishedAt":216,"seo":3451,"slug":3452,"stem":3453,"summary":3454,"tags":3455,"updatedAt":216,"visible":92,"__hash__":3457},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3305,"toc":3439},[3306,3309,3311,3314,3316,3322,3325,3327,3338,3340,3342,3376,3378,3384,3386,3388,3402,3404,3416,3418,3430,3432,3434,3437],[10,3307,3308],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3310,16],{"id":16},[10,3312,3313],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3315,22],{"id":22},[10,3317,3318],{},[26,3319],{"alt":3320,"src":3321},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3323,3324],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3326,40],{"id":40},[42,3328,3329,3332,3335],{},[45,3330,3331],{},"元组常用来表达固定数量、固定含义的一组值。",[45,3333,3334],{},"只有一个元素的元组必须保留尾随逗号。",[45,3336,3337],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3339,60],{"id":60},[10,3341,63],{},[65,3343,3345],{"className":67,"code":3344,"language":69,"meta":70,"style":70},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3346,3347,3352,3357,3362,3366,3371],{"__ignoreMap":70},[74,3348,3349],{"class":76,"line":77},[74,3350,3351],{},"point = (120, 80)\n",[74,3353,3354],{"class":76,"line":83},[74,3355,3356],{},"print(point[0])\n",[74,3358,3359],{"class":76,"line":89},[74,3360,3361],{},"print(point[1])\n",[74,3363,3364],{"class":76,"line":96},[74,3365,93],{"emptyLinePlaceholder":92},[74,3367,3368],{"class":76,"line":102},[74,3369,3370],{},"single = (5,)\n",[74,3372,3373],{"class":76,"line":108},[74,3374,3375],{},"print(single)\n",[10,3377,120],{},[65,3379,3382],{"className":3380,"code":3381,"language":126,"meta":70},[124],"120\n80\n(5,)\n",[34,3383,3381],{"__ignoreMap":70},[10,3385,131],{},[14,3387,134],{"id":134},[136,3389,3390,3396],{},[45,3391,3392,3395],{},[34,3393,3394],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[45,3397,3398,3401],{},[34,3399,3400],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3403,157],{"id":157},[42,3405,3406,3413],{},[45,3407,3408,3409,3412],{},"把 ",[34,3410,3411],{},"(5)"," 当作元组，实际它仍是整数。",[45,3414,3415],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3417,175],{"id":175},[136,3419,3420,3423],{},[45,3421,3422],{},"用元组表示宽度和高度。",[45,3424,2157,3425,2160,3427,3429],{},[34,3426,3411],{},[34,3428,3400],{}," 的类型。",[10,3431,189],{},[14,3433,192],{"id":192},[10,3435,3436],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,3438,199],{},{"title":70,"searchDepth":83,"depth":83,"links":3440},[3441,3442,3443,3444,3445,3446,3447,3448],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3303,"description":3308},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[210,3456,223],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3459,"title":3460,"body":3461,"category":210,"cover":211,"description":3465,"extension":212,"meta":3620,"navigation":92,"path":3621,"pinned":215,"publishedAt":216,"seo":3622,"slug":3623,"stem":3624,"summary":3625,"tags":3626,"updatedAt":216,"visible":92,"__hash__":3628},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3462,"toc":3610},[3463,3466,3468,3471,3473,3479,3489,3491,3505,3507,3509,3543,3545,3551,3553,3555,3570,3572,3591,3593,3601,3603,3605,3608],[10,3464,3465],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3467,16],{"id":16},[10,3469,3470],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3472,22],{"id":22},[10,3474,3475],{},[26,3476],{"alt":3477,"src":3478},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3480,3481,3482,3485,3486,3488],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3483,3484],{},"student[\"score\"]"," 读取的是键 ",[34,3487,2230],{}," 对应的值，而不是“第几个元素”。",[14,3490,40],{"id":40},[42,3492,3493,3496,3502],{},[45,3494,3495],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[45,3497,2323,3498,3501],{},[34,3499,3500],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[45,3503,3504],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3506,60],{"id":60},[10,3508,63],{},[65,3510,3512],{"className":67,"code":3511,"language":69,"meta":70,"style":70},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3513,3514,3519,3524,3528,3533,3538],{"__ignoreMap":70},[74,3515,3516],{"class":76,"line":77},[74,3517,3518],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[74,3520,3521],{"class":76,"line":83},[74,3522,3523],{},"print(student[\"name\"])\n",[74,3525,3526],{"class":76,"line":89},[74,3527,93],{"emptyLinePlaceholder":92},[74,3529,3530],{"class":76,"line":96},[74,3531,3532],{},"student[\"score\"] = 95\n",[74,3534,3535],{"class":76,"line":102},[74,3536,3537],{},"student[\"city\"] = \"郑州\"\n",[74,3539,3540],{"class":76,"line":108},[74,3541,3542],{},"print(student)\n",[10,3544,120],{},[65,3546,3549],{"className":3547,"code":3548,"language":126,"meta":70},[124],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3550,3548],{"__ignoreMap":70},[10,3552,131],{},[14,3554,134],{"id":134},[136,3556,3557,3560],{},[45,3558,3559],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[45,3561,3562,3563,3565,3566,3569],{},"给已有键 ",[34,3564,2230],{}," 赋值会更新映射，给新键 ",[34,3567,3568],{},"city"," 赋值会增加映射。",[14,3571,157],{"id":157},[42,3573,3574,3581],{},[45,3575,3576,3577,3580],{},"按位置理解字典并尝试 ",[34,3578,3579],{},"student[0]","，而实际键是字符串。",[45,3582,3583,3584,3587,3588,57],{},"直接读取不确定存在的键并忽略 ",[34,3585,3586],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3589,3590],{},"get()",[14,3592,175],{"id":175},[136,3594,3595,3598],{},[45,3596,3597],{},"建立一本书的标题、作者和页数字典。",[45,3599,3600],{},"添加分类键，再修改页数。",[10,3602,189],{},[14,3604,192],{"id":192},[10,3606,3607],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,3609,199],{},{"title":70,"searchDepth":83,"depth":83,"links":3611},[3612,3613,3614,3615,3616,3617,3618,3619],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3460,"description":3465},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[210,3627,223],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3630,"title":3631,"body":3632,"category":210,"cover":211,"description":3636,"extension":212,"meta":3785,"navigation":92,"path":3786,"pinned":215,"publishedAt":216,"seo":3787,"slug":3788,"stem":3789,"summary":3790,"tags":3791,"updatedAt":216,"visible":92,"__hash__":3793},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3633,"toc":3775},[3634,3637,3639,3642,3644,3650,3653,3655,3674,3676,3678,3712,3714,3720,3722,3724,3739,3741,3753,3755,3766,3768,3770,3773],[10,3635,3636],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3638,16],{"id":16},[10,3640,3641],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3643,22],{"id":22},[10,3645,3646],{},[26,3647],{"alt":3648,"src":3649},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3651,3652],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3654,40],{"id":40},[42,3656,3657,3660,3663],{},[45,3658,3659],{},"集合中的元素不重复。",[45,3661,3662],{},"集合是无序容器，不要依赖打印顺序或索引。",[45,3664,3665,3666,3669,3670,3673],{},"创建空集合必须写 ",[34,3667,3668],{},"set()","；",[34,3671,3672],{},"{}"," 创建的是空字典。",[14,3675,60],{"id":60},[10,3677,63],{},[65,3679,3681],{"className":67,"code":3680,"language":69,"meta":70,"style":70},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3682,3683,3688,3693,3697,3702,3707],{"__ignoreMap":70},[74,3684,3685],{"class":76,"line":77},[74,3686,3687],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[74,3689,3690],{"class":76,"line":83},[74,3691,3692],{},"right = {\"Python\", \"Docker\"}\n",[74,3694,3695],{"class":76,"line":89},[74,3696,93],{"emptyLinePlaceholder":92},[74,3698,3699],{"class":76,"line":96},[74,3700,3701],{},"print(left & right)\n",[74,3703,3704],{"class":76,"line":102},[74,3705,3706],{},"print(left | right)\n",[74,3708,3709],{"class":76,"line":108},[74,3710,3711],{},"print(\"Git\" in left)\n",[10,3713,120],{},[65,3715,3718],{"className":3716,"code":3717,"language":126,"meta":70},[124],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3719,3717],{"__ignoreMap":70},[10,3721,131],{},[14,3723,134],{"id":134},[136,3725,3726,3729],{},[45,3727,3728],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[45,3730,3731,3734,3735,3738],{},[34,3732,3733],{},"&"," 计算交集，",[34,3736,3737],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3740,157],{"id":157},[42,3742,3743,3750],{},[45,3744,2323,3745,3747,3748,57],{},[34,3746,3672],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3749,3668],{},[45,3751,3752],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3754,175],{"id":175},[136,3756,3757,3763],{},[45,3758,3759,3760,3762],{},"把包含重复标签的列表交给 ",[34,3761,3668],{}," 去重。",[45,3764,3765],{},"计算两组课程标签的交集和差集。",[10,3767,189],{},[14,3769,192],{"id":192},[10,3771,3772],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,3774,199],{},{"title":70,"searchDepth":83,"depth":83,"links":3776},[3777,3778,3779,3780,3781,3782,3783,3784],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3631,"description":3636},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[210,3792,223],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3795,"title":3796,"body":3797,"category":210,"cover":211,"description":3801,"extension":212,"meta":3999,"navigation":92,"path":4000,"pinned":215,"publishedAt":216,"seo":4001,"slug":4002,"stem":4003,"summary":4004,"tags":4005,"updatedAt":216,"visible":92,"__hash__":4008},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3798,"toc":3987},[3799,3802,3804,3807,3809,3815,3825,3827,3844,3846,3848,3898,3900,3906,3908,3910,3932,3934,3937,3943,3946,3948,3961,3963,3978,3980,3982,3985],[10,3800,3801],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3803,16],{"id":16},[10,3805,3806],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3808,22],{"id":22},[10,3810,3811],{},[26,3812],{"alt":3813,"src":3814},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3816,3817,3820,3821,3824],{},[34,3818,3819],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3822,3823],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3826,40],{"id":40},[42,3828,3829,3838,3841],{},[45,3830,3831,3833,3834,3837],{},[34,3832,2792],{}," 比较内容是否相等，",[34,3835,3836],{},"is"," 比较是否为同一个对象。",[45,3839,3840],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[45,3842,3843],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3845,60],{"id":60},[10,3847,63],{},[65,3849,3851],{"className":67,"code":3850,"language":69,"meta":70,"style":70},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3852,3853,3858,3863,3868,3872,3877,3882,3887,3892],{"__ignoreMap":70},[74,3854,3855],{"class":76,"line":77},[74,3856,3857],{},"tasks = [\"变量\", \"字符串\"]\n",[74,3859,3860],{"class":76,"line":83},[74,3861,3862],{},"shared = tasks\n",[74,3864,3865],{"class":76,"line":89},[74,3866,3867],{},"backup = tasks.copy()\n",[74,3869,3870],{"class":76,"line":96},[74,3871,93],{"emptyLinePlaceholder":92},[74,3873,3874],{"class":76,"line":102},[74,3875,3876],{},"tasks.append(\"列表\")\n",[74,3878,3879],{"class":76,"line":108},[74,3880,3881],{},"print(shared)\n",[74,3883,3884],{"class":76,"line":114},[74,3885,3886],{},"print(backup)\n",[74,3888,3889],{"class":76,"line":2478},[74,3890,3891],{},"print(tasks is shared)\n",[74,3893,3895],{"class":76,"line":3894},9,[74,3896,3897],{},"print(tasks is backup)\n",[10,3899,120],{},[65,3901,3904],{"className":3902,"code":3903,"language":126,"meta":70},[124],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3905,3903],{"__ignoreMap":70},[10,3907,131],{},[14,3909,134],{"id":134},[136,3911,3912,3918],{},[45,3913,3914,3917],{},[34,3915,3916],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[45,3919,3920,3923,3924,3927,3928,3931],{},[34,3921,3922],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3925,3926],{},"shared"," 能观察到变化，",[34,3929,3930],{},"backup"," 不会。",[313,3933,2682],{"id":2682},[10,3935,3936],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3938,3939],{},[26,3940],{"alt":3941,"src":3942},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3944,3945],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3947,157],{"id":157},[42,3949,3950,3958],{},[45,3951,3952,3953,3955,3956,57],{},"用 ",[34,3954,2792],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,3957,3836],{},[45,3959,3960],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3962,175],{"id":175},[136,3964,3965,3968],{},[45,3966,3967],{},"让两个变量引用同一个字典并修改其中一个。",[45,3969,2323,3970,3973,3974,1141,3976,57],{},[34,3971,3972],{},"copy()"," 创建外层副本，再比较 ",[34,3975,3836],{},[34,3977,2792],{},[10,3979,189],{},[14,3981,192],{"id":192},[10,3983,3984],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,3986,199],{},{"title":70,"searchDepth":83,"depth":83,"links":3988},[3989,3990,3991,3992,3993,3996,3997,3998],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":3994},[3995],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3796,"description":3801},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[210,4006,4007],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4010,"title":4011,"body":4012,"category":210,"cover":211,"description":4016,"extension":212,"meta":4229,"navigation":92,"path":4230,"pinned":215,"publishedAt":216,"seo":4231,"slug":4232,"stem":4233,"summary":4234,"tags":4235,"updatedAt":216,"visible":92,"__hash__":4237},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4013,"toc":4216},[4014,4017,4019,4022,4024,4030,4040,4042,4053,4055,4057,4110,4112,4118,4120,4122,4140,4142,4145,4151,4159,4162,4165,4171,4177,4179,4197,4199,4207,4209,4211,4214],[10,4015,4016],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4018,16],{"id":16},[10,4020,4021],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4023,22],{"id":22},[10,4025,4026],{},[26,4027],{"alt":4028,"src":4029},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4031,4032,2241,4034,2241,4037,4039],{},[34,4033,1140],{},[34,4035,4036],{},"elif",[34,4038,1144],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4041,40],{"id":40},[42,4043,4044,4047,4050],{},[45,4045,4046],{},"冒号表示接下来开始一个代码块。",[45,4048,4049],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[45,4051,4052],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4054,60],{"id":60},[10,4056,63],{},[65,4058,4060],{"className":67,"code":4059,"language":69,"meta":70,"style":70},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4061,4062,4067,4071,4076,4081,4086,4091,4095,4100,4104],{"__ignoreMap":70},[74,4063,4064],{"class":76,"line":77},[74,4065,4066],{},"score = int(input(\"请输入分数：\"))\n",[74,4068,4069],{"class":76,"line":83},[74,4070,93],{"emptyLinePlaceholder":92},[74,4072,4073],{"class":76,"line":89},[74,4074,4075],{},"if score >= 90:\n",[74,4077,4078],{"class":76,"line":96},[74,4079,4080],{},"    level = \"优秀\"\n",[74,4082,4083],{"class":76,"line":102},[74,4084,4085],{},"elif score >= 60:\n",[74,4087,4088],{"class":76,"line":108},[74,4089,4090],{},"    level = \"合格\"\n",[74,4092,4093],{"class":76,"line":114},[74,4094,1130],{},[74,4096,4097],{"class":76,"line":2478},[74,4098,4099],{},"    level = \"需要继续学习\"\n",[74,4101,4102],{"class":76,"line":3894},[74,4103,93],{"emptyLinePlaceholder":92},[74,4105,4107],{"class":76,"line":4106},10,[74,4108,4109],{},"print(level)\n",[10,4111,120],{},[65,4113,4116],{"className":4114,"code":4115,"language":126,"meta":70},[124],"输入 85 时输出：合格\n",[34,4117,4115],{"__ignoreMap":70},[10,4119,131],{},[14,4121,134],{"id":134},[136,4123,4124,4131],{},[45,4125,4126,4127,4130],{},"输入先转换为整数，程序从 ",[34,4128,4129],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[45,4132,4133,4136,4137,4139],{},[34,4134,4135],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4138,1144],{}," 被跳过；最终三个分支只会选择一个。",[313,4141,2682],{"id":2682},[10,4143,4144],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4146,4147],{},[26,4148],{"alt":4149,"src":4150},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4152,4153,4155,4156,4158],{},[34,4154,4129],{}," 必须放在 ",[34,4157,4135],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[313,4160,2682],{"id":4161},"再看一个具体细节-1",[10,4163,4164],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4166,4167],{},[26,4168],{"alt":4169,"src":4170},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4172,4173,4174,4176],{},"同一缩进层级属于同一个代码块；回到 ",[34,4175,1140],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4178,157],{"id":157},[42,4180,4181,4187],{},[45,4182,4183,4184,4186],{},"先写 ",[34,4185,4135],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[45,4188,4189,4190,4192,4193,4196],{},"混用多个独立 ",[34,4191,1140],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4194,4195],{},"if\u002Felif\u002Felse"," 链。",[14,4198,175],{"id":175},[136,4200,4201,4204],{},[45,4202,4203],{},"根据温度输出“冷、适中、热”三个等级。",[45,4205,4206],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4208,189],{},[14,4210,192],{"id":192},[10,4212,4213],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,4215,199],{},{"title":70,"searchDepth":83,"depth":83,"links":4217},[4218,4219,4220,4221,4222,4226,4227,4228],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":4223},[4224,4225],{"id":2682,"depth":89,"text":2682},{"id":4161,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4011,"description":4016},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[210,1140,4236],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4239,"title":4240,"body":4241,"category":210,"cover":211,"description":4245,"extension":212,"meta":4411,"navigation":92,"path":4412,"pinned":215,"publishedAt":216,"seo":4413,"slug":4414,"stem":4415,"summary":4416,"tags":4417,"updatedAt":216,"visible":92,"__hash__":4419},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4242,"toc":4399},[4243,4246,4248,4251,4253,4259,4265,4267,4282,4284,4286,4324,4326,4332,4334,4336,4351,4353,4356,4362,4368,4370,4378,4380,4390,4392,4394,4397],[10,4244,4245],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4247,16],{"id":16},[10,4249,4250],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4252,22],{"id":22},[10,4254,4255],{},[26,4256],{"alt":4257,"src":4258},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4260,4261,4264],{},[34,4262,4263],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4266,40],{"id":40},[42,4268,4269,4272,4275],{},[45,4270,4271],{},"进入循环前先准备参与条件判断的状态。",[45,4273,4274],{},"循环体中必须有机会让条件变为假。",[45,4276,4277,4278,4281],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4279,4280],{},"for"," 通常更直接。",[14,4283,60],{"id":60},[10,4285,63],{},[65,4287,4289],{"className":67,"code":4288,"language":69,"meta":70,"style":70},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4290,4291,4296,4300,4305,4310,4315,4319],{"__ignoreMap":70},[74,4292,4293],{"class":76,"line":77},[74,4294,4295],{},"count = 1\n",[74,4297,4298],{"class":76,"line":83},[74,4299,93],{"emptyLinePlaceholder":92},[74,4301,4302],{"class":76,"line":89},[74,4303,4304],{},"while count \u003C= 3:\n",[74,4306,4307],{"class":76,"line":96},[74,4308,4309],{},"    print(\"第\", count, \"次练习\")\n",[74,4311,4312],{"class":76,"line":102},[74,4313,4314],{},"    count = count + 1\n",[74,4316,4317],{"class":76,"line":108},[74,4318,93],{"emptyLinePlaceholder":92},[74,4320,4321],{"class":76,"line":114},[74,4322,4323],{},"print(\"练习结束\")\n",[10,4325,120],{},[65,4327,4330],{"className":4328,"code":4329,"language":126,"meta":70},[124],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4331,4329],{"__ignoreMap":70},[10,4333,131],{},[14,4335,134],{"id":134},[136,4337,4338,4345],{},[45,4339,4340,4341,4344],{},"进入循环前 ",[34,4342,4343],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[45,4346,4347,4348,4350],{},"循环体末尾把 ",[34,4349,4343],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[313,4352,2682],{"id":2682},[10,4354,4355],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4357,4358],{},[26,4359],{"alt":4360,"src":4361},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4363,4364,4365,4367],{},"第4次检查时 ",[34,4366,4343],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4369,157],{"id":157},[42,4371,4372,4375],{},[45,4373,4374],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[45,4376,4377],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4379,175],{"id":175},[136,4381,4382,4387],{},[45,4383,2323,4384,4386],{},[34,4385,4263],{}," 输出 1 到 5。",[45,4388,4389],{},"计算 1 到 10 的累加和。",[10,4391,189],{},[14,4393,192],{"id":192},[10,4395,4396],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,4398,199],{},{"title":70,"searchDepth":83,"depth":83,"links":4400},[4401,4402,4403,4404,4405,4408,4409,4410],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":4406},[4407],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4240,"description":4245},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[210,4263,4418],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4421,"title":4422,"body":4423,"category":210,"cover":211,"description":4427,"extension":212,"meta":4575,"navigation":92,"path":4576,"pinned":215,"publishedAt":216,"seo":4577,"slug":4578,"stem":4579,"summary":4580,"tags":4581,"updatedAt":216,"visible":92,"__hash__":4583},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4424,"toc":4565},[4425,4428,4430,4433,4435,4441,4446,4448,4462,4464,4466,4504,4506,4512,4514,4516,4533,4535,4543,4545,4556,4558,4560,4563],[10,4426,4427],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4429,16],{"id":16},[10,4431,4432],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4434,22],{"id":22},[10,4436,4437],{},[26,4438],{"alt":4439,"src":4440},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4442,4443,4445],{},[34,4444,4280],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4447,40],{"id":40},[42,4449,4450,4456,4459],{},[45,4451,4452,4455],{},[34,4453,4454],{},"range(1, 4)"," 包含 1，不包含 4。",[45,4457,4458],{},"只需要元素时直接遍历元素，不必手工维护索引。",[45,4460,4461],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4463,60],{"id":60},[10,4465,63],{},[65,4467,4469],{"className":67,"code":4468,"language":69,"meta":70,"style":70},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4470,4471,4476,4480,4485,4490,4494,4499],{"__ignoreMap":70},[74,4472,4473],{"class":76,"line":77},[74,4474,4475],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[74,4477,4478],{"class":76,"line":83},[74,4479,93],{"emptyLinePlaceholder":92},[74,4481,4482],{"class":76,"line":89},[74,4483,4484],{},"for course in courses:\n",[74,4486,4487],{"class":76,"line":96},[74,4488,4489],{},"    print(course)\n",[74,4491,4492],{"class":76,"line":102},[74,4493,93],{"emptyLinePlaceholder":92},[74,4495,4496],{"class":76,"line":108},[74,4497,4498],{},"for number in range(1, 4):\n",[74,4500,4501],{"class":76,"line":114},[74,4502,4503],{},"    print(number)\n",[10,4505,120],{},[65,4507,4510],{"className":4508,"code":4509,"language":126,"meta":70},[124],"变量\n字符串\n列表\n1\n2\n3\n",[34,4511,4509],{"__ignoreMap":70},[10,4513,131],{},[14,4515,134],{"id":134},[136,4517,4518,4528],{},[45,4519,4520,4521,4523,4524,4527],{},"第一个 ",[34,4522,4280],{}," 依次从列表取得字符串，循环变量 ",[34,4525,4526],{},"course"," 每轮重新绑定。",[45,4529,4530,4532],{},[34,4531,4454],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4534,157],{"id":157},[42,4536,4537,4540],{},[45,4538,4539],{},"只需要元素却手工维护索引，增加越界风险。",[45,4541,4542],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4544,175],{"id":175},[136,4546,4547,4550],{},[45,4548,4549],{},"逐项输出一个字符串中的字符。",[45,4551,2323,4552,4555],{},[34,4553,4554],{},"range()"," 输出 2、4、6、8。",[10,4557,189],{},[14,4559,192],{"id":192},[10,4561,4562],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,4564,199],{},{"title":70,"searchDepth":83,"depth":83,"links":4566},[4567,4568,4569,4570,4571,4572,4573,4574],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4422,"description":4427},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[210,4280,4582],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4585,"title":4586,"body":4587,"category":210,"cover":211,"description":4591,"extension":212,"meta":4765,"navigation":92,"path":4766,"pinned":215,"publishedAt":216,"seo":4767,"slug":4768,"stem":4769,"summary":4770,"tags":4771,"updatedAt":216,"visible":92,"__hash__":4772},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4588,"toc":4755},[4589,4592,4594,4597,4599,4605,4615,4617,4636,4638,4640,4692,4694,4700,4702,4704,4718,4720,4736,4738,4746,4748,4750,4753],[10,4590,4591],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4593,16],{"id":16},[10,4595,4596],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4598,22],{"id":22},[10,4600,4601],{},[26,4602],{"alt":4603,"src":4604},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4606,4607,4610,4611,4614],{},[34,4608,4609],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4612,4613],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4616,40],{"id":40},[42,4618,4619,4622,4630],{},[45,4620,4621],{},"先写普通循环，再在确有需要时加入流程控制语句。",[45,4623,4624,4626,4627,4629],{},[34,4625,4609],{}," 前要确认不会跳过 ",[34,4628,4263],{}," 循环中的状态更新。",[45,4631,4632,4633,4635],{},"多层嵌套中 ",[34,4634,4613],{}," 只结束它所在的最内层循环。",[14,4637,60],{"id":60},[10,4639,63],{},[65,4641,4643],{"className":67,"code":4642,"language":69,"meta":70,"style":70},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,4644,4645,4650,4654,4659,4664,4669,4674,4679,4683,4687],{"__ignoreMap":70},[74,4646,4647],{"class":76,"line":77},[74,4648,4649],{},"numbers = [3, -1, 0, 8, 12]\n",[74,4651,4652],{"class":76,"line":83},[74,4653,93],{"emptyLinePlaceholder":92},[74,4655,4656],{"class":76,"line":89},[74,4657,4658],{},"for number in numbers:\n",[74,4660,4661],{"class":76,"line":96},[74,4662,4663],{},"    if number \u003C 0:\n",[74,4665,4666],{"class":76,"line":102},[74,4667,4668],{},"        continue\n",[74,4670,4671],{"class":76,"line":108},[74,4672,4673],{},"    if number == 0:\n",[74,4675,4676],{"class":76,"line":114},[74,4677,4678],{},"        break\n",[74,4680,4681],{"class":76,"line":2478},[74,4682,4503],{},[74,4684,4685],{"class":76,"line":3894},[74,4686,93],{"emptyLinePlaceholder":92},[74,4688,4689],{"class":76,"line":4106},[74,4690,4691],{},"print(\"循环结束\")\n",[10,4693,120],{},[65,4695,4698],{"className":4696,"code":4697,"language":126,"meta":70},[124],"3\n循环结束\n",[34,4699,4697],{"__ignoreMap":70},[10,4701,131],{},[14,4703,134],{"id":134},[136,4705,4706,4712],{},[45,4707,4708,4709,4711],{},"遇到 -1 时 ",[34,4710,4609],{}," 立即结束本轮，后面的判断和输出都不执行。",[45,4713,4714,4715,4717],{},"遇到 0 时 ",[34,4716,4613],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4719,157],{"id":157},[42,4721,4722,4727],{},[45,4723,3408,4724,4726],{},[34,4725,4609],{}," 当作结束循环，实际它只跳到下一轮。",[45,4728,4729,4730,4732,4733,4735],{},"在 ",[34,4731,4263],{}," 中把状态更新放在可能被 ",[34,4734,4609],{}," 跳过的位置，造成无限循环。",[14,4737,175],{"id":175},[136,4739,4740,4743],{},[45,4741,4742],{},"跳过列表中的空字符串并输出其他内容。",[45,4744,4745],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4747,189],{},[14,4749,192],{"id":192},[10,4751,4752],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,4754,199],{},{"title":70,"searchDepth":83,"depth":83,"links":4756},[4757,4758,4759,4760,4761,4762,4763,4764],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4586,"description":4591},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[210,4613,4609],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4774,"title":4775,"body":4776,"category":210,"cover":211,"description":4780,"extension":212,"meta":4951,"navigation":92,"path":4952,"pinned":215,"publishedAt":216,"seo":4953,"slug":4954,"stem":4955,"summary":4956,"tags":4957,"updatedAt":216,"visible":92,"__hash__":4960},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4777,"toc":4939},[4778,4781,4783,4786,4788,4794,4797,4799,4823,4825,4827,4861,4863,4869,4871,4873,4890,4892,4895,4901,4904,4906,4920,4922,4930,4932,4934,4937],[10,4779,4780],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4782,16],{"id":16},[10,4784,4785],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4787,22],{"id":22},[10,4789,4790],{},[26,4791],{"alt":4792,"src":4793},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4795,4796],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4798,40],{"id":40},[42,4800,4801,4804,4807],{},[45,4802,4803],{},"每增加一层嵌套，阅读成本都会上升。",[45,4805,4806],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[45,4808,4809,4810,2241,4813,4816,4817,2241,4820,57],{},"变量名使用 ",[34,4811,4812],{},"row",[34,4814,4815],{},"cell"," 等层级含义，避免全部写成 ",[34,4818,4819],{},"i",[34,4821,4822],{},"j",[14,4824,60],{"id":60},[10,4826,63],{},[65,4828,4830],{"className":67,"code":4829,"language":69,"meta":70,"style":70},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4831,4832,4837,4841,4846,4851,4856],{"__ignoreMap":70},[74,4833,4834],{"class":76,"line":77},[74,4835,4836],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[74,4838,4839],{"class":76,"line":83},[74,4840,93],{"emptyLinePlaceholder":92},[74,4842,4843],{"class":76,"line":89},[74,4844,4845],{},"for row in table:\n",[74,4847,4848],{"class":76,"line":96},[74,4849,4850],{},"    for cell in row:\n",[74,4852,4853],{"class":76,"line":102},[74,4854,4855],{},"        print(cell)\n",[74,4857,4858],{"class":76,"line":108},[74,4859,4860],{},"    print(\"一行结束\")\n",[10,4862,120],{},[65,4864,4867],{"className":4865,"code":4866,"language":126,"meta":70},[124],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4868,4866],{"__ignoreMap":70},[10,4870,131],{},[14,4872,134],{"id":134},[136,4874,4875,4887],{},[45,4876,4877,4878,4880,4881,1141,4884,57],{},"外层变量 ",[34,4879,4812],{}," 先引用第一行列表，内层才依次处理 ",[34,4882,4883],{},"A1",[34,4885,4886],{},"A2",[45,4888,4889],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[313,4891,2682],{"id":2682},[10,4893,4894],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4896,4897],{},[26,4898],{"alt":4899,"src":4900},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4902,4903],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4905,157],{"id":157},[42,4907,4908,4917],{},[45,4909,4910,4911,993,4914,4916],{},"把两层循环变量都叫 ",[34,4912,4913],{},"item",[34,4915,4819],{},"，难以确认当前层级。",[45,4918,4919],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4921,175],{"id":175},[136,4923,4924,4927],{},[45,4925,4926],{},"打印一个 2×3 数字表。",[45,4928,4929],{},"在内层增加条件，只输出大于 3 的元素。",[10,4931,189],{},[14,4933,192],{"id":192},[10,4935,4936],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,4938,199],{},{"title":70,"searchDepth":83,"depth":83,"links":4940},[4941,4942,4943,4944,4945,4948,4949,4950],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":4946},[4947],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4775,"description":4780},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[210,4958,4959],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4962,"title":4963,"body":4964,"category":210,"cover":211,"description":4968,"extension":212,"meta":5106,"navigation":92,"path":5107,"pinned":215,"publishedAt":216,"seo":5108,"slug":5109,"stem":5110,"summary":5111,"tags":5112,"updatedAt":216,"visible":92,"__hash__":5115},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4965,"toc":5096},[4966,4969,4971,4974,4976,4982,4985,4987,4998,5000,5002,5040,5042,5048,5050,5052,5064,5066,5077,5079,5087,5089,5091,5094],[10,4967,4968],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4970,16],{"id":16},[10,4972,4973],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4975,22],{"id":22},[10,4977,4978],{},[26,4979],{"alt":4980,"src":4981},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4983,4984],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4986,40],{"id":40},[42,4988,4989,4992,4995],{},[45,4990,4991],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[45,4993,4994],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[45,4996,4997],{},"推导式创建新列表，不修改输入列表。",[14,4999,60],{"id":60},[10,5001,63],{},[65,5003,5005],{"className":67,"code":5004,"language":69,"meta":70,"style":70},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,5006,5007,5012,5016,5021,5026,5030,5035],{"__ignoreMap":70},[74,5008,5009],{"class":76,"line":77},[74,5010,5011],{},"numbers = [1, 2, 3, 4, 5]\n",[74,5013,5014],{"class":76,"line":83},[74,5015,93],{"emptyLinePlaceholder":92},[74,5017,5018],{"class":76,"line":89},[74,5019,5020],{},"squares = [number * number for number in numbers]\n",[74,5022,5023],{"class":76,"line":96},[74,5024,5025],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[74,5027,5028],{"class":76,"line":102},[74,5029,93],{"emptyLinePlaceholder":92},[74,5031,5032],{"class":76,"line":108},[74,5033,5034],{},"print(squares)\n",[74,5036,5037],{"class":76,"line":114},[74,5038,5039],{},"print(even_squares)\n",[10,5041,120],{},[65,5043,5046],{"className":5044,"code":5045,"language":126,"meta":70},[124],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5047,5045],{"__ignoreMap":70},[10,5049,131],{},[14,5051,134],{"id":134},[136,5053,5054,5057],{},[45,5055,5056],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[45,5058,5059,5060,5063],{},"第二条先用 ",[34,5061,5062],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5065,157],{"id":157},[42,5067,5068,5074],{},[45,5069,5070,5071,5073],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5072,4280],{}," 开始找输入。",[45,5075,5076],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5078,175],{"id":175},[136,5080,5081,5084],{},[45,5082,5083],{},"把字符串列表转换为长度列表。",[45,5085,5086],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5088,189],{},[14,5090,192],{"id":192},[10,5092,5093],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,5095,199],{},{"title":70,"searchDepth":83,"depth":83,"links":5097},[5098,5099,5100,5101,5102,5103,5104,5105],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4963,"description":4968},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[210,5113,5114],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5117,"title":5118,"body":5119,"category":210,"cover":211,"description":5123,"extension":212,"meta":5266,"navigation":92,"path":5267,"pinned":215,"publishedAt":216,"seo":5268,"slug":5269,"stem":5270,"summary":5271,"tags":5272,"updatedAt":216,"visible":92,"__hash__":5275},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5120,"toc":5256},[5121,5124,5126,5129,5131,5137,5140,5142,5153,5155,5157,5196,5198,5204,5206,5208,5223,5225,5233,5235,5247,5249,5251,5254],[10,5122,5123],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5125,16],{"id":16},[10,5127,5128],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5130,22],{"id":22},[10,5132,5133],{},[26,5134],{"alt":5135,"src":5136},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5138,5139],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5141,40],{"id":40},[42,5143,5144,5147,5150],{},[45,5145,5146],{},"函数名描述动作，使用小写字母和下划线。",[45,5148,5149],{},"函数定义要先执行，之后才能调用。",[45,5151,5152],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5154,60],{"id":60},[10,5156,63],{},[65,5158,5160],{"className":67,"code":5159,"language":69,"meta":70,"style":70},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5161,5162,5167,5172,5177,5181,5186,5191],{"__ignoreMap":70},[74,5163,5164],{"class":76,"line":77},[74,5165,5166],{},"def show_progress():\n",[74,5168,5169],{"class":76,"line":83},[74,5170,5171],{},"    print(\"正在学习函数\")\n",[74,5173,5174],{"class":76,"line":89},[74,5175,5176],{},"    print(\"本节完成 50%\")\n",[74,5178,5179],{"class":76,"line":96},[74,5180,93],{"emptyLinePlaceholder":92},[74,5182,5183],{"class":76,"line":102},[74,5184,5185],{},"print(\"调用前\")\n",[74,5187,5188],{"class":76,"line":108},[74,5189,5190],{},"show_progress()\n",[74,5192,5193],{"class":76,"line":114},[74,5194,5195],{},"print(\"调用后\")\n",[10,5197,120],{},[65,5199,5202],{"className":5200,"code":5201,"language":126,"meta":70},[124],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5203,5201],{"__ignoreMap":70},[10,5205,131],{},[14,5207,134],{"id":134},[136,5209,5210,5216],{},[45,5211,922,5212,5215],{},[34,5213,5214],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[45,5217,5218,5219,5222],{},"运行到 ",[34,5220,5221],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5224,157],{"id":157},[42,5226,5227,5230],{},[45,5228,5229],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[45,5231,5232],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5234,175],{"id":175},[136,5236,5237,5244],{},[45,5238,5239,5240,5243],{},"定义 ",[34,5241,5242],{},"show_plan()"," 输出两行学习计划。",[45,5245,5246],{},"连续调用同一个函数两次，观察执行顺序。",[10,5248,189],{},[14,5250,192],{"id":192},[10,5252,5253],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,5255,199],{},{"title":70,"searchDepth":83,"depth":83,"links":5257},[5258,5259,5260,5261,5262,5263,5264,5265],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5118,"description":5123},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[210,5273,5274],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5277,"title":5278,"body":5279,"category":210,"cover":211,"description":5283,"extension":212,"meta":5463,"navigation":92,"path":5464,"pinned":215,"publishedAt":216,"seo":5465,"slug":5466,"stem":5467,"summary":5468,"tags":5469,"updatedAt":216,"visible":92,"__hash__":5472},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5280,"toc":5451},[5281,5284,5286,5289,5291,5297,5304,5306,5323,5325,5327,5361,5363,5369,5371,5373,5394,5396,5399,5405,5415,5417,5432,5434,5442,5444,5446,5449],[10,5282,5283],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5285,16],{"id":16},[10,5287,5288],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5290,22],{"id":22},[10,5292,5293],{},[26,5294],{"alt":5295,"src":5296},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5298,5299,5300,5303],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5301,5302],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5305,40],{"id":40},[42,5307,5308,5311,5314],{},[45,5309,5310],{},"形参出现在函数定义中，实参出现在函数调用中。",[45,5312,5313],{},"局部变量默认只在函数内部可见。",[45,5315,5316,5317,5319,5320,57],{},"没有显式 ",[34,5318,5302],{}," 的函数会返回 ",[34,5321,5322],{},"None",[14,5324,60],{"id":60},[10,5326,63],{},[65,5328,5330],{"className":67,"code":5329,"language":69,"meta":70,"style":70},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,5331,5332,5337,5342,5347,5351,5356],{"__ignoreMap":70},[74,5333,5334],{"class":76,"line":77},[74,5335,5336],{},"def calculate_total(price, count):\n",[74,5338,5339],{"class":76,"line":83},[74,5340,5341],{},"    total = price * count\n",[74,5343,5344],{"class":76,"line":89},[74,5345,5346],{},"    return total\n",[74,5348,5349],{"class":76,"line":96},[74,5350,93],{"emptyLinePlaceholder":92},[74,5352,5353],{"class":76,"line":102},[74,5354,5355],{},"result = calculate_total(25, 4)\n",[74,5357,5358],{"class":76,"line":108},[74,5359,5360],{},"print(result)\n",[10,5362,120],{},[65,5364,5367],{"className":5365,"code":5366,"language":126,"meta":70},[124],"100\n",[34,5368,5366],{"__ignoreMap":70},[10,5370,131],{},[14,5372,134],{"id":134},[136,5374,5375,5384],{},[45,5376,5377,5378,2241,5381,5383],{},"调用时 25 和 4 分别绑定到 ",[34,5379,5380],{},"price",[34,5382,4343],{},"，它们只在本次函数调用的局部范围中使用。",[45,5385,5386,5389,5390,5393],{},[34,5387,5388],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5391,5392],{},"result"," 并输出。",[313,5395,2682],{"id":2682},[10,5397,5398],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5400,5401],{},[26,5402],{"alt":5403,"src":5404},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5406,5407,2241,5409,1141,5411,5414],{},[34,5408,5380],{},[34,5410,4343],{},[34,5412,5413],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5416,157],{"id":157},[42,5418,5419,5426],{},[45,5420,5421,5422,5425],{},"在函数内部只 ",[34,5423,5424],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[45,5427,5428,5429,5431],{},"试图在函数外直接访问局部变量 ",[34,5430,5413],{},"，它的名字只在调用期间的局部作用域存在。",[14,5433,175],{"id":175},[136,5435,5436,5439],{},[45,5437,5438],{},"编写计算长方形面积的函数。",[45,5440,5441],{},"让函数返回结果后在调用方加上单位再输出。",[10,5443,189],{},[14,5445,192],{"id":192},[10,5447,5448],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,5450,199],{},{"title":70,"searchDepth":83,"depth":83,"links":5452},[5453,5454,5455,5456,5457,5460,5461,5462],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":5458},[5459],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5278,"description":5283},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[210,5470,5471],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5474,"title":5475,"body":5476,"category":210,"cover":211,"description":5480,"extension":212,"meta":5660,"navigation":92,"path":5661,"pinned":215,"publishedAt":216,"seo":5662,"slug":5663,"stem":5664,"summary":5665,"tags":5666,"updatedAt":216,"visible":92,"__hash__":5669},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5477,"toc":5648},[5478,5481,5483,5486,5488,5494,5497,5499,5516,5518,5520,5572,5574,5580,5582,5584,5602,5604,5607,5613,5616,5618,5629,5631,5639,5641,5643,5646],[10,5479,5480],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5482,16],{"id":16},[10,5484,5485],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5487,22],{"id":22},[10,5489,5490],{},[26,5491],{"alt":5492,"src":5493},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5495,5496],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5498,40],{"id":40},[42,5500,5501,5504,5510],{},[45,5502,5503],{},"必需参数应放在有默认值的参数之前。",[45,5505,5506,5509],{},[34,5507,5508],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[45,5511,5512,5515],{},[34,5513,5514],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5517,60],{"id":60},[10,5519,63],{},[65,5521,5523],{"className":67,"code":5522,"language":69,"meta":70,"style":70},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,5524,5525,5530,5535,5539,5544,5549,5553,5558,5563,5567],{"__ignoreMap":70},[74,5526,5527],{"class":76,"line":77},[74,5528,5529],{},"def build_title(name, level=\"基础\"):\n",[74,5531,5532],{"class":76,"line":83},[74,5533,5534],{},"    return name + \"｜\" + level\n",[74,5536,5537],{"class":76,"line":89},[74,5538,93],{"emptyLinePlaceholder":92},[74,5540,5541],{"class":76,"line":96},[74,5542,5543],{},"print(build_title(\"Python\"))\n",[74,5545,5546],{"class":76,"line":102},[74,5547,5548],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[74,5550,5551],{"class":76,"line":108},[74,5552,93],{"emptyLinePlaceholder":92},[74,5554,5555],{"class":76,"line":114},[74,5556,5557],{},"def total(*numbers):\n",[74,5559,5560],{"class":76,"line":2478},[74,5561,5562],{},"    return sum(numbers)\n",[74,5564,5565],{"class":76,"line":3894},[74,5566,93],{"emptyLinePlaceholder":92},[74,5568,5569],{"class":76,"line":4106},[74,5570,5571],{},"print(total(10, 20, 30))\n",[10,5573,120],{},[65,5575,5578],{"className":5576,"code":5577,"language":126,"meta":70},[124],"Python｜基础\n异常处理｜进阶\n60\n",[34,5579,5577],{"__ignoreMap":70},[10,5581,131],{},[14,5583,134],{"id":134},[136,5585,5586,5593],{},[45,5587,5588,5589,5592],{},"第一次调用只提供必需参数，",[34,5590,5591],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[45,5594,5595,5598,5599,57],{},[34,5596,5597],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5600,5601],{},"sum()",[313,5603,2682],{"id":2682},[10,5605,5606],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5608,5609],{},[26,5610],{"alt":5611,"src":5612},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5614,5615],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5617,157],{"id":157},[42,5619,5620,5626],{},[45,5621,5622,5623,5625],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5624,5322],{}," 再在函数内创建。",[45,5627,5628],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5630,175],{"id":175},[136,5632,5633,5636],{},[45,5634,5635],{},"给问候函数增加默认称呼。",[45,5637,5638],{},"编写接收任意数量分数并返回总分的函数。",[10,5640,189],{},[14,5642,192],{"id":192},[10,5644,5645],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,5647,199],{},{"title":70,"searchDepth":83,"depth":83,"links":5649},[5650,5651,5652,5653,5654,5657,5658,5659],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":5655},[5656],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5475,"description":5480},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[210,5667,5668],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5671,"title":5672,"body":5673,"category":210,"cover":211,"description":5677,"extension":212,"meta":5874,"navigation":92,"path":5875,"pinned":215,"publishedAt":216,"seo":5876,"slug":5877,"stem":5878,"summary":5879,"tags":5880,"updatedAt":216,"visible":92,"__hash__":5883},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5674,"toc":5862},[5675,5678,5680,5683,5685,5691,5694,5696,5713,5715,5717,5780,5782,5788,5790,5792,5819,5821,5824,5830,5833,5835,5843,5845,5853,5855,5857,5860],[10,5676,5677],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5679,16],{"id":16},[10,5681,5682],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5684,22],{"id":22},[10,5686,5687],{},[26,5688],{"alt":5689,"src":5690},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5692,5693],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5695,40],{"id":40},[42,5697,5698,5701,5704],{},[45,5699,5700],{},"函数内部赋值默认创建局部变量。",[45,5702,5703],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[45,5705,5706,2160,5709,5712],{},[34,5707,5708],{},"global",[34,5710,5711],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5714,60],{"id":60},[10,5716,63],{},[65,5718,5720],{"className":67,"code":5719,"language":69,"meta":70,"style":70},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5721,5722,5727,5731,5736,5741,5745,5750,5755,5760,5764,5769,5774],{"__ignoreMap":70},[74,5723,5724],{"class":76,"line":77},[74,5725,5726],{},"course = \"Python\"\n",[74,5728,5729],{"class":76,"line":83},[74,5730,93],{"emptyLinePlaceholder":92},[74,5732,5733],{"class":76,"line":89},[74,5734,5735],{},"def outer():\n",[74,5737,5738],{"class":76,"line":96},[74,5739,5740],{},"    level = \"基础\"\n",[74,5742,5743],{"class":76,"line":102},[74,5744,93],{"emptyLinePlaceholder":92},[74,5746,5747],{"class":76,"line":108},[74,5748,5749],{},"    def show():\n",[74,5751,5752],{"class":76,"line":114},[74,5753,5754],{},"        lesson = \"作用域\"\n",[74,5756,5757],{"class":76,"line":2478},[74,5758,5759],{},"        print(course, level, lesson)\n",[74,5761,5762],{"class":76,"line":3894},[74,5763,93],{"emptyLinePlaceholder":92},[74,5765,5766],{"class":76,"line":4106},[74,5767,5768],{},"    show()\n",[74,5770,5772],{"class":76,"line":5771},11,[74,5773,93],{"emptyLinePlaceholder":92},[74,5775,5777],{"class":76,"line":5776},12,[74,5778,5779],{},"outer()\n",[10,5781,120],{},[65,5783,5786],{"className":5784,"code":5785,"language":126,"meta":70},[124],"Python 基础 作用域\n",[34,5787,5785],{"__ignoreMap":70},[10,5789,131],{},[14,5791,134],{"id":134},[136,5793,5794,5811],{},[45,5795,5796,5799,5800,5803,5804,5806,5807,5810],{},[34,5797,5798],{},"show()"," 中查找 ",[34,5801,5802],{},"lesson"," 时先在局部找到，查找 ",[34,5805,5591],{}," 时到外层 ",[34,5808,5809],{},"outer()"," 找到。",[45,5812,5813,5815,5816,5818],{},[34,5814,4526],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5817,2192],{}," 最后在内置作用域找到。",[313,5820,2682],{"id":2682},[10,5822,5823],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5825,5826],{},[26,5827],{"alt":5828,"src":5829},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5831,5832],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5834,157],{"id":157},[42,5836,5837,5840],{},[45,5838,5839],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[45,5841,5842],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5844,175],{"id":175},[136,5846,5847,5850],{},[45,5848,5849],{},"在内外层定义同名变量，观察最近作用域优先。",[45,5851,5852],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5854,189],{},[14,5856,192],{"id":192},[10,5858,5859],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,5861,199],{},{"title":70,"searchDepth":83,"depth":83,"links":5863},[5864,5865,5866,5867,5868,5871,5872,5873],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":5869},[5870],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5672,"description":5677},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[210,5881,5882],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5885,"title":5886,"body":5887,"category":210,"cover":211,"description":5891,"extension":212,"meta":6041,"navigation":92,"path":6042,"pinned":215,"publishedAt":216,"seo":6043,"slug":6044,"stem":6045,"summary":6046,"tags":6047,"updatedAt":216,"visible":92,"__hash__":6050},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5888,"toc":6031},[5889,5892,5894,5897,5899,5905,5908,5910,5929,5931,5933,5967,5969,5975,5977,5979,5994,5996,6008,6010,6022,6024,6026,6029],[10,5890,5891],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5893,16],{"id":16},[10,5895,5896],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5898,22],{"id":22},[10,5900,5901],{},[26,5902],{"alt":5903,"src":5904},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5906,5907],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5909,40],{"id":40},[42,5911,5912,5915,5918],{},[45,5913,5914],{},"文档字符串紧跟在函数定义后的第一条语句。",[45,5916,5917],{},"注解表达接口意图，不代替输入校验和测试。",[45,5919,5920,5921,2241,5923,2241,5925,5928],{},"基础注解优先使用 ",[34,5922,2244],{},[34,5924,2410],{},[34,5926,5927],{},"list[str]"," 等直接写法。",[14,5930,60],{"id":60},[10,5932,63],{},[65,5934,5936],{"className":67,"code":5935,"language":69,"meta":70,"style":70},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5937,5938,5943,5948,5953,5957,5962],{"__ignoreMap":70},[74,5939,5940],{"class":76,"line":77},[74,5941,5942],{},"def format_score(name: str, score: int) -> str:\n",[74,5944,5945],{"class":76,"line":83},[74,5946,5947],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[74,5949,5950],{"class":76,"line":89},[74,5951,5952],{},"    return name + \"：\" + str(score)\n",[74,5954,5955],{"class":76,"line":96},[74,5956,93],{"emptyLinePlaceholder":92},[74,5958,5959],{"class":76,"line":102},[74,5960,5961],{},"print(format_score(\"小郑\", 95))\n",[74,5963,5964],{"class":76,"line":108},[74,5965,5966],{},"print(format_score.__doc__)\n",[10,5968,120],{},[65,5970,5973],{"className":5971,"code":5972,"language":126,"meta":70},[124],"小郑：95\n返回带姓名的分数文本。\n",[34,5974,5972],{"__ignoreMap":70},[10,5976,131],{},[14,5978,134],{"id":134},[136,5980,5981,5991],{},[45,5982,5983,5984,5987,5988,5990],{},"函数签名说明 ",[34,5985,5986],{},"name"," 预期为字符串、",[34,5989,2230],{}," 预期为整数，返回值预期为字符串。",[45,5992,5993],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5995,157],{"id":157},[42,5997,5998,6005],{},[45,5999,6000,6001,6004],{},"认为加了 ",[34,6002,6003],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[45,6006,6007],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6009,175],{"id":175},[136,6011,6012,6015],{},[45,6013,6014],{},"为面积函数补充参数和返回值注解。",[45,6016,6017,6018,6021],{},"通过 ",[34,6019,6020],{},"函数名.__doc__"," 查看文档字符串。",[10,6023,189],{},[14,6025,192],{"id":192},[10,6027,6028],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,6030,199],{},{"title":70,"searchDepth":83,"depth":83,"links":6032},[6033,6034,6035,6036,6037,6038,6039,6040],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5886,"description":5891},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[210,6048,6049],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6052,"title":6053,"body":6054,"category":210,"cover":211,"description":6058,"extension":212,"meta":6285,"navigation":92,"path":6286,"pinned":215,"publishedAt":216,"seo":6287,"slug":6288,"stem":6289,"summary":6290,"tags":6291,"updatedAt":216,"visible":92,"__hash__":6294},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6055,"toc":6273},[6056,6059,6061,6067,6069,6075,6086,6088,6106,6108,6115,6144,6151,6170,6179,6181,6187,6189,6191,6214,6216,6219,6225,6231,6233,6249,6251,6264,6266,6268,6271],[10,6057,6058],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6060,16],{"id":16},[10,6062,6063,6064,6066],{},"本篇只处理“模块、import 与 ",[279,6065,5986],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6068,22],{"id":22},[10,6070,6071],{},[26,6072],{"alt":6073,"src":6074},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6076,6077,6078,6081,6082,6085],{},"同一个文件直接运行时 ",[34,6079,6080],{},"__name__"," 等于 ",[34,6083,6084],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6087,40],{"id":40},[42,6089,6090,6096,6099],{},[45,6091,6092,6093,6095],{},"一个 ",[34,6094,1155],{}," 文件就是一个模块。",[45,6097,6098],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[45,6100,6101,6102,6105],{},"避免使用 ",[34,6103,6104],{},"from module import *","，它会让名字来源不清楚。",[14,6107,60],{"id":60},[10,6109,6110,6111,6114],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6112,6113],{},"calculator.py","：",[65,6116,6118],{"className":67,"code":6117,"language":69,"meta":70,"style":70},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6119,6120,6125,6130,6134,6139],{"__ignoreMap":70},[74,6121,6122],{"class":76,"line":77},[74,6123,6124],{},"def add(left, right):\n",[74,6126,6127],{"class":76,"line":83},[74,6128,6129],{},"    return left + right\n",[74,6131,6132],{"class":76,"line":89},[74,6133,93],{"emptyLinePlaceholder":92},[74,6135,6136],{"class":76,"line":96},[74,6137,6138],{},"if __name__ == \"__main__\":\n",[74,6140,6141],{"class":76,"line":102},[74,6142,6143],{},"    print(add(2, 3))\n",[10,6145,6146,6147,6150],{},"再创建 ",[34,6148,6149],{},"app.py","，从模块中导入函数：",[65,6152,6154],{"className":67,"code":6153,"language":69,"meta":70,"style":70},"from calculator import add\n\nprint(add(10, 20))\n",[34,6155,6156,6161,6165],{"__ignoreMap":70},[74,6157,6158],{"class":76,"line":77},[74,6159,6160],{},"from calculator import add\n",[74,6162,6163],{"class":76,"line":83},[74,6164,93],{"emptyLinePlaceholder":92},[74,6166,6167],{"class":76,"line":89},[74,6168,6169],{},"print(add(10, 20))\n",[10,6171,6172,6173,1141,6176,57],{},"分别执行 ",[34,6174,6175],{},"python3 calculator.py",[34,6177,6178],{},"python3 app.py",[10,6180,120],{},[65,6182,6185],{"className":6183,"code":6184,"language":126,"meta":70},[124],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6186,6184],{"__ignoreMap":70},[10,6188,131],{},[14,6190,134],{"id":134},[136,6192,6193,6203],{},[45,6194,6195,6196,6198,6199,6202],{},"直接运行 ",[34,6197,6113],{}," 时，模块名是 ",[34,6200,6201],{},"__main__","，入口代码输出 5。",[45,6204,6205,6207,6208,6210,6211,6213],{},[34,6206,6149],{}," 导入模块时，",[34,6209,6113],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6212,6149],{}," 调用函数输出 30。",[313,6215,2682],{"id":2682},[10,6217,6218],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6220,6221],{},[26,6222],{"alt":6223,"src":6224},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6226,6227,6228,6230],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6229,6201],{}," 保护下的演示代码。",[14,6232,157],{"id":157},[42,6234,6235,6242],{},[45,6236,6237,6238,1141,6240,57],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6239,6113],{},[34,6241,6149],{},[45,6243,6244,6245,6248],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6246,6247],{},"json.py","，导致导入目标被遮蔽。",[14,6250,175],{"id":175},[136,6252,6253,6259],{},[45,6254,2338,6255,6258],{},[34,6256,6257],{},"text_tools.py"," 并导出一个格式化函数。",[45,6260,6261,6262,57],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6263,6080],{},[10,6265,189],{},[14,6267,192],{"id":192},[10,6269,6270],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,6272,199],{},{"title":70,"searchDepth":83,"depth":83,"links":6274},[6275,6276,6277,6278,6279,6282,6283,6284],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":6280},[6281],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6053,"description":6058},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[210,6292,6293],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6296,"title":6297,"body":6298,"category":210,"cover":211,"description":6302,"extension":212,"meta":6467,"navigation":92,"path":6468,"pinned":215,"publishedAt":216,"seo":6469,"slug":6470,"stem":6471,"summary":6472,"tags":6473,"updatedAt":216,"visible":92,"__hash__":6475},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6299,"toc":6457},[6300,6303,6305,6308,6310,6316,6319,6321,6335,6337,6339,6385,6387,6393,6395,6397,6423,6425,6435,6437,6448,6450,6452,6455],[10,6301,6302],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6304,16],{"id":16},[10,6306,6307],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6309,22],{"id":22},[10,6311,6312],{},[26,6313],{"alt":6314,"src":6315},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6317,6318],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6320,40],{"id":40},[42,6322,6323,6329,6332],{},[45,6324,6325,6328],{},[34,6326,6327],{},".venv"," 是常见目录名，不应提交到 Git。",[45,6330,6331],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[45,6333,6334],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6336,60],{"id":60},[10,6338,1558],{},[65,6340,6342],{"className":575,"code":6341,"language":577,"meta":70,"style":70},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6343,6344,6356,6364,6370,6380],{"__ignoreMap":70},[74,6345,6346,6348,6350,6353],{"class":76,"line":77},[74,6347,675],{"class":584},[74,6349,617],{"class":587},[74,6351,6352],{"class":620}," venv",[74,6354,6355],{"class":620}," .venv\n",[74,6357,6358,6361],{"class":76,"line":83},[74,6359,6360],{"class":587},"source",[74,6362,6363],{"class":620}," .venv\u002Fbin\u002Factivate\n",[74,6365,6366,6368],{"class":76,"line":89},[74,6367,69],{"class":584},[74,6369,588],{"class":587},[74,6371,6372,6374,6376,6378],{"class":76,"line":96},[74,6373,69],{"class":584},[74,6375,617],{"class":587},[74,6377,621],{"class":620},[74,6379,588],{"class":587},[74,6381,6382],{"class":76,"line":102},[74,6383,6384],{"class":584},"deactivate\n",[10,6386,120],{},[65,6388,6391],{"className":6389,"code":6390,"language":126,"meta":70},[124],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6392,6390],{"__ignoreMap":70},[10,6394,131],{},[14,6396,134],{"id":134},[136,6398,6399,6408],{},[45,6400,6401,6404,6405,6407],{},[34,6402,6403],{},"venv"," 根据当前 ",[34,6406,675],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[45,6409,6410,6411,2160,6413,6416,6417,3669,6419,6422],{},"激活后 ",[34,6412,69],{},[34,6414,6415],{},"python -m pip"," 优先指向 ",[34,6418,6327],{},[34,6420,6421],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6424,157],{"id":157},[42,6426,6427,6430],{},[45,6428,6429],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[45,6431,3408,6432,6434],{},[34,6433,6327],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6436,175],{"id":175},[136,6438,6439,6445],{},[45,6440,6441,6442,57],{},"创建虚拟环境并记录激活前后的 ",[34,6443,6444],{},"which python",[45,6446,6447],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6449,189],{},[14,6451,192],{"id":192},[10,6453,6454],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,6456,1642],{},{"title":70,"searchDepth":83,"depth":83,"links":6458},[6459,6460,6461,6462,6463,6464,6465,6466],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6297,"description":6302},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[210,6474,245],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6477,"title":6478,"body":6479,"category":210,"cover":211,"description":6483,"extension":212,"meta":6671,"navigation":92,"path":6672,"pinned":215,"publishedAt":216,"seo":6673,"slug":6674,"stem":6675,"summary":6676,"tags":6677,"updatedAt":216,"visible":92,"__hash__":6680},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6480,"toc":6661},[6481,6484,6486,6489,6491,6497,6506,6508,6532,6534,6536,6589,6591,6597,6599,6601,6617,6619,6638,6640,6652,6654,6656,6659],[10,6482,6483],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6485,16],{"id":16},[10,6487,6488],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6490,22],{"id":22},[10,6492,6493],{},[26,6494],{"alt":6495,"src":6496},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6498,6499,6502,6503,6505],{},[34,6500,6501],{},"Path"," 使用 ",[34,6504,2420],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6507,40],{"id":40},[42,6509,6510,6513,6525],{},[45,6511,6512],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[45,6514,6515,2241,6518,2241,6521,6524],{},[34,6516,6517],{},"exists()",[34,6519,6520],{},"is_file()",[34,6522,6523],{},"is_dir()"," 检查真实文件系统状态。",[45,6526,6527,6528,6531],{},"创建目录前明确目标；",[34,6529,6530],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6533,60],{"id":60},[10,6535,63],{},[65,6537,6539],{"className":67,"code":6538,"language":69,"meta":70,"style":70},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,6540,6541,6546,6550,6555,6560,6565,6569,6574,6579,6584],{"__ignoreMap":70},[74,6542,6543],{"class":76,"line":77},[74,6544,6545],{},"from pathlib import Path\n",[74,6547,6548],{"class":76,"line":83},[74,6549,93],{"emptyLinePlaceholder":92},[74,6551,6552],{"class":76,"line":89},[74,6553,6554],{},"project = Path.cwd()\n",[74,6556,6557],{"class":76,"line":96},[74,6558,6559],{},"data_dir = project \u002F \"data\"\n",[74,6561,6562],{"class":76,"line":102},[74,6563,6564],{},"file_path = data_dir \u002F \"records.json\"\n",[74,6566,6567],{"class":76,"line":108},[74,6568,93],{"emptyLinePlaceholder":92},[74,6570,6571],{"class":76,"line":114},[74,6572,6573],{},"print(project)\n",[74,6575,6576],{"class":76,"line":2478},[74,6577,6578],{},"print(file_path.name)\n",[74,6580,6581],{"class":76,"line":3894},[74,6582,6583],{},"print(file_path.suffix)\n",[74,6585,6586],{"class":76,"line":4106},[74,6587,6588],{},"print(file_path.exists())\n",[10,6590,120],{},[65,6592,6595],{"className":6593,"code":6594,"language":126,"meta":70},[124],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6596,6594],{"__ignoreMap":70},[10,6598,131],{},[14,6600,134],{"id":134},[136,6602,6603,6609],{},[45,6604,6605,6608],{},[34,6606,6607],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[45,6610,2323,6611,6613,6614,6616],{},[34,6612,2420],{}," 组合路径片段只创建新的 ",[34,6615,6501],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6618,157],{"id":157},[42,6620,6621,6629],{},[45,6622,3408,6623,6625,6626,6628],{},[34,6624,6501],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6627,6517],{}," 等方法确认。",[45,6630,6631,6632,993,6634,6637],{},"手工拼接 ",[34,6633,2420],{},[34,6635,6636],{},"\\"," 分隔符，降低跨平台可读性。",[14,6639,175],{"id":175},[136,6641,6642,6649],{},[45,6643,6644,6645,6648],{},"组合 ",[34,6646,6647],{},"output\u002Freport.txt"," 路径但先不创建文件。",[45,6650,6651],{},"输出路径的父目录、文件名和扩展名。",[10,6653,189],{},[14,6655,192],{"id":192},[10,6657,6658],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,6660,199],{},{"title":70,"searchDepth":83,"depth":83,"links":6662},[6663,6664,6665,6666,6667,6668,6669,6670],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6478,"description":6483},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[210,6678,6679],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6682,"title":6683,"body":6684,"category":210,"cover":211,"description":6688,"extension":212,"meta":6866,"navigation":92,"path":6867,"pinned":215,"publishedAt":216,"seo":6868,"slug":6869,"stem":6870,"summary":6871,"tags":6872,"updatedAt":216,"visible":92,"__hash__":6875},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6685,"toc":6856},[6686,6689,6691,6694,6696,6702,6705,6707,6735,6737,6739,6796,6798,6804,6806,6808,6819,6821,6834,6836,6847,6849,6851,6854],[10,6687,6688],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6690,16],{"id":16},[10,6692,6693],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6695,22],{"id":22},[10,6697,6698],{},[26,6699],{"alt":6700,"src":6701},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6703,6704],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6706,40],{"id":40},[42,6708,6709,6715,6724],{},[45,6710,6711,6714],{},[34,6712,6713],{},"w"," 模式会截断原文件，写入前必须确认目标。",[45,6716,6717,6720,6721,57],{},[34,6718,6719],{},"r"," 模式读取不存在文件会产生 ",[34,6722,6723],{},"FileNotFoundError",[45,6725,6726,6727,6730,6731,6734],{},"本篇显式调用 ",[34,6728,6729],{},"close()","；第 34 篇会用 ",[34,6732,6733],{},"with"," 更可靠地管理关闭动作。",[14,6736,60],{"id":60},[10,6738,63],{},[65,6740,6742],{"className":67,"code":6741,"language":69,"meta":70,"style":70},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,6743,6744,6748,6752,6757,6762,6767,6772,6776,6781,6786,6791],{"__ignoreMap":70},[74,6745,6746],{"class":76,"line":77},[74,6747,6545],{},[74,6749,6750],{"class":76,"line":83},[74,6751,93],{"emptyLinePlaceholder":92},[74,6753,6754],{"class":76,"line":89},[74,6755,6756],{},"file_path = Path(\"notes.txt\")\n",[74,6758,6759],{"class":76,"line":96},[74,6760,6761],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[74,6763,6764],{"class":76,"line":102},[74,6765,6766],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[74,6768,6769],{"class":76,"line":108},[74,6770,6771],{},"writer.close()\n",[74,6773,6774],{"class":76,"line":114},[74,6775,93],{"emptyLinePlaceholder":92},[74,6777,6778],{"class":76,"line":2478},[74,6779,6780],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[74,6782,6783],{"class":76,"line":3894},[74,6784,6785],{},"content = reader.read()\n",[74,6787,6788],{"class":76,"line":4106},[74,6789,6790],{},"reader.close()\n",[74,6792,6793],{"class":76,"line":5771},[74,6794,6795],{},"print(content)\n",[10,6797,120],{},[65,6799,6802],{"className":6800,"code":6801,"language":126,"meta":70},[124],"变量\n循环\n函数\n",[34,6803,6801],{"__ignoreMap":70},[10,6805,131],{},[14,6807,134],{"id":134},[136,6809,6810,6816],{},[45,6811,6812,6813,6815],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6814,6729],{}," 确保缓冲内容交给文件系统。",[45,6817,6818],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6820,157],{"id":157},[42,6822,6823,6828],{},[45,6824,2323,6825,6827],{},[34,6826,6713],{}," 模式打开重要文件却未确认覆盖风险。",[45,6829,6830,6831,57],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6832,6833],{},"encoding=\"utf-8\"",[14,6835,175],{"id":175},[136,6837,6838,6841],{},[45,6839,6840],{},"写入三行学习记录并读取。",[45,6842,6843,6844,6846],{},"改用 ",[34,6845,321],{}," 模式追加一行，确认原内容仍保留。",[10,6848,189],{},[14,6850,192],{"id":192},[10,6852,6853],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,6855,199],{},{"title":70,"searchDepth":83,"depth":83,"links":6857},[6858,6859,6860,6861,6862,6863,6864,6865],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6683,"description":6688},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[210,6873,6874],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6877,"title":6878,"body":6879,"category":210,"cover":211,"description":6883,"extension":212,"meta":7050,"navigation":92,"path":7051,"pinned":215,"publishedAt":216,"seo":7052,"slug":7053,"stem":7054,"summary":7055,"tags":7056,"updatedAt":216,"visible":92,"__hash__":7059},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6880,"toc":7040},[6881,6884,6886,6889,6891,6897,6907,6909,6923,6925,6927,6987,6989,6995,6997,6999,7011,7013,7021,7023,7031,7033,7035,7038],[10,6882,6883],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6885,16],{"id":16},[10,6887,6888],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6890,22],{"id":22},[10,6892,6893],{},[26,6894],{"alt":6895,"src":6896},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6898,6899,6902,6903,6906],{},[34,6900,6901],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6904,6905],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6908,40],{"id":40},[42,6910,6911,6914,6920],{},[45,6912,6913],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[45,6915,6916,6919],{},[34,6917,6918],{},"ensure_ascii=False"," 让中文以可读字符写入。",[45,6921,6922],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6924,60],{"id":60},[10,6926,63],{},[65,6928,6930],{"className":67,"code":6929,"language":69,"meta":70,"style":70},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,6931,6932,6937,6941,6946,6950,6955,6960,6964,6968,6973,6978,6982],{"__ignoreMap":70},[74,6933,6934],{"class":76,"line":77},[74,6935,6936],{},"import json\n",[74,6938,6939],{"class":76,"line":83},[74,6940,93],{"emptyLinePlaceholder":92},[74,6942,6943],{"class":76,"line":89},[74,6944,6945],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[74,6947,6948],{"class":76,"line":96},[74,6949,93],{"emptyLinePlaceholder":92},[74,6951,6952],{"class":76,"line":102},[74,6953,6954],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[74,6956,6957],{"class":76,"line":108},[74,6958,6959],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[74,6961,6962],{"class":76,"line":114},[74,6963,6771],{},[74,6965,6966],{"class":76,"line":2478},[74,6967,93],{"emptyLinePlaceholder":92},[74,6969,6970],{"class":76,"line":3894},[74,6971,6972],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[74,6974,6975],{"class":76,"line":4106},[74,6976,6977],{},"loaded = json.load(reader)\n",[74,6979,6980],{"class":76,"line":5771},[74,6981,6790],{},[74,6983,6984],{"class":76,"line":5776},[74,6985,6986],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6988,120],{},[65,6990,6993],{"className":6991,"code":6992,"language":126,"meta":70},[124],"Python 60\n",[34,6994,6992],{"__ignoreMap":70},[10,6996,131],{},[14,6998,134],{"id":134},[136,7000,7001,7006],{},[45,7002,7003,7005],{},[34,7004,6901],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[45,7007,7008,7010],{},[34,7009,6905],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7012,157],{"id":157},[42,7014,7015,7018],{},[45,7016,7017],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[45,7019,7020],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7022,175],{"id":175},[136,7024,7025,7028],{},[45,7026,7027],{},"保存包含两条学习记录的列表。",[45,7029,7030],{},"读取后修改进度，再重新写回文件。",[10,7032,189],{},[14,7034,192],{"id":192},[10,7036,7037],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,7039,199],{},{"title":70,"searchDepth":83,"depth":83,"links":7041},[7042,7043,7044,7045,7046,7047,7048,7049],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6878,"description":6883},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[210,7057,7058],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7061,"title":7062,"body":7063,"category":210,"cover":211,"description":7067,"extension":212,"meta":7251,"navigation":92,"path":7252,"pinned":215,"publishedAt":216,"seo":7253,"slug":7254,"stem":7255,"summary":7256,"tags":7257,"updatedAt":216,"visible":92,"__hash__":7260},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7064,"toc":7241},[7065,7068,7070,7073,7075,7081,7087,7089,7111,7113,7115,7178,7180,7186,7188,7190,7206,7208,7222,7224,7232,7234,7236,7239],[10,7066,7067],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7069,16],{"id":16},[10,7071,7072],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7074,22],{"id":22},[10,7076,7077],{},[26,7078],{"alt":7079,"src":7080},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7082,7083,7086],{},[34,7084,7085],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7088,40],{"id":40},[42,7090,7091,7101,7108],{},[45,7092,2323,7093,7096,7097,7100],{},[34,7094,7095],{},"newline=\"\""," 让 ",[34,7098,7099],{},"csv"," 模块正确处理换行。",[45,7102,7103,7104,7107],{},"字段顺序由 ",[34,7105,7106],{},"fieldnames"," 决定，字典键需要与字段名一致。",[45,7109,7110],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7112,60],{"id":60},[10,7114,63],{},[65,7116,7118],{"className":67,"code":7117,"language":69,"meta":70,"style":70},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,7119,7120,7125,7129,7134,7139,7144,7149,7154,7158,7163,7168,7173],{"__ignoreMap":70},[74,7121,7122],{"class":76,"line":77},[74,7123,7124],{},"import csv\n",[74,7126,7127],{"class":76,"line":83},[74,7128,93],{"emptyLinePlaceholder":92},[74,7130,7131],{"class":76,"line":89},[74,7132,7133],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[74,7135,7136],{"class":76,"line":96},[74,7137,7138],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[74,7140,7141],{"class":76,"line":102},[74,7142,7143],{},"writer.writeheader()\n",[74,7145,7146],{"class":76,"line":108},[74,7147,7148],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[74,7150,7151],{"class":76,"line":114},[74,7152,7153],{},"writer_file.close()\n",[74,7155,7156],{"class":76,"line":2478},[74,7157,93],{"emptyLinePlaceholder":92},[74,7159,7160],{"class":76,"line":3894},[74,7161,7162],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[74,7164,7165],{"class":76,"line":4106},[74,7166,7167],{},"for row in csv.DictReader(reader_file):\n",[74,7169,7170],{"class":76,"line":5771},[74,7171,7172],{},"    print(row[\"name\"], row[\"score\"])\n",[74,7174,7175],{"class":76,"line":5776},[74,7176,7177],{},"reader_file.close()\n",[10,7179,120],{},[65,7181,7184],{"className":7182,"code":7183,"language":126,"meta":70},[124],"小郑 95\n",[34,7185,7183],{"__ignoreMap":70},[10,7187,131],{},[14,7189,134],{"id":134},[136,7191,7192,7201],{},[45,7193,7194,7197,7198,7200],{},[34,7195,7196],{},"DictWriter"," 按 ",[34,7199,7106],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[45,7202,7203,7205],{},[34,7204,7085],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7207,157],{"id":157},[42,7209,7210,7213],{},[45,7211,7212],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[45,7214,7215,7216,7218,7219,7221],{},"在 macOS 以外环境忽略 ",[34,7217,7095],{}," 可能出现额外空行；统一交给 ",[34,7220,7099],{}," 模块管理换行。",[14,7223,175],{"id":175},[136,7225,7226,7229],{},[45,7227,7228],{},"写入三名学习者的课程和分数。",[45,7230,7231],{},"读取 CSV 后把分数字符串转换为整数。",[10,7233,189],{},[14,7235,192],{"id":192},[10,7237,7238],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,7240,199],{},{"title":70,"searchDepth":83,"depth":83,"links":7242},[7243,7244,7245,7246,7247,7248,7249,7250],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7062,"description":7067},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[210,7258,7259],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7262,"title":7263,"body":7264,"category":210,"cover":211,"description":7268,"extension":212,"meta":7541,"navigation":92,"path":7542,"pinned":215,"publishedAt":216,"seo":7543,"slug":7544,"stem":7545,"summary":7546,"tags":7547,"updatedAt":216,"visible":92,"__hash__":7550},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7265,"toc":7528},[7266,7269,7271,7274,7276,7282,7293,7295,7312,7314,7316,7391,7393,7399,7401,7403,7428,7430,7439,7445,7456,7458,7464,7470,7479,7481,7496,7498,7519,7521,7523,7526],[10,7267,7268],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7270,16],{"id":16},[10,7272,7273],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7275,22],{"id":22},[10,7277,7278],{},[26,7279],{"alt":7280,"src":7281},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7283,7284,7285,7288,7289,7292],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7286,7287],{},"except","；无论是否异常，",[34,7290,7291],{},"finally"," 都会在离开结构前执行。",[14,7294,40],{"id":40},[42,7296,7297,7303,7309],{},[45,7298,7299,7300,7302],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7301,7287],{}," 吞掉全部错误。",[45,7304,7305,7308],{},[34,7306,7307],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[45,7310,7311],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7313,60],{"id":60},[10,7315,63],{},[65,7317,7319],{"className":67,"code":7318,"language":69,"meta":70,"style":70},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,7320,7321,7326,7331,7336,7341,7346,7350,7355,7360,7365,7370,7374,7379,7385],{"__ignoreMap":70},[74,7322,7323],{"class":76,"line":77},[74,7324,7325],{},"def parse_age(text):\n",[74,7327,7328],{"class":76,"line":83},[74,7329,7330],{},"    age = int(text)\n",[74,7332,7333],{"class":76,"line":89},[74,7334,7335],{},"    if age \u003C 0:\n",[74,7337,7338],{"class":76,"line":96},[74,7339,7340],{},"        raise ValueError(\"年龄不能为负数\")\n",[74,7342,7343],{"class":76,"line":102},[74,7344,7345],{},"    return age\n",[74,7347,7348],{"class":76,"line":108},[74,7349,93],{"emptyLinePlaceholder":92},[74,7351,7352],{"class":76,"line":114},[74,7353,7354],{},"try:\n",[74,7356,7357],{"class":76,"line":2478},[74,7358,7359],{},"    age = parse_age(\"18\")\n",[74,7361,7362],{"class":76,"line":3894},[74,7363,7364],{},"except ValueError as error:\n",[74,7366,7367],{"class":76,"line":4106},[74,7368,7369],{},"    print(\"输入错误：\", error)\n",[74,7371,7372],{"class":76,"line":5771},[74,7373,1130],{},[74,7375,7376],{"class":76,"line":5776},[74,7377,7378],{},"    print(\"年龄：\", age)\n",[74,7380,7382],{"class":76,"line":7381},13,[74,7383,7384],{},"finally:\n",[74,7386,7388],{"class":76,"line":7387},14,[74,7389,7390],{},"    print(\"处理结束\")\n",[10,7392,120],{},[65,7394,7397],{"className":7395,"code":7396,"language":126,"meta":70},[124],"年龄： 18\n处理结束\n",[34,7398,7396],{"__ignoreMap":70},[10,7400,131],{},[14,7402,134],{"id":134},[136,7404,7405,7417],{},[45,7406,7407,7409,7410,7412,7413,7416],{},[34,7408,3021],{}," 或主动 ",[34,7411,7307],{}," 都可能产生 ",[34,7414,7415],{},"ValueError","，控制流立即离开当前正常路径。",[45,7418,7419,7420,7422,7423,7425,7426,57],{},"有异常时进入匹配的 ",[34,7421,7287],{},"；没有异常时执行 ",[34,7424,1144],{},"；两种情况最后都会执行 ",[34,7427,7291],{},[313,7429,2682],{"id":2682},[10,7431,7432,2241,7434,1141,7436,7438],{},[34,7433,7287],{},[34,7435,1144],{},[34,7437,7291],{}," 的职责不同，不能只看它们出现的顺序。",[10,7440,7441],{},[26,7442],{"alt":7443,"src":7444},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7446,7447,7449,7450,7452,7453,7455],{},[34,7448,7287],{}," 处理匹配异常，",[34,7451,1144],{}," 只在无异常时运行，",[34,7454,7291],{}," 负责两条路径都需要的清理动作。",[313,7457,2682],{"id":4161},[10,7459,7460,7463],{},[34,7461,7462],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7465,7466],{},[26,7467],{"alt":7468,"src":7469},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7471,7472,7473,7475,7476,7478],{},"只把可能产生预期异常的操作放进 ",[34,7474,7462],{},"，后续正常业务放进 ",[34,7477,1144],{},"，错误边界会更清楚。",[14,7480,157],{"id":157},[42,7482,7483,7490],{},[45,7484,7485,7486,7489],{},"使用裸 ",[34,7487,7488],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[45,7491,7492,7493,7495],{},"把整个程序包在一个巨大 ",[34,7494,7462],{}," 中，无法判断究竟哪一步允许失败。",[14,7497,175],{"id":175},[136,7499,7500,7513],{},[45,7501,7502,7503,7506,7507,1141,7510,57],{},"让 ",[34,7504,7505],{},"parse_age"," 分别处理 ",[34,7508,7509],{},"\"abc\"",[34,7511,7512],{},"\"-1\"",[45,7514,7515,7516,7518],{},"为文件读取捕获 ",[34,7517,6723],{}," 并给出清晰提示。",[10,7520,189],{},[14,7522,192],{"id":192},[10,7524,7525],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,7527,199],{},{"title":70,"searchDepth":83,"depth":83,"links":7529},[7530,7531,7532,7533,7534,7538,7539,7540],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":7535},[7536,7537],{"id":2682,"depth":89,"text":2682},{"id":4161,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7263,"description":7268},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[210,7548,7549],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7552,"title":7553,"body":7554,"category":210,"cover":211,"description":7558,"extension":212,"meta":7734,"navigation":92,"path":7735,"pinned":215,"publishedAt":216,"seo":7736,"slug":7737,"stem":7738,"summary":7739,"tags":7740,"updatedAt":216,"visible":92,"__hash__":7742},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7555,"toc":7724},[7556,7559,7561,7564,7566,7572,7578,7580,7596,7598,7600,7654,7656,7662,7664,7666,7679,7681,7694,7696,7715,7717,7719,7722],[10,7557,7558],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7560,16],{"id":16},[10,7562,7563],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7565,22],{"id":22},[10,7567,7568],{},[26,7569],{"alt":7570,"src":7571},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7573,7574,7575,7577],{},"进入 ",[34,7576,6733],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7579,40],{"id":40},[42,7581,7582,7587,7593],{},[45,7583,7584,7586],{},[34,7585,6733],{}," 把资源获取和释放配成一个清晰边界。",[45,7588,7589,7592],{},[34,7590,7591],{},"as file"," 得到的是上下文返回的资源对象。",[45,7594,7595],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7597,60],{"id":60},[10,7599,63],{},[65,7601,7603],{"className":67,"code":7602,"language":69,"meta":70,"style":70},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[34,7604,7605,7609,7613,7617,7621,7626,7631,7635,7640,7645,7649],{"__ignoreMap":70},[74,7606,7607],{"class":76,"line":77},[74,7608,6545],{},[74,7610,7611],{"class":76,"line":83},[74,7612,93],{"emptyLinePlaceholder":92},[74,7614,7615],{"class":76,"line":89},[74,7616,6756],{},[74,7618,7619],{"class":76,"line":96},[74,7620,93],{"emptyLinePlaceholder":92},[74,7622,7623],{"class":76,"line":102},[74,7624,7625],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,7627,7628],{"class":76,"line":108},[74,7629,7630],{},"    file.write(\"上下文管理器\\n\")\n",[74,7632,7633],{"class":76,"line":114},[74,7634,93],{"emptyLinePlaceholder":92},[74,7636,7637],{"class":76,"line":2478},[74,7638,7639],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[74,7641,7642],{"class":76,"line":3894},[74,7643,7644],{},"    print(file.read())\n",[74,7646,7647],{"class":76,"line":4106},[74,7648,93],{"emptyLinePlaceholder":92},[74,7650,7651],{"class":76,"line":5771},[74,7652,7653],{},"print(file.closed)\n",[10,7655,120],{},[65,7657,7660],{"className":7658,"code":7659,"language":126,"meta":70},[124],"上下文管理器\n\nTrue\n",[34,7661,7659],{"__ignoreMap":70},[10,7663,131],{},[14,7665,134],{"id":134},[136,7667,7668,7676],{},[45,7669,7574,7670,7672,7673,57],{},[34,7671,6733],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7674,7675],{},"file",[45,7677,7678],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7680,157],{"id":157},[42,7682,7683,7688],{},[45,7684,4729,7685,7687],{},[34,7686,6733],{}," 代码块外继续读写已经关闭的文件对象。",[45,7689,7690,7691,7693],{},"误以为 ",[34,7692,6733],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7695,175],{"id":175},[136,7697,7698,7707],{},[45,7699,7700,7701,7704,7705,57],{},"把第 30 篇的手动 ",[34,7702,7703],{},"open\u002Fclose"," 改写为 ",[34,7706,6733],{},[45,7708,4729,7709,7711,7712,57],{},[34,7710,6733],{}," 块后检查 ",[34,7713,7714],{},"file.closed",[10,7716,189],{},[14,7718,192],{"id":192},[10,7720,7721],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,7723,199],{},{"title":70,"searchDepth":83,"depth":83,"links":7725},[7726,7727,7728,7729,7730,7731,7732,7733],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7553,"description":7558},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[210,6733,7741],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7744,"title":7745,"body":7746,"category":210,"cover":211,"description":7750,"extension":212,"meta":7962,"navigation":92,"path":7963,"pinned":215,"publishedAt":216,"seo":7964,"slug":7965,"stem":7966,"summary":7967,"tags":7968,"updatedAt":216,"visible":92,"__hash__":7971},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7747,"toc":7950},[7748,7751,7753,7756,7758,7764,7767,7769,7786,7788,7790,7858,7860,7866,7868,7870,7895,7897,7900,7906,7915,7917,7928,7930,7941,7943,7945,7948],[10,7749,7750],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7752,16],{"id":16},[10,7754,7755],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7757,22],{"id":22},[10,7759,7760],{},[26,7761],{"alt":7762,"src":7763},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7765,7766],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7768,40],{"id":40},[42,7770,7771,7777,7783],{},[45,7772,7773,7776],{},[34,7774,7775],{},"self"," 表示当前实例，由方法调用自动传入。",[45,7778,7779,7782],{},[34,7780,7781],{},"__init__"," 在实例创建过程中初始化属性。",[45,7784,7785],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7787,60],{"id":60},[10,7789,63],{},[65,7791,7793],{"className":67,"code":7792,"language":69,"meta":70,"style":70},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,7794,7795,7800,7805,7810,7815,7819,7824,7829,7834,7839,7843,7848,7853],{"__ignoreMap":70},[74,7796,7797],{"class":76,"line":77},[74,7798,7799],{},"class LearningRecord:\n",[74,7801,7802],{"class":76,"line":83},[74,7803,7804],{},"    def __init__(self, course, progress=0):\n",[74,7806,7807],{"class":76,"line":89},[74,7808,7809],{},"        self.course = course\n",[74,7811,7812],{"class":76,"line":96},[74,7813,7814],{},"        self.progress = progress\n",[74,7816,7817],{"class":76,"line":102},[74,7818,93],{"emptyLinePlaceholder":92},[74,7820,7821],{"class":76,"line":108},[74,7822,7823],{},"    def advance(self, amount):\n",[74,7825,7826],{"class":76,"line":114},[74,7827,7828],{},"        self.progress = self.progress + amount\n",[74,7830,7831],{"class":76,"line":2478},[74,7832,7833],{},"        if self.progress > 100:\n",[74,7835,7836],{"class":76,"line":3894},[74,7837,7838],{},"            self.progress = 100\n",[74,7840,7841],{"class":76,"line":4106},[74,7842,93],{"emptyLinePlaceholder":92},[74,7844,7845],{"class":76,"line":5771},[74,7846,7847],{},"record = LearningRecord(\"Python\", 40)\n",[74,7849,7850],{"class":76,"line":5776},[74,7851,7852],{},"record.advance(15)\n",[74,7854,7855],{"class":76,"line":7381},[74,7856,7857],{},"print(record.course, record.progress)\n",[10,7859,120],{},[65,7861,7864],{"className":7862,"code":7863,"language":126,"meta":70},[124],"Python 55\n",[34,7865,7863],{"__ignoreMap":70},[10,7867,131],{},[14,7869,134],{"id":134},[136,7871,7872,7882],{},[45,7873,7874,7875,7878,7879,7881],{},"调用 ",[34,7876,7877],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7880,7781],{}," 把课程和进度保存在该实例属性中。",[45,7883,7884,7887,7888,7891,7892,7894],{},[34,7885,7886],{},"record.advance(15)"," 自动把 ",[34,7889,7890],{},"record"," 作为 ",[34,7893,7775],{},"，方法更新同一实例的进度并限制上限。",[313,7896,2682],{"id":2682},[10,7898,7899],{},"类是共同定义，实例则各自保存状态。",[10,7901,7902],{},[26,7903],{"alt":7904,"src":7905},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7907,7908,7909,1141,7911,7914],{},"两个实例共享同一套方法定义，但 ",[34,7910,4526],{},[34,7912,7913],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7916,157],{"id":157},[42,7918,7919,7925],{},[45,7920,7921,7922,7924],{},"调用实例方法时手工再传一次 ",[34,7923,7775],{},"。通过实例调用时 Python 会自动绑定。",[45,7926,7927],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7929,175],{"id":175},[136,7931,7932,7938],{},[45,7933,5239,7934,7937],{},[34,7935,7936],{},"Book"," 类，保存标题和阅读页数。",[45,7939,7940],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7942,189],{},[14,7944,192],{"id":192},[10,7946,7947],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,7949,199],{},{"title":70,"searchDepth":83,"depth":83,"links":7951},[7952,7953,7954,7955,7956,7959,7960,7961],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":7957},[7958],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7745,"description":7750},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[210,7969,7970],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7973,"title":7974,"body":7975,"category":210,"cover":211,"description":7979,"extension":212,"meta":8157,"navigation":92,"path":8158,"pinned":215,"publishedAt":216,"seo":8159,"slug":8160,"stem":8161,"summary":8162,"tags":8163,"updatedAt":216,"visible":92,"__hash__":8166},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7976,"toc":8147},[7977,7980,7982,7985,7987,7993,7996,7998,8009,8011,8013,8080,8082,8088,8090,8092,8111,8113,8121,8123,8138,8140,8142,8145],[10,7978,7979],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7981,16],{"id":16},[10,7983,7984],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7986,22],{"id":22},[10,7988,7989],{},[26,7990],{"alt":7991,"src":7992},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7994,7995],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7997,40],{"id":40},[42,7999,8000,8003,8006],{},[45,8001,8002],{},"封装让对象通过方法维护自己的有效状态。",[45,8004,8005],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[45,8007,8008],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8010,60],{"id":60},[10,8012,63],{},[65,8014,8016],{"className":67,"code":8015,"language":69,"meta":70,"style":70},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,8017,8018,8023,8028,8033,8037,8042,8047,8052,8056,8061,8066,8070,8075],{"__ignoreMap":70},[74,8019,8020],{"class":76,"line":77},[74,8021,8022],{},"class Storage:\n",[74,8024,8025],{"class":76,"line":83},[74,8026,8027],{},"    def save(self, text):\n",[74,8029,8030],{"class":76,"line":89},[74,8031,8032],{},"        print(\"保存：\", text)\n",[74,8034,8035],{"class":76,"line":96},[74,8036,93],{"emptyLinePlaceholder":92},[74,8038,8039],{"class":76,"line":102},[74,8040,8041],{},"class LearningService:\n",[74,8043,8044],{"class":76,"line":108},[74,8045,8046],{},"    def __init__(self, storage):\n",[74,8048,8049],{"class":76,"line":114},[74,8050,8051],{},"        self.storage = storage\n",[74,8053,8054],{"class":76,"line":2478},[74,8055,93],{"emptyLinePlaceholder":92},[74,8057,8058],{"class":76,"line":3894},[74,8059,8060],{},"    def finish_lesson(self, title):\n",[74,8062,8063],{"class":76,"line":4106},[74,8064,8065],{},"        self.storage.save(title)\n",[74,8067,8068],{"class":76,"line":5771},[74,8069,93],{"emptyLinePlaceholder":92},[74,8071,8072],{"class":76,"line":5776},[74,8073,8074],{},"service = LearningService(Storage())\n",[74,8076,8077],{"class":76,"line":7381},[74,8078,8079],{},"service.finish_lesson(\"异常处理\")\n",[10,8081,120],{},[65,8083,8086],{"className":8084,"code":8085,"language":126,"meta":70},[124],"保存： 异常处理\n",[34,8087,8085],{"__ignoreMap":70},[10,8089,131],{},[14,8091,134],{"id":134},[136,8093,8094,8104],{},[45,8095,8096,8099,8100,8103],{},[34,8097,8098],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8101,8102],{},"save()"," 的协作对象。",[45,8105,8106,8107,8110],{},"调用业务方法时，服务把保存动作委托给 ",[34,8108,8109],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8112,157],{"id":157},[42,8114,8115,8118],{},[45,8116,8117],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[45,8119,8120],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8122,175],{"id":175},[136,8124,8125,8135],{},[45,8126,8127,8128,8131,8132,57],{},"用组合让 ",[34,8129,8130],{},"OrderService"," 使用一个 ",[34,8133,8134],{},"Notifier",[45,8136,8137],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8139,189],{},[14,8141,192],{"id":192},[10,8143,8144],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,8146,199],{},{"title":70,"searchDepth":83,"depth":83,"links":8148},[8149,8150,8151,8152,8153,8154,8155,8156],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7974,"description":7979},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[210,8164,8165],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8168,"title":8169,"body":8170,"category":210,"cover":211,"description":8174,"extension":212,"meta":8377,"navigation":92,"path":8378,"pinned":215,"publishedAt":216,"seo":8379,"slug":8380,"stem":8381,"summary":8382,"tags":8383,"updatedAt":216,"visible":92,"__hash__":8386},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8171,"toc":8365},[8172,8175,8177,8180,8182,8188,8195,8197,8222,8224,8226,8278,8280,8286,8288,8290,8311,8313,8319,8325,8331,8333,8341,8343,8356,8358,8360,8363],[10,8173,8174],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8176,16],{"id":16},[10,8178,8179],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8181,22],{"id":22},[10,8183,8184],{},[26,8185],{"alt":8186,"src":8187},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8189,8190,8191,8194],{},"生成器运行到 ",[34,8192,8193],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8196,40],{"id":40},[42,8198,8199,8209,8219],{},[45,8200,8201,8204,8205,8208],{},[34,8202,8203],{},"iter()"," 从可迭代对象取得迭代器，",[34,8206,8207],{},"next()"," 请求下一个值。",[45,8210,8211,8212,8215,8216,8218],{},"没有更多值时迭代器抛出 ",[34,8213,8214],{},"StopIteration","，",[34,8217,4280],{}," 会自动处理。",[45,8220,8221],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8223,60],{"id":60},[10,8225,63],{},[65,8227,8229],{"className":67,"code":8228,"language":69,"meta":70,"style":70},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,8230,8231,8236,8241,8246,8251,8256,8260,8265,8270,8274],{"__ignoreMap":70},[74,8232,8233],{"class":76,"line":77},[74,8234,8235],{},"def countdown(start):\n",[74,8237,8238],{"class":76,"line":83},[74,8239,8240],{},"    current = start\n",[74,8242,8243],{"class":76,"line":89},[74,8244,8245],{},"    while current > 0:\n",[74,8247,8248],{"class":76,"line":96},[74,8249,8250],{},"        yield current\n",[74,8252,8253],{"class":76,"line":102},[74,8254,8255],{},"        current = current - 1\n",[74,8257,8258],{"class":76,"line":108},[74,8259,93],{"emptyLinePlaceholder":92},[74,8261,8262],{"class":76,"line":114},[74,8263,8264],{},"iterator = countdown(3)\n",[74,8266,8267],{"class":76,"line":2478},[74,8268,8269],{},"print(next(iterator))\n",[74,8271,8272],{"class":76,"line":3894},[74,8273,8269],{},[74,8275,8276],{"class":76,"line":4106},[74,8277,8269],{},[10,8279,120],{},[65,8281,8284],{"className":8282,"code":8283,"language":126,"meta":70},[124],"3\n2\n1\n",[34,8285,8283],{"__ignoreMap":70},[10,8287,131],{},[14,8289,134],{"id":134},[136,8291,8292,8298],{},[45,8293,7874,8294,8297],{},[34,8295,8296],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[45,8299,8300,8301,8303,8304,8306,8307,8310],{},"每次 ",[34,8302,8207],{}," 运行到下一个 ",[34,8305,8193],{}," 并暂停，局部变量 ",[34,8308,8309],{},"current"," 和执行位置被保留。",[313,8312,2682],{"id":2682},[10,8314,8315,8316,8318],{},"生成器的暂停位置可以展开成多次 ",[34,8317,8207],{}," 的时间线。",[10,8320,8321],{},[26,8322],{"alt":8323,"src":8324},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8326,8327,8328,8330],{},"每次请求只推进到下一个 ",[34,8329,8193],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8332,157],{"id":157},[42,8334,8335,8338],{},[45,8336,8337],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[45,8339,8340],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8342,175],{"id":175},[136,8344,8345,8348],{},[45,8346,8347],{},"编写产生 1 到指定上限偶数的生成器。",[45,8349,3952,8350,8352,8353,8355],{},[34,8351,4280],{}," 遍历生成器，比较手动 ",[34,8354,8207],{}," 的差异。",[10,8357,189],{},[14,8359,192],{"id":192},[10,8361,8362],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,8364,199],{},{"title":70,"searchDepth":83,"depth":83,"links":8366},[8367,8368,8369,8370,8371,8374,8375,8376],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":8372},[8373],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8169,"description":8174},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[210,8384,8385],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8388,"title":8389,"body":8390,"category":210,"cover":211,"description":8394,"extension":212,"meta":8618,"navigation":92,"path":8619,"pinned":215,"publishedAt":216,"seo":8620,"slug":8621,"stem":8622,"summary":8623,"tags":8624,"updatedAt":216,"visible":92,"__hash__":8626},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8391,"toc":8606},[8392,8395,8397,8400,8402,8408,8411,8413,8433,8435,8437,8519,8521,8527,8529,8531,8553,8555,8558,8564,8571,8573,8583,8585,8597,8599,8601,8604],[10,8393,8394],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8396,16],{"id":16},[10,8398,8399],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8401,22],{"id":22},[10,8403,8404],{},[26,8405],{"alt":8406,"src":8407},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8409,8410],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8412,40],{"id":40},[42,8414,8415,8424,8427],{},[45,8416,8417,8420,8421,57],{},[34,8418,8419],{},"@trace"," 等价于 ",[34,8422,8423],{},"add = trace(add)",[45,8425,8426],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[45,8428,8429,8432],{},[34,8430,8431],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8434,60],{"id":60},[10,8436,63],{},[65,8438,8440],{"className":67,"code":8439,"language":69,"meta":70,"style":70},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,8441,8442,8447,8451,8456,8461,8466,8471,8476,8481,8486,8491,8495,8500,8504,8508,8513],{"__ignoreMap":70},[74,8443,8444],{"class":76,"line":77},[74,8445,8446],{},"from functools import wraps\n",[74,8448,8449],{"class":76,"line":83},[74,8450,93],{"emptyLinePlaceholder":92},[74,8452,8453],{"class":76,"line":89},[74,8454,8455],{},"def trace(function):\n",[74,8457,8458],{"class":76,"line":96},[74,8459,8460],{},"    @wraps(function)\n",[74,8462,8463],{"class":76,"line":102},[74,8464,8465],{},"    def wrapper(*args, **kwargs):\n",[74,8467,8468],{"class":76,"line":108},[74,8469,8470],{},"        print(\"开始：\", function.__name__)\n",[74,8472,8473],{"class":76,"line":114},[74,8474,8475],{},"        result = function(*args, **kwargs)\n",[74,8477,8478],{"class":76,"line":2478},[74,8479,8480],{},"        print(\"结束：\", function.__name__)\n",[74,8482,8483],{"class":76,"line":3894},[74,8484,8485],{},"        return result\n",[74,8487,8488],{"class":76,"line":4106},[74,8489,8490],{},"    return wrapper\n",[74,8492,8493],{"class":76,"line":5771},[74,8494,93],{"emptyLinePlaceholder":92},[74,8496,8497],{"class":76,"line":5776},[74,8498,8499],{},"@trace\n",[74,8501,8502],{"class":76,"line":7381},[74,8503,6124],{},[74,8505,8506],{"class":76,"line":7387},[74,8507,6129],{},[74,8509,8511],{"class":76,"line":8510},15,[74,8512,93],{"emptyLinePlaceholder":92},[74,8514,8516],{"class":76,"line":8515},16,[74,8517,8518],{},"print(add(2, 3))\n",[10,8520,120],{},[65,8522,8525],{"className":8523,"code":8524,"language":126,"meta":70},[124],"开始： add\n结束： add\n5\n",[34,8526,8524],{"__ignoreMap":70},[10,8528,131],{},[14,8530,134],{"id":134},[136,8532,8533,8550],{},[45,8534,8535,8536,8539,8540,8543,8544,8547,8548,57],{},"解释器执行定义时，把原 ",[34,8537,8538],{},"add"," 函数交给 ",[34,8541,8542],{},"trace","，返回的 ",[34,8545,8546],{},"wrapper"," 重新绑定到名字 ",[34,8549,8538],{},[45,8551,8552],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[313,8554,2682],{"id":2682},[10,8556,8557],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8559,8560],{},[26,8561],{"alt":8562,"src":8563},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8565,8566,8568,8569,57],{},[34,8567,8419],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8570,8423],{},[14,8572,157],{"id":157},[42,8574,8575,8580],{},[45,8576,8577,8578,57],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8579,5322],{},[45,8581,8582],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8584,175],{"id":175},[136,8586,8587,8590],{},[45,8588,8589],{},"编写只记录调用次数的简单装饰器。",[45,8591,8592,8593,8596],{},"删除包装函数的 ",[34,8594,8595],{},"return result","，观察调用方得到什么。",[10,8598,189],{},[14,8600,192],{"id":192},[10,8602,8603],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,8605,199],{},{"title":70,"searchDepth":83,"depth":83,"links":8607},[8608,8609,8610,8611,8612,8615,8616,8617],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":8613},[8614],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8389,"description":8394},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[210,8625,5273],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8628,"title":8629,"body":8630,"category":210,"cover":211,"description":8634,"extension":212,"meta":8821,"navigation":92,"path":8822,"pinned":215,"publishedAt":216,"seo":8823,"slug":8824,"stem":8825,"summary":8826,"tags":8827,"updatedAt":216,"visible":92,"__hash__":8830},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8631,"toc":8809},[8632,8635,8637,8640,8642,8648,8651,8653,8664,8666,8668,8743,8745,8751,8753,8755,8766,8768,8771,8777,8780,8782,8790,8792,8800,8802,8804,8807],[10,8633,8634],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8636,16],{"id":16},[10,8638,8639],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8641,22],{"id":22},[10,8643,8644],{},[26,8645],{"alt":8646,"src":8647},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8649,8650],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8652,40],{"id":40},[42,8654,8655,8658,8661],{},[45,8656,8657],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[45,8659,8660],{},"日志记录运行状态，测试判断结果是否符合约定。",[45,8662,8663],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8665,60],{"id":60},[10,8667,63],{},[65,8669,8671],{"className":67,"code":8670,"language":69,"meta":70,"style":70},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,8672,8673,8678,8683,8687,8692,8696,8701,8706,8711,8715,8720,8725,8730,8734,8738],{"__ignoreMap":70},[74,8674,8675],{"class":76,"line":77},[74,8676,8677],{},"import logging\n",[74,8679,8680],{"class":76,"line":83},[74,8681,8682],{},"import unittest\n",[74,8684,8685],{"class":76,"line":89},[74,8686,93],{"emptyLinePlaceholder":92},[74,8688,8689],{"class":76,"line":96},[74,8690,8691],{},"logging.basicConfig(level=logging.INFO)\n",[74,8693,8694],{"class":76,"line":102},[74,8695,93],{"emptyLinePlaceholder":92},[74,8697,8698],{"class":76,"line":108},[74,8699,8700],{},"def clamp_progress(value):\n",[74,8702,8703],{"class":76,"line":114},[74,8704,8705],{},"    logging.info(\"检查进度：%s\", value)\n",[74,8707,8708],{"class":76,"line":2478},[74,8709,8710],{},"    return max(0, min(100, value))\n",[74,8712,8713],{"class":76,"line":3894},[74,8714,93],{"emptyLinePlaceholder":92},[74,8716,8717],{"class":76,"line":4106},[74,8718,8719],{},"class ProgressTest(unittest.TestCase):\n",[74,8721,8722],{"class":76,"line":5771},[74,8723,8724],{},"    def test_upper_limit(self):\n",[74,8726,8727],{"class":76,"line":5776},[74,8728,8729],{},"        self.assertEqual(clamp_progress(120), 100)\n",[74,8731,8732],{"class":76,"line":7381},[74,8733,93],{"emptyLinePlaceholder":92},[74,8735,8736],{"class":76,"line":7387},[74,8737,6138],{},[74,8739,8740],{"class":76,"line":8510},[74,8741,8742],{},"    unittest.main()\n",[10,8744,120],{},[65,8746,8749],{"className":8747,"code":8748,"language":126,"meta":70},[124],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8750,8748],{"__ignoreMap":70},[10,8752,131],{},[14,8754,134],{"id":134},[136,8756,8757,8763],{},[45,8758,8759,8762],{},[34,8760,8761],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[45,8764,8765],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[313,8767,2682],{"id":2682},[10,8769,8770],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8772,8773],{},[26,8774],{"alt":8775,"src":8776},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8778,8779],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8781,157],{"id":157},[42,8783,8784,8787],{},[45,8785,8786],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[45,8788,8789],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8791,175],{"id":175},[136,8793,8794,8797],{},[45,8795,8796],{},"为负数进度增加测试。",[45,8798,8799],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8801,189],{},[14,8803,192],{"id":192},[10,8805,8806],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,8808,199],{},{"title":70,"searchDepth":83,"depth":83,"links":8810},[8811,8812,8813,8814,8815,8818,8819,8820],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":8816},[8817],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8629,"description":8634},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[210,8828,8829],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8832,"title":8833,"body":8834,"category":210,"cover":211,"description":8838,"extension":212,"meta":9138,"navigation":92,"path":9139,"pinned":215,"publishedAt":216,"seo":9140,"slug":9141,"stem":9142,"summary":9143,"tags":9144,"updatedAt":216,"visible":92,"__hash__":9147},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8835,"toc":9125},[8836,8839,8841,8844,8846,8852,8855,8857,8872,8874,8876,9023,9025,9031,9033,9035,9048,9050,9053,9059,9062,9064,9067,9073,9080,9082,9093,9095,9116,9118,9120,9123],[10,8837,8838],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8840,16],{"id":16},[10,8842,8843],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8845,22],{"id":22},[10,8847,8848],{},[26,8849],{"alt":8850,"src":8851},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8853,8854],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8856,40],{"id":40},[42,8858,8859,8862,8865],{},[45,8860,8861],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[45,8863,8864],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[45,8866,8867,8868,8871],{},"实际扩展前先为 ",[34,8869,8870],{},"add()"," 和存储边界补充测试。",[14,8873,60],{"id":60},[10,8875,63],{},[65,8877,8879],{"className":67,"code":8878,"language":69,"meta":70,"style":70},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,8880,8881,8885,8889,8893,8898,8903,8908,8913,8917,8922,8927,8932,8937,8942,8946,8951,8956,8962,8967,8973,8978,8983,8989,8995,9001,9006,9012,9017],{"__ignoreMap":70},[74,8882,8883],{"class":76,"line":77},[74,8884,6936],{},[74,8886,8887],{"class":76,"line":83},[74,8888,6545],{},[74,8890,8891],{"class":76,"line":89},[74,8892,93],{"emptyLinePlaceholder":92},[74,8894,8895],{"class":76,"line":96},[74,8896,8897],{},"class LearningRecords:\n",[74,8899,8900],{"class":76,"line":102},[74,8901,8902],{},"    def __init__(self, file_path):\n",[74,8904,8905],{"class":76,"line":108},[74,8906,8907],{},"        self.file_path = Path(file_path)\n",[74,8909,8910],{"class":76,"line":114},[74,8911,8912],{},"        self.items = []\n",[74,8914,8915],{"class":76,"line":2478},[74,8916,93],{"emptyLinePlaceholder":92},[74,8918,8919],{"class":76,"line":3894},[74,8920,8921],{},"    def add(self, title):\n",[74,8923,8924],{"class":76,"line":4106},[74,8925,8926],{},"        title = title.strip()\n",[74,8928,8929],{"class":76,"line":5771},[74,8930,8931],{},"        if not title:\n",[74,8933,8934],{"class":76,"line":5776},[74,8935,8936],{},"            raise ValueError(\"课程名称不能为空\")\n",[74,8938,8939],{"class":76,"line":7381},[74,8940,8941],{},"        self.items.append({\"title\": title, \"done\": False})\n",[74,8943,8944],{"class":76,"line":7387},[74,8945,93],{"emptyLinePlaceholder":92},[74,8947,8948],{"class":76,"line":8510},[74,8949,8950],{},"    def save(self):\n",[74,8952,8953],{"class":76,"line":8515},[74,8954,8955],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,8957,8959],{"class":76,"line":8958},17,[74,8960,8961],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[74,8963,8965],{"class":76,"line":8964},18,[74,8966,93],{"emptyLinePlaceholder":92},[74,8968,8970],{"class":76,"line":8969},19,[74,8971,8972],{},"records = LearningRecords(\"learning-records.json\")\n",[74,8974,8976],{"class":76,"line":8975},20,[74,8977,93],{"emptyLinePlaceholder":92},[74,8979,8981],{"class":76,"line":8980},21,[74,8982,7354],{},[74,8984,8986],{"class":76,"line":8985},22,[74,8987,8988],{},"    title = input(\"输入已学习课程：\")\n",[74,8990,8992],{"class":76,"line":8991},23,[74,8993,8994],{},"    records.add(title)\n",[74,8996,8998],{"class":76,"line":8997},24,[74,8999,9000],{},"    records.save()\n",[74,9002,9004],{"class":76,"line":9003},25,[74,9005,7364],{},[74,9007,9009],{"class":76,"line":9008},26,[74,9010,9011],{},"    print(\"无法保存：\", error)\n",[74,9013,9015],{"class":76,"line":9014},27,[74,9016,1130],{},[74,9018,9020],{"class":76,"line":9019},28,[74,9021,9022],{},"    print(\"已保存 1 条学习记录\")\n",[10,9024,120],{},[65,9026,9029],{"className":9027,"code":9028,"language":126,"meta":70},[124],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9030,9028],{"__ignoreMap":70},[10,9032,131],{},[14,9034,134],{"id":134},[136,9036,9037,9043],{},[45,9038,9039,9040,9042],{},"输入层取得课程名后，",[34,9041,8870],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[45,9044,9045,9047],{},[34,9046,8102],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[313,9049,2682],{"id":2682},[10,9051,9052],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9054,9055],{},[26,9056],{"alt":9057,"src":9058},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9060,9061],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[313,9063,2682],{"id":4161},[10,9065,9066],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9068,9069],{},[26,9070],{"alt":9071,"src":9072},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9074,9075,9076,9079],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9077,9078],{},"load()"," 把文件状态恢复到内存。",[14,9081,157],{"id":157},[42,9083,9084,9087],{},[45,9085,9086],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[45,9088,9089,9090,9092],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9091,9078],{}," 是下一项必要扩展。",[14,9094,175],{"id":175},[136,9096,9097,9103,9106],{},[45,9098,9099,9100,9102],{},"增加 ",[34,9101,9078],{},"，文件不存在时从空列表开始。",[45,9104,9105],{},"增加按序号标记完成的功能，并校验序号范围。",[45,9107,9108,9109,9112,9113,9115],{},"把输入循环放进 ",[34,9110,9111],{},"main()","，通过 ",[34,9114,6080],{}," 控制程序入口。",[10,9117,189],{},[14,9119,192],{"id":192},[10,9121,9122],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[197,9124,199],{},{"title":70,"searchDepth":83,"depth":83,"links":9126},[9127,9128,9129,9130,9131,9135,9136,9137],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":9132},[9133,9134],{"id":2682,"depth":89,"text":2682},{"id":4161,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8833,"description":8838},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[210,9145,9146],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9149,9252,9371,9502,9645,9770,9907,10044,10185,10354,10491,10624,10747,10876,11003,11166,11342,11483,11612,11761,11904,12025,12148,12297,12450,12615,12742,12923,13066,13223,13374,13521,13676,13894,14049,14224,14375,14542,14729,14892,15134,15374],{"id":1377,"title":1378,"body":9150,"category":210,"cover":211,"description":1383,"extension":212,"meta":9249,"navigation":92,"path":1502,"pinned":215,"publishedAt":216,"seo":9250,"slug":1504,"stem":1505,"summary":1506,"tags":9251,"updatedAt":216,"visible":92,"__hash__":1509},{"type":7,"value":9151,"toc":9239},[9152,9154,9156,9158,9160,9164,9168,9170,9180,9182,9184,9192,9194,9199,9201,9203,9213,9215,9223,9225,9231,9233,9235,9237],[10,9153,1383],{},[14,9155,16],{"id":16},[10,9157,1388],{},[14,9159,22],{"id":22},[10,9161,9162],{},[26,9163],{"alt":1395,"src":1396},[10,9165,9166,1401],{},[34,9167,1155],{},[14,9169,40],{"id":40},[42,9171,9172,9176,9178],{},[45,9173,1408,9174,1411],{},[34,9175,1155],{},[45,9177,1414],{},[45,9179,1417],{},[14,9181,60],{"id":60},[10,9183,63],{},[65,9185,9186],{"className":67,"code":1424,"language":69,"meta":70,"style":70},[34,9187,9188],{"__ignoreMap":70},[74,9189,9190],{"class":76,"line":77},[74,9191,1424],{},[10,9193,120],{},[65,9195,9197],{"className":9196,"code":1436,"language":126,"meta":70},[124],[34,9198,1436],{"__ignoreMap":70},[10,9200,131],{},[14,9202,134],{"id":134},[136,9204,9205,9209],{},[45,9206,1447,9207,1451],{},[34,9208,1450],{},[45,9210,1454,9211,1458],{},[34,9212,1457],{},[14,9214,157],{"id":157},[42,9216,9217,9219],{},[45,9218,1465],{},[45,9220,1468,9221,1471],{},[34,9222,1155],{},[14,9224,175],{"id":175},[136,9226,9227,9229],{},[45,9228,1478],{},[45,9230,1481],{},[10,9232,189],{},[14,9234,192],{"id":192},[10,9236,1488],{},[197,9238,199],{},{"title":70,"searchDepth":83,"depth":83,"links":9240},[9241,9242,9243,9244,9245,9246,9247,9248],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":1378,"description":1383},[210,1373,1508],{"id":1511,"title":1512,"body":9253,"category":210,"cover":211,"description":1517,"extension":212,"meta":9368,"navigation":92,"path":1654,"pinned":215,"publishedAt":216,"seo":9369,"slug":1656,"stem":1657,"summary":1658,"tags":9370,"updatedAt":216,"visible":92,"__hash__":1661},{"type":7,"value":9254,"toc":9358},[9255,9257,9259,9261,9263,9267,9271,9273,9283,9285,9287,9307,9309,9314,9316,9318,9328,9330,9340,9342,9350,9352,9354,9356],[10,9256,1517],{},[14,9258,16],{"id":16},[10,9260,1522],{},[14,9262,22],{"id":22},[10,9264,9265],{},[26,9266],{"alt":1529,"src":1530},[10,9268,1533,9269,1536],{},[34,9270,675],{},[14,9272,40],{"id":40},[42,9274,9275,9277,9279],{},[45,9276,1543],{},[45,9278,1546],{},[45,9280,1549,9281,1553],{},[34,9282,1552],{},[14,9284,60],{"id":60},[10,9286,1558],{},[65,9288,9289],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,9290,9291,9297],{"__ignoreMap":70},[74,9292,9293,9295],{"class":76,"line":77},[74,9294,675],{"class":584},[74,9296,588],{"class":587},[74,9298,9299,9301,9303,9305],{"class":76,"line":83},[74,9300,675],{"class":584},[74,9302,617],{"class":587},[74,9304,621],{"class":620},[74,9306,588],{"class":587},[10,9308,120],{},[65,9310,9312],{"className":9311,"code":1584,"language":126,"meta":70},[124],[34,9313,1584],{"__ignoreMap":70},[10,9315,131],{},[14,9317,134],{"id":134},[136,9319,9320,9324],{},[45,9321,9322,1598],{},[34,9323,1597],{},[45,9325,9326,1603],{},[34,9327,683],{},[14,9329,157],{"id":157},[42,9331,9332,9336],{},[45,9333,1610,9334,1613],{},[34,9335,675],{},[45,9337,1616,9338,1619],{},[34,9339,675],{},[14,9341,175],{"id":175},[136,9343,9344,9348],{},[45,9345,922,9346,1629],{},[34,9347,1628],{},[45,9349,1632],{},[10,9351,189],{},[14,9353,192],{"id":192},[10,9355,1639],{},[197,9357,1642],{},{"title":70,"searchDepth":83,"depth":83,"links":9359},[9360,9361,9362,9363,9364,9365,9366,9367],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":1512,"description":1517},[210,1660,1036],{"id":1663,"title":1664,"body":9372,"category":210,"cover":211,"description":1830,"extension":212,"meta":9499,"navigation":92,"path":1832,"pinned":215,"publishedAt":216,"seo":9500,"slug":1834,"stem":1835,"summary":1836,"tags":9501,"updatedAt":216,"visible":92,"__hash__":1840},{"type":7,"value":9373,"toc":9489},[9374,9378,9380,9382,9384,9388,9390,9392,9408,9410,9412,9432,9434,9439,9441,9443,9455,9457,9467,9469,9479,9481,9483,9487],[10,9375,1669,9376,1672],{},[34,9377,1155],{},[14,9379,16],{"id":16},[10,9381,1677],{},[14,9383,22],{"id":22},[10,9385,9386],{},[26,9387],{"alt":1684,"src":1685},[10,9389,1688],{},[14,9391,40],{"id":40},[42,9393,9394,9400,9404],{},[45,9395,1695,9396,1698,9398,57],{},[34,9397,675],{},[34,9399,1701],{},[45,9401,1704,9402,1708],{},[34,9403,1707],{},[45,9405,1711,9406,1714],{},[34,9407,1155],{},[14,9409,60],{"id":60},[10,9411,63],{},[65,9413,9414],{"className":1721,"code":1722,"language":1723,"meta":70,"style":70},[34,9415,9416,9420,9424,9428],{"__ignoreMap":70},[74,9417,9418],{"class":76,"line":77},[74,9419,1730],{},[74,9421,9422],{"class":76,"line":83},[74,9423,1735],{},[74,9425,9426],{"class":76,"line":89},[74,9427,1740],{},[74,9429,9430],{"class":76,"line":96},[74,9431,1745],{},[10,9433,120],{},[65,9435,9437],{"className":9436,"code":1751,"language":126,"meta":70},[124],[34,9438,1751],{"__ignoreMap":70},[10,9440,131],{},[14,9442,134],{"id":134},[136,9444,9445,9451],{},[45,9446,1762,9447,1766,9449,57],{},[34,9448,1765],{},[34,9450,1769],{},[45,9452,1772,9453,1775],{},[34,9454,1457],{},[14,9456,157],{"id":157},[42,9458,9459,9465],{},[45,9460,1782,9461,1785,9463,1788],{},[34,9462,1701],{},[34,9464,1155],{},[45,9466,1791],{},[14,9468,175],{"id":175},[136,9470,9471,9475],{},[45,9472,1798,9473,57],{},[34,9474,1801],{},[45,9476,1804,9477,1807],{},[34,9478,1457],{},[10,9480,189],{},[14,9482,192],{"id":192},[10,9484,1814,9485,1817],{},[34,9486,1155],{},[197,9488,199],{},{"title":70,"searchDepth":83,"depth":83,"links":9490},[9491,9492,9493,9494,9495,9496,9497,9498],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":1664,"description":1830},[210,1838,1839],{"id":1842,"title":1843,"body":9503,"category":210,"cover":211,"description":1848,"extension":212,"meta":9642,"navigation":92,"path":2020,"pinned":215,"publishedAt":216,"seo":9643,"slug":2022,"stem":2023,"summary":2024,"tags":9644,"updatedAt":216,"visible":92,"__hash__":2028},{"type":7,"value":9504,"toc":9632},[9505,9507,9509,9511,9513,9517,9521,9523,9535,9537,9539,9575,9577,9582,9584,9586,9602,9604,9614,9616,9624,9626,9628,9630],[10,9506,1848],{},[14,9508,16],{"id":16},[10,9510,1853],{},[14,9512,22],{"id":22},[10,9514,9515],{},[26,9516],{"alt":1860,"src":1861},[10,9518,9519,1867],{},[34,9520,1866],{},[14,9522,40],{"id":40},[42,9524,9525,9527,9533],{},[45,9526,1874],{},[45,9528,9529,1880,9531,1884],{},[34,9530,1879],{},[34,9532,1883],{},[45,9534,1887],{},[14,9536,60],{"id":60},[10,9538,1558],{},[65,9540,9541],{"className":575,"code":1894,"language":577,"meta":70,"style":70},[34,9542,9543,9549,9555,9559,9569],{"__ignoreMap":70},[74,9544,9545,9547],{"class":76,"line":77},[74,9546,1901],{"class":584},[74,9548,1904],{"class":620},[74,9550,9551,9553],{"class":76,"line":83},[74,9552,1909],{"class":587},[74,9554,1904],{"class":620},[74,9556,9557],{"class":76,"line":89},[74,9558,1916],{"class":587},[74,9560,9561,9563,9565,9567],{"class":76,"line":96},[74,9562,1921],{"class":587},[74,9564,1924],{"class":620},[74,9566,1928],{"class":1927},[74,9568,1199],{"class":620},[74,9570,9571,9573],{"class":76,"line":102},[74,9572,675],{"class":584},[74,9574,1199],{"class":620},[10,9576,120],{},[65,9578,9580],{"className":9579,"code":1942,"language":126,"meta":70},[124],[34,9581,1942],{"__ignoreMap":70},[10,9583,131],{},[14,9585,134],{"id":134},[136,9587,9588,9596],{},[45,9589,9590,1955,9592,1958,9594,1961],{},[34,9591,1901],{},[34,9593,1909],{},[34,9595,1879],{},[45,9597,9598,1966,9600,1970],{},[34,9599,1866],{},[34,9601,1969],{},[14,9603,157],{"id":157},[42,9605,9606,9612],{},[45,9607,1977,9608,1141,9610,57],{},[34,9609,1879],{},[34,9611,1883],{},[45,9613,1984],{},[14,9615,175],{"id":175},[136,9617,9618,9622],{},[45,9619,1991,9620,1995],{},[34,9621,1994],{},[45,9623,1998],{},[10,9625,189],{},[14,9627,192],{"id":192},[10,9629,2005],{},[197,9631,2008],{},{"title":70,"searchDepth":83,"depth":83,"links":9633},[9634,9635,9636,9637,9638,9639,9640,9641],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":1843,"description":1848},[210,2026,2027],{"id":2030,"title":2031,"body":9646,"category":210,"cover":211,"description":2036,"extension":212,"meta":9767,"navigation":92,"path":2185,"pinned":215,"publishedAt":216,"seo":9768,"slug":2187,"stem":2188,"summary":2189,"tags":9769,"updatedAt":216,"visible":92,"__hash__":2193},{"type":7,"value":9647,"toc":9757},[9648,9650,9652,9654,9656,9660,9668,9670,9684,9686,9688,9704,9706,9711,9713,9715,9729,9731,9737,9739,9749,9751,9753,9755],[10,9649,2036],{},[14,9651,16],{"id":16},[10,9653,2041],{},[14,9655,22],{"id":22},[10,9657,9658],{},[26,9659],{"alt":2048,"src":2049},[10,9661,2052,9662,57,9664,2058,9666,57],{},[34,9663,1457],{},[34,9665,2057],{},[34,9667,1765],{},[14,9669,40],{"id":40},[42,9671,9672,9676,9682],{},[45,9673,9674,2070],{},[34,9675,2069],{},[45,9677,9678,2076,9680,57],{},[34,9679,2075],{},[34,9681,2079],{},[45,9683,2082],{},[14,9685,60],{"id":60},[10,9687,63],{},[65,9689,9690],{"className":67,"code":2089,"language":69,"meta":70,"style":70},[34,9691,9692,9696,9700],{"__ignoreMap":70},[74,9693,9694],{"class":76,"line":77},[74,9695,2096],{},[74,9697,9698],{"class":76,"line":83},[74,9699,2101],{},[74,9701,9702],{"class":76,"line":89},[74,9703,2106],{},[10,9705,120],{},[65,9707,9709],{"className":9708,"code":2112,"language":126,"meta":70},[124],[34,9710,2112],{"__ignoreMap":70},[10,9712,131],{},[14,9714,134],{"id":134},[136,9716,9717,9723],{},[45,9718,9719,2126,9721,57],{},[34,9720,2125],{},[34,9722,2079],{},[45,9724,9725,2133,9727,2137],{},[34,9726,1457],{},[34,9728,2136],{},[14,9730,157],{"id":157},[42,9732,9733,9735],{},[45,9734,2144],{},[45,9736,2147],{},[14,9738,175],{"id":175},[136,9740,9741,9743],{},[45,9742,2154],{},[45,9744,2157,9745,2160,9747,2164],{},[34,9746,2057],{},[34,9748,2163],{},[10,9750,189],{},[14,9752,192],{"id":192},[10,9754,2171],{},[197,9756,199],{},{"title":70,"searchDepth":83,"depth":83,"links":9758},[9759,9760,9761,9762,9763,9764,9765,9766],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":2031,"description":2036},[210,2191,2192],{"id":2195,"title":2196,"body":9771,"category":210,"cover":211,"description":2201,"extension":212,"meta":9904,"navigation":92,"path":2369,"pinned":215,"publishedAt":216,"seo":9905,"slug":2371,"stem":2372,"summary":2373,"tags":9906,"updatedAt":216,"visible":92,"__hash__":2377},{"type":7,"value":9772,"toc":9894},[9773,9775,9777,9779,9781,9785,9787,9789,9805,9807,9809,9833,9835,9840,9842,9844,9860,9862,9874,9876,9886,9888,9890,9892],[10,9774,2201],{},[14,9776,16],{"id":16},[10,9778,2206],{},[14,9780,22],{"id":22},[10,9782,9783],{},[26,9784],{"alt":2213,"src":2214},[10,9786,2217],{},[14,9788,40],{"id":40},[42,9790,9791,9793,9799],{},[45,9792,2224],{},[45,9794,2227,9795,2160,9797,2234],{},[34,9796,2230],{},[34,9798,2233],{},[45,9800,2237,9801,2241,9803,2245],{},[34,9802,2240],{},[34,9804,2244],{},[14,9806,60],{"id":60},[10,9808,63],{},[65,9810,9811],{"className":67,"code":2252,"language":69,"meta":70,"style":70},[34,9812,9813,9817,9821,9825,9829],{"__ignoreMap":70},[74,9814,9815],{"class":76,"line":77},[74,9816,2259],{},[74,9818,9819],{"class":76,"line":83},[74,9820,2264],{},[74,9822,9823],{"class":76,"line":89},[74,9824,93],{"emptyLinePlaceholder":92},[74,9826,9827],{"class":76,"line":96},[74,9828,2273],{},[74,9830,9831],{"class":76,"line":102},[74,9832,2264],{},[10,9834,120],{},[65,9836,9838],{"className":9837,"code":2283,"language":126,"meta":70},[124],[34,9839,2283],{"__ignoreMap":70},[10,9841,131],{},[14,9843,134],{"id":134},[136,9845,9846,9852],{},[45,9847,922,9848,2297,9850,2300],{},[34,9849,2296],{},[34,9851,2230],{},[45,9853,922,9854,2306,9856,2310,9858,57],{},[34,9855,2305],{},[34,9857,2309],{},[34,9859,2313],{},[14,9861,157],{"id":157},[42,9863,9864,9866],{},[45,9865,2320],{},[45,9867,2323,9868,2241,9870,2241,9872,2331],{},[34,9869,2240],{},[34,9871,2244],{},[34,9873,2330],{},[14,9875,175],{"id":175},[136,9877,9878,9884],{},[45,9879,2338,9880,1141,9882,2345],{},[34,9881,2341],{},[34,9883,2344],{},[45,9885,2348],{},[10,9887,189],{},[14,9889,192],{"id":192},[10,9891,2355],{},[197,9893,199],{},{"title":70,"searchDepth":83,"depth":83,"links":9895},[9896,9897,9898,9899,9900,9901,9902,9903],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":2196,"description":2201},[210,2375,2376],{"id":2379,"title":2380,"body":9908,"category":210,"cover":211,"description":2385,"extension":212,"meta":10041,"navigation":92,"path":2551,"pinned":215,"publishedAt":216,"seo":10042,"slug":2553,"stem":2554,"summary":2555,"tags":10043,"updatedAt":216,"visible":92,"__hash__":2559},{"type":7,"value":9909,"toc":10031},[9910,9912,9914,9916,9918,9922,9924,9926,9944,9946,9948,9984,9986,9991,9993,9995,10005,10007,10015,10017,10023,10025,10027,10029],[10,9911,2385],{},[14,9913,16],{"id":16},[10,9915,2390],{},[14,9917,22],{"id":22},[10,9919,9920],{},[26,9921],{"alt":2397,"src":2398},[10,9923,2401],{},[14,9925,40],{"id":40},[42,9927,9928,9934,9942],{},[45,9929,9930,2411,9932,2415],{},[34,9931,2410],{},[34,9933,2414],{},[45,9935,9936,2421,9938,2425,9940,2429],{},[34,9937,2420],{},[34,9939,2424],{},[34,9941,2428],{},[45,9943,2432],{},[14,9945,60],{"id":60},[10,9947,63],{},[65,9949,9950],{"className":67,"code":2439,"language":69,"meta":70,"style":70},[34,9951,9952,9956,9960,9964,9968,9972,9976,9980],{"__ignoreMap":70},[74,9953,9954],{"class":76,"line":77},[74,9955,2446],{},[74,9957,9958],{"class":76,"line":83},[74,9959,2451],{},[74,9961,9962],{"class":76,"line":89},[74,9963,2456],{},[74,9965,9966],{"class":76,"line":96},[74,9967,93],{"emptyLinePlaceholder":92},[74,9969,9970],{"class":76,"line":102},[74,9971,2465],{},[74,9973,9974],{"class":76,"line":108},[74,9975,2470],{},[74,9977,9978],{"class":76,"line":114},[74,9979,2475],{},[74,9981,9982],{"class":76,"line":2478},[74,9983,2481],{},[10,9985,120],{},[65,9987,9989],{"className":9988,"code":2487,"language":126,"meta":70},[124],[34,9990,2487],{"__ignoreMap":70},[10,9992,131],{},[14,9994,134],{"id":134},[136,9996,9997,10001],{},[45,9998,9999,2501],{},[34,10000,2500],{},[45,10002,10003,2507],{},[34,10004,2506],{},[14,10006,157],{"id":157},[42,10008,10009,10013],{},[45,10010,2514,10011,57],{},[34,10012,2517],{},[45,10014,2520],{},[14,10016,175],{"id":175},[136,10018,10019,10021],{},[45,10020,2527],{},[45,10022,2530],{},[10,10024,189],{},[14,10026,192],{"id":192},[10,10028,2537],{},[197,10030,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10032},[10033,10034,10035,10036,10037,10038,10039,10040],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":2380,"description":2385},[210,2557,2558],{"id":2561,"title":2562,"body":10045,"category":210,"cover":211,"description":2567,"extension":212,"meta":10182,"navigation":92,"path":2744,"pinned":215,"publishedAt":216,"seo":10183,"slug":2746,"stem":2747,"summary":2748,"tags":10184,"updatedAt":216,"visible":92,"__hash__":2752},{"type":7,"value":10046,"toc":10170},[10047,10049,10051,10053,10055,10059,10065,10067,10075,10077,10079,10103,10105,10110,10112,10114,10132,10134,10136,10140,10142,10144,10150,10152,10162,10164,10166,10168],[10,10048,2567],{},[14,10050,16],{"id":16},[10,10052,2572],{},[14,10054,22],{"id":22},[10,10056,10057],{},[26,10058],{"alt":2579,"src":2580},[10,10060,2583,10061,2587,10063,57],{},[34,10062,2586],{},[34,10064,2590],{},[14,10066,40],{"id":40},[42,10068,10069,10071,10073],{},[45,10070,2597],{},[45,10072,2600],{},[45,10074,2603],{},[14,10076,60],{"id":60},[10,10078,63],{},[65,10080,10081],{"className":67,"code":2610,"language":69,"meta":70,"style":70},[34,10082,10083,10087,10091,10095,10099],{"__ignoreMap":70},[74,10084,10085],{"class":76,"line":77},[74,10086,2617],{},[74,10088,10089],{"class":76,"line":83},[74,10090,2622],{},[74,10092,10093],{"class":76,"line":89},[74,10094,2627],{},[74,10096,10097],{"class":76,"line":96},[74,10098,2632],{},[74,10100,10101],{"class":76,"line":102},[74,10102,2637],{},[10,10104,120],{},[65,10106,10108],{"className":10107,"code":2643,"language":126,"meta":70},[124],[34,10109,2643],{"__ignoreMap":70},[10,10111,131],{},[14,10113,134],{"id":134},[136,10115,10116,10124],{},[45,10117,2654,10118,2657,10120,2661,10122,2665],{},[34,10119,210],{},[34,10121,2660],{},[34,10123,2664],{},[45,10125,10126,2671,10128,2675,10130,2679],{},[34,10127,2670],{},[34,10129,2674],{},[34,10131,2678],{},[313,10133,2682],{"id":2682},[10,10135,2685],{},[10,10137,10138],{},[26,10139],{"alt":2690,"src":2691},[10,10141,2694],{},[14,10143,157],{"id":157},[42,10145,10146,10148],{},[45,10147,2701],{},[45,10149,2704],{},[14,10151,175],{"id":175},[136,10153,10154,10160],{},[45,10155,2711,10156,2715,10158,57],{},[34,10157,2714],{},[34,10159,2718],{},[45,10161,2721],{},[10,10163,189],{},[14,10165,192],{"id":192},[10,10167,2728],{},[197,10169,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10171},[10172,10173,10174,10175,10176,10179,10180,10181],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":10177},[10178],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":2562,"description":2567},[210,2750,2751],{"id":2754,"title":2755,"body":10186,"category":210,"cover":211,"description":2760,"extension":212,"meta":10351,"navigation":92,"path":2975,"pinned":215,"publishedAt":216,"seo":10352,"slug":2977,"stem":2978,"summary":2979,"tags":10353,"updatedAt":216,"visible":92,"__hash__":2983},{"type":7,"value":10187,"toc":10339},[10188,10190,10192,10194,10196,10200,10206,10208,10228,10230,10232,10268,10270,10275,10277,10279,10293,10295,10297,10301,10307,10309,10319,10321,10331,10333,10335,10337],[10,10189,2760],{},[14,10191,16],{"id":16},[10,10193,2765],{},[14,10195,22],{"id":22},[10,10197,10198],{},[26,10199],{"alt":2772,"src":2773},[10,10201,2776,10202,993,10204,2783],{},[34,10203,2779],{},[34,10205,2782],{},[14,10207,40],{"id":40},[42,10209,10210,10218,10226],{},[45,10211,10212,2793,10214,2797,10216,2801],{},[34,10213,2792],{},[34,10215,2796],{},[34,10217,2800],{},[45,10219,10220,2807,10222,2811,10224,2815],{},[34,10221,2806],{},[34,10223,2810],{},[34,10225,2814],{},[45,10227,2818],{},[14,10229,60],{"id":60},[10,10231,63],{},[65,10233,10234],{"className":67,"code":2825,"language":69,"meta":70,"style":70},[34,10235,10236,10240,10244,10248,10252,10256,10260,10264],{"__ignoreMap":70},[74,10237,10238],{"class":76,"line":77},[74,10239,2832],{},[74,10241,10242],{"class":76,"line":83},[74,10243,2837],{},[74,10245,10246],{"class":76,"line":89},[74,10247,93],{"emptyLinePlaceholder":92},[74,10249,10250],{"class":76,"line":96},[74,10251,2846],{},[74,10253,10254],{"class":76,"line":102},[74,10255,2851],{},[74,10257,10258],{"class":76,"line":108},[74,10259,2856],{},[74,10261,10262],{"class":76,"line":114},[74,10263,2861],{},[74,10265,10266],{"class":76,"line":2478},[74,10267,2866],{},[10,10269,120],{},[65,10271,10273],{"className":10272,"code":2872,"language":126,"meta":70},[124],[34,10274,2872],{"__ignoreMap":70},[10,10276,131],{},[14,10278,134],{"id":134},[136,10280,10281,10287],{},[45,10282,10283,2886,10285,2890],{},[34,10284,2885],{},[34,10286,2889],{},[45,10288,10289,2896,10291,2899],{},[34,10290,2895],{},[34,10292,2814],{},[313,10294,2682],{"id":2682},[10,10296,2904],{},[10,10298,10299],{},[26,10300],{"alt":2909,"src":2910},[10,10302,10303,2915,10305,2918],{},[34,10304,2806],{},[34,10306,2810],{},[14,10308,157],{"id":157},[42,10310,10311,10317],{},[45,10312,2925,10313,2928,10315,2931],{},[34,10314,2800],{},[34,10316,2792],{},[45,10318,2934],{},[14,10320,175],{"id":175},[136,10322,10323,10327],{},[45,10324,2941,10325,2945],{},[34,10326,2944],{},[45,10328,2948,10329,2952],{},[34,10330,2951],{},[10,10332,189],{},[14,10334,192],{"id":192},[10,10336,2959],{},[197,10338,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10340},[10341,10342,10343,10344,10345,10348,10349,10350],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":10346},[10347],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":2755,"description":2760},[210,2981,2982],{"id":2985,"title":2986,"body":10355,"category":210,"cover":211,"description":2991,"extension":212,"meta":10488,"navigation":92,"path":3160,"pinned":215,"publishedAt":216,"seo":10489,"slug":3162,"stem":3163,"summary":3164,"tags":10490,"updatedAt":216,"visible":92,"__hash__":3167},{"type":7,"value":10356,"toc":10478},[10357,10359,10361,10363,10365,10369,10379,10381,10391,10393,10395,10423,10425,10430,10432,10434,10448,10450,10458,10460,10470,10472,10474,10476],[10,10358,2991],{},[14,10360,16],{"id":16},[10,10362,2996],{},[14,10364,22],{"id":22},[10,10366,10367],{},[26,10368],{"alt":3003,"src":3004},[10,10370,10371,3010,10373,3014,10375,3018,10377,3022],{},[34,10372,3009],{},[34,10374,3013],{},[34,10376,3017],{},[34,10378,3021],{},[14,10380,40],{"id":40},[42,10382,10383,10385,10389],{},[45,10384,3029],{},[45,10386,10387,3034],{},[34,10388,3021],{},[45,10390,3037],{},[14,10392,60],{"id":60},[10,10394,63],{},[65,10396,10397],{"className":67,"code":3044,"language":69,"meta":70,"style":70},[34,10398,10399,10403,10407,10411,10415,10419],{"__ignoreMap":70},[74,10400,10401],{"class":76,"line":77},[74,10402,3051],{},[74,10404,10405],{"class":76,"line":83},[74,10406,3056],{},[74,10408,10409],{"class":76,"line":89},[74,10410,3061],{},[74,10412,10413],{"class":76,"line":96},[74,10414,93],{"emptyLinePlaceholder":92},[74,10416,10417],{"class":76,"line":102},[74,10418,3070],{},[74,10420,10421],{"class":76,"line":108},[74,10422,3075],{},[10,10424,120],{},[65,10426,10428],{"className":10427,"code":3081,"language":126,"meta":70},[124],[34,10429,3081],{"__ignoreMap":70},[10,10431,131],{},[14,10433,134],{"id":134},[136,10435,10436,10442],{},[45,10437,3092,10438,3095,10440,3099],{},[34,10439,3009],{},[34,10441,3098],{},[45,10443,10444,3105,10446,3109],{},[34,10445,3104],{},[34,10447,3108],{},[14,10449,157],{"id":157},[42,10451,10452,10456],{},[45,10453,3116,10454,3120],{},[34,10455,3119],{},[45,10457,3123],{},[14,10459,175],{"id":175},[136,10461,10462,10464],{},[45,10463,3130],{},[45,10465,1704,10466,3136,10468,3139],{},[34,10467,3135],{},[34,10469,3021],{},[10,10471,189],{},[14,10473,192],{"id":192},[10,10475,3146],{},[197,10477,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10479},[10480,10481,10482,10483,10484,10485,10486,10487],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":2986,"description":2991},[210,2330,3166],{"id":4,"title":5,"body":10492,"category":210,"cover":211,"description":12,"extension":212,"meta":10621,"navigation":92,"path":214,"pinned":215,"publishedAt":216,"seo":10622,"slug":218,"stem":219,"summary":220,"tags":10623,"updatedAt":216,"visible":92,"__hash__":224},{"type":7,"value":10493,"toc":10611},[10494,10496,10498,10500,10502,10506,10510,10512,10522,10524,10526,10558,10560,10565,10567,10569,10581,10583,10593,10595,10603,10605,10607,10609],[10,10495,12],{},[14,10497,16],{"id":16},[10,10499,19],{},[14,10501,22],{"id":22},[10,10503,10504],{},[26,10505],{"alt":28,"src":29},[10,10507,32,10508,37],{},[34,10509,36],{},[14,10511,40],{"id":40},[42,10513,10514,10516,10518],{},[45,10515,47],{},[45,10517,50],{},[45,10519,53,10520,57],{},[34,10521,56],{},[14,10523,60],{"id":60},[10,10525,63],{},[65,10527,10528],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,10529,10530,10534,10538,10542,10546,10550,10554],{"__ignoreMap":70},[74,10531,10532],{"class":76,"line":77},[74,10533,80],{},[74,10535,10536],{"class":76,"line":83},[74,10537,86],{},[74,10539,10540],{"class":76,"line":89},[74,10541,93],{"emptyLinePlaceholder":92},[74,10543,10544],{"class":76,"line":96},[74,10545,99],{},[74,10547,10548],{"class":76,"line":102},[74,10549,105],{},[74,10551,10552],{"class":76,"line":108},[74,10553,111],{},[74,10555,10556],{"class":76,"line":114},[74,10557,117],{},[10,10559,120],{},[65,10561,10563],{"className":10562,"code":125,"language":126,"meta":70},[124],[34,10564,125],{"__ignoreMap":70},[10,10566,131],{},[14,10568,134],{"id":134},[136,10570,10571,10573],{},[45,10572,140],{},[45,10574,10575,146,10577,150,10579,154],{},[34,10576,145],{},[34,10578,149],{},[34,10580,153],{},[14,10582,157],{"id":157},[42,10584,10585,10591],{},[45,10586,162,10587,166,10589,57],{},[34,10588,165],{},[34,10590,169],{},[45,10592,172],{},[14,10594,175],{"id":175},[136,10596,10597,10599],{},[45,10598,180],{},[45,10600,183,10601,186],{},[34,10602,153],{},[10,10604,189],{},[14,10606,192],{"id":192},[10,10608,195],{},[197,10610,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10612},[10613,10614,10615,10616,10617,10618,10619,10620],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5,"description":12},[210,222,223],{"id":3302,"title":3303,"body":10625,"category":210,"cover":211,"description":3308,"extension":212,"meta":10744,"navigation":92,"path":3450,"pinned":215,"publishedAt":216,"seo":10745,"slug":3452,"stem":3453,"summary":3454,"tags":10746,"updatedAt":216,"visible":92,"__hash__":3457},{"type":7,"value":10626,"toc":10734},[10627,10629,10631,10633,10635,10639,10641,10643,10651,10653,10655,10683,10685,10690,10692,10694,10704,10706,10714,10716,10726,10728,10730,10732],[10,10628,3308],{},[14,10630,16],{"id":16},[10,10632,3313],{},[14,10634,22],{"id":22},[10,10636,10637],{},[26,10638],{"alt":3320,"src":3321},[10,10640,3324],{},[14,10642,40],{"id":40},[42,10644,10645,10647,10649],{},[45,10646,3331],{},[45,10648,3334],{},[45,10650,3337],{},[14,10652,60],{"id":60},[10,10654,63],{},[65,10656,10657],{"className":67,"code":3344,"language":69,"meta":70,"style":70},[34,10658,10659,10663,10667,10671,10675,10679],{"__ignoreMap":70},[74,10660,10661],{"class":76,"line":77},[74,10662,3351],{},[74,10664,10665],{"class":76,"line":83},[74,10666,3356],{},[74,10668,10669],{"class":76,"line":89},[74,10670,3361],{},[74,10672,10673],{"class":76,"line":96},[74,10674,93],{"emptyLinePlaceholder":92},[74,10676,10677],{"class":76,"line":102},[74,10678,3370],{},[74,10680,10681],{"class":76,"line":108},[74,10682,3375],{},[10,10684,120],{},[65,10686,10688],{"className":10687,"code":3381,"language":126,"meta":70},[124],[34,10689,3381],{"__ignoreMap":70},[10,10691,131],{},[14,10693,134],{"id":134},[136,10695,10696,10700],{},[45,10697,10698,3395],{},[34,10699,3394],{},[45,10701,10702,3401],{},[34,10703,3400],{},[14,10705,157],{"id":157},[42,10707,10708,10712],{},[45,10709,3408,10710,3412],{},[34,10711,3411],{},[45,10713,3415],{},[14,10715,175],{"id":175},[136,10717,10718,10720],{},[45,10719,3422],{},[45,10721,2157,10722,2160,10724,3429],{},[34,10723,3411],{},[34,10725,3400],{},[10,10727,189],{},[14,10729,192],{"id":192},[10,10731,3436],{},[197,10733,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10735},[10736,10737,10738,10739,10740,10741,10742,10743],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":3303,"description":3308},[210,3456,223],{"id":3459,"title":3460,"body":10748,"category":210,"cover":211,"description":3465,"extension":212,"meta":10873,"navigation":92,"path":3621,"pinned":215,"publishedAt":216,"seo":10874,"slug":3623,"stem":3624,"summary":3625,"tags":10875,"updatedAt":216,"visible":92,"__hash__":3628},{"type":7,"value":10749,"toc":10863},[10750,10752,10754,10756,10758,10762,10768,10770,10780,10782,10784,10812,10814,10819,10821,10823,10833,10835,10847,10849,10855,10857,10859,10861],[10,10751,3465],{},[14,10753,16],{"id":16},[10,10755,3470],{},[14,10757,22],{"id":22},[10,10759,10760],{},[26,10761],{"alt":3477,"src":3478},[10,10763,3481,10764,3485,10766,3488],{},[34,10765,3484],{},[34,10767,2230],{},[14,10769,40],{"id":40},[42,10771,10772,10774,10778],{},[45,10773,3495],{},[45,10775,2323,10776,3501],{},[34,10777,3500],{},[45,10779,3504],{},[14,10781,60],{"id":60},[10,10783,63],{},[65,10785,10786],{"className":67,"code":3511,"language":69,"meta":70,"style":70},[34,10787,10788,10792,10796,10800,10804,10808],{"__ignoreMap":70},[74,10789,10790],{"class":76,"line":77},[74,10791,3518],{},[74,10793,10794],{"class":76,"line":83},[74,10795,3523],{},[74,10797,10798],{"class":76,"line":89},[74,10799,93],{"emptyLinePlaceholder":92},[74,10801,10802],{"class":76,"line":96},[74,10803,3532],{},[74,10805,10806],{"class":76,"line":102},[74,10807,3537],{},[74,10809,10810],{"class":76,"line":108},[74,10811,3542],{},[10,10813,120],{},[65,10815,10817],{"className":10816,"code":3548,"language":126,"meta":70},[124],[34,10818,3548],{"__ignoreMap":70},[10,10820,131],{},[14,10822,134],{"id":134},[136,10824,10825,10827],{},[45,10826,3559],{},[45,10828,3562,10829,3565,10831,3569],{},[34,10830,2230],{},[34,10832,3568],{},[14,10834,157],{"id":157},[42,10836,10837,10841],{},[45,10838,3576,10839,3580],{},[34,10840,3579],{},[45,10842,3583,10843,3587,10845,57],{},[34,10844,3586],{},[34,10846,3590],{},[14,10848,175],{"id":175},[136,10850,10851,10853],{},[45,10852,3597],{},[45,10854,3600],{},[10,10856,189],{},[14,10858,192],{"id":192},[10,10860,3607],{},[197,10862,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10864},[10865,10866,10867,10868,10869,10870,10871,10872],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":3460,"description":3465},[210,3627,223],{"id":3630,"title":3631,"body":10877,"category":210,"cover":211,"description":3636,"extension":212,"meta":11000,"navigation":92,"path":3786,"pinned":215,"publishedAt":216,"seo":11001,"slug":3788,"stem":3789,"summary":3790,"tags":11002,"updatedAt":216,"visible":92,"__hash__":3793},{"type":7,"value":10878,"toc":10990},[10879,10881,10883,10885,10887,10891,10893,10895,10907,10909,10911,10939,10941,10946,10948,10950,10960,10962,10972,10974,10982,10984,10986,10988],[10,10880,3636],{},[14,10882,16],{"id":16},[10,10884,3641],{},[14,10886,22],{"id":22},[10,10888,10889],{},[26,10890],{"alt":3648,"src":3649},[10,10892,3652],{},[14,10894,40],{"id":40},[42,10896,10897,10899,10901],{},[45,10898,3659],{},[45,10900,3662],{},[45,10902,3665,10903,3669,10905,3673],{},[34,10904,3668],{},[34,10906,3672],{},[14,10908,60],{"id":60},[10,10910,63],{},[65,10912,10913],{"className":67,"code":3680,"language":69,"meta":70,"style":70},[34,10914,10915,10919,10923,10927,10931,10935],{"__ignoreMap":70},[74,10916,10917],{"class":76,"line":77},[74,10918,3687],{},[74,10920,10921],{"class":76,"line":83},[74,10922,3692],{},[74,10924,10925],{"class":76,"line":89},[74,10926,93],{"emptyLinePlaceholder":92},[74,10928,10929],{"class":76,"line":96},[74,10930,3701],{},[74,10932,10933],{"class":76,"line":102},[74,10934,3706],{},[74,10936,10937],{"class":76,"line":108},[74,10938,3711],{},[10,10940,120],{},[65,10942,10944],{"className":10943,"code":3717,"language":126,"meta":70},[124],[34,10945,3717],{"__ignoreMap":70},[10,10947,131],{},[14,10949,134],{"id":134},[136,10951,10952,10954],{},[45,10953,3728],{},[45,10955,10956,3734,10958,3738],{},[34,10957,3733],{},[34,10959,3737],{},[14,10961,157],{"id":157},[42,10963,10964,10970],{},[45,10965,2323,10966,3747,10968,57],{},[34,10967,3672],{},[34,10969,3668],{},[45,10971,3752],{},[14,10973,175],{"id":175},[136,10975,10976,10980],{},[45,10977,3759,10978,3762],{},[34,10979,3668],{},[45,10981,3765],{},[10,10983,189],{},[14,10985,192],{"id":192},[10,10987,3772],{},[197,10989,199],{},{"title":70,"searchDepth":83,"depth":83,"links":10991},[10992,10993,10994,10995,10996,10997,10998,10999],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":3631,"description":3636},[210,3792,223],{"id":3795,"title":3796,"body":11004,"category":210,"cover":211,"description":3801,"extension":212,"meta":11163,"navigation":92,"path":4000,"pinned":215,"publishedAt":216,"seo":11164,"slug":4002,"stem":4003,"summary":4004,"tags":11165,"updatedAt":216,"visible":92,"__hash__":4008},{"type":7,"value":11005,"toc":11151},[11006,11008,11010,11012,11014,11018,11024,11026,11038,11040,11042,11082,11084,11089,11091,11093,11107,11109,11111,11115,11117,11119,11129,11131,11143,11145,11147,11149],[10,11007,3801],{},[14,11009,16],{"id":16},[10,11011,3806],{},[14,11013,22],{"id":22},[10,11015,11016],{},[26,11017],{"alt":3813,"src":3814},[10,11019,11020,3820,11022,3824],{},[34,11021,3819],{},[34,11023,3823],{},[14,11025,40],{"id":40},[42,11027,11028,11034,11036],{},[45,11029,11030,3833,11032,3837],{},[34,11031,2792],{},[34,11033,3836],{},[45,11035,3840],{},[45,11037,3843],{},[14,11039,60],{"id":60},[10,11041,63],{},[65,11043,11044],{"className":67,"code":3850,"language":69,"meta":70,"style":70},[34,11045,11046,11050,11054,11058,11062,11066,11070,11074,11078],{"__ignoreMap":70},[74,11047,11048],{"class":76,"line":77},[74,11049,3857],{},[74,11051,11052],{"class":76,"line":83},[74,11053,3862],{},[74,11055,11056],{"class":76,"line":89},[74,11057,3867],{},[74,11059,11060],{"class":76,"line":96},[74,11061,93],{"emptyLinePlaceholder":92},[74,11063,11064],{"class":76,"line":102},[74,11065,3876],{},[74,11067,11068],{"class":76,"line":108},[74,11069,3881],{},[74,11071,11072],{"class":76,"line":114},[74,11073,3886],{},[74,11075,11076],{"class":76,"line":2478},[74,11077,3891],{},[74,11079,11080],{"class":76,"line":3894},[74,11081,3897],{},[10,11083,120],{},[65,11085,11087],{"className":11086,"code":3903,"language":126,"meta":70},[124],[34,11088,3903],{"__ignoreMap":70},[10,11090,131],{},[14,11092,134],{"id":134},[136,11094,11095,11099],{},[45,11096,11097,3917],{},[34,11098,3916],{},[45,11100,11101,3923,11103,3927,11105,3931],{},[34,11102,3922],{},[34,11104,3926],{},[34,11106,3930],{},[313,11108,2682],{"id":2682},[10,11110,3936],{},[10,11112,11113],{},[26,11114],{"alt":3941,"src":3942},[10,11116,3945],{},[14,11118,157],{"id":157},[42,11120,11121,11127],{},[45,11122,3952,11123,3955,11125,57],{},[34,11124,2792],{},[34,11126,3836],{},[45,11128,3960],{},[14,11130,175],{"id":175},[136,11132,11133,11135],{},[45,11134,3967],{},[45,11136,2323,11137,3973,11139,1141,11141,57],{},[34,11138,3972],{},[34,11140,3836],{},[34,11142,2792],{},[10,11144,189],{},[14,11146,192],{"id":192},[10,11148,3984],{},[197,11150,199],{},{"title":70,"searchDepth":83,"depth":83,"links":11152},[11153,11154,11155,11156,11157,11160,11161,11162],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":11158},[11159],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":3796,"description":3801},[210,4006,4007],{"id":4010,"title":4011,"body":11167,"category":210,"cover":211,"description":4016,"extension":212,"meta":11339,"navigation":92,"path":4230,"pinned":215,"publishedAt":216,"seo":11340,"slug":4232,"stem":4233,"summary":4234,"tags":11341,"updatedAt":216,"visible":92,"__hash__":4237},{"type":7,"value":11168,"toc":11326},[11169,11171,11173,11175,11177,11181,11189,11191,11199,11201,11203,11247,11249,11254,11256,11258,11270,11272,11274,11278,11284,11286,11288,11292,11296,11298,11310,11312,11318,11320,11322,11324],[10,11170,4016],{},[14,11172,16],{"id":16},[10,11174,4021],{},[14,11176,22],{"id":22},[10,11178,11179],{},[26,11180],{"alt":4028,"src":4029},[10,11182,11183,2241,11185,2241,11187,4039],{},[34,11184,1140],{},[34,11186,4036],{},[34,11188,1144],{},[14,11190,40],{"id":40},[42,11192,11193,11195,11197],{},[45,11194,4046],{},[45,11196,4049],{},[45,11198,4052],{},[14,11200,60],{"id":60},[10,11202,63],{},[65,11204,11205],{"className":67,"code":4059,"language":69,"meta":70,"style":70},[34,11206,11207,11211,11215,11219,11223,11227,11231,11235,11239,11243],{"__ignoreMap":70},[74,11208,11209],{"class":76,"line":77},[74,11210,4066],{},[74,11212,11213],{"class":76,"line":83},[74,11214,93],{"emptyLinePlaceholder":92},[74,11216,11217],{"class":76,"line":89},[74,11218,4075],{},[74,11220,11221],{"class":76,"line":96},[74,11222,4080],{},[74,11224,11225],{"class":76,"line":102},[74,11226,4085],{},[74,11228,11229],{"class":76,"line":108},[74,11230,4090],{},[74,11232,11233],{"class":76,"line":114},[74,11234,1130],{},[74,11236,11237],{"class":76,"line":2478},[74,11238,4099],{},[74,11240,11241],{"class":76,"line":3894},[74,11242,93],{"emptyLinePlaceholder":92},[74,11244,11245],{"class":76,"line":4106},[74,11246,4109],{},[10,11248,120],{},[65,11250,11252],{"className":11251,"code":4115,"language":126,"meta":70},[124],[34,11253,4115],{"__ignoreMap":70},[10,11255,131],{},[14,11257,134],{"id":134},[136,11259,11260,11264],{},[45,11261,4126,11262,4130],{},[34,11263,4129],{},[45,11265,11266,4136,11268,4139],{},[34,11267,4135],{},[34,11269,1144],{},[313,11271,2682],{"id":2682},[10,11273,4144],{},[10,11275,11276],{},[26,11277],{"alt":4149,"src":4150},[10,11279,11280,4155,11282,4158],{},[34,11281,4129],{},[34,11283,4135],{},[313,11285,2682],{"id":4161},[10,11287,4164],{},[10,11289,11290],{},[26,11291],{"alt":4169,"src":4170},[10,11293,4173,11294,4176],{},[34,11295,1140],{},[14,11297,157],{"id":157},[42,11299,11300,11304],{},[45,11301,4183,11302,4186],{},[34,11303,4135],{},[45,11305,4189,11306,4192,11308,4196],{},[34,11307,1140],{},[34,11309,4195],{},[14,11311,175],{"id":175},[136,11313,11314,11316],{},[45,11315,4203],{},[45,11317,4206],{},[10,11319,189],{},[14,11321,192],{"id":192},[10,11323,4213],{},[197,11325,199],{},{"title":70,"searchDepth":83,"depth":83,"links":11327},[11328,11329,11330,11331,11332,11336,11337,11338],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":11333},[11334,11335],{"id":2682,"depth":89,"text":2682},{"id":4161,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":4011,"description":4016},[210,1140,4236],{"id":4239,"title":4240,"body":11343,"category":210,"cover":211,"description":4245,"extension":212,"meta":11480,"navigation":92,"path":4412,"pinned":215,"publishedAt":216,"seo":11481,"slug":4414,"stem":4415,"summary":4416,"tags":11482,"updatedAt":216,"visible":92,"__hash__":4419},{"type":7,"value":11344,"toc":11468},[11345,11347,11349,11351,11353,11357,11361,11363,11373,11375,11377,11409,11411,11416,11418,11420,11430,11432,11434,11438,11442,11444,11450,11452,11460,11462,11464,11466],[10,11346,4245],{},[14,11348,16],{"id":16},[10,11350,4250],{},[14,11352,22],{"id":22},[10,11354,11355],{},[26,11356],{"alt":4257,"src":4258},[10,11358,11359,4264],{},[34,11360,4263],{},[14,11362,40],{"id":40},[42,11364,11365,11367,11369],{},[45,11366,4271],{},[45,11368,4274],{},[45,11370,4277,11371,4281],{},[34,11372,4280],{},[14,11374,60],{"id":60},[10,11376,63],{},[65,11378,11379],{"className":67,"code":4288,"language":69,"meta":70,"style":70},[34,11380,11381,11385,11389,11393,11397,11401,11405],{"__ignoreMap":70},[74,11382,11383],{"class":76,"line":77},[74,11384,4295],{},[74,11386,11387],{"class":76,"line":83},[74,11388,93],{"emptyLinePlaceholder":92},[74,11390,11391],{"class":76,"line":89},[74,11392,4304],{},[74,11394,11395],{"class":76,"line":96},[74,11396,4309],{},[74,11398,11399],{"class":76,"line":102},[74,11400,4314],{},[74,11402,11403],{"class":76,"line":108},[74,11404,93],{"emptyLinePlaceholder":92},[74,11406,11407],{"class":76,"line":114},[74,11408,4323],{},[10,11410,120],{},[65,11412,11414],{"className":11413,"code":4329,"language":126,"meta":70},[124],[34,11415,4329],{"__ignoreMap":70},[10,11417,131],{},[14,11419,134],{"id":134},[136,11421,11422,11426],{},[45,11423,4340,11424,4344],{},[34,11425,4343],{},[45,11427,4347,11428,4350],{},[34,11429,4343],{},[313,11431,2682],{"id":2682},[10,11433,4355],{},[10,11435,11436],{},[26,11437],{"alt":4360,"src":4361},[10,11439,4364,11440,4367],{},[34,11441,4343],{},[14,11443,157],{"id":157},[42,11445,11446,11448],{},[45,11447,4374],{},[45,11449,4377],{},[14,11451,175],{"id":175},[136,11453,11454,11458],{},[45,11455,2323,11456,4386],{},[34,11457,4263],{},[45,11459,4389],{},[10,11461,189],{},[14,11463,192],{"id":192},[10,11465,4396],{},[197,11467,199],{},{"title":70,"searchDepth":83,"depth":83,"links":11469},[11470,11471,11472,11473,11474,11477,11478,11479],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":11475},[11476],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":4240,"description":4245},[210,4263,4418],{"id":4421,"title":4422,"body":11484,"category":210,"cover":211,"description":4427,"extension":212,"meta":11609,"navigation":92,"path":4576,"pinned":215,"publishedAt":216,"seo":11610,"slug":4578,"stem":4579,"summary":4580,"tags":11611,"updatedAt":216,"visible":92,"__hash__":4583},{"type":7,"value":11485,"toc":11599},[11486,11488,11490,11492,11494,11498,11502,11504,11514,11516,11518,11550,11552,11557,11559,11561,11573,11575,11581,11583,11591,11593,11595,11597],[10,11487,4427],{},[14,11489,16],{"id":16},[10,11491,4432],{},[14,11493,22],{"id":22},[10,11495,11496],{},[26,11497],{"alt":4439,"src":4440},[10,11499,11500,4445],{},[34,11501,4280],{},[14,11503,40],{"id":40},[42,11505,11506,11510,11512],{},[45,11507,11508,4455],{},[34,11509,4454],{},[45,11511,4458],{},[45,11513,4461],{},[14,11515,60],{"id":60},[10,11517,63],{},[65,11519,11520],{"className":67,"code":4468,"language":69,"meta":70,"style":70},[34,11521,11522,11526,11530,11534,11538,11542,11546],{"__ignoreMap":70},[74,11523,11524],{"class":76,"line":77},[74,11525,4475],{},[74,11527,11528],{"class":76,"line":83},[74,11529,93],{"emptyLinePlaceholder":92},[74,11531,11532],{"class":76,"line":89},[74,11533,4484],{},[74,11535,11536],{"class":76,"line":96},[74,11537,4489],{},[74,11539,11540],{"class":76,"line":102},[74,11541,93],{"emptyLinePlaceholder":92},[74,11543,11544],{"class":76,"line":108},[74,11545,4498],{},[74,11547,11548],{"class":76,"line":114},[74,11549,4503],{},[10,11551,120],{},[65,11553,11555],{"className":11554,"code":4509,"language":126,"meta":70},[124],[34,11556,4509],{"__ignoreMap":70},[10,11558,131],{},[14,11560,134],{"id":134},[136,11562,11563,11569],{},[45,11564,4520,11565,4523,11567,4527],{},[34,11566,4280],{},[34,11568,4526],{},[45,11570,11571,4532],{},[34,11572,4454],{},[14,11574,157],{"id":157},[42,11576,11577,11579],{},[45,11578,4539],{},[45,11580,4542],{},[14,11582,175],{"id":175},[136,11584,11585,11587],{},[45,11586,4549],{},[45,11588,2323,11589,4555],{},[34,11590,4554],{},[10,11592,189],{},[14,11594,192],{"id":192},[10,11596,4562],{},[197,11598,199],{},{"title":70,"searchDepth":83,"depth":83,"links":11600},[11601,11602,11603,11604,11605,11606,11607,11608],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":4422,"description":4427},[210,4280,4582],{"id":4585,"title":4586,"body":11613,"category":210,"cover":211,"description":4591,"extension":212,"meta":11758,"navigation":92,"path":4766,"pinned":215,"publishedAt":216,"seo":11759,"slug":4768,"stem":4769,"summary":4770,"tags":11760,"updatedAt":216,"visible":92,"__hash__":4772},{"type":7,"value":11614,"toc":11748},[11615,11617,11619,11621,11623,11627,11633,11635,11649,11651,11653,11697,11699,11704,11706,11708,11718,11720,11732,11734,11740,11742,11744,11746],[10,11616,4591],{},[14,11618,16],{"id":16},[10,11620,4596],{},[14,11622,22],{"id":22},[10,11624,11625],{},[26,11626],{"alt":4603,"src":4604},[10,11628,11629,4610,11631,4614],{},[34,11630,4609],{},[34,11632,4613],{},[14,11634,40],{"id":40},[42,11636,11637,11639,11645],{},[45,11638,4621],{},[45,11640,11641,4626,11643,4629],{},[34,11642,4609],{},[34,11644,4263],{},[45,11646,4632,11647,4635],{},[34,11648,4613],{},[14,11650,60],{"id":60},[10,11652,63],{},[65,11654,11655],{"className":67,"code":4642,"language":69,"meta":70,"style":70},[34,11656,11657,11661,11665,11669,11673,11677,11681,11685,11689,11693],{"__ignoreMap":70},[74,11658,11659],{"class":76,"line":77},[74,11660,4649],{},[74,11662,11663],{"class":76,"line":83},[74,11664,93],{"emptyLinePlaceholder":92},[74,11666,11667],{"class":76,"line":89},[74,11668,4658],{},[74,11670,11671],{"class":76,"line":96},[74,11672,4663],{},[74,11674,11675],{"class":76,"line":102},[74,11676,4668],{},[74,11678,11679],{"class":76,"line":108},[74,11680,4673],{},[74,11682,11683],{"class":76,"line":114},[74,11684,4678],{},[74,11686,11687],{"class":76,"line":2478},[74,11688,4503],{},[74,11690,11691],{"class":76,"line":3894},[74,11692,93],{"emptyLinePlaceholder":92},[74,11694,11695],{"class":76,"line":4106},[74,11696,4691],{},[10,11698,120],{},[65,11700,11702],{"className":11701,"code":4697,"language":126,"meta":70},[124],[34,11703,4697],{"__ignoreMap":70},[10,11705,131],{},[14,11707,134],{"id":134},[136,11709,11710,11714],{},[45,11711,4708,11712,4711],{},[34,11713,4609],{},[45,11715,4714,11716,4717],{},[34,11717,4613],{},[14,11719,157],{"id":157},[42,11721,11722,11726],{},[45,11723,3408,11724,4726],{},[34,11725,4609],{},[45,11727,4729,11728,4732,11730,4735],{},[34,11729,4263],{},[34,11731,4609],{},[14,11733,175],{"id":175},[136,11735,11736,11738],{},[45,11737,4742],{},[45,11739,4745],{},[10,11741,189],{},[14,11743,192],{"id":192},[10,11745,4752],{},[197,11747,199],{},{"title":70,"searchDepth":83,"depth":83,"links":11749},[11750,11751,11752,11753,11754,11755,11756,11757],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":4586,"description":4591},[210,4613,4609],{"id":4774,"title":4775,"body":11762,"category":210,"cover":211,"description":4780,"extension":212,"meta":11901,"navigation":92,"path":4952,"pinned":215,"publishedAt":216,"seo":11902,"slug":4954,"stem":4955,"summary":4956,"tags":11903,"updatedAt":216,"visible":92,"__hash__":4960},{"type":7,"value":11763,"toc":11889},[11764,11766,11768,11770,11772,11776,11778,11780,11796,11798,11800,11828,11830,11835,11837,11839,11851,11853,11855,11859,11861,11863,11873,11875,11881,11883,11885,11887],[10,11765,4780],{},[14,11767,16],{"id":16},[10,11769,4785],{},[14,11771,22],{"id":22},[10,11773,11774],{},[26,11775],{"alt":4792,"src":4793},[10,11777,4796],{},[14,11779,40],{"id":40},[42,11781,11782,11784,11786],{},[45,11783,4803],{},[45,11785,4806],{},[45,11787,4809,11788,2241,11790,4816,11792,2241,11794,57],{},[34,11789,4812],{},[34,11791,4815],{},[34,11793,4819],{},[34,11795,4822],{},[14,11797,60],{"id":60},[10,11799,63],{},[65,11801,11802],{"className":67,"code":4829,"language":69,"meta":70,"style":70},[34,11803,11804,11808,11812,11816,11820,11824],{"__ignoreMap":70},[74,11805,11806],{"class":76,"line":77},[74,11807,4836],{},[74,11809,11810],{"class":76,"line":83},[74,11811,93],{"emptyLinePlaceholder":92},[74,11813,11814],{"class":76,"line":89},[74,11815,4845],{},[74,11817,11818],{"class":76,"line":96},[74,11819,4850],{},[74,11821,11822],{"class":76,"line":102},[74,11823,4855],{},[74,11825,11826],{"class":76,"line":108},[74,11827,4860],{},[10,11829,120],{},[65,11831,11833],{"className":11832,"code":4866,"language":126,"meta":70},[124],[34,11834,4866],{"__ignoreMap":70},[10,11836,131],{},[14,11838,134],{"id":134},[136,11840,11841,11849],{},[45,11842,4877,11843,4880,11845,1141,11847,57],{},[34,11844,4812],{},[34,11846,4883],{},[34,11848,4886],{},[45,11850,4889],{},[313,11852,2682],{"id":2682},[10,11854,4894],{},[10,11856,11857],{},[26,11858],{"alt":4899,"src":4900},[10,11860,4903],{},[14,11862,157],{"id":157},[42,11864,11865,11871],{},[45,11866,4910,11867,993,11869,4916],{},[34,11868,4913],{},[34,11870,4819],{},[45,11872,4919],{},[14,11874,175],{"id":175},[136,11876,11877,11879],{},[45,11878,4926],{},[45,11880,4929],{},[10,11882,189],{},[14,11884,192],{"id":192},[10,11886,4936],{},[197,11888,199],{},{"title":70,"searchDepth":83,"depth":83,"links":11890},[11891,11892,11893,11894,11895,11898,11899,11900],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":11896},[11897],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":4775,"description":4780},[210,4958,4959],{"id":4962,"title":4963,"body":11905,"category":210,"cover":211,"description":4968,"extension":212,"meta":12022,"navigation":92,"path":5107,"pinned":215,"publishedAt":216,"seo":12023,"slug":5109,"stem":5110,"summary":5111,"tags":12024,"updatedAt":216,"visible":92,"__hash__":5115},{"type":7,"value":11906,"toc":12012},[11907,11909,11911,11913,11915,11919,11921,11923,11931,11933,11935,11967,11969,11974,11976,11978,11986,11988,11996,11998,12004,12006,12008,12010],[10,11908,4968],{},[14,11910,16],{"id":16},[10,11912,4973],{},[14,11914,22],{"id":22},[10,11916,11917],{},[26,11918],{"alt":4980,"src":4981},[10,11920,4984],{},[14,11922,40],{"id":40},[42,11924,11925,11927,11929],{},[45,11926,4991],{},[45,11928,4994],{},[45,11930,4997],{},[14,11932,60],{"id":60},[10,11934,63],{},[65,11936,11937],{"className":67,"code":5004,"language":69,"meta":70,"style":70},[34,11938,11939,11943,11947,11951,11955,11959,11963],{"__ignoreMap":70},[74,11940,11941],{"class":76,"line":77},[74,11942,5011],{},[74,11944,11945],{"class":76,"line":83},[74,11946,93],{"emptyLinePlaceholder":92},[74,11948,11949],{"class":76,"line":89},[74,11950,5020],{},[74,11952,11953],{"class":76,"line":96},[74,11954,5025],{},[74,11956,11957],{"class":76,"line":102},[74,11958,93],{"emptyLinePlaceholder":92},[74,11960,11961],{"class":76,"line":108},[74,11962,5034],{},[74,11964,11965],{"class":76,"line":114},[74,11966,5039],{},[10,11968,120],{},[65,11970,11972],{"className":11971,"code":5045,"language":126,"meta":70},[124],[34,11973,5045],{"__ignoreMap":70},[10,11975,131],{},[14,11977,134],{"id":134},[136,11979,11980,11982],{},[45,11981,5056],{},[45,11983,5059,11984,5063],{},[34,11985,5062],{},[14,11987,157],{"id":157},[42,11989,11990,11994],{},[45,11991,5070,11992,5073],{},[34,11993,4280],{},[45,11995,5076],{},[14,11997,175],{"id":175},[136,11999,12000,12002],{},[45,12001,5083],{},[45,12003,5086],{},[10,12005,189],{},[14,12007,192],{"id":192},[10,12009,5093],{},[197,12011,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12013},[12014,12015,12016,12017,12018,12019,12020,12021],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":4963,"description":4968},[210,5113,5114],{"id":5117,"title":5118,"body":12026,"category":210,"cover":211,"description":5123,"extension":212,"meta":12145,"navigation":92,"path":5267,"pinned":215,"publishedAt":216,"seo":12146,"slug":5269,"stem":5270,"summary":5271,"tags":12147,"updatedAt":216,"visible":92,"__hash__":5275},{"type":7,"value":12027,"toc":12135},[12028,12030,12032,12034,12036,12040,12042,12044,12052,12054,12056,12088,12090,12095,12097,12099,12109,12111,12117,12119,12127,12129,12131,12133],[10,12029,5123],{},[14,12031,16],{"id":16},[10,12033,5128],{},[14,12035,22],{"id":22},[10,12037,12038],{},[26,12039],{"alt":5135,"src":5136},[10,12041,5139],{},[14,12043,40],{"id":40},[42,12045,12046,12048,12050],{},[45,12047,5146],{},[45,12049,5149],{},[45,12051,5152],{},[14,12053,60],{"id":60},[10,12055,63],{},[65,12057,12058],{"className":67,"code":5159,"language":69,"meta":70,"style":70},[34,12059,12060,12064,12068,12072,12076,12080,12084],{"__ignoreMap":70},[74,12061,12062],{"class":76,"line":77},[74,12063,5166],{},[74,12065,12066],{"class":76,"line":83},[74,12067,5171],{},[74,12069,12070],{"class":76,"line":89},[74,12071,5176],{},[74,12073,12074],{"class":76,"line":96},[74,12075,93],{"emptyLinePlaceholder":92},[74,12077,12078],{"class":76,"line":102},[74,12079,5185],{},[74,12081,12082],{"class":76,"line":108},[74,12083,5190],{},[74,12085,12086],{"class":76,"line":114},[74,12087,5195],{},[10,12089,120],{},[65,12091,12093],{"className":12092,"code":5201,"language":126,"meta":70},[124],[34,12094,5201],{"__ignoreMap":70},[10,12096,131],{},[14,12098,134],{"id":134},[136,12100,12101,12105],{},[45,12102,922,12103,5215],{},[34,12104,5214],{},[45,12106,5218,12107,5222],{},[34,12108,5221],{},[14,12110,157],{"id":157},[42,12112,12113,12115],{},[45,12114,5229],{},[45,12116,5232],{},[14,12118,175],{"id":175},[136,12120,12121,12125],{},[45,12122,5239,12123,5243],{},[34,12124,5242],{},[45,12126,5246],{},[10,12128,189],{},[14,12130,192],{"id":192},[10,12132,5253],{},[197,12134,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12136},[12137,12138,12139,12140,12141,12142,12143,12144],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5118,"description":5123},[210,5273,5274],{"id":5277,"title":5278,"body":12149,"category":210,"cover":211,"description":5283,"extension":212,"meta":12294,"navigation":92,"path":5464,"pinned":215,"publishedAt":216,"seo":12295,"slug":5466,"stem":5467,"summary":5468,"tags":12296,"updatedAt":216,"visible":92,"__hash__":5472},{"type":7,"value":12150,"toc":12282},[12151,12153,12155,12157,12159,12163,12167,12169,12181,12183,12185,12213,12215,12220,12222,12224,12238,12240,12242,12246,12254,12256,12266,12268,12274,12276,12278,12280],[10,12152,5283],{},[14,12154,16],{"id":16},[10,12156,5288],{},[14,12158,22],{"id":22},[10,12160,12161],{},[26,12162],{"alt":5295,"src":5296},[10,12164,5299,12165,5303],{},[34,12166,5302],{},[14,12168,40],{"id":40},[42,12170,12171,12173,12175],{},[45,12172,5310],{},[45,12174,5313],{},[45,12176,5316,12177,5319,12179,57],{},[34,12178,5302],{},[34,12180,5322],{},[14,12182,60],{"id":60},[10,12184,63],{},[65,12186,12187],{"className":67,"code":5329,"language":69,"meta":70,"style":70},[34,12188,12189,12193,12197,12201,12205,12209],{"__ignoreMap":70},[74,12190,12191],{"class":76,"line":77},[74,12192,5336],{},[74,12194,12195],{"class":76,"line":83},[74,12196,5341],{},[74,12198,12199],{"class":76,"line":89},[74,12200,5346],{},[74,12202,12203],{"class":76,"line":96},[74,12204,93],{"emptyLinePlaceholder":92},[74,12206,12207],{"class":76,"line":102},[74,12208,5355],{},[74,12210,12211],{"class":76,"line":108},[74,12212,5360],{},[10,12214,120],{},[65,12216,12218],{"className":12217,"code":5366,"language":126,"meta":70},[124],[34,12219,5366],{"__ignoreMap":70},[10,12221,131],{},[14,12223,134],{"id":134},[136,12225,12226,12232],{},[45,12227,5377,12228,2241,12230,5383],{},[34,12229,5380],{},[34,12231,4343],{},[45,12233,12234,5389,12236,5393],{},[34,12235,5388],{},[34,12237,5392],{},[313,12239,2682],{"id":2682},[10,12241,5398],{},[10,12243,12244],{},[26,12245],{"alt":5403,"src":5404},[10,12247,12248,2241,12250,1141,12252,5414],{},[34,12249,5380],{},[34,12251,4343],{},[34,12253,5413],{},[14,12255,157],{"id":157},[42,12257,12258,12262],{},[45,12259,5421,12260,5425],{},[34,12261,5424],{},[45,12263,5428,12264,5431],{},[34,12265,5413],{},[14,12267,175],{"id":175},[136,12269,12270,12272],{},[45,12271,5438],{},[45,12273,5441],{},[10,12275,189],{},[14,12277,192],{"id":192},[10,12279,5448],{},[197,12281,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12283},[12284,12285,12286,12287,12288,12291,12292,12293],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":12289},[12290],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5278,"description":5283},[210,5470,5471],{"id":5474,"title":5475,"body":12298,"category":210,"cover":211,"description":5480,"extension":212,"meta":12447,"navigation":92,"path":5661,"pinned":215,"publishedAt":216,"seo":12448,"slug":5663,"stem":5664,"summary":5665,"tags":12449,"updatedAt":216,"visible":92,"__hash__":5669},{"type":7,"value":12299,"toc":12435},[12300,12302,12304,12306,12308,12312,12314,12316,12328,12330,12332,12376,12378,12383,12385,12387,12399,12401,12403,12407,12409,12411,12419,12421,12427,12429,12431,12433],[10,12301,5480],{},[14,12303,16],{"id":16},[10,12305,5485],{},[14,12307,22],{"id":22},[10,12309,12310],{},[26,12311],{"alt":5492,"src":5493},[10,12313,5496],{},[14,12315,40],{"id":40},[42,12317,12318,12320,12324],{},[45,12319,5503],{},[45,12321,12322,5509],{},[34,12323,5508],{},[45,12325,12326,5515],{},[34,12327,5514],{},[14,12329,60],{"id":60},[10,12331,63],{},[65,12333,12334],{"className":67,"code":5522,"language":69,"meta":70,"style":70},[34,12335,12336,12340,12344,12348,12352,12356,12360,12364,12368,12372],{"__ignoreMap":70},[74,12337,12338],{"class":76,"line":77},[74,12339,5529],{},[74,12341,12342],{"class":76,"line":83},[74,12343,5534],{},[74,12345,12346],{"class":76,"line":89},[74,12347,93],{"emptyLinePlaceholder":92},[74,12349,12350],{"class":76,"line":96},[74,12351,5543],{},[74,12353,12354],{"class":76,"line":102},[74,12355,5548],{},[74,12357,12358],{"class":76,"line":108},[74,12359,93],{"emptyLinePlaceholder":92},[74,12361,12362],{"class":76,"line":114},[74,12363,5557],{},[74,12365,12366],{"class":76,"line":2478},[74,12367,5562],{},[74,12369,12370],{"class":76,"line":3894},[74,12371,93],{"emptyLinePlaceholder":92},[74,12373,12374],{"class":76,"line":4106},[74,12375,5571],{},[10,12377,120],{},[65,12379,12381],{"className":12380,"code":5577,"language":126,"meta":70},[124],[34,12382,5577],{"__ignoreMap":70},[10,12384,131],{},[14,12386,134],{"id":134},[136,12388,12389,12393],{},[45,12390,5588,12391,5592],{},[34,12392,5591],{},[45,12394,12395,5598,12397,57],{},[34,12396,5597],{},[34,12398,5601],{},[313,12400,2682],{"id":2682},[10,12402,5606],{},[10,12404,12405],{},[26,12406],{"alt":5611,"src":5612},[10,12408,5615],{},[14,12410,157],{"id":157},[42,12412,12413,12417],{},[45,12414,5622,12415,5625],{},[34,12416,5322],{},[45,12418,5628],{},[14,12420,175],{"id":175},[136,12422,12423,12425],{},[45,12424,5635],{},[45,12426,5638],{},[10,12428,189],{},[14,12430,192],{"id":192},[10,12432,5645],{},[197,12434,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12436},[12437,12438,12439,12440,12441,12444,12445,12446],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":12442},[12443],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5475,"description":5480},[210,5667,5668],{"id":5671,"title":5672,"body":12451,"category":210,"cover":211,"description":5677,"extension":212,"meta":12612,"navigation":92,"path":5875,"pinned":215,"publishedAt":216,"seo":12613,"slug":5877,"stem":5878,"summary":5879,"tags":12614,"updatedAt":216,"visible":92,"__hash__":5883},{"type":7,"value":12452,"toc":12600},[12453,12455,12457,12459,12461,12465,12467,12469,12481,12483,12485,12537,12539,12544,12546,12548,12566,12568,12570,12574,12576,12578,12584,12586,12592,12594,12596,12598],[10,12454,5677],{},[14,12456,16],{"id":16},[10,12458,5682],{},[14,12460,22],{"id":22},[10,12462,12463],{},[26,12464],{"alt":5689,"src":5690},[10,12466,5693],{},[14,12468,40],{"id":40},[42,12470,12471,12473,12475],{},[45,12472,5700],{},[45,12474,5703],{},[45,12476,12477,2160,12479,5712],{},[34,12478,5708],{},[34,12480,5711],{},[14,12482,60],{"id":60},[10,12484,63],{},[65,12486,12487],{"className":67,"code":5719,"language":69,"meta":70,"style":70},[34,12488,12489,12493,12497,12501,12505,12509,12513,12517,12521,12525,12529,12533],{"__ignoreMap":70},[74,12490,12491],{"class":76,"line":77},[74,12492,5726],{},[74,12494,12495],{"class":76,"line":83},[74,12496,93],{"emptyLinePlaceholder":92},[74,12498,12499],{"class":76,"line":89},[74,12500,5735],{},[74,12502,12503],{"class":76,"line":96},[74,12504,5740],{},[74,12506,12507],{"class":76,"line":102},[74,12508,93],{"emptyLinePlaceholder":92},[74,12510,12511],{"class":76,"line":108},[74,12512,5749],{},[74,12514,12515],{"class":76,"line":114},[74,12516,5754],{},[74,12518,12519],{"class":76,"line":2478},[74,12520,5759],{},[74,12522,12523],{"class":76,"line":3894},[74,12524,93],{"emptyLinePlaceholder":92},[74,12526,12527],{"class":76,"line":4106},[74,12528,5768],{},[74,12530,12531],{"class":76,"line":5771},[74,12532,93],{"emptyLinePlaceholder":92},[74,12534,12535],{"class":76,"line":5776},[74,12536,5779],{},[10,12538,120],{},[65,12540,12542],{"className":12541,"code":5785,"language":126,"meta":70},[124],[34,12543,5785],{"__ignoreMap":70},[10,12545,131],{},[14,12547,134],{"id":134},[136,12549,12550,12560],{},[45,12551,12552,5799,12554,5803,12556,5806,12558,5810],{},[34,12553,5798],{},[34,12555,5802],{},[34,12557,5591],{},[34,12559,5809],{},[45,12561,12562,5815,12564,5818],{},[34,12563,4526],{},[34,12565,2192],{},[313,12567,2682],{"id":2682},[10,12569,5823],{},[10,12571,12572],{},[26,12573],{"alt":5828,"src":5829},[10,12575,5832],{},[14,12577,157],{"id":157},[42,12579,12580,12582],{},[45,12581,5839],{},[45,12583,5842],{},[14,12585,175],{"id":175},[136,12587,12588,12590],{},[45,12589,5849],{},[45,12591,5852],{},[10,12593,189],{},[14,12595,192],{"id":192},[10,12597,5859],{},[197,12599,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12601},[12602,12603,12604,12605,12606,12609,12610,12611],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":12607},[12608],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5672,"description":5677},[210,5881,5882],{"id":5885,"title":5886,"body":12616,"category":210,"cover":211,"description":5891,"extension":212,"meta":12739,"navigation":92,"path":6042,"pinned":215,"publishedAt":216,"seo":12740,"slug":6044,"stem":6045,"summary":6046,"tags":12741,"updatedAt":216,"visible":92,"__hash__":6050},{"type":7,"value":12617,"toc":12729},[12618,12620,12622,12624,12626,12630,12632,12634,12648,12650,12652,12680,12682,12687,12689,12691,12701,12703,12711,12713,12721,12723,12725,12727],[10,12619,5891],{},[14,12621,16],{"id":16},[10,12623,5896],{},[14,12625,22],{"id":22},[10,12627,12628],{},[26,12629],{"alt":5903,"src":5904},[10,12631,5907],{},[14,12633,40],{"id":40},[42,12635,12636,12638,12640],{},[45,12637,5914],{},[45,12639,5917],{},[45,12641,5920,12642,2241,12644,2241,12646,5928],{},[34,12643,2244],{},[34,12645,2410],{},[34,12647,5927],{},[14,12649,60],{"id":60},[10,12651,63],{},[65,12653,12654],{"className":67,"code":5935,"language":69,"meta":70,"style":70},[34,12655,12656,12660,12664,12668,12672,12676],{"__ignoreMap":70},[74,12657,12658],{"class":76,"line":77},[74,12659,5942],{},[74,12661,12662],{"class":76,"line":83},[74,12663,5947],{},[74,12665,12666],{"class":76,"line":89},[74,12667,5952],{},[74,12669,12670],{"class":76,"line":96},[74,12671,93],{"emptyLinePlaceholder":92},[74,12673,12674],{"class":76,"line":102},[74,12675,5961],{},[74,12677,12678],{"class":76,"line":108},[74,12679,5966],{},[10,12681,120],{},[65,12683,12685],{"className":12684,"code":5972,"language":126,"meta":70},[124],[34,12686,5972],{"__ignoreMap":70},[10,12688,131],{},[14,12690,134],{"id":134},[136,12692,12693,12699],{},[45,12694,5983,12695,5987,12697,5990],{},[34,12696,5986],{},[34,12698,2230],{},[45,12700,5993],{},[14,12702,157],{"id":157},[42,12704,12705,12709],{},[45,12706,6000,12707,6004],{},[34,12708,6003],{},[45,12710,6007],{},[14,12712,175],{"id":175},[136,12714,12715,12717],{},[45,12716,6014],{},[45,12718,6017,12719,6021],{},[34,12720,6020],{},[10,12722,189],{},[14,12724,192],{"id":192},[10,12726,6028],{},[197,12728,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12730},[12731,12732,12733,12734,12735,12736,12737,12738],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":5886,"description":5891},[210,6048,6049],{"id":6052,"title":6053,"body":12743,"category":210,"cover":211,"description":6058,"extension":212,"meta":12920,"navigation":92,"path":6286,"pinned":215,"publishedAt":216,"seo":12921,"slug":6288,"stem":6289,"summary":6290,"tags":12922,"updatedAt":216,"visible":92,"__hash__":6294},{"type":7,"value":12744,"toc":12908},[12745,12747,12749,12753,12755,12759,12765,12767,12779,12781,12785,12809,12813,12829,12835,12837,12842,12844,12846,12862,12864,12866,12870,12874,12876,12888,12890,12900,12902,12904,12906],[10,12746,6058],{},[14,12748,16],{"id":16},[10,12750,6063,12751,6066],{},[279,12752,5986],{},[14,12754,22],{"id":22},[10,12756,12757],{},[26,12758],{"alt":6073,"src":6074},[10,12760,6077,12761,6081,12763,6085],{},[34,12762,6080],{},[34,12764,6084],{},[14,12766,40],{"id":40},[42,12768,12769,12773,12775],{},[45,12770,6092,12771,6095],{},[34,12772,1155],{},[45,12774,6098],{},[45,12776,6101,12777,6105],{},[34,12778,6104],{},[14,12780,60],{"id":60},[10,12782,6110,12783,6114],{},[34,12784,6113],{},[65,12786,12787],{"className":67,"code":6117,"language":69,"meta":70,"style":70},[34,12788,12789,12793,12797,12801,12805],{"__ignoreMap":70},[74,12790,12791],{"class":76,"line":77},[74,12792,6124],{},[74,12794,12795],{"class":76,"line":83},[74,12796,6129],{},[74,12798,12799],{"class":76,"line":89},[74,12800,93],{"emptyLinePlaceholder":92},[74,12802,12803],{"class":76,"line":96},[74,12804,6138],{},[74,12806,12807],{"class":76,"line":102},[74,12808,6143],{},[10,12810,6146,12811,6150],{},[34,12812,6149],{},[65,12814,12815],{"className":67,"code":6153,"language":69,"meta":70,"style":70},[34,12816,12817,12821,12825],{"__ignoreMap":70},[74,12818,12819],{"class":76,"line":77},[74,12820,6160],{},[74,12822,12823],{"class":76,"line":83},[74,12824,93],{"emptyLinePlaceholder":92},[74,12826,12827],{"class":76,"line":89},[74,12828,6169],{},[10,12830,6172,12831,1141,12833,57],{},[34,12832,6175],{},[34,12834,6178],{},[10,12836,120],{},[65,12838,12840],{"className":12839,"code":6184,"language":126,"meta":70},[124],[34,12841,6184],{"__ignoreMap":70},[10,12843,131],{},[14,12845,134],{"id":134},[136,12847,12848,12854],{},[45,12849,6195,12850,6198,12852,6202],{},[34,12851,6113],{},[34,12853,6201],{},[45,12855,12856,6207,12858,6210,12860,6213],{},[34,12857,6149],{},[34,12859,6113],{},[34,12861,6149],{},[313,12863,2682],{"id":2682},[10,12865,6218],{},[10,12867,12868],{},[26,12869],{"alt":6223,"src":6224},[10,12871,6227,12872,6230],{},[34,12873,6201],{},[14,12875,157],{"id":157},[42,12877,12878,12884],{},[45,12879,6237,12880,1141,12882,57],{},[34,12881,6113],{},[34,12883,6149],{},[45,12885,6244,12886,6248],{},[34,12887,6247],{},[14,12889,175],{"id":175},[136,12891,12892,12896],{},[45,12893,2338,12894,6258],{},[34,12895,6257],{},[45,12897,6261,12898,57],{},[34,12899,6080],{},[10,12901,189],{},[14,12903,192],{"id":192},[10,12905,6270],{},[197,12907,199],{},{"title":70,"searchDepth":83,"depth":83,"links":12909},[12910,12911,12912,12913,12914,12917,12918,12919],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":12915},[12916],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":6053,"description":6058},[210,6292,6293],{"id":6296,"title":6297,"body":12924,"category":210,"cover":211,"description":6302,"extension":212,"meta":13063,"navigation":92,"path":6468,"pinned":215,"publishedAt":216,"seo":13064,"slug":6470,"stem":6471,"summary":6472,"tags":13065,"updatedAt":216,"visible":92,"__hash__":6475},{"type":7,"value":12925,"toc":13053},[12926,12928,12930,12932,12934,12938,12940,12942,12952,12954,12956,12996,12998,13003,13005,13007,13025,13027,13035,13037,13045,13047,13049,13051],[10,12927,6302],{},[14,12929,16],{"id":16},[10,12931,6307],{},[14,12933,22],{"id":22},[10,12935,12936],{},[26,12937],{"alt":6314,"src":6315},[10,12939,6318],{},[14,12941,40],{"id":40},[42,12943,12944,12948,12950],{},[45,12945,12946,6328],{},[34,12947,6327],{},[45,12949,6331],{},[45,12951,6334],{},[14,12953,60],{"id":60},[10,12955,1558],{},[65,12957,12958],{"className":575,"code":6341,"language":577,"meta":70,"style":70},[34,12959,12960,12970,12976,12982,12992],{"__ignoreMap":70},[74,12961,12962,12964,12966,12968],{"class":76,"line":77},[74,12963,675],{"class":584},[74,12965,617],{"class":587},[74,12967,6352],{"class":620},[74,12969,6355],{"class":620},[74,12971,12972,12974],{"class":76,"line":83},[74,12973,6360],{"class":587},[74,12975,6363],{"class":620},[74,12977,12978,12980],{"class":76,"line":89},[74,12979,69],{"class":584},[74,12981,588],{"class":587},[74,12983,12984,12986,12988,12990],{"class":76,"line":96},[74,12985,69],{"class":584},[74,12987,617],{"class":587},[74,12989,621],{"class":620},[74,12991,588],{"class":587},[74,12993,12994],{"class":76,"line":102},[74,12995,6384],{"class":584},[10,12997,120],{},[65,12999,13001],{"className":13000,"code":6390,"language":126,"meta":70},[124],[34,13002,6390],{"__ignoreMap":70},[10,13004,131],{},[14,13006,134],{"id":134},[136,13008,13009,13015],{},[45,13010,13011,6404,13013,6407],{},[34,13012,6403],{},[34,13014,675],{},[45,13016,6410,13017,2160,13019,6416,13021,3669,13023,6422],{},[34,13018,69],{},[34,13020,6415],{},[34,13022,6327],{},[34,13024,6421],{},[14,13026,157],{"id":157},[42,13028,13029,13031],{},[45,13030,6429],{},[45,13032,3408,13033,6434],{},[34,13034,6327],{},[14,13036,175],{"id":175},[136,13038,13039,13043],{},[45,13040,6441,13041,57],{},[34,13042,6444],{},[45,13044,6447],{},[10,13046,189],{},[14,13048,192],{"id":192},[10,13050,6454],{},[197,13052,1642],{},{"title":70,"searchDepth":83,"depth":83,"links":13054},[13055,13056,13057,13058,13059,13060,13061,13062],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":6297,"description":6302},[210,6474,245],{"id":6477,"title":6478,"body":13067,"category":210,"cover":211,"description":6483,"extension":212,"meta":13220,"navigation":92,"path":6672,"pinned":215,"publishedAt":216,"seo":13221,"slug":6674,"stem":6675,"summary":6676,"tags":13222,"updatedAt":216,"visible":92,"__hash__":6680},{"type":7,"value":13068,"toc":13210},[13069,13071,13073,13075,13077,13081,13087,13089,13105,13107,13109,13153,13155,13160,13162,13164,13176,13178,13192,13194,13202,13204,13206,13208],[10,13070,6483],{},[14,13072,16],{"id":16},[10,13074,6488],{},[14,13076,22],{"id":22},[10,13078,13079],{},[26,13080],{"alt":6495,"src":6496},[10,13082,13083,6502,13085,6505],{},[34,13084,6501],{},[34,13086,2420],{},[14,13088,40],{"id":40},[42,13090,13091,13093,13101],{},[45,13092,6512],{},[45,13094,13095,2241,13097,2241,13099,6524],{},[34,13096,6517],{},[34,13098,6520],{},[34,13100,6523],{},[45,13102,6527,13103,6531],{},[34,13104,6530],{},[14,13106,60],{"id":60},[10,13108,63],{},[65,13110,13111],{"className":67,"code":6538,"language":69,"meta":70,"style":70},[34,13112,13113,13117,13121,13125,13129,13133,13137,13141,13145,13149],{"__ignoreMap":70},[74,13114,13115],{"class":76,"line":77},[74,13116,6545],{},[74,13118,13119],{"class":76,"line":83},[74,13120,93],{"emptyLinePlaceholder":92},[74,13122,13123],{"class":76,"line":89},[74,13124,6554],{},[74,13126,13127],{"class":76,"line":96},[74,13128,6559],{},[74,13130,13131],{"class":76,"line":102},[74,13132,6564],{},[74,13134,13135],{"class":76,"line":108},[74,13136,93],{"emptyLinePlaceholder":92},[74,13138,13139],{"class":76,"line":114},[74,13140,6573],{},[74,13142,13143],{"class":76,"line":2478},[74,13144,6578],{},[74,13146,13147],{"class":76,"line":3894},[74,13148,6583],{},[74,13150,13151],{"class":76,"line":4106},[74,13152,6588],{},[10,13154,120],{},[65,13156,13158],{"className":13157,"code":6594,"language":126,"meta":70},[124],[34,13159,6594],{"__ignoreMap":70},[10,13161,131],{},[14,13163,134],{"id":134},[136,13165,13166,13170],{},[45,13167,13168,6608],{},[34,13169,6607],{},[45,13171,2323,13172,6613,13174,6616],{},[34,13173,2420],{},[34,13175,6501],{},[14,13177,157],{"id":157},[42,13179,13180,13186],{},[45,13181,3408,13182,6625,13184,6628],{},[34,13183,6501],{},[34,13185,6517],{},[45,13187,6631,13188,993,13190,6637],{},[34,13189,2420],{},[34,13191,6636],{},[14,13193,175],{"id":175},[136,13195,13196,13200],{},[45,13197,6644,13198,6648],{},[34,13199,6647],{},[45,13201,6651],{},[10,13203,189],{},[14,13205,192],{"id":192},[10,13207,6658],{},[197,13209,199],{},{"title":70,"searchDepth":83,"depth":83,"links":13211},[13212,13213,13214,13215,13216,13217,13218,13219],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":6478,"description":6483},[210,6678,6679],{"id":6682,"title":6683,"body":13224,"category":210,"cover":211,"description":6688,"extension":212,"meta":13371,"navigation":92,"path":6867,"pinned":215,"publishedAt":216,"seo":13372,"slug":6869,"stem":6870,"summary":6871,"tags":13373,"updatedAt":216,"visible":92,"__hash__":6875},{"type":7,"value":13225,"toc":13361},[13226,13228,13230,13232,13234,13238,13240,13242,13260,13262,13264,13312,13314,13319,13321,13323,13331,13333,13343,13345,13353,13355,13357,13359],[10,13227,6688],{},[14,13229,16],{"id":16},[10,13231,6693],{},[14,13233,22],{"id":22},[10,13235,13236],{},[26,13237],{"alt":6700,"src":6701},[10,13239,6704],{},[14,13241,40],{"id":40},[42,13243,13244,13248,13254],{},[45,13245,13246,6714],{},[34,13247,6713],{},[45,13249,13250,6720,13252,57],{},[34,13251,6719],{},[34,13253,6723],{},[45,13255,6726,13256,6730,13258,6734],{},[34,13257,6729],{},[34,13259,6733],{},[14,13261,60],{"id":60},[10,13263,63],{},[65,13265,13266],{"className":67,"code":6741,"language":69,"meta":70,"style":70},[34,13267,13268,13272,13276,13280,13284,13288,13292,13296,13300,13304,13308],{"__ignoreMap":70},[74,13269,13270],{"class":76,"line":77},[74,13271,6545],{},[74,13273,13274],{"class":76,"line":83},[74,13275,93],{"emptyLinePlaceholder":92},[74,13277,13278],{"class":76,"line":89},[74,13279,6756],{},[74,13281,13282],{"class":76,"line":96},[74,13283,6761],{},[74,13285,13286],{"class":76,"line":102},[74,13287,6766],{},[74,13289,13290],{"class":76,"line":108},[74,13291,6771],{},[74,13293,13294],{"class":76,"line":114},[74,13295,93],{"emptyLinePlaceholder":92},[74,13297,13298],{"class":76,"line":2478},[74,13299,6780],{},[74,13301,13302],{"class":76,"line":3894},[74,13303,6785],{},[74,13305,13306],{"class":76,"line":4106},[74,13307,6790],{},[74,13309,13310],{"class":76,"line":5771},[74,13311,6795],{},[10,13313,120],{},[65,13315,13317],{"className":13316,"code":6801,"language":126,"meta":70},[124],[34,13318,6801],{"__ignoreMap":70},[10,13320,131],{},[14,13322,134],{"id":134},[136,13324,13325,13329],{},[45,13326,6812,13327,6815],{},[34,13328,6729],{},[45,13330,6818],{},[14,13332,157],{"id":157},[42,13334,13335,13339],{},[45,13336,2323,13337,6827],{},[34,13338,6713],{},[45,13340,6830,13341,57],{},[34,13342,6833],{},[14,13344,175],{"id":175},[136,13346,13347,13349],{},[45,13348,6840],{},[45,13350,6843,13351,6846],{},[34,13352,321],{},[10,13354,189],{},[14,13356,192],{"id":192},[10,13358,6853],{},[197,13360,199],{},{"title":70,"searchDepth":83,"depth":83,"links":13362},[13363,13364,13365,13366,13367,13368,13369,13370],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":6683,"description":6688},[210,6873,6874],{"id":6877,"title":6878,"body":13375,"category":210,"cover":211,"description":6883,"extension":212,"meta":13518,"navigation":92,"path":7051,"pinned":215,"publishedAt":216,"seo":13519,"slug":7053,"stem":7054,"summary":7055,"tags":13520,"updatedAt":216,"visible":92,"__hash__":7059},{"type":7,"value":13376,"toc":13508},[13377,13379,13381,13383,13385,13389,13395,13397,13407,13409,13411,13463,13465,13470,13472,13474,13484,13486,13492,13494,13500,13502,13504,13506],[10,13378,6883],{},[14,13380,16],{"id":16},[10,13382,6888],{},[14,13384,22],{"id":22},[10,13386,13387],{},[26,13388],{"alt":6895,"src":6896},[10,13390,13391,6902,13393,6906],{},[34,13392,6901],{},[34,13394,6905],{},[14,13396,40],{"id":40},[42,13398,13399,13401,13405],{},[45,13400,6913],{},[45,13402,13403,6919],{},[34,13404,6918],{},[45,13406,6922],{},[14,13408,60],{"id":60},[10,13410,63],{},[65,13412,13413],{"className":67,"code":6929,"language":69,"meta":70,"style":70},[34,13414,13415,13419,13423,13427,13431,13435,13439,13443,13447,13451,13455,13459],{"__ignoreMap":70},[74,13416,13417],{"class":76,"line":77},[74,13418,6936],{},[74,13420,13421],{"class":76,"line":83},[74,13422,93],{"emptyLinePlaceholder":92},[74,13424,13425],{"class":76,"line":89},[74,13426,6945],{},[74,13428,13429],{"class":76,"line":96},[74,13430,93],{"emptyLinePlaceholder":92},[74,13432,13433],{"class":76,"line":102},[74,13434,6954],{},[74,13436,13437],{"class":76,"line":108},[74,13438,6959],{},[74,13440,13441],{"class":76,"line":114},[74,13442,6771],{},[74,13444,13445],{"class":76,"line":2478},[74,13446,93],{"emptyLinePlaceholder":92},[74,13448,13449],{"class":76,"line":3894},[74,13450,6972],{},[74,13452,13453],{"class":76,"line":4106},[74,13454,6977],{},[74,13456,13457],{"class":76,"line":5771},[74,13458,6790],{},[74,13460,13461],{"class":76,"line":5776},[74,13462,6986],{},[10,13464,120],{},[65,13466,13468],{"className":13467,"code":6992,"language":126,"meta":70},[124],[34,13469,6992],{"__ignoreMap":70},[10,13471,131],{},[14,13473,134],{"id":134},[136,13475,13476,13480],{},[45,13477,13478,7005],{},[34,13479,6901],{},[45,13481,13482,7010],{},[34,13483,6905],{},[14,13485,157],{"id":157},[42,13487,13488,13490],{},[45,13489,7017],{},[45,13491,7020],{},[14,13493,175],{"id":175},[136,13495,13496,13498],{},[45,13497,7027],{},[45,13499,7030],{},[10,13501,189],{},[14,13503,192],{"id":192},[10,13505,7037],{},[197,13507,199],{},{"title":70,"searchDepth":83,"depth":83,"links":13509},[13510,13511,13512,13513,13514,13515,13516,13517],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":6878,"description":6883},[210,7057,7058],{"id":7061,"title":7062,"body":13522,"category":210,"cover":211,"description":7067,"extension":212,"meta":13673,"navigation":92,"path":7252,"pinned":215,"publishedAt":216,"seo":13674,"slug":7254,"stem":7255,"summary":7256,"tags":13675,"updatedAt":216,"visible":92,"__hash__":7260},{"type":7,"value":13523,"toc":13663},[13524,13526,13528,13530,13532,13536,13540,13542,13556,13558,13560,13612,13614,13619,13621,13623,13635,13637,13647,13649,13655,13657,13659,13661],[10,13525,7067],{},[14,13527,16],{"id":16},[10,13529,7072],{},[14,13531,22],{"id":22},[10,13533,13534],{},[26,13535],{"alt":7079,"src":7080},[10,13537,13538,7086],{},[34,13539,7085],{},[14,13541,40],{"id":40},[42,13543,13544,13550,13554],{},[45,13545,2323,13546,7096,13548,7100],{},[34,13547,7095],{},[34,13549,7099],{},[45,13551,7103,13552,7107],{},[34,13553,7106],{},[45,13555,7110],{},[14,13557,60],{"id":60},[10,13559,63],{},[65,13561,13562],{"className":67,"code":7117,"language":69,"meta":70,"style":70},[34,13563,13564,13568,13572,13576,13580,13584,13588,13592,13596,13600,13604,13608],{"__ignoreMap":70},[74,13565,13566],{"class":76,"line":77},[74,13567,7124],{},[74,13569,13570],{"class":76,"line":83},[74,13571,93],{"emptyLinePlaceholder":92},[74,13573,13574],{"class":76,"line":89},[74,13575,7133],{},[74,13577,13578],{"class":76,"line":96},[74,13579,7138],{},[74,13581,13582],{"class":76,"line":102},[74,13583,7143],{},[74,13585,13586],{"class":76,"line":108},[74,13587,7148],{},[74,13589,13590],{"class":76,"line":114},[74,13591,7153],{},[74,13593,13594],{"class":76,"line":2478},[74,13595,93],{"emptyLinePlaceholder":92},[74,13597,13598],{"class":76,"line":3894},[74,13599,7162],{},[74,13601,13602],{"class":76,"line":4106},[74,13603,7167],{},[74,13605,13606],{"class":76,"line":5771},[74,13607,7172],{},[74,13609,13610],{"class":76,"line":5776},[74,13611,7177],{},[10,13613,120],{},[65,13615,13617],{"className":13616,"code":7183,"language":126,"meta":70},[124],[34,13618,7183],{"__ignoreMap":70},[10,13620,131],{},[14,13622,134],{"id":134},[136,13624,13625,13631],{},[45,13626,13627,7197,13629,7200],{},[34,13628,7196],{},[34,13630,7106],{},[45,13632,13633,7205],{},[34,13634,7085],{},[14,13636,157],{"id":157},[42,13638,13639,13641],{},[45,13640,7212],{},[45,13642,7215,13643,7218,13645,7221],{},[34,13644,7095],{},[34,13646,7099],{},[14,13648,175],{"id":175},[136,13650,13651,13653],{},[45,13652,7228],{},[45,13654,7231],{},[10,13656,189],{},[14,13658,192],{"id":192},[10,13660,7238],{},[197,13662,199],{},{"title":70,"searchDepth":83,"depth":83,"links":13664},[13665,13666,13667,13668,13669,13670,13671,13672],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":7062,"description":7067},[210,7258,7259],{"id":7262,"title":7263,"body":13677,"category":210,"cover":211,"description":7268,"extension":212,"meta":13891,"navigation":92,"path":7542,"pinned":215,"publishedAt":216,"seo":13892,"slug":7544,"stem":7545,"summary":7546,"tags":13893,"updatedAt":216,"visible":92,"__hash__":7550},{"type":7,"value":13678,"toc":13878},[13679,13681,13683,13685,13687,13691,13697,13699,13711,13713,13715,13775,13777,13782,13784,13786,13804,13806,13814,13818,13826,13828,13832,13836,13842,13844,13854,13856,13870,13872,13874,13876],[10,13680,7268],{},[14,13682,16],{"id":16},[10,13684,7273],{},[14,13686,22],{"id":22},[10,13688,13689],{},[26,13690],{"alt":7280,"src":7281},[10,13692,7284,13693,7288,13695,7292],{},[34,13694,7287],{},[34,13696,7291],{},[14,13698,40],{"id":40},[42,13700,13701,13705,13709],{},[45,13702,7299,13703,7302],{},[34,13704,7287],{},[45,13706,13707,7308],{},[34,13708,7307],{},[45,13710,7311],{},[14,13712,60],{"id":60},[10,13714,63],{},[65,13716,13717],{"className":67,"code":7318,"language":69,"meta":70,"style":70},[34,13718,13719,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771],{"__ignoreMap":70},[74,13720,13721],{"class":76,"line":77},[74,13722,7325],{},[74,13724,13725],{"class":76,"line":83},[74,13726,7330],{},[74,13728,13729],{"class":76,"line":89},[74,13730,7335],{},[74,13732,13733],{"class":76,"line":96},[74,13734,7340],{},[74,13736,13737],{"class":76,"line":102},[74,13738,7345],{},[74,13740,13741],{"class":76,"line":108},[74,13742,93],{"emptyLinePlaceholder":92},[74,13744,13745],{"class":76,"line":114},[74,13746,7354],{},[74,13748,13749],{"class":76,"line":2478},[74,13750,7359],{},[74,13752,13753],{"class":76,"line":3894},[74,13754,7364],{},[74,13756,13757],{"class":76,"line":4106},[74,13758,7369],{},[74,13760,13761],{"class":76,"line":5771},[74,13762,1130],{},[74,13764,13765],{"class":76,"line":5776},[74,13766,7378],{},[74,13768,13769],{"class":76,"line":7381},[74,13770,7384],{},[74,13772,13773],{"class":76,"line":7387},[74,13774,7390],{},[10,13776,120],{},[65,13778,13780],{"className":13779,"code":7396,"language":126,"meta":70},[124],[34,13781,7396],{"__ignoreMap":70},[10,13783,131],{},[14,13785,134],{"id":134},[136,13787,13788,13796],{},[45,13789,13790,7409,13792,7412,13794,7416],{},[34,13791,3021],{},[34,13793,7307],{},[34,13795,7415],{},[45,13797,7419,13798,7422,13800,7425,13802,57],{},[34,13799,7287],{},[34,13801,1144],{},[34,13803,7291],{},[313,13805,2682],{"id":2682},[10,13807,13808,2241,13810,1141,13812,7438],{},[34,13809,7287],{},[34,13811,1144],{},[34,13813,7291],{},[10,13815,13816],{},[26,13817],{"alt":7443,"src":7444},[10,13819,13820,7449,13822,7452,13824,7455],{},[34,13821,7287],{},[34,13823,1144],{},[34,13825,7291],{},[313,13827,2682],{"id":4161},[10,13829,13830,7463],{},[34,13831,7462],{},[10,13833,13834],{},[26,13835],{"alt":7468,"src":7469},[10,13837,7472,13838,7475,13840,7478],{},[34,13839,7462],{},[34,13841,1144],{},[14,13843,157],{"id":157},[42,13845,13846,13850],{},[45,13847,7485,13848,7489],{},[34,13849,7488],{},[45,13851,7492,13852,7495],{},[34,13853,7462],{},[14,13855,175],{"id":175},[136,13857,13858,13866],{},[45,13859,7502,13860,7506,13862,1141,13864,57],{},[34,13861,7505],{},[34,13863,7509],{},[34,13865,7512],{},[45,13867,7515,13868,7518],{},[34,13869,6723],{},[10,13871,189],{},[14,13873,192],{"id":192},[10,13875,7525],{},[197,13877,199],{},{"title":70,"searchDepth":83,"depth":83,"links":13879},[13880,13881,13882,13883,13884,13888,13889,13890],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":13885},[13886,13887],{"id":2682,"depth":89,"text":2682},{"id":4161,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":7263,"description":7268},[210,7548,7549],{"id":7552,"title":7553,"body":13895,"category":210,"cover":211,"description":7558,"extension":212,"meta":14046,"navigation":92,"path":7735,"pinned":215,"publishedAt":216,"seo":14047,"slug":7737,"stem":7738,"summary":7739,"tags":14048,"updatedAt":216,"visible":92,"__hash__":7742},{"type":7,"value":13896,"toc":14036},[13897,13899,13901,13903,13905,13909,13913,13915,13927,13929,13931,13979,13981,13986,13988,13990,14000,14002,14012,14014,14028,14030,14032,14034],[10,13898,7558],{},[14,13900,16],{"id":16},[10,13902,7563],{},[14,13904,22],{"id":22},[10,13906,13907],{},[26,13908],{"alt":7570,"src":7571},[10,13910,7574,13911,7577],{},[34,13912,6733],{},[14,13914,40],{"id":40},[42,13916,13917,13921,13925],{},[45,13918,13919,7586],{},[34,13920,6733],{},[45,13922,13923,7592],{},[34,13924,7591],{},[45,13926,7595],{},[14,13928,60],{"id":60},[10,13930,63],{},[65,13932,13933],{"className":67,"code":7602,"language":69,"meta":70,"style":70},[34,13934,13935,13939,13943,13947,13951,13955,13959,13963,13967,13971,13975],{"__ignoreMap":70},[74,13936,13937],{"class":76,"line":77},[74,13938,6545],{},[74,13940,13941],{"class":76,"line":83},[74,13942,93],{"emptyLinePlaceholder":92},[74,13944,13945],{"class":76,"line":89},[74,13946,6756],{},[74,13948,13949],{"class":76,"line":96},[74,13950,93],{"emptyLinePlaceholder":92},[74,13952,13953],{"class":76,"line":102},[74,13954,7625],{},[74,13956,13957],{"class":76,"line":108},[74,13958,7630],{},[74,13960,13961],{"class":76,"line":114},[74,13962,93],{"emptyLinePlaceholder":92},[74,13964,13965],{"class":76,"line":2478},[74,13966,7639],{},[74,13968,13969],{"class":76,"line":3894},[74,13970,7644],{},[74,13972,13973],{"class":76,"line":4106},[74,13974,93],{"emptyLinePlaceholder":92},[74,13976,13977],{"class":76,"line":5771},[74,13978,7653],{},[10,13980,120],{},[65,13982,13984],{"className":13983,"code":7659,"language":126,"meta":70},[124],[34,13985,7659],{"__ignoreMap":70},[10,13987,131],{},[14,13989,134],{"id":134},[136,13991,13992,13998],{},[45,13993,7574,13994,7672,13996,57],{},[34,13995,6733],{},[34,13997,7675],{},[45,13999,7678],{},[14,14001,157],{"id":157},[42,14003,14004,14008],{},[45,14005,4729,14006,7687],{},[34,14007,6733],{},[45,14009,7690,14010,7693],{},[34,14011,6733],{},[14,14013,175],{"id":175},[136,14015,14016,14022],{},[45,14017,7700,14018,7704,14020,57],{},[34,14019,7703],{},[34,14021,6733],{},[45,14023,4729,14024,7711,14026,57],{},[34,14025,6733],{},[34,14027,7714],{},[10,14029,189],{},[14,14031,192],{"id":192},[10,14033,7721],{},[197,14035,199],{},{"title":70,"searchDepth":83,"depth":83,"links":14037},[14038,14039,14040,14041,14042,14043,14044,14045],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":7553,"description":7558},[210,6733,7741],{"id":7744,"title":7745,"body":14050,"category":210,"cover":211,"description":7750,"extension":212,"meta":14221,"navigation":92,"path":7963,"pinned":215,"publishedAt":216,"seo":14222,"slug":7965,"stem":7966,"summary":7967,"tags":14223,"updatedAt":216,"visible":92,"__hash__":7971},{"type":7,"value":14051,"toc":14209},[14052,14054,14056,14058,14060,14064,14066,14068,14080,14082,14084,14140,14142,14147,14149,14151,14167,14169,14171,14175,14181,14183,14191,14193,14201,14203,14205,14207],[10,14053,7750],{},[14,14055,16],{"id":16},[10,14057,7755],{},[14,14059,22],{"id":22},[10,14061,14062],{},[26,14063],{"alt":7762,"src":7763},[10,14065,7766],{},[14,14067,40],{"id":40},[42,14069,14070,14074,14078],{},[45,14071,14072,7776],{},[34,14073,7775],{},[45,14075,14076,7782],{},[34,14077,7781],{},[45,14079,7785],{},[14,14081,60],{"id":60},[10,14083,63],{},[65,14085,14086],{"className":67,"code":7792,"language":69,"meta":70,"style":70},[34,14087,14088,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132,14136],{"__ignoreMap":70},[74,14089,14090],{"class":76,"line":77},[74,14091,7799],{},[74,14093,14094],{"class":76,"line":83},[74,14095,7804],{},[74,14097,14098],{"class":76,"line":89},[74,14099,7809],{},[74,14101,14102],{"class":76,"line":96},[74,14103,7814],{},[74,14105,14106],{"class":76,"line":102},[74,14107,93],{"emptyLinePlaceholder":92},[74,14109,14110],{"class":76,"line":108},[74,14111,7823],{},[74,14113,14114],{"class":76,"line":114},[74,14115,7828],{},[74,14117,14118],{"class":76,"line":2478},[74,14119,7833],{},[74,14121,14122],{"class":76,"line":3894},[74,14123,7838],{},[74,14125,14126],{"class":76,"line":4106},[74,14127,93],{"emptyLinePlaceholder":92},[74,14129,14130],{"class":76,"line":5771},[74,14131,7847],{},[74,14133,14134],{"class":76,"line":5776},[74,14135,7852],{},[74,14137,14138],{"class":76,"line":7381},[74,14139,7857],{},[10,14141,120],{},[65,14143,14145],{"className":14144,"code":7863,"language":126,"meta":70},[124],[34,14146,7863],{"__ignoreMap":70},[10,14148,131],{},[14,14150,134],{"id":134},[136,14152,14153,14159],{},[45,14154,7874,14155,7878,14157,7881],{},[34,14156,7877],{},[34,14158,7781],{},[45,14160,14161,7887,14163,7891,14165,7894],{},[34,14162,7886],{},[34,14164,7890],{},[34,14166,7775],{},[313,14168,2682],{"id":2682},[10,14170,7899],{},[10,14172,14173],{},[26,14174],{"alt":7904,"src":7905},[10,14176,7908,14177,1141,14179,7914],{},[34,14178,4526],{},[34,14180,7913],{},[14,14182,157],{"id":157},[42,14184,14185,14189],{},[45,14186,7921,14187,7924],{},[34,14188,7775],{},[45,14190,7927],{},[14,14192,175],{"id":175},[136,14194,14195,14199],{},[45,14196,5239,14197,7937],{},[34,14198,7936],{},[45,14200,7940],{},[10,14202,189],{},[14,14204,192],{"id":192},[10,14206,7947],{},[197,14208,199],{},{"title":70,"searchDepth":83,"depth":83,"links":14210},[14211,14212,14213,14214,14215,14218,14219,14220],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":14216},[14217],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":7745,"description":7750},[210,7969,7970],{"id":7973,"title":7974,"body":14225,"category":210,"cover":211,"description":7979,"extension":212,"meta":14372,"navigation":92,"path":8158,"pinned":215,"publishedAt":216,"seo":14373,"slug":8160,"stem":8161,"summary":8162,"tags":14374,"updatedAt":216,"visible":92,"__hash__":8166},{"type":7,"value":14226,"toc":14362},[14227,14229,14231,14233,14235,14239,14241,14243,14251,14253,14255,14311,14313,14318,14320,14322,14334,14336,14342,14344,14354,14356,14358,14360],[10,14228,7979],{},[14,14230,16],{"id":16},[10,14232,7984],{},[14,14234,22],{"id":22},[10,14236,14237],{},[26,14238],{"alt":7991,"src":7992},[10,14240,7995],{},[14,14242,40],{"id":40},[42,14244,14245,14247,14249],{},[45,14246,8002],{},[45,14248,8005],{},[45,14250,8008],{},[14,14252,60],{"id":60},[10,14254,63],{},[65,14256,14257],{"className":67,"code":8015,"language":69,"meta":70,"style":70},[34,14258,14259,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303,14307],{"__ignoreMap":70},[74,14260,14261],{"class":76,"line":77},[74,14262,8022],{},[74,14264,14265],{"class":76,"line":83},[74,14266,8027],{},[74,14268,14269],{"class":76,"line":89},[74,14270,8032],{},[74,14272,14273],{"class":76,"line":96},[74,14274,93],{"emptyLinePlaceholder":92},[74,14276,14277],{"class":76,"line":102},[74,14278,8041],{},[74,14280,14281],{"class":76,"line":108},[74,14282,8046],{},[74,14284,14285],{"class":76,"line":114},[74,14286,8051],{},[74,14288,14289],{"class":76,"line":2478},[74,14290,93],{"emptyLinePlaceholder":92},[74,14292,14293],{"class":76,"line":3894},[74,14294,8060],{},[74,14296,14297],{"class":76,"line":4106},[74,14298,8065],{},[74,14300,14301],{"class":76,"line":5771},[74,14302,93],{"emptyLinePlaceholder":92},[74,14304,14305],{"class":76,"line":5776},[74,14306,8074],{},[74,14308,14309],{"class":76,"line":7381},[74,14310,8079],{},[10,14312,120],{},[65,14314,14316],{"className":14315,"code":8085,"language":126,"meta":70},[124],[34,14317,8085],{"__ignoreMap":70},[10,14319,131],{},[14,14321,134],{"id":134},[136,14323,14324,14330],{},[45,14325,14326,8099,14328,8103],{},[34,14327,8098],{},[34,14329,8102],{},[45,14331,8106,14332,8110],{},[34,14333,8109],{},[14,14335,157],{"id":157},[42,14337,14338,14340],{},[45,14339,8117],{},[45,14341,8120],{},[14,14343,175],{"id":175},[136,14345,14346,14352],{},[45,14347,8127,14348,8131,14350,57],{},[34,14349,8130],{},[34,14351,8134],{},[45,14353,8137],{},[10,14355,189],{},[14,14357,192],{"id":192},[10,14359,8144],{},[197,14361,199],{},{"title":70,"searchDepth":83,"depth":83,"links":14363},[14364,14365,14366,14367,14368,14369,14370,14371],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":7974,"description":7979},[210,8164,8165],{"id":8168,"title":8169,"body":14376,"category":210,"cover":211,"description":8174,"extension":212,"meta":14539,"navigation":92,"path":8378,"pinned":215,"publishedAt":216,"seo":14540,"slug":8380,"stem":8381,"summary":8382,"tags":14541,"updatedAt":216,"visible":92,"__hash__":8386},{"type":7,"value":14377,"toc":14527},[14378,14380,14382,14384,14386,14390,14394,14396,14412,14414,14416,14460,14462,14467,14469,14471,14485,14487,14491,14495,14499,14501,14507,14509,14519,14521,14523,14525],[10,14379,8174],{},[14,14381,16],{"id":16},[10,14383,8179],{},[14,14385,22],{"id":22},[10,14387,14388],{},[26,14389],{"alt":8186,"src":8187},[10,14391,8190,14392,8194],{},[34,14393,8193],{},[14,14395,40],{"id":40},[42,14397,14398,14404,14410],{},[45,14399,14400,8204,14402,8208],{},[34,14401,8203],{},[34,14403,8207],{},[45,14405,8211,14406,8215,14408,8218],{},[34,14407,8214],{},[34,14409,4280],{},[45,14411,8221],{},[14,14413,60],{"id":60},[10,14415,63],{},[65,14417,14418],{"className":67,"code":8228,"language":69,"meta":70,"style":70},[34,14419,14420,14424,14428,14432,14436,14440,14444,14448,14452,14456],{"__ignoreMap":70},[74,14421,14422],{"class":76,"line":77},[74,14423,8235],{},[74,14425,14426],{"class":76,"line":83},[74,14427,8240],{},[74,14429,14430],{"class":76,"line":89},[74,14431,8245],{},[74,14433,14434],{"class":76,"line":96},[74,14435,8250],{},[74,14437,14438],{"class":76,"line":102},[74,14439,8255],{},[74,14441,14442],{"class":76,"line":108},[74,14443,93],{"emptyLinePlaceholder":92},[74,14445,14446],{"class":76,"line":114},[74,14447,8264],{},[74,14449,14450],{"class":76,"line":2478},[74,14451,8269],{},[74,14453,14454],{"class":76,"line":3894},[74,14455,8269],{},[74,14457,14458],{"class":76,"line":4106},[74,14459,8269],{},[10,14461,120],{},[65,14463,14465],{"className":14464,"code":8283,"language":126,"meta":70},[124],[34,14466,8283],{"__ignoreMap":70},[10,14468,131],{},[14,14470,134],{"id":134},[136,14472,14473,14477],{},[45,14474,7874,14475,8297],{},[34,14476,8296],{},[45,14478,8300,14479,8303,14481,8306,14483,8310],{},[34,14480,8207],{},[34,14482,8193],{},[34,14484,8309],{},[313,14486,2682],{"id":2682},[10,14488,8315,14489,8318],{},[34,14490,8207],{},[10,14492,14493],{},[26,14494],{"alt":8323,"src":8324},[10,14496,8327,14497,8330],{},[34,14498,8193],{},[14,14500,157],{"id":157},[42,14502,14503,14505],{},[45,14504,8337],{},[45,14506,8340],{},[14,14508,175],{"id":175},[136,14510,14511,14513],{},[45,14512,8347],{},[45,14514,3952,14515,8352,14517,8355],{},[34,14516,4280],{},[34,14518,8207],{},[10,14520,189],{},[14,14522,192],{"id":192},[10,14524,8362],{},[197,14526,199],{},{"title":70,"searchDepth":83,"depth":83,"links":14528},[14529,14530,14531,14532,14533,14536,14537,14538],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":14534},[14535],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":8169,"description":8174},[210,8384,8385],{"id":8388,"title":8389,"body":14543,"category":210,"cover":211,"description":8394,"extension":212,"meta":14726,"navigation":92,"path":8619,"pinned":215,"publishedAt":216,"seo":14727,"slug":8621,"stem":8622,"summary":8623,"tags":14728,"updatedAt":216,"visible":92,"__hash__":8626},{"type":7,"value":14544,"toc":14714},[14545,14547,14549,14551,14553,14557,14559,14561,14575,14577,14579,14647,14649,14654,14656,14658,14672,14674,14676,14680,14686,14688,14696,14698,14706,14708,14710,14712],[10,14546,8394],{},[14,14548,16],{"id":16},[10,14550,8399],{},[14,14552,22],{"id":22},[10,14554,14555],{},[26,14556],{"alt":8406,"src":8407},[10,14558,8410],{},[14,14560,40],{"id":40},[42,14562,14563,14569,14571],{},[45,14564,14565,8420,14567,57],{},[34,14566,8419],{},[34,14568,8423],{},[45,14570,8426],{},[45,14572,14573,8432],{},[34,14574,8431],{},[14,14576,60],{"id":60},[10,14578,63],{},[65,14580,14581],{"className":67,"code":8439,"language":69,"meta":70,"style":70},[34,14582,14583,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643],{"__ignoreMap":70},[74,14584,14585],{"class":76,"line":77},[74,14586,8446],{},[74,14588,14589],{"class":76,"line":83},[74,14590,93],{"emptyLinePlaceholder":92},[74,14592,14593],{"class":76,"line":89},[74,14594,8455],{},[74,14596,14597],{"class":76,"line":96},[74,14598,8460],{},[74,14600,14601],{"class":76,"line":102},[74,14602,8465],{},[74,14604,14605],{"class":76,"line":108},[74,14606,8470],{},[74,14608,14609],{"class":76,"line":114},[74,14610,8475],{},[74,14612,14613],{"class":76,"line":2478},[74,14614,8480],{},[74,14616,14617],{"class":76,"line":3894},[74,14618,8485],{},[74,14620,14621],{"class":76,"line":4106},[74,14622,8490],{},[74,14624,14625],{"class":76,"line":5771},[74,14626,93],{"emptyLinePlaceholder":92},[74,14628,14629],{"class":76,"line":5776},[74,14630,8499],{},[74,14632,14633],{"class":76,"line":7381},[74,14634,6124],{},[74,14636,14637],{"class":76,"line":7387},[74,14638,6129],{},[74,14640,14641],{"class":76,"line":8510},[74,14642,93],{"emptyLinePlaceholder":92},[74,14644,14645],{"class":76,"line":8515},[74,14646,8518],{},[10,14648,120],{},[65,14650,14652],{"className":14651,"code":8524,"language":126,"meta":70},[124],[34,14653,8524],{"__ignoreMap":70},[10,14655,131],{},[14,14657,134],{"id":134},[136,14659,14660,14670],{},[45,14661,8535,14662,8539,14664,8543,14666,8547,14668,57],{},[34,14663,8538],{},[34,14665,8542],{},[34,14667,8546],{},[34,14669,8538],{},[45,14671,8552],{},[313,14673,2682],{"id":2682},[10,14675,8557],{},[10,14677,14678],{},[26,14679],{"alt":8562,"src":8563},[10,14681,14682,8568,14684,57],{},[34,14683,8419],{},[34,14685,8423],{},[14,14687,157],{"id":157},[42,14689,14690,14694],{},[45,14691,8577,14692,57],{},[34,14693,5322],{},[45,14695,8582],{},[14,14697,175],{"id":175},[136,14699,14700,14702],{},[45,14701,8589],{},[45,14703,8592,14704,8596],{},[34,14705,8595],{},[10,14707,189],{},[14,14709,192],{"id":192},[10,14711,8603],{},[197,14713,199],{},{"title":70,"searchDepth":83,"depth":83,"links":14715},[14716,14717,14718,14719,14720,14723,14724,14725],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":14721},[14722],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":8389,"description":8394},[210,8625,5273],{"id":8628,"title":8629,"body":14730,"category":210,"cover":211,"description":8634,"extension":212,"meta":14889,"navigation":92,"path":8822,"pinned":215,"publishedAt":216,"seo":14890,"slug":8824,"stem":8825,"summary":8826,"tags":14891,"updatedAt":216,"visible":92,"__hash__":8830},{"type":7,"value":14731,"toc":14877},[14732,14734,14736,14738,14740,14744,14746,14748,14756,14758,14760,14824,14826,14831,14833,14835,14843,14845,14847,14851,14853,14855,14861,14863,14869,14871,14873,14875],[10,14733,8634],{},[14,14735,16],{"id":16},[10,14737,8639],{},[14,14739,22],{"id":22},[10,14741,14742],{},[26,14743],{"alt":8646,"src":8647},[10,14745,8650],{},[14,14747,40],{"id":40},[42,14749,14750,14752,14754],{},[45,14751,8657],{},[45,14753,8660],{},[45,14755,8663],{},[14,14757,60],{"id":60},[10,14759,63],{},[65,14761,14762],{"className":67,"code":8670,"language":69,"meta":70,"style":70},[34,14763,14764,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820],{"__ignoreMap":70},[74,14765,14766],{"class":76,"line":77},[74,14767,8677],{},[74,14769,14770],{"class":76,"line":83},[74,14771,8682],{},[74,14773,14774],{"class":76,"line":89},[74,14775,93],{"emptyLinePlaceholder":92},[74,14777,14778],{"class":76,"line":96},[74,14779,8691],{},[74,14781,14782],{"class":76,"line":102},[74,14783,93],{"emptyLinePlaceholder":92},[74,14785,14786],{"class":76,"line":108},[74,14787,8700],{},[74,14789,14790],{"class":76,"line":114},[74,14791,8705],{},[74,14793,14794],{"class":76,"line":2478},[74,14795,8710],{},[74,14797,14798],{"class":76,"line":3894},[74,14799,93],{"emptyLinePlaceholder":92},[74,14801,14802],{"class":76,"line":4106},[74,14803,8719],{},[74,14805,14806],{"class":76,"line":5771},[74,14807,8724],{},[74,14809,14810],{"class":76,"line":5776},[74,14811,8729],{},[74,14813,14814],{"class":76,"line":7381},[74,14815,93],{"emptyLinePlaceholder":92},[74,14817,14818],{"class":76,"line":7387},[74,14819,6138],{},[74,14821,14822],{"class":76,"line":8510},[74,14823,8742],{},[10,14825,120],{},[65,14827,14829],{"className":14828,"code":8748,"language":126,"meta":70},[124],[34,14830,8748],{"__ignoreMap":70},[10,14832,131],{},[14,14834,134],{"id":134},[136,14836,14837,14841],{},[45,14838,14839,8762],{},[34,14840,8761],{},[45,14842,8765],{},[313,14844,2682],{"id":2682},[10,14846,8770],{},[10,14848,14849],{},[26,14850],{"alt":8775,"src":8776},[10,14852,8779],{},[14,14854,157],{"id":157},[42,14856,14857,14859],{},[45,14858,8786],{},[45,14860,8789],{},[14,14862,175],{"id":175},[136,14864,14865,14867],{},[45,14866,8796],{},[45,14868,8799],{},[10,14870,189],{},[14,14872,192],{"id":192},[10,14874,8806],{},[197,14876,199],{},{"title":70,"searchDepth":83,"depth":83,"links":14878},[14879,14880,14881,14882,14883,14886,14887,14888],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":14884},[14885],{"id":2682,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":8629,"description":8634},[210,8828,8829],{"id":8832,"title":8833,"body":14893,"category":210,"cover":211,"description":8838,"extension":212,"meta":15131,"navigation":92,"path":9139,"pinned":215,"publishedAt":216,"seo":15132,"slug":9141,"stem":9142,"summary":9143,"tags":15133,"updatedAt":216,"visible":92,"__hash__":9147},{"type":7,"value":14894,"toc":15118},[14895,14897,14899,14901,14903,14907,14909,14911,14921,14923,14925,15041,15043,15048,15050,15052,15062,15064,15066,15070,15072,15074,15076,15080,15084,15086,15094,15096,15110,15112,15114,15116],[10,14896,8838],{},[14,14898,16],{"id":16},[10,14900,8843],{},[14,14902,22],{"id":22},[10,14904,14905],{},[26,14906],{"alt":8850,"src":8851},[10,14908,8854],{},[14,14910,40],{"id":40},[42,14912,14913,14915,14917],{},[45,14914,8861],{},[45,14916,8864],{},[45,14918,8867,14919,8871],{},[34,14920,8870],{},[14,14922,60],{"id":60},[10,14924,63],{},[65,14926,14927],{"className":67,"code":8878,"language":69,"meta":70,"style":70},[34,14928,14929,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037],{"__ignoreMap":70},[74,14930,14931],{"class":76,"line":77},[74,14932,6936],{},[74,14934,14935],{"class":76,"line":83},[74,14936,6545],{},[74,14938,14939],{"class":76,"line":89},[74,14940,93],{"emptyLinePlaceholder":92},[74,14942,14943],{"class":76,"line":96},[74,14944,8897],{},[74,14946,14947],{"class":76,"line":102},[74,14948,8902],{},[74,14950,14951],{"class":76,"line":108},[74,14952,8907],{},[74,14954,14955],{"class":76,"line":114},[74,14956,8912],{},[74,14958,14959],{"class":76,"line":2478},[74,14960,93],{"emptyLinePlaceholder":92},[74,14962,14963],{"class":76,"line":3894},[74,14964,8921],{},[74,14966,14967],{"class":76,"line":4106},[74,14968,8926],{},[74,14970,14971],{"class":76,"line":5771},[74,14972,8931],{},[74,14974,14975],{"class":76,"line":5776},[74,14976,8936],{},[74,14978,14979],{"class":76,"line":7381},[74,14980,8941],{},[74,14982,14983],{"class":76,"line":7387},[74,14984,93],{"emptyLinePlaceholder":92},[74,14986,14987],{"class":76,"line":8510},[74,14988,8950],{},[74,14990,14991],{"class":76,"line":8515},[74,14992,8955],{},[74,14994,14995],{"class":76,"line":8958},[74,14996,8961],{},[74,14998,14999],{"class":76,"line":8964},[74,15000,93],{"emptyLinePlaceholder":92},[74,15002,15003],{"class":76,"line":8969},[74,15004,8972],{},[74,15006,15007],{"class":76,"line":8975},[74,15008,93],{"emptyLinePlaceholder":92},[74,15010,15011],{"class":76,"line":8980},[74,15012,7354],{},[74,15014,15015],{"class":76,"line":8985},[74,15016,8988],{},[74,15018,15019],{"class":76,"line":8991},[74,15020,8994],{},[74,15022,15023],{"class":76,"line":8997},[74,15024,9000],{},[74,15026,15027],{"class":76,"line":9003},[74,15028,7364],{},[74,15030,15031],{"class":76,"line":9008},[74,15032,9011],{},[74,15034,15035],{"class":76,"line":9014},[74,15036,1130],{},[74,15038,15039],{"class":76,"line":9019},[74,15040,9022],{},[10,15042,120],{},[65,15044,15046],{"className":15045,"code":9028,"language":126,"meta":70},[124],[34,15047,9028],{"__ignoreMap":70},[10,15049,131],{},[14,15051,134],{"id":134},[136,15053,15054,15058],{},[45,15055,9039,15056,9042],{},[34,15057,8870],{},[45,15059,15060,9047],{},[34,15061,8102],{},[313,15063,2682],{"id":2682},[10,15065,9052],{},[10,15067,15068],{},[26,15069],{"alt":9057,"src":9058},[10,15071,9061],{},[313,15073,2682],{"id":4161},[10,15075,9066],{},[10,15077,15078],{},[26,15079],{"alt":9071,"src":9072},[10,15081,9075,15082,9079],{},[34,15083,9078],{},[14,15085,157],{"id":157},[42,15087,15088,15090],{},[45,15089,9086],{},[45,15091,9089,15092,9092],{},[34,15093,9078],{},[14,15095,175],{"id":175},[136,15097,15098,15102,15104],{},[45,15099,9099,15100,9102],{},[34,15101,9078],{},[45,15103,9105],{},[45,15105,9108,15106,9112,15108,9115],{},[34,15107,9111],{},[34,15109,6080],{},[10,15111,189],{},[14,15113,192],{"id":192},[10,15115,9122],{},[197,15117,199],{},{"title":70,"searchDepth":83,"depth":83,"links":15119},[15120,15121,15122,15123,15124,15128,15129,15130],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":40,"depth":83,"text":40},{"id":60,"depth":83,"text":60},{"id":134,"depth":83,"text":134,"children":15125},[15126,15127],{"id":2682,"depth":89,"text":2682},{"id":4161,"depth":89,"text":2682},{"id":157,"depth":83,"text":157},{"id":175,"depth":83,"text":175},{"id":192,"depth":83,"text":192},{},{"title":8833,"description":8838},[210,9145,9146],{"id":1040,"title":1041,"body":15135,"category":210,"cover":1049,"description":70,"extension":212,"meta":15371,"navigation":92,"path":1366,"pinned":215,"publishedAt":1367,"seo":15372,"slug":1369,"stem":1370,"summary":1371,"tags":15373,"updatedAt":1367,"visible":92,"__hash__":1375},{"type":7,"value":15136,"toc":15356},[15137,15141,15143,15145,15147,15149,15169,15171,15176,15178,15180,15208,15214,15216,15220,15222,15242,15244,15254,15256,15258,15260,15262,15264,15266,15268,15270,15272,15292,15294,15296,15300,15302,15304,15306,15308,15312,15314,15332,15334,15336,15338,15340,15342,15344,15346,15348,15350,15352,15354],[10,15138,15139],{},[26,15140],{"alt":1048,"src":1049},[10,15142,1052],{},[10,15144,1055],{},[14,15146,1059],{"id":1058},[10,15148,1062],{},[65,15150,15151],{"className":67,"code":1065,"language":69,"meta":70,"style":70},[34,15152,15153,15157,15161,15165],{"__ignoreMap":70},[74,15154,15155],{"class":76,"line":77},[74,15156,1072],{},[74,15158,15159],{"class":76,"line":83},[74,15160,1077],{},[74,15162,15163],{"class":76,"line":89},[74,15164,93],{"emptyLinePlaceholder":92},[74,15166,15167],{"class":76,"line":96},[74,15168,1086],{},[10,15170,1089],{},[65,15172,15174],{"className":15173,"code":1093,"language":126,"meta":70},[124],[34,15175,1093],{"__ignoreMap":70},[10,15177,1098],{},[10,15179,1101],{},[65,15181,15182],{"className":67,"code":1104,"language":69,"meta":70,"style":70},[34,15183,15184,15188,15192,15196,15200,15204],{"__ignoreMap":70},[74,15185,15186],{"class":76,"line":77},[74,15187,1111],{},[74,15189,15190],{"class":76,"line":83},[74,15191,93],{"emptyLinePlaceholder":92},[74,15193,15194],{"class":76,"line":89},[74,15195,1120],{},[74,15197,15198],{"class":76,"line":96},[74,15199,1125],{},[74,15201,15202],{"class":76,"line":102},[74,15203,1130],{},[74,15205,15206],{"class":76,"line":108},[74,15207,1135],{},[10,15209,15210,1141,15212,1145],{},[34,15211,1140],{},[34,15213,1144],{},[14,15215,1149],{"id":1148},[10,15217,1152,15218,1156],{},[34,15219,1155],{},[10,15221,1159],{},[65,15223,15224],{"className":67,"code":1162,"language":69,"meta":70,"style":70},[34,15225,15226,15230,15234,15238],{"__ignoreMap":70},[74,15227,15228],{"class":76,"line":77},[74,15229,1169],{},[74,15231,15232],{"class":76,"line":83},[74,15233,1174],{},[74,15235,15236],{"class":76,"line":89},[74,15237,1179],{},[74,15239,15240],{"class":76,"line":96},[74,15241,1184],{},[10,15243,1187],{},[65,15245,15246],{"className":575,"code":1190,"language":577,"meta":70,"style":70},[34,15247,15248],{"__ignoreMap":70},[74,15249,15250,15252],{"class":76,"line":77},[74,15251,675],{"class":584},[74,15253,1199],{"class":620},[10,15255,1202],{},[14,15257,1206],{"id":1205},[313,15259,1209],{"id":1209},[10,15261,1212],{},[313,15263,1215],{"id":1215},[10,15265,1218],{},[313,15267,1221],{"id":1221},[10,15269,1224],{},[10,15271,1227],{},[65,15273,15274],{"className":67,"code":1230,"language":69,"meta":70,"style":70},[34,15275,15276,15280,15284,15288],{"__ignoreMap":70},[74,15277,15278],{"class":76,"line":77},[74,15279,1237],{},[74,15281,15282],{"class":76,"line":83},[74,15283,93],{"emptyLinePlaceholder":92},[74,15285,15286],{"class":76,"line":89},[74,15287,1246],{},[74,15289,15290],{"class":76,"line":96},[74,15291,1251],{},[10,15293,1254],{},[313,15295,1257],{"id":1257},[10,15297,1260,15298,1263],{},[34,15299,245],{},[10,15301,1266],{},[313,15303,1269],{"id":1269},[10,15305,1272],{},[14,15307,1276],{"id":1275},[10,15309,15310],{},[26,15311],{"alt":1281,"src":1282},[10,15313,1285],{},[42,15315,15316,15318,15320,15322,15324,15326,15328,15330],{},[45,15317,1290],{},[45,15319,1293],{},[45,15321,1296],{},[45,15323,1299],{},[45,15325,1302],{},[45,15327,1305],{},[45,15329,1308],{},[45,15331,1311],{},[10,15333,1314],{},[14,15335,1318],{"id":1317},[10,15337,1321],{},[10,15339,1324],{},[14,15341,1328],{"id":1327},[10,15343,1331],{},[10,15345,1334],{},[10,15347,1337],{},[14,15349,1340],{"id":1340},[10,15351,1343],{},[10,15353,1346],{},[197,15355,1349],{},{"title":70,"searchDepth":83,"depth":83,"links":15357},[15358,15359,15360,15367,15368,15369,15370],{"id":1058,"depth":83,"text":1059},{"id":1148,"depth":83,"text":1149},{"id":1205,"depth":83,"text":1206,"children":15361},[15362,15363,15364,15365,15366],{"id":1209,"depth":89,"text":1209},{"id":1215,"depth":89,"text":1215},{"id":1221,"depth":89,"text":1221},{"id":1257,"depth":89,"text":1257},{"id":1269,"depth":89,"text":1269},{"id":1275,"depth":83,"text":1276},{"id":1317,"depth":83,"text":1318},{"id":1327,"depth":83,"text":1328},{"id":1340,"depth":83,"text":1340},{},{"title":1041,"description":70},[210,1373,1374],{"id":227,"title":228,"body":15375,"category":210,"cover":211,"description":70,"extension":212,"meta":15954,"navigation":92,"path":1029,"pinned":215,"publishedAt":1030,"seo":15955,"slug":1032,"stem":1033,"summary":1034,"tags":15956,"updatedAt":1030,"visible":92,"__hash__":1038},{"type":7,"value":15376,"toc":15930},[15377,15379,15381,15383,15387,15389,15391,15415,15427,15429,15431,15436,15440,15444,15456,15460,15464,15468,15470,15504,15506,15510,15514,15516,15538,15568,15580,15590,15598,15600,15606,15616,15618,15623,15627,15629,15643,15649,15669,15671,15673,15675,15685,15689,15691,15700,15704,15706,15708,15728,15732,15734,15736,15738,15740,15760,15762,15764,15766,15792,15794,15810,15812,15828,15832,15834,15836,15856,15858,15860,15862,15866,15876,15878,15880,15882,15892,15900,15902,15904,15918,15928],[14,15378,233],{"id":233},[10,15380,236],{},[10,15382,239],{},[10,15384,242,15385,246],{},[34,15386,245],{},[14,15388,249],{"id":249},[10,15390,252],{},[254,15392,15393,15395],{},[10,15394,258],{},[254,15396,15397,15403,15405,15409,15411],{},[10,15398,263,15399,267,15401,271],{},[34,15400,266],{},[34,15402,270],{},[10,15404,274],{},[10,15406,277,15407,282],{},[279,15408,281],{},[10,15410,285],{},[10,15412,15413],{},[26,15414],{"alt":290,"src":291},[254,15416,15417,15419],{},[10,15418,296],{},[254,15420,15421,15423],{},[10,15422,301],{},[10,15424,15425],{},[26,15426],{"alt":306,"src":307},[14,15428,311],{"id":310},[313,15430,316],{"id":315},[10,15432,319,15433,327],{},[321,15434,326],{"href":323,"rel":15435},[325],[254,15437,15438],{},[10,15439,332],{},[10,15441,15442],{},[26,15443],{"alt":337,"src":338},[42,15445,15446,15450,15454],{},[45,15447,343,15448,57],{},[279,15449,346],{},[45,15451,349,15452,57],{},[279,15453,352],{},[45,15455,355],{},[10,15457,15458],{},[26,15459],{"alt":360,"src":361},[254,15461,15462],{},[10,15463,366],{},[10,15465,15466],{},[26,15467],{"alt":371,"src":372},[313,15469,376],{"id":375},[254,15471,15472,15476,15480,15500],{},[254,15473,15474],{},[10,15475,383],{},[10,15477,386,15478,390],{},[279,15479,389],{},[65,15481,15482],{"className":67,"code":393,"language":69,"meta":70,"style":70},[34,15483,15484,15488,15492,15496],{"__ignoreMap":70},[74,15485,15486],{"class":76,"line":77},[74,15487,400],{},[74,15489,15490],{"class":76,"line":83},[74,15491,405],{},[74,15493,15494],{"class":76,"line":89},[74,15495,410],{},[74,15497,15498],{"class":76,"line":96},[74,15499,415],{},[10,15501,418,15502,422],{},[279,15503,421],{},[10,15505,425],{},[10,15507,428,15508,431],{},[34,15509,69],{},[10,15511,15512],{},[26,15513],{"alt":436,"src":437},[10,15515,440],{},[254,15517,15518,15520,15524],{},[10,15519,445],{},[10,15521,15522],{},[279,15523,450],{},[254,15525,15526,15530,15534],{},[10,15527,455,15528,458],{},[34,15529,69],{},[10,15531,461,15532,464],{},[34,15533,69],{},[10,15535,467,15536,471],{},[279,15537,470],{},[254,15539,15540,15542,15546],{},[10,15541,476],{},[10,15543,15544],{},[279,15545,481],{},[254,15547,15548,15554,15562,15564],{},[10,15549,15550,489,15552,493],{},[34,15551,488],{},[34,15553,492],{},[10,15555,496,15556,499,15558,503,15560,507],{},[34,15557,488],{},[279,15559,502],{},[279,15561,506],{},[10,15563,510],{},[10,15565,15566,516],{},[279,15567,515],{},[254,15569,15570,15572],{},[10,15571,521],{},[254,15573,15574,15578],{},[10,15575,526,15576,530],{},[279,15577,529],{},[10,15579,533],{},[254,15581,15582,15586],{},[10,15583,538,15584],{},[279,15585,541],{},[10,15587,15588],{},[26,15589],{"alt":546,"src":547},[254,15591,15592,15594],{},[10,15593,552],{},[10,15595,15596],{},[26,15597],{"alt":546,"src":557},[313,15599,561],{"id":560},[10,15601,564,15602,568,15604,572],{},[34,15603,567],{},[34,15605,571],{},[65,15607,15608],{"className":575,"code":576,"language":577,"meta":70,"style":70},[34,15609,15610],{"__ignoreMap":70},[74,15611,15612,15614],{"class":76,"line":77},[74,15613,69],{"class":584},[74,15615,588],{"class":587},[10,15617,591],{},[65,15619,15621],{"className":15620,"code":595,"language":126,"meta":70},[124],[34,15622,595],{"__ignoreMap":70},[10,15624,15625],{},[26,15626],{"alt":546,"src":602},[10,15628,605],{},[65,15630,15631],{"className":575,"code":608,"language":577,"meta":70,"style":70},[34,15632,15633],{"__ignoreMap":70},[74,15634,15635,15637,15639,15641],{"class":76,"line":77},[74,15636,69],{"class":584},[74,15638,617],{"class":587},[74,15640,621],{"class":620},[74,15642,588],{"class":587},[10,15644,626,15645,629,15647,633],{},[34,15646,69],{},[34,15648,632],{},[65,15650,15651],{"className":575,"code":636,"language":577,"meta":70,"style":70},[34,15652,15653,15659],{"__ignoreMap":70},[74,15654,15655,15657],{"class":76,"line":77},[74,15656,492],{"class":584},[74,15658,588],{"class":587},[74,15660,15661,15663,15665,15667],{"class":76,"line":83},[74,15662,492],{"class":584},[74,15664,617],{"class":587},[74,15666,621],{"class":620},[74,15668,588],{"class":587},[14,15670,658],{"id":657},[313,15672,662],{"id":661},[10,15674,665],{},[65,15676,15677],{"className":575,"code":668,"language":577,"meta":70,"style":70},[34,15678,15679],{"__ignoreMap":70},[74,15680,15681,15683],{"class":76,"line":77},[74,15682,675],{"class":584},[74,15684,588],{"class":587},[10,15686,680,15687,684],{},[34,15688,683],{},[313,15690,688],{"id":687},[10,15692,319,15693,696,15696,57,15698,703],{},[321,15694,695],{"href":693,"rel":15695},[325],[279,15697,699],{},[34,15699,702],{},[10,15701,706,15702,710],{},[34,15703,709],{},[313,15705,714],{"id":713},[10,15707,717],{},[65,15709,15710],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,15711,15712,15718],{"__ignoreMap":70},[74,15713,15714,15716],{"class":76,"line":77},[74,15715,675],{"class":584},[74,15717,588],{"class":587},[74,15719,15720,15722,15724,15726],{"class":76,"line":83},[74,15721,675],{"class":584},[74,15723,617],{"class":587},[74,15725,621],{"class":620},[74,15727,588],{"class":587},[10,15729,741,15730,744],{},[34,15731,675],{},[14,15733,748],{"id":747},[10,15735,751],{},[313,15737,755],{"id":754},[10,15739,758],{},[65,15741,15742],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,15743,15744,15750],{"__ignoreMap":70},[74,15745,15746,15748],{"class":76,"line":77},[74,15747,675],{"class":584},[74,15749,588],{"class":587},[74,15751,15752,15754,15756,15758],{"class":76,"line":83},[74,15753,675],{"class":584},[74,15755,617],{"class":587},[74,15757,621],{"class":620},[74,15759,588],{"class":587},[10,15761,781],{},[313,15763,785],{"id":784},[10,15765,788],{},[65,15767,15768],{"className":575,"code":791,"language":577,"meta":70,"style":70},[34,15769,15770,15778],{"__ignoreMap":70},[74,15771,15772,15774,15776],{"class":76,"line":77},[74,15773,798],{"class":584},[74,15775,801],{"class":620},[74,15777,804],{"class":620},[74,15779,15780,15782,15784,15786,15788,15790],{"class":76,"line":83},[74,15781,798],{"class":584},[74,15783,801],{"class":620},[74,15785,813],{"class":620},[74,15787,816],{"class":620},[74,15789,819],{"class":620},[74,15791,822],{"class":620},[10,15793,825],{},[65,15795,15796],{"className":575,"code":828,"language":577,"meta":70,"style":70},[34,15797,15798],{"__ignoreMap":70},[74,15799,15800,15802,15804,15806,15808],{"class":76,"line":77},[74,15801,798],{"class":584},[74,15803,837],{"class":620},[74,15805,813],{"class":620},[74,15807,816],{"class":620},[74,15809,844],{"class":620},[10,15811,847],{},[65,15813,15814],{"className":575,"code":850,"language":577,"meta":70,"style":70},[34,15815,15816],{"__ignoreMap":70},[74,15817,15818,15820,15822,15824,15826],{"class":76,"line":77},[74,15819,798],{"class":584},[74,15821,859],{"class":620},[74,15823,862],{"class":587},[74,15825,865],{"class":620},[74,15827,868],{"class":620},[10,15829,15830,873],{},[34,15831,798],{},[313,15833,877],{"id":876},[10,15835,880],{},[65,15837,15838],{"className":575,"code":720,"language":577,"meta":70,"style":70},[34,15839,15840,15846],{"__ignoreMap":70},[74,15841,15842,15844],{"class":76,"line":77},[74,15843,675],{"class":584},[74,15845,588],{"class":587},[74,15847,15848,15850,15852,15854],{"class":76,"line":83},[74,15849,675],{"class":584},[74,15851,617],{"class":587},[74,15853,621],{"class":620},[74,15855,588],{"class":587},[10,15857,903],{},[14,15859,906],{"id":906},[313,15861,910],{"id":909},[10,15863,913,15864,917],{},[34,15865,916],{},[136,15867,15868,15872,15874],{},[45,15869,922,15870,925],{},[34,15871,632],{},[45,15873,928],{},[45,15875,931],{},[10,15877,934],{},[313,15879,938],{"id":937},[10,15881,941],{},[65,15883,15884],{"className":575,"code":668,"language":577,"meta":70,"style":70},[34,15885,15886],{"__ignoreMap":70},[74,15887,15888,15890],{"class":76,"line":77},[74,15889,675],{"class":584},[74,15891,588],{"class":587},[10,15893,954,15894,957,15896,960,15898,57],{},[34,15895,675],{},[34,15897,69],{},[34,15899,675],{},[313,15901,966],{"id":965},[10,15903,969],{},[65,15905,15906],{"className":575,"code":972,"language":577,"meta":70,"style":70},[34,15907,15908],{"__ignoreMap":70},[74,15909,15910,15912,15914,15916],{"class":76,"line":77},[74,15911,675],{"class":584},[74,15913,617],{"class":587},[74,15915,621],{"class":620},[74,15917,588],{"class":587},[10,15919,987,15920,990,15922,993,15924,996,15926,1000],{},[34,15921,675],{},[34,15923,69],{},[34,15925,492],{},[34,15927,999],{},[197,15929,1003],{},{"title":70,"searchDepth":83,"depth":83,"links":15931},[15932,15933,15934,15939,15944,15949],{"id":233,"depth":83,"text":233},{"id":249,"depth":83,"text":249},{"id":310,"depth":83,"text":311,"children":15935},[15936,15937,15938],{"id":315,"depth":89,"text":316},{"id":375,"depth":89,"text":376},{"id":560,"depth":89,"text":561},{"id":657,"depth":83,"text":658,"children":15940},[15941,15942,15943],{"id":661,"depth":89,"text":662},{"id":687,"depth":89,"text":688},{"id":713,"depth":89,"text":714},{"id":747,"depth":83,"text":748,"children":15945},[15946,15947,15948],{"id":754,"depth":89,"text":755},{"id":784,"depth":89,"text":785},{"id":876,"depth":89,"text":877},{"id":906,"depth":83,"text":906,"children":15950},[15951,15952,15953],{"id":909,"depth":89,"text":910},{"id":937,"depth":89,"text":938},{"id":965,"depth":89,"text":966},{},{"title":228,"description":70},[210,1036,1037],1786973364563]