[{"data":1,"prerenderedAt":15965},["ShallowReactive",2],{"post-python-string-index-slice":3,"sidebar-posts":239,"post-related-source":9156},{"id":4,"title":5,"body":6,"category":130,"cover":224,"description":12,"extension":225,"meta":226,"navigation":227,"path":228,"pinned":229,"publishedAt":230,"seo":231,"slug":232,"stem":233,"summary":234,"tags":235,"updatedAt":230,"visible":227,"__hash__":238},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":8,"toc":212},"minimark",[9,13,17,20,23,30,42,45,58,61,64,105,108,116,119,122,154,158,161,167,170,173,181,184,199,202,205,208],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[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\u002F08-string-slice.svg",[10,31,32,33,37,38,41],{},"切片 ",[34,35,36],"code",{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,39,40],{},"stop - start","。",[14,43,44],{"id":44},"核心概念",[46,47,48,52,55],"ul",{},[49,50,51],"li",{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[49,53,54],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[49,56,57],{},"切片会创建新的字符串，不会修改原字符串。",[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","language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n","python","",[34,72,73,81,87,93,99],{"__ignoreMap":70},[74,75,78],"span",{"class":76,"line":77},"line",1,[74,79,80],{},"language = \"Python\"\n",[74,82,84],{"class":76,"line":83},2,[74,85,86],{},"print(language[0])\n",[74,88,90],{"class":76,"line":89},3,[74,91,92],{},"print(language[-1])\n",[74,94,96],{"class":76,"line":95},4,[74,97,98],{},"print(language[0:3])\n",[74,100,102],{"class":76,"line":101},5,[74,103,104],{},"print(language + \" 3.14\")\n",[10,106,107],{},"预期结果：",[65,109,114],{"className":110,"code":112,"language":113,"meta":70},[111],"language-text","P\nn\nPyt\nPython 3.14\n","text",[34,115,112],{"__ignoreMap":70},[10,117,118],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,120,121],{"id":121},"按执行顺序拆开看",[123,124,125,140],"ol",{},[49,126,127,128,131,132,135,136,139],{},"字符串 ",[34,129,130],{},"Python"," 的正索引从 ",[34,133,134],{},"P"," 的 0 开始，负索引从末尾 ",[34,137,138],{},"n"," 的 -1 开始。",[49,141,142,145,146,149,150,153],{},[34,143,144],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,147,148],{},"Pyt","；索引 3 的 ",[34,151,152],{},"h"," 不在结果中。",[155,156,157],"h3",{"id":157},"再看一个具体细节",[10,159,160],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,162,163],{},[26,164],{"alt":165,"src":166},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,168,169],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,171,172],{"id":172},"初学者容易混淆的地方",[46,174,175,178],{},[49,176,177],{},"把第一个字符写成索引 1，造成整体偏移一位。",[49,179,180],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,182,183],{"id":183},"练习",[123,185,186,196],{},[49,187,188,189,192,193,41],{},"从 ",[34,190,191],{},"\"programming\""," 中切出 ",[34,194,195],{},"\"gram\"",[49,197,198],{},"使用负索引取得字符串倒数第二个字符。",[10,200,201],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,203,204],{"id":204},"本篇边界",[10,206,207],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,210,211],"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":213},[214,215,216,217,218,221,222,223],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":219},[220],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},null,"md",{},true,"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",false,"2026-08-17",{"title":5,"description":12},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[130,236,237],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",[240,1052,1391,1525,1677,1856,2044,2209,2393,2576,2717,2948,3132,3309,3466,3637,3802,4017,4246,4428,4592,4781,4969,5124,5284,5481,5678,5892,6059,6303,6484,6689,6884,7068,7269,7559,7751,7980,8175,8395,8635,8839],{"id":241,"title":242,"body":243,"category":130,"cover":224,"description":70,"extension":225,"meta":1041,"navigation":227,"path":1042,"pinned":229,"publishedAt":1043,"seo":1044,"slug":1045,"stem":1046,"summary":1047,"tags":1048,"updatedAt":1043,"visible":227,"__hash__":1051},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":244,"toc":1017},[245,248,251,254,261,264,267,306,322,326,330,341,346,352,369,375,380,386,390,436,439,445,451,454,485,530,547,561,571,575,586,602,605,611,616,619,637,647,668,672,676,679,691,698,702,717,724,728,731,752,758,762,765,769,772,792,795,799,802,836,839,858,861,882,887,891,894,914,917,920,924,931,945,948,952,955,965,976,980,983,998,1014],[14,246,247],{"id":247},"引言",[10,249,250],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,252,253],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,255,256,257,260],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,258,259],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,262,263],{"id":263},"扫盲",[10,265,266],{},"那么这里有几个概念：",[268,269,270,273],"blockquote",{},[10,271,272],{},"为什么需要安装python解释器？",[268,274,275,286,289,297,300],{},[10,276,277,278,281,282,285],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,279,280],{},"0","和",[34,283,284],{},"1","组成的机器指令。",[10,287,288],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,290,291,292,296],{},"这样，我们就能用",[293,294,295],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,298,299],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,301,302],{},[26,303],{"alt":304,"src":305},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[268,307,308,311],{},[10,309,310],{},"pip又是什么？",[268,312,313,316],{},[10,314,315],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,317,318],{},[26,319],{"alt":320,"src":321},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,323,325],{"id":324},"windows-安装","Windows 安装",[155,327,329],{"id":328},"_1-下载官方安装程序","1. 下载官方安装程序",[10,331,332,333,340],{},"打开 ",[334,335,339],"a",{"href":336,"rel":337},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[338],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[268,342,343],{},[10,344,345],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,347,348],{},[26,349],{"alt":350,"src":351},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[46,353,354,360,366],{},[49,355,356,357,41],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[293,358,359],{},"Windows installer (64-bit)",[49,361,362,363,41],{},"搭载 ARM 处理器的 Windows 设备选择 ",[293,364,365],{},"Windows installer (ARM64)",[49,367,368],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,370,371],{},[26,372],{"alt":373,"src":374},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[268,376,377],{},[10,378,379],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,381,382],{},[26,383],{"alt":384,"src":385},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[155,387,389],{"id":388},"_2-安装并加入-path","2. 安装并加入 PATH",[268,391,392,397,404,429],{},[268,393,394],{},[10,395,396],{},"PATH 环境变量",[10,398,399,400,403],{},"Windows 有一个特殊的变量叫 ",[293,401,402],{},"PATH","，它里面存了一串文件夹路径，比如：",[65,405,407],{"className":67,"code":406,"language":69,"meta":70,"style":70},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,408,409,414,419,424],{"__ignoreMap":70},[74,410,411],{"class":76,"line":77},[74,412,413],{},"D:\\Python313\\\n",[74,415,416],{"class":76,"line":83},[74,417,418],{},"D:\\Python313\\Scripts\\\n",[74,420,421],{"class":76,"line":89},[74,422,423],{},"C:\\Windows\\System32\\\n",[74,425,426],{"class":76,"line":95},[74,427,428],{},"...\n",[10,430,431,432,435],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[293,433,434],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,437,438],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,440,441,442,444],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,443,69],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,446,447],{},[26,448],{"alt":449,"src":450},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,452,453],{},"对安装界面最底部的两个勾选项分别解释 :",[268,455,456,459,464],{},[10,457,458],{},"Add python.exe to PATH",[10,460,461],{},[293,462,463],{},"把 Python 添加到系统环境变量",[268,465,466,472,478],{},[10,467,468,469,471],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,470,69],{}," 就能运行",[10,473,474,475,477],{},"不勾选的话，命令行输入 ",[34,476,69],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,479,480,481,484],{},"必须",[293,482,483],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[268,486,487,490,495],{},[10,488,489],{},"Use admin privileges when installing py.exe",[10,491,492],{},[293,493,494],{},"使用管理员权限安装 py.exe（Python 启动器）",[268,496,497,507,521,524],{},[10,498,499,502,503,506],{},[34,500,501],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,504,505],{},"py"," 来启动 Python。",[10,508,509,510,512,513,516,517,520],{},"勾选后，",[34,511,501],{}," 会安装到",[293,514,515],{},"系统级目录","，电脑上",[293,518,519],{},"所有用户账户","都能用",[10,522,523],{},"不勾选，只有当前用户能用",[10,525,526,529],{},[293,527,528],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[268,531,532,535],{},[10,533,534],{},"操作建议",[268,536,537,544],{},[10,538,539,540,543],{},"两个都勾上之后，再点 ",[293,541,542],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,545,546],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[268,548,549,555],{},[10,550,551,552],{},"Python 安装的",[293,553,554],{},"可选功能页",[10,556,557],{},[26,558],{"alt":559,"src":560},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[268,562,563,566],{},[10,564,565],{},"高级选项页",[10,567,568],{},[26,569],{"alt":559,"src":570},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[155,572,574],{"id":573},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,576,577,578,581,582,585],{},"按 ",[34,579,580],{},"Win + R","，输入 ",[34,583,584],{},"cmd"," 并回车，然后执行：",[65,587,591],{"className":588,"code":589,"language":590,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,592,593],{"__ignoreMap":70},[74,594,595,598],{"class":76,"line":77},[74,596,69],{"class":597},"svObZ",[74,599,601],{"class":600},"sDLfK"," --version\n",[10,603,604],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[65,606,609],{"className":607,"code":608,"language":113,"meta":70},[111],"Python 3.x.x\n",[34,610,608],{"__ignoreMap":70},[10,612,613],{},[26,614],{"alt":559,"src":615},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,617,618],{},"继续检查 pip：",[65,620,622],{"className":588,"code":621,"language":590,"meta":70,"style":70},"python -m pip --version\n",[34,623,624],{"__ignoreMap":70},[74,625,626,628,631,635],{"class":76,"line":77},[74,627,69],{"class":597},[74,629,630],{"class":600}," -m",[74,632,634],{"class":633},"sU2Wk"," pip",[74,636,601],{"class":600},[10,638,639,640,642,643,646],{},"如果 ",[34,641,69],{}," 无法识别，但 ",[34,644,645],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[65,648,650],{"className":588,"code":649,"language":590,"meta":70,"style":70},"py --version\npy -m pip --version\n",[34,651,652,658],{"__ignoreMap":70},[74,653,654,656],{"class":76,"line":77},[74,655,505],{"class":597},[74,657,601],{"class":600},[74,659,660,662,664,666],{"class":76,"line":83},[74,661,505],{"class":597},[74,663,630],{"class":600},[74,665,634],{"class":633},[74,667,601],{"class":600},[14,669,671],{"id":670},"macos-安装","macOS 安装",[155,673,675],{"id":674},"_1-先检查现有环境","1. 先检查现有环境",[10,677,678],{},"打开“终端”应用，执行：",[65,680,682],{"className":588,"code":681,"language":590,"meta":70,"style":70},"python3 --version\n",[34,683,684],{"__ignoreMap":70},[74,685,686,689],{"class":76,"line":77},[74,687,688],{"class":597},"python3",[74,690,601],{"class":600},[10,692,693,694,697],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,695,696],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[155,699,701],{"id":700},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,703,332,704,709,710,41,713,716],{},[334,705,708],{"href":706,"rel":707},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[338],"Python macOS 下载页","，下载当前稳定版的 ",[293,711,712],{},"macOS 64-bit universal2 installer",[34,714,715],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,718,719,720,723],{},"下载完成后打开 ",[34,721,722],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[155,725,727],{"id":726},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,729,730],{},"安装完成后重新打开终端，执行：",[65,732,734],{"className":588,"code":733,"language":590,"meta":70,"style":70},"python3 --version\npython3 -m pip --version\n",[34,735,736,742],{"__ignoreMap":70},[74,737,738,740],{"class":76,"line":77},[74,739,688],{"class":597},[74,741,601],{"class":600},[74,743,744,746,748,750],{"class":76,"line":83},[74,745,688],{"class":597},[74,747,630],{"class":600},[74,749,634],{"class":633},[74,751,601],{"class":600},[10,753,754,755,757],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,756,688],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,759,761],{"id":760},"linux-安装","Linux 安装",[10,763,764],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[155,766,768],{"id":767},"_1-检查是否已经安装","1. 检查是否已经安装",[10,770,771],{},"打开终端，执行：",[65,773,774],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,775,776,782],{"__ignoreMap":70},[74,777,778,780],{"class":76,"line":77},[74,779,688],{"class":597},[74,781,601],{"class":600},[74,783,784,786,788,790],{"class":76,"line":83},[74,785,688],{"class":597},[74,787,630],{"class":600},[74,789,634],{"class":633},[74,791,601],{"class":600},[10,793,794],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[155,796,798],{"id":797},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,800,801],{},"Ubuntu 或 Debian：",[65,803,805],{"className":588,"code":804,"language":590,"meta":70,"style":70},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,806,807,818],{"__ignoreMap":70},[74,808,809,812,815],{"class":76,"line":77},[74,810,811],{"class":597},"sudo",[74,813,814],{"class":633}," apt",[74,816,817],{"class":633}," update\n",[74,819,820,822,824,827,830,833],{"class":76,"line":83},[74,821,811],{"class":597},[74,823,814],{"class":633},[74,825,826],{"class":633}," install",[74,828,829],{"class":633}," python3",[74,831,832],{"class":633}," python3-pip",[74,834,835],{"class":633}," python3-venv\n",[10,837,838],{},"Fedora：",[65,840,842],{"className":588,"code":841,"language":590,"meta":70,"style":70},"sudo dnf install python3 python3-pip\n",[34,843,844],{"__ignoreMap":70},[74,845,846,848,851,853,855],{"class":76,"line":77},[74,847,811],{"class":597},[74,849,850],{"class":633}," dnf",[74,852,826],{"class":633},[74,854,829],{"class":633},[74,856,857],{"class":633}," python3-pip\n",[10,859,860],{},"Arch Linux：",[65,862,864],{"className":588,"code":863,"language":590,"meta":70,"style":70},"sudo pacman -S python python-pip\n",[34,865,866],{"__ignoreMap":70},[74,867,868,870,873,876,879],{"class":76,"line":77},[74,869,811],{"class":597},[74,871,872],{"class":633}," pacman",[74,874,875],{"class":600}," -S",[74,877,878],{"class":633}," python",[74,880,881],{"class":633}," python-pip\n",[10,883,884,886],{},[34,885,811],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[155,888,890],{"id":889},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,892,893],{},"安装结束后执行：",[65,895,896],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,897,898,904],{"__ignoreMap":70},[74,899,900,902],{"class":76,"line":77},[74,901,688],{"class":597},[74,903,601],{"class":600},[74,905,906,908,910,912],{"class":76,"line":83},[74,907,688],{"class":597},[74,909,630],{"class":600},[74,911,634],{"class":633},[74,913,601],{"class":600},[10,915,916],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,918,919],{"id":919},"常见问题",[155,921,923],{"id":922},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,925,926,927,930],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,928,929],{},"python --version","。如果仍然失败，按下面的顺序检查：",[123,932,933,939,942],{},[49,934,935,936,938],{},"执行 ",[34,937,645],{},"，确认 Python Launcher 是否可用。",[49,940,941],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[49,943,944],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,946,947],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[155,949,951],{"id":950},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,953,954],{},"先尝试：",[65,956,957],{"className":588,"code":681,"language":590,"meta":70,"style":70},[34,958,959],{"__ignoreMap":70},[74,960,961,963],{"class":76,"line":77},[74,962,688],{"class":597},[74,964,601],{"class":600},[10,966,967,968,970,971,973,974,41],{},"在这两个系统中，只有 ",[34,969,688],{}," 命令而没有 ",[34,972,69],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,975,688],{},[155,977,979],{"id":978},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,981,982],{},"先使用模块方式检查：",[65,984,986],{"className":588,"code":985,"language":590,"meta":70,"style":70},"python3 -m pip --version\n",[34,987,988],{"__ignoreMap":70},[74,989,990,992,994,996],{"class":76,"line":77},[74,991,688],{"class":597},[74,993,630],{"class":600},[74,995,634],{"class":633},[74,997,601],{"class":600},[10,999,1000,1001,1003,1004,1006,1007,1009,1010,1013],{},"Windows 用户将命令中的 ",[34,1002,688],{}," 换成 ",[34,1005,69],{}," 或 ",[34,1008,505],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,1011,1012],{},"python3-pip","；不要直接使用其他系统的安装命令。",[209,1015,1016],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":70,"searchDepth":83,"depth":83,"links":1018},[1019,1020,1021,1026,1031,1036],{"id":247,"depth":83,"text":247},{"id":263,"depth":83,"text":263},{"id":324,"depth":83,"text":325,"children":1022},[1023,1024,1025],{"id":328,"depth":89,"text":329},{"id":388,"depth":89,"text":389},{"id":573,"depth":89,"text":574},{"id":670,"depth":83,"text":671,"children":1027},[1028,1029,1030],{"id":674,"depth":89,"text":675},{"id":700,"depth":89,"text":701},{"id":726,"depth":89,"text":727},{"id":760,"depth":83,"text":761,"children":1032},[1033,1034,1035],{"id":767,"depth":89,"text":768},{"id":797,"depth":89,"text":798},{"id":889,"depth":89,"text":890},{"id":919,"depth":83,"text":919,"children":1037},[1038,1039,1040],{"id":922,"depth":89,"text":923},{"id":950,"depth":89,"text":951},{"id":978,"depth":89,"text":979},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":242,"description":70},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[130,1049,1050],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1053,"title":1054,"body":1055,"category":130,"cover":1062,"description":70,"extension":225,"meta":1380,"navigation":227,"path":1381,"pinned":229,"publishedAt":1382,"seo":1383,"slug":1384,"stem":1385,"summary":1386,"tags":1387,"updatedAt":1382,"visible":227,"__hash__":1390},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1056,"toc":1365},[1057,1063,1066,1069,1073,1076,1101,1104,1110,1113,1116,1151,1161,1165,1172,1175,1200,1203,1215,1218,1222,1225,1228,1231,1234,1237,1240,1243,1267,1270,1273,1279,1282,1285,1288,1292,1298,1301,1327,1330,1334,1337,1340,1344,1347,1350,1353,1356,1359,1362],[10,1058,1059],{},[26,1060],{"alt":1061,"src":1062},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1064,1065],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1067,1068],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1070,1072],{"id":1071},"python-代码是什么样的","Python 代码是什么样的",[10,1074,1075],{},"下面是一段简单的 Python 代码：",[65,1077,1079],{"className":67,"code":1078,"language":69,"meta":70,"style":70},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1080,1081,1086,1091,1096],{"__ignoreMap":70},[74,1082,1083],{"class":76,"line":77},[74,1084,1085],{},"name = \"Python\"\n",[74,1087,1088],{"class":76,"line":83},[74,1089,1090],{},"year = 2026\n",[74,1092,1093],{"class":76,"line":89},[74,1094,1095],{"emptyLinePlaceholder":227},"\n",[74,1097,1098],{"class":76,"line":95},[74,1099,1100],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1102,1103],{},"运行结果：",[65,1105,1108],{"className":1106,"code":1107,"language":113,"meta":70},[111],"正在学习 Python，当前年份是 2026\n",[34,1109,1107],{"__ignoreMap":70},[10,1111,1112],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1114,1115],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[65,1117,1119],{"className":67,"code":1118,"language":69,"meta":70,"style":70},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1120,1121,1126,1130,1135,1140,1145],{"__ignoreMap":70},[74,1122,1123],{"class":76,"line":77},[74,1124,1125],{},"score = 85\n",[74,1127,1128],{"class":76,"line":83},[74,1129,1095],{"emptyLinePlaceholder":227},[74,1131,1132],{"class":76,"line":89},[74,1133,1134],{},"if score >= 60:\n",[74,1136,1137],{"class":76,"line":95},[74,1138,1139],{},"    print(\"成绩合格\")\n",[74,1141,1142],{"class":76,"line":101},[74,1143,1144],{},"else:\n",[74,1146,1148],{"class":76,"line":1147},6,[74,1149,1150],{},"    print(\"需要继续学习\")\n",[10,1152,1153,1156,1157,1160],{},[34,1154,1155],{},"if"," 和 ",[34,1158,1159],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1162,1164],{"id":1163},"python-如何运行代码","Python 如何运行代码",[10,1166,1167,1168,1171],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1169,1170],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1173,1174],{},"交互式环境适合快速验证一个表达式：",[65,1176,1178],{"className":67,"code":1177,"language":69,"meta":70,"style":70},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1179,1180,1185,1190,1195],{"__ignoreMap":70},[74,1181,1182],{"class":76,"line":77},[74,1183,1184],{},">>> 10 + 20\n",[74,1186,1187],{"class":76,"line":83},[74,1188,1189],{},"30\n",[74,1191,1192],{"class":76,"line":89},[74,1193,1194],{},">>> \"Python\".lower()\n",[74,1196,1197],{"class":76,"line":95},[74,1198,1199],{},"'python'\n",[10,1201,1202],{},"需要保存和重复运行的程序，则可以写入文件：",[65,1204,1206],{"className":588,"code":1205,"language":590,"meta":70,"style":70},"python3 hello.py\n",[34,1207,1208],{"__ignoreMap":70},[74,1209,1210,1212],{"class":76,"line":77},[74,1211,688],{"class":597},[74,1213,1214],{"class":633}," hello.py\n",[10,1216,1217],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1219,1221],{"id":1220},"python-的特点","Python 的特点",[155,1223,1224],{"id":1224},"语法相对简洁",[10,1226,1227],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[155,1229,1230],{"id":1230},"支持多种编程方式",[10,1232,1233],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[155,1235,1236],{"id":1236},"标准库比较完整",[10,1238,1239],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1241,1242],{},"例如，获取当前时间：",[65,1244,1246],{"className":67,"code":1245,"language":69,"meta":70,"style":70},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1247,1248,1253,1257,1262],{"__ignoreMap":70},[74,1249,1250],{"class":76,"line":77},[74,1251,1252],{},"from datetime import datetime\n",[74,1254,1255],{"class":76,"line":83},[74,1256,1095],{"emptyLinePlaceholder":227},[74,1258,1259],{"class":76,"line":89},[74,1260,1261],{},"now = datetime.now()\n",[74,1263,1264],{"class":76,"line":95},[74,1265,1266],{},"print(now)\n",[10,1268,1269],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[155,1271,1272],{"id":1272},"第三方工具丰富",[10,1274,1275,1276,1278],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1277,259],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1280,1281],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[155,1283,1284],{"id":1284},"支持多个操作系统",[10,1286,1287],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1289,1291],{"id":1290},"python-可以做什么","Python 可以做什么",[10,1293,1294],{},[26,1295],{"alt":1296,"src":1297},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1299,1300],{},"Python 的应用范围比较广，常见方向包括：",[46,1302,1303,1306,1309,1312,1315,1318,1321,1324],{},[49,1304,1305],{},"编写自动化脚本，批量处理文件和重复任务；",[49,1307,1308],{},"开发网站后端和 API 服务；",[49,1310,1311],{},"进行数据清洗、统计分析和图表展示；",[49,1313,1314],{},"编写网络爬虫和信息采集工具；",[49,1316,1317],{},"开发自动化测试程序；",[49,1319,1320],{},"进行机器学习和人工智能开发；",[49,1322,1323],{},"编写运维、监控和辅助开发工具；",[49,1325,1326],{},"开发部分桌面应用和插件。",[10,1328,1329],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1331,1333],{"id":1332},"python-的发展","Python 的发展",[10,1335,1336],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1338,1339],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1341,1343],{"id":1342},"python-也有局限","Python 也有局限",[10,1345,1346],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1348,1349],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1351,1352],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1354,1355],{"id":1355},"写在最后",[10,1357,1358],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1360,1361],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[209,1363,1364],{},"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":1366},[1367,1368,1369,1376,1377,1378,1379],{"id":1071,"depth":83,"text":1072},{"id":1163,"depth":83,"text":1164},{"id":1220,"depth":83,"text":1221,"children":1370},[1371,1372,1373,1374,1375],{"id":1224,"depth":89,"text":1224},{"id":1230,"depth":89,"text":1230},{"id":1236,"depth":89,"text":1236},{"id":1272,"depth":89,"text":1272},{"id":1284,"depth":89,"text":1284},{"id":1290,"depth":83,"text":1291},{"id":1332,"depth":83,"text":1333},{"id":1342,"depth":83,"text":1343},{"id":1355,"depth":83,"text":1355},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1054,"description":70},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[130,1388,1389],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1392,"title":1393,"body":1394,"category":130,"cover":224,"description":1398,"extension":225,"meta":1516,"navigation":227,"path":1517,"pinned":229,"publishedAt":230,"seo":1518,"slug":1519,"stem":1520,"summary":1521,"tags":1522,"updatedAt":230,"visible":227,"__hash__":1524},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1395,"toc":1506},[1396,1399,1401,1404,1406,1412,1417,1419,1433,1435,1437,1446,1448,1454,1456,1458,1474,1476,1487,1489,1497,1499,1501,1504],[10,1397,1398],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1400,16],{"id":16},[10,1402,1403],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1405,22],{"id":22},[10,1407,1408],{},[26,1409],{"alt":1410,"src":1411},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1413,1414,1416],{},[34,1415,1170],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1418,44],{"id":44},[46,1420,1421,1427,1430],{},[49,1422,1423,1424,1426],{},"源代码是人编写的文本，通常保存在 ",[34,1425,1170],{}," 文件中。",[49,1428,1429],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[49,1431,1432],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1434,60],{"id":60},[10,1436,63],{},[65,1438,1440],{"className":67,"code":1439,"language":69,"meta":70,"style":70},"print(\"你好，Python\")\n",[34,1441,1442],{"__ignoreMap":70},[74,1443,1444],{"class":76,"line":77},[74,1445,1439],{},[10,1447,107],{},[65,1449,1452],{"className":1450,"code":1451,"language":113,"meta":70},[111],"你好，Python\n",[34,1453,1451],{"__ignoreMap":70},[10,1455,118],{},[14,1457,121],{"id":121},[123,1459,1460,1467],{},[49,1461,1462,1463,1466],{},"终端启动解释器后，解释器读取 ",[34,1464,1465],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[49,1468,1469,1470,1473],{},"字符串对象先准备好，再交给 ",[34,1471,1472],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1475,172],{"id":172},[46,1477,1478,1481],{},[49,1479,1480],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[49,1482,1483,1484,1486],{},"认为 ",[34,1485,1170],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1488,183],{"id":183},[123,1490,1491,1494],{},[49,1492,1493],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[49,1495,1496],{},"把示例文字改成自己的学习目标并重新运行。",[10,1498,201],{},[14,1500,204],{"id":204},[10,1502,1503],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,1505,211],{},{"title":70,"searchDepth":83,"depth":83,"links":1507},[1508,1509,1510,1511,1512,1513,1514,1515],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1393,"description":1398},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[130,1388,1523],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1526,"title":1527,"body":1528,"category":130,"cover":224,"description":1532,"extension":225,"meta":1668,"navigation":227,"path":1669,"pinned":229,"publishedAt":230,"seo":1670,"slug":1671,"stem":1672,"summary":1673,"tags":1674,"updatedAt":230,"visible":227,"__hash__":1676},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1529,"toc":1658},[1530,1533,1535,1538,1540,1546,1552,1554,1569,1571,1574,1594,1596,1602,1604,1606,1619,1621,1635,1637,1648,1650,1652,1655],[10,1531,1532],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1534,16],{"id":16},[10,1536,1537],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1539,22],{"id":22},[10,1541,1542],{},[26,1543],{"alt":1544,"src":1545},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1547,1548,1549,1551],{},"终端收到 ",[34,1550,688],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1553,44],{"id":44},[46,1555,1556,1559,1562],{},[49,1557,1558],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[49,1560,1561],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[49,1563,1564,1565,1568],{},"检查 pip 时使用 ",[34,1566,1567],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1570,60],{"id":60},[10,1572,1573],{},"在 macOS 终端执行：",[65,1575,1576],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,1577,1578,1584],{"__ignoreMap":70},[74,1579,1580,1582],{"class":76,"line":77},[74,1581,688],{"class":597},[74,1583,601],{"class":600},[74,1585,1586,1588,1590,1592],{"class":76,"line":83},[74,1587,688],{"class":597},[74,1589,630],{"class":600},[74,1591,634],{"class":633},[74,1593,601],{"class":600},[10,1595,107],{},[65,1597,1600],{"className":1598,"code":1599,"language":113,"meta":70},[111],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1601,1599],{"__ignoreMap":70},[10,1603,118],{},[14,1605,121],{"id":121},[123,1607,1608,1614],{},[49,1609,1610,1613],{},[34,1611,1612],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[49,1615,1616,1618],{},[34,1617,696],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1620,172],{"id":172},[46,1622,1623,1629],{},[49,1624,1625,1626,1628],{},"看到系统已有 ",[34,1627,688],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[49,1630,1631,1632,1634],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1633,688],{},"，不修改系统自带工具。",[14,1636,183],{"id":183},[123,1638,1639,1645],{},[49,1640,935,1641,1644],{},[34,1642,1643],{},"which python3","，记录当前解释器路径。",[49,1646,1647],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1649,201],{},[14,1651,204],{"id":204},[10,1653,1654],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,1656,1657],{},"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":1659},[1660,1661,1662,1663,1664,1665,1666,1667],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1527,"description":1532},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[130,1675,1049],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1678,"title":1679,"body":1680,"category":130,"cover":224,"description":1845,"extension":225,"meta":1846,"navigation":227,"path":1847,"pinned":229,"publishedAt":230,"seo":1848,"slug":1849,"stem":1850,"summary":1851,"tags":1852,"updatedAt":230,"visible":227,"__hash__":1855},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1681,"toc":1835},[1682,1688,1690,1693,1695,1701,1704,1706,1730,1732,1734,1761,1763,1769,1771,1773,1791,1793,1807,1809,1823,1825,1827,1833],[10,1683,1684,1685,1687],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1686,1170],{}," 脚本。",[14,1689,16],{"id":16},[10,1691,1692],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1694,22],{"id":22},[10,1696,1697],{},[26,1698],{"alt":1699,"src":1700},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1702,1703],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1705,44],{"id":44},[46,1707,1708,1717,1724],{},[49,1709,1710,1711,1713,1714,41],{},"在终端输入 ",[34,1712,688],{}," 进入 REPL，提示符通常是 ",[34,1715,1716],{},">>>",[49,1718,1719,1720,1723],{},"输入 ",[34,1721,1722],{},"exit()"," 或按 Control-D 退出 REPL。",[49,1725,1726,1727,1729],{},"需要保存、复查或多次运行的代码应写入 ",[34,1728,1170],{}," 文件。",[14,1731,60],{"id":60},[10,1733,63],{},[65,1735,1739],{"className":1736,"code":1737,"language":1738,"meta":70,"style":70},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1740,1741,1746,1751,1756],{"__ignoreMap":70},[74,1742,1743],{"class":76,"line":77},[74,1744,1745],{},">>> 2 + 3\n",[74,1747,1748],{"class":76,"line":83},[74,1749,1750],{},"5\n",[74,1752,1753],{"class":76,"line":89},[74,1754,1755],{},">>> \"python\".upper()\n",[74,1757,1758],{"class":76,"line":95},[74,1759,1760],{},"'PYTHON'\n",[10,1762,107],{},[65,1764,1767],{"className":1765,"code":1766,"language":113,"meta":70},[111],"REPL 会直接显示表达式结果\n",[34,1768,1766],{"__ignoreMap":70},[10,1770,118],{},[14,1772,121],{"id":121},[123,1774,1775,1785],{},[49,1776,1777,1778,1781,1782,41],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1779,1780],{},"2 + 3"," 能直接看到 ",[34,1783,1784],{},"5",[49,1786,1787,1788,1790],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1789,1472],{}," 才会写到标准输出。",[14,1792,172],{"id":172},[46,1794,1795,1804],{},[49,1796,1797,1798,1800,1801,1803],{},"把提示符 ",[34,1799,1716],{}," 复制进 ",[34,1802,1170],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[49,1805,1806],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1808,183],{"id":183},[123,1810,1811,1817],{},[49,1812,1813,1814,41],{},"在 REPL 计算 ",[34,1815,1816],{},"12 * 8",[49,1818,1819,1820,1822],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1821,1472],{}," 时是否显示结果。",[10,1824,201],{},[14,1826,204],{"id":204},[10,1828,1829,1830,1832],{},"本篇目标是根据任务选择 REPL 或 ",[34,1831,1170],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,1834,211],{},{"title":70,"searchDepth":83,"depth":83,"links":1836},[1837,1838,1839,1840,1841,1842,1843,1844],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1679,"description":1845},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[130,1853,1854],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1857,"title":1858,"body":1859,"category":130,"cover":224,"description":1863,"extension":225,"meta":2034,"navigation":227,"path":2035,"pinned":229,"publishedAt":230,"seo":2036,"slug":2037,"stem":2038,"summary":2039,"tags":2040,"updatedAt":230,"visible":227,"__hash__":2043},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1860,"toc":2024},[1861,1864,1866,1869,1871,1877,1883,1885,1903,1905,1907,1952,1954,1960,1962,1964,1986,1988,2000,2002,2014,2016,2018,2021],[10,1862,1863],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1865,16],{"id":16},[10,1867,1868],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1870,22],{"id":22},[10,1872,1873],{},[26,1874],{"alt":1875,"src":1876},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1878,1879,1882],{},[34,1880,1881],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1884,44],{"id":44},[46,1886,1887,1890,1900],{},[49,1888,1889],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[49,1891,1892,1895,1896,1899],{},[34,1893,1894],{},"pwd"," 显示当前目录，",[34,1897,1898],{},"ls"," 显示目录里的文件。",[49,1901,1902],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1904,60],{"id":60},[10,1906,1573],{},[65,1908,1910],{"className":588,"code":1909,"language":590,"meta":70,"style":70},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1911,1912,1920,1927,1932,1946],{"__ignoreMap":70},[74,1913,1914,1917],{"class":76,"line":77},[74,1915,1916],{"class":597},"mkdir",[74,1918,1919],{"class":633}," python-study\n",[74,1921,1922,1925],{"class":76,"line":83},[74,1923,1924],{"class":600},"cd",[74,1926,1919],{"class":633},[74,1928,1929],{"class":76,"line":89},[74,1930,1931],{"class":600},"pwd\n",[74,1933,1934,1937,1940,1944],{"class":76,"line":95},[74,1935,1936],{"class":600},"printf",[74,1938,1939],{"class":633}," 'print(\"项目已经运行\")\\n'",[74,1941,1943],{"class":1942},"snl16"," >",[74,1945,1214],{"class":633},[74,1947,1948,1950],{"class":76,"line":101},[74,1949,688],{"class":597},[74,1951,1214],{"class":633},[10,1953,107],{},[65,1955,1958],{"className":1956,"code":1957,"language":113,"meta":70},[111],"项目已经运行\n",[34,1959,1957],{"__ignoreMap":70},[10,1961,118],{},[14,1963,121],{"id":121},[123,1965,1966,1977],{},[49,1967,1968,1970,1971,1973,1974,1976],{},[34,1969,1916],{}," 创建目录，",[34,1972,1924],{}," 改变终端当前目录，",[34,1975,1894],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[49,1978,1979,1981,1982,1985],{},[34,1980,1881],{}," 会在当前目录寻找 ",[34,1983,1984],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1987,172],{"id":172},[46,1989,1990,1997],{},[49,1991,1992,1993,1156,1995,41],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,1994,1894],{},[34,1996,1898],{},[49,1998,1999],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2001,183],{"id":183},[123,2003,2004,2011],{},[49,2005,2006,2007,2010],{},"新建 ",[34,2008,2009],{},"lesson01.py"," 并输出课程编号。",[49,2012,2013],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2015,201],{},[14,2017,204],{"id":204},[10,2019,2020],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2022,2023],{},"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":2025},[2026,2027,2028,2029,2030,2031,2032,2033],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1858,"description":1863},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[130,2041,2042],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2045,"title":2046,"body":2047,"category":130,"cover":224,"description":2051,"extension":225,"meta":2199,"navigation":227,"path":2200,"pinned":229,"publishedAt":230,"seo":2201,"slug":2202,"stem":2203,"summary":2204,"tags":2205,"updatedAt":230,"visible":227,"__hash__":2208},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2048,"toc":2189},[2049,2052,2054,2057,2059,2065,2076,2078,2098,2100,2102,2122,2124,2130,2132,2134,2153,2155,2163,2165,2180,2182,2184,2187],[10,2050,2051],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2053,16],{"id":16},[10,2055,2056],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2058,22],{"id":22},[10,2060,2061],{},[26,2062],{"alt":2063,"src":2064},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2066,2067,2068,41,2070,2073,2074,41],{},"Python 先计算表达式，再把得到的对象交给 ",[34,2069,1472],{},[34,2071,2072],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2075,1780],{},[14,2077,44],{"id":44},[46,2079,2080,2086,2095],{},[49,2081,2082,2085],{},[34,2083,2084],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[49,2087,2088,2091,2092,41],{},[34,2089,2090],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2093,2094],{},"12",[49,2096,2097],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2099,60],{"id":60},[10,2101,63],{},[65,2103,2105],{"className":67,"code":2104,"language":69,"meta":70,"style":70},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2106,2107,2112,2117],{"__ignoreMap":70},[74,2108,2109],{"class":76,"line":77},[74,2110,2111],{},"print(42)\n",[74,2113,2114],{"class":76,"line":83},[74,2115,2116],{},"print(7 + 5)\n",[74,2118,2119],{"class":76,"line":89},[74,2120,2121],{},"print(\"Python 基础课\")\n",[10,2123,107],{},[65,2125,2128],{"className":2126,"code":2127,"language":113,"meta":70},[111],"42\n12\nPython 基础课\n",[34,2129,2127],{"__ignoreMap":70},[10,2131,118],{},[14,2133,121],{"id":121},[123,2135,2136,2144],{},[49,2137,2138,2141,2142,41],{},[34,2139,2140],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2143,2094],{},[49,2145,2146,2148,2149,2152],{},[34,2147,1472],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2150,2151],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2154,172],{"id":172},[46,2156,2157,2160],{},[49,2158,2159],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[49,2161,2162],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2164,183],{"id":183},[123,2166,2167,2170],{},[49,2168,2169],{},"分别输出一个整数、一个小数和一段文本。",[49,2171,2172,2173,2175,2176,2179],{},"比较 ",[34,2174,2072],{}," 与 ",[34,2177,2178],{},"print(\"2 + 3\")"," 的结果。",[10,2181,201],{},[14,2183,204],{"id":204},[10,2185,2186],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2188,211],{},{"title":70,"searchDepth":83,"depth":83,"links":2190},[2191,2192,2193,2194,2195,2196,2197,2198],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2046,"description":2051},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[130,2206,2207],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2210,"title":2211,"body":2212,"category":130,"cover":224,"description":2216,"extension":225,"meta":2383,"navigation":227,"path":2384,"pinned":229,"publishedAt":230,"seo":2385,"slug":2386,"stem":2387,"summary":2388,"tags":2389,"updatedAt":230,"visible":227,"__hash__":2392},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2213,"toc":2373},[2214,2217,2219,2222,2224,2230,2233,2235,2261,2263,2265,2293,2295,2301,2303,2305,2329,2331,2347,2349,2364,2366,2368,2371],[10,2215,2216],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2218,16],{"id":16},[10,2220,2221],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2223,22],{"id":22},[10,2225,2226],{},[26,2227],{"alt":2228,"src":2229},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2231,2232],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2234,44],{"id":44},[46,2236,2237,2240,2250],{},[49,2238,2239],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[49,2241,2242,2243,2175,2246,2249],{},"变量名区分大小写，",[34,2244,2245],{},"score",[34,2247,2248],{},"Score"," 是两个名字。",[49,2251,2252,2253,2256,2257,2260],{},"使用能表达含义的名称；不要用 ",[34,2254,2255],{},"list","、",[34,2258,2259],{},"str"," 等内置名称作为普通变量名。",[14,2262,60],{"id":60},[10,2264,63],{},[65,2266,2268],{"className":67,"code":2267,"language":69,"meta":70,"style":70},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2269,2270,2275,2280,2284,2289],{"__ignoreMap":70},[74,2271,2272],{"class":76,"line":77},[74,2273,2274],{},"score = 90\n",[74,2276,2277],{"class":76,"line":83},[74,2278,2279],{},"print(score)\n",[74,2281,2282],{"class":76,"line":89},[74,2283,1095],{"emptyLinePlaceholder":227},[74,2285,2286],{"class":76,"line":95},[74,2287,2288],{},"score = 95\n",[74,2290,2291],{"class":76,"line":101},[74,2292,2279],{},[10,2294,107],{},[65,2296,2299],{"className":2297,"code":2298,"language":113,"meta":70},[111],"90\n95\n",[34,2300,2298],{"__ignoreMap":70},[10,2302,118],{},[14,2304,121],{"id":121},[123,2306,2307,2316],{},[49,2308,935,2309,2312,2313,2315],{},[34,2310,2311],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2314,2245],{}," 再绑定到它。",[49,2317,935,2318,2321,2322,2325,2326,41],{},[34,2319,2320],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2323,2324],{},"90"," 没有被改造成 ",[34,2327,2328],{},"95",[14,2330,172],{"id":172},[46,2332,2333,2336],{},[49,2334,2335],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[49,2337,2338,2339,2256,2341,2256,2343,2346],{},"使用 ",[34,2340,2255],{},[34,2342,2259],{},[34,2344,2345],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2348,183],{"id":183},[123,2350,2351,2361],{},[49,2352,2353,2354,1156,2357,2360],{},"创建 ",[34,2355,2356],{},"course_name",[34,2358,2359],{},"lesson_count"," 两个变量并输出。",[49,2362,2363],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2365,201],{},[14,2367,204],{"id":204},[10,2369,2370],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2372,211],{},{"title":70,"searchDepth":83,"depth":83,"links":2374},[2375,2376,2377,2378,2379,2380,2381,2382],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2211,"description":2216},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[130,2390,2391],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2394,"title":2395,"body":2396,"category":130,"cover":224,"description":2400,"extension":225,"meta":2566,"navigation":227,"path":2567,"pinned":229,"publishedAt":230,"seo":2568,"slug":2569,"stem":2570,"summary":2571,"tags":2572,"updatedAt":230,"visible":227,"__hash__":2575},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2397,"toc":2556},[2398,2401,2403,2406,2408,2414,2417,2419,2448,2450,2452,2498,2500,2506,2508,2510,2524,2526,2537,2539,2547,2549,2551,2554],[10,2399,2400],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2402,16],{"id":16},[10,2404,2405],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2407,22],{"id":22},[10,2409,2410],{},[26,2411],{"alt":2412,"src":2413},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2415,2416],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2418,44],{"id":44},[46,2420,2421,2431,2445],{},[49,2422,2423,2426,2427,2430],{},[34,2424,2425],{},"int"," 表示整数，",[34,2428,2429],{},"float"," 表示浮点数。",[49,2432,2433,2436,2437,2440,2441,2444],{},[34,2434,2435],{},"\u002F"," 总是进行真除法；",[34,2438,2439],{},"\u002F\u002F"," 是向下取整除法，",[34,2442,2443],{},"%"," 得到余数。",[49,2446,2447],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2449,60],{"id":60},[10,2451,63],{},[65,2453,2455],{"className":67,"code":2454,"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,2456,2457,2462,2467,2472,2476,2481,2486,2492],{"__ignoreMap":70},[74,2458,2459],{"class":76,"line":77},[74,2460,2461],{},"price = 25\n",[74,2463,2464],{"class":76,"line":83},[74,2465,2466],{},"count = 4\n",[74,2468,2469],{"class":76,"line":89},[74,2470,2471],{},"discount = 0.9\n",[74,2473,2474],{"class":76,"line":95},[74,2475,1095],{"emptyLinePlaceholder":227},[74,2477,2478],{"class":76,"line":101},[74,2479,2480],{},"total = price * count * discount\n",[74,2482,2483],{"class":76,"line":1147},[74,2484,2485],{},"average = total \u002F count\n",[74,2487,2489],{"class":76,"line":2488},7,[74,2490,2491],{},"print(total)\n",[74,2493,2495],{"class":76,"line":2494},8,[74,2496,2497],{},"print(average)\n",[10,2499,107],{},[65,2501,2504],{"className":2502,"code":2503,"language":113,"meta":70},[111],"90.0\n22.5\n",[34,2505,2503],{"__ignoreMap":70},[10,2507,118],{},[14,2509,121],{"id":121},[123,2511,2512,2518],{},[49,2513,2514,2517],{},[34,2515,2516],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[49,2519,2520,2523],{},[34,2521,2522],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2525,172],{"id":172},[46,2527,2528,2534],{},[49,2529,2530,2531,41],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2532,2533],{},"decimal.Decimal",[49,2535,2536],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2538,183],{"id":183},[123,2540,2541,2544],{},[49,2542,2543],{},"计算 137 除以 10 的商和余数。",[49,2545,2546],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2548,201],{},[14,2550,204],{"id":204},[10,2552,2553],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2555,211],{},{"title":70,"searchDepth":83,"depth":83,"links":2557},[2558,2559,2560,2561,2562,2563,2564,2565],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2395,"description":2400},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[130,2573,2574],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":4,"title":5,"body":2577,"category":130,"cover":224,"description":12,"extension":225,"meta":2714,"navigation":227,"path":228,"pinned":229,"publishedAt":230,"seo":2715,"slug":232,"stem":233,"summary":234,"tags":2716,"updatedAt":230,"visible":227,"__hash__":238},{"type":7,"value":2578,"toc":2702},[2579,2581,2583,2585,2587,2591,2597,2599,2607,2609,2611,2635,2637,2642,2644,2646,2664,2666,2668,2672,2674,2676,2682,2684,2694,2696,2698,2700],[10,2580,12],{},[14,2582,16],{"id":16},[10,2584,19],{},[14,2586,22],{"id":22},[10,2588,2589],{},[26,2590],{"alt":28,"src":29},[10,2592,32,2593,37,2595,41],{},[34,2594,36],{},[34,2596,40],{},[14,2598,44],{"id":44},[46,2600,2601,2603,2605],{},[49,2602,51],{},[49,2604,54],{},[49,2606,57],{},[14,2608,60],{"id":60},[10,2610,63],{},[65,2612,2613],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,2614,2615,2619,2623,2627,2631],{"__ignoreMap":70},[74,2616,2617],{"class":76,"line":77},[74,2618,80],{},[74,2620,2621],{"class":76,"line":83},[74,2622,86],{},[74,2624,2625],{"class":76,"line":89},[74,2626,92],{},[74,2628,2629],{"class":76,"line":95},[74,2630,98],{},[74,2632,2633],{"class":76,"line":101},[74,2634,104],{},[10,2636,107],{},[65,2638,2640],{"className":2639,"code":112,"language":113,"meta":70},[111],[34,2641,112],{"__ignoreMap":70},[10,2643,118],{},[14,2645,121],{"id":121},[123,2647,2648,2656],{},[49,2649,127,2650,131,2652,135,2654,139],{},[34,2651,130],{},[34,2653,134],{},[34,2655,138],{},[49,2657,2658,145,2660,149,2662,153],{},[34,2659,144],{},[34,2661,148],{},[34,2663,152],{},[155,2665,157],{"id":157},[10,2667,160],{},[10,2669,2670],{},[26,2671],{"alt":165,"src":166},[10,2673,169],{},[14,2675,172],{"id":172},[46,2677,2678,2680],{},[49,2679,177],{},[49,2681,180],{},[14,2683,183],{"id":183},[123,2685,2686,2692],{},[49,2687,188,2688,192,2690,41],{},[34,2689,191],{},[34,2691,195],{},[49,2693,198],{},[10,2695,201],{},[14,2697,204],{"id":204},[10,2699,207],{},[209,2701,211],{},{"title":70,"searchDepth":83,"depth":83,"links":2703},[2704,2705,2706,2707,2708,2711,2712,2713],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":2709},[2710],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5,"description":12},[130,236,237],{"id":2718,"title":2719,"body":2720,"category":130,"cover":224,"description":2724,"extension":225,"meta":2938,"navigation":227,"path":2939,"pinned":229,"publishedAt":230,"seo":2940,"slug":2941,"stem":2942,"summary":2943,"tags":2944,"updatedAt":230,"visible":227,"__hash__":2947},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2721,"toc":2926},[2722,2725,2727,2730,2732,2738,2748,2750,2783,2785,2787,2831,2833,2839,2841,2843,2864,2866,2869,2875,2883,2885,2899,2901,2917,2919,2921,2924],[10,2723,2724],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2726,16],{"id":16},[10,2728,2729],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2731,22],{"id":22},[10,2733,2734],{},[26,2735],{"alt":2736,"src":2737},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2739,2740,2741,1006,2744,2747],{},"比较表达式先产生 ",[34,2742,2743],{},"True",[34,2745,2746],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2749,44],{"id":44},[46,2751,2752,2766,2780],{},[49,2753,2754,2757,2758,2761,2762,2765],{},[34,2755,2756],{},"=="," 判断是否相等，",[34,2759,2760],{},"!="," 判断是否不等；单个 ",[34,2763,2764],{},"="," 是赋值。",[49,2767,2768,2771,2772,2775,2776,2779],{},[34,2769,2770],{},"and"," 要求两侧都为真，",[34,2773,2774],{},"or"," 只需一侧为真，",[34,2777,2778],{},"not"," 取反。",[49,2781,2782],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2784,60],{"id":60},[10,2786,63],{},[65,2788,2790],{"className":67,"code":2789,"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,2791,2792,2797,2802,2806,2811,2816,2821,2826],{"__ignoreMap":70},[74,2793,2794],{"class":76,"line":77},[74,2795,2796],{},"age = 20\n",[74,2798,2799],{"class":76,"line":83},[74,2800,2801],{},"has_ticket = True\n",[74,2803,2804],{"class":76,"line":89},[74,2805,1095],{"emptyLinePlaceholder":227},[74,2807,2808],{"class":76,"line":95},[74,2809,2810],{},"is_adult = age >= 18\n",[74,2812,2813],{"class":76,"line":101},[74,2814,2815],{},"can_enter = is_adult and has_ticket\n",[74,2817,2818],{"class":76,"line":1147},[74,2819,2820],{},"print(is_adult)\n",[74,2822,2823],{"class":76,"line":2488},[74,2824,2825],{},"print(can_enter)\n",[74,2827,2828],{"class":76,"line":2494},[74,2829,2830],{},"print(not has_ticket)\n",[10,2832,107],{},[65,2834,2837],{"className":2835,"code":2836,"language":113,"meta":70},[111],"True\nTrue\nFalse\n",[34,2838,2836],{"__ignoreMap":70},[10,2840,118],{},[14,2842,121],{"id":121},[123,2844,2845,2855],{},[49,2846,2847,2850,2851,2854],{},[34,2848,2849],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2852,2853],{},"is_adult","，这一步没有任何分支跳转。",[49,2856,2857,2860,2861,2863],{},[34,2858,2859],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2862,2778],{}," 只对紧随其后的值取反。",[155,2865,157],{"id":157},[10,2867,2868],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2870,2871],{},[26,2872],{"alt":2873,"src":2874},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2876,2877,2879,2880,2882],{},[34,2878,2770],{}," 只有“真、真”得到真；",[34,2881,2774],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2884,172],{"id":172},[46,2886,2887,2896],{},[49,2888,2889,2890,2892,2893,2895],{},"用单个等号判断相等。",[34,2891,2764],{}," 是赋值，",[34,2894,2756],{}," 才是相等比较。",[49,2897,2898],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2900,183],{"id":183},[123,2902,2903,2910],{},[49,2904,2905,2906,2909],{},"判断数字 ",[34,2907,2908],{},"15"," 是否同时大于 10 且小于 20。",[49,2911,2912,2913,2916],{},"分别修改年龄和票据状态，记录 ",[34,2914,2915],{},"can_enter"," 的四种组合结果。",[10,2918,201],{},[14,2920,204],{"id":204},[10,2922,2923],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2925,211],{},{"title":70,"searchDepth":83,"depth":83,"links":2927},[2928,2929,2930,2931,2932,2935,2936,2937],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":2933},[2934],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2719,"description":2724},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[130,2945,2946],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2949,"title":2950,"body":2951,"category":130,"cover":224,"description":2955,"extension":225,"meta":3123,"navigation":227,"path":3124,"pinned":229,"publishedAt":230,"seo":3125,"slug":3126,"stem":3127,"summary":3128,"tags":3129,"updatedAt":230,"visible":227,"__hash__":3131},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2952,"toc":3113},[2953,2956,2958,2961,2963,2969,2987,2989,3002,3004,3006,3040,3042,3048,3050,3052,3074,3076,3088,3090,3104,3106,3108,3111],[10,2954,2955],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2957,16],{"id":16},[10,2959,2960],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2962,22],{"id":22},[10,2964,2965],{},[26,2966],{"alt":2967,"src":2968},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2970,2971,2974,2975,2978,2979,2982,2983,2986],{},[34,2972,2973],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,2976,2977],{},"18","，程序首先得到的也是 ",[34,2980,2981],{},"\"18\"","，需要 ",[34,2984,2985],{},"int()"," 后才能按整数参与计算。",[14,2988,44],{"id":44},[46,2990,2991,2994,2999],{},[49,2992,2993],{},"提示文字应告诉用户需要输入什么。",[49,2995,2996,2998],{},[34,2997,2985],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[49,3000,3001],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3003,60],{"id":60},[10,3005,63],{},[65,3007,3009],{"className":67,"code":3008,"language":69,"meta":70,"style":70},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,3010,3011,3016,3021,3026,3030,3035],{"__ignoreMap":70},[74,3012,3013],{"class":76,"line":77},[74,3014,3015],{},"name = input(\"请输入姓名：\")\n",[74,3017,3018],{"class":76,"line":83},[74,3019,3020],{},"age_text = input(\"请输入年龄：\")\n",[74,3022,3023],{"class":76,"line":89},[74,3024,3025],{},"age = int(age_text)\n",[74,3027,3028],{"class":76,"line":95},[74,3029,1095],{"emptyLinePlaceholder":227},[74,3031,3032],{"class":76,"line":101},[74,3033,3034],{},"print(\"你好，\" + name)\n",[74,3036,3037],{"class":76,"line":1147},[74,3038,3039],{},"print(age + 1)\n",[10,3041,107],{},[65,3043,3046],{"className":3044,"code":3045,"language":113,"meta":70},[111],"根据输入显示姓名，并输出下一年的年龄\n",[34,3047,3045],{"__ignoreMap":70},[10,3049,118],{},[14,3051,121],{"id":121},[123,3053,3054,3064],{},[49,3055,3056,3057,3059,3060,3063],{},"两次 ",[34,3058,2973],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3061,3062],{},"age_text"," 用来提醒这仍是文本。",[49,3065,3066,3069,3070,3073],{},[34,3067,3068],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3071,3072],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3075,172],{"id":172},[46,3077,3078,3085],{},[49,3079,3080,3081,3084],{},"直接计算 ",[34,3082,3083],{},"input(...) + 1","，忽略输入结果是字符串。",[49,3086,3087],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3089,183],{"id":183},[123,3091,3092,3095],{},[49,3093,3094],{},"接收两个整数并输出它们的和。",[49,3096,1719,3097,3100,3101,3103],{},[34,3098,3099],{},"18.5"," 给 ",[34,3102,2985],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3105,201],{},[14,3107,204],{"id":204},[10,3109,3110],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3112,211],{},{"title":70,"searchDepth":83,"depth":83,"links":3114},[3115,3116,3117,3118,3119,3120,3121,3122],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2950,"description":2955},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[130,2345,3130],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3133,"title":3134,"body":3135,"category":130,"cover":224,"description":3139,"extension":225,"meta":3299,"navigation":227,"path":3300,"pinned":229,"publishedAt":230,"seo":3301,"slug":3302,"stem":3303,"summary":3304,"tags":3305,"updatedAt":230,"visible":227,"__hash__":3308},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3136,"toc":3289},[3137,3140,3142,3145,3147,3153,3160,3162,3176,3178,3180,3219,3221,3227,3229,3231,3250,3252,3267,3269,3280,3282,3284,3287],[10,3138,3139],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3141,16],{"id":16},[10,3143,3144],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3146,22],{"id":22},[10,3148,3149],{},[26,3150],{"alt":3151,"src":3152},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3154,3155,3156,3159],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3157,3158],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3161,44],{"id":44},[46,3163,3164,3167,3170],{},[49,3165,3166],{},"列表使用方括号，元素之间用逗号分隔。",[49,3168,3169],{},"列表可变，可以替换、追加和删除元素。",[49,3171,3172,3173,41],{},"访问不存在的索引会产生 ",[34,3174,3175],{},"IndexError",[14,3177,60],{"id":60},[10,3179,63],{},[65,3181,3183],{"className":67,"code":3182,"language":69,"meta":70,"style":70},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3184,3185,3190,3195,3199,3204,3209,3214],{"__ignoreMap":70},[74,3186,3187],{"class":76,"line":77},[74,3188,3189],{},"scores = [82, 90, 76]\n",[74,3191,3192],{"class":76,"line":83},[74,3193,3194],{},"print(scores[0])\n",[74,3196,3197],{"class":76,"line":89},[74,3198,1095],{"emptyLinePlaceholder":227},[74,3200,3201],{"class":76,"line":95},[74,3202,3203],{},"scores[1] = 95\n",[74,3205,3206],{"class":76,"line":101},[74,3207,3208],{},"scores.append(88)\n",[74,3210,3211],{"class":76,"line":1147},[74,3212,3213],{},"print(scores)\n",[74,3215,3216],{"class":76,"line":2488},[74,3217,3218],{},"print(len(scores))\n",[10,3220,107],{},[65,3222,3225],{"className":3223,"code":3224,"language":113,"meta":70},[111],"82\n[82, 95, 76, 88]\n4\n",[34,3226,3224],{"__ignoreMap":70},[10,3228,118],{},[14,3230,121],{"id":121},[123,3232,3233,3236],{},[49,3234,3235],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[49,3237,3238,3241,3242,3245,3246,3249],{},[34,3239,3240],{},"scores[1] = 95"," 替换第二个位置，",[34,3243,3244],{},"append(88)"," 在末尾增加新位置，",[34,3247,3248],{},"len()"," 因而从 3 变为 4。",[14,3251,172],{"id":172},[46,3253,3254,3264],{},[49,3255,3256,3257,3260,3261,41],{},"访问 ",[34,3258,3259],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3262,3263],{},"len(scores) - 1",[49,3265,3266],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3268,183],{"id":183},[123,3270,3271,3274],{},[49,3272,3273],{},"建立三项学习任务列表，再追加第四项。",[49,3275,3276,3277,3279],{},"修改第二项，并用 ",[34,3278,3248],{}," 检查元素数量。",[10,3281,201],{},[14,3283,204],{"id":204},[10,3285,3286],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3288,211],{},{"title":70,"searchDepth":83,"depth":83,"links":3290},[3291,3292,3293,3294,3295,3296,3297,3298],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3134,"description":3139},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[130,3306,3307],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3310,"title":3311,"body":3312,"category":130,"cover":224,"description":3316,"extension":225,"meta":3457,"navigation":227,"path":3458,"pinned":229,"publishedAt":230,"seo":3459,"slug":3460,"stem":3461,"summary":3462,"tags":3463,"updatedAt":230,"visible":227,"__hash__":3465},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3313,"toc":3447},[3314,3317,3319,3322,3324,3330,3333,3335,3346,3348,3350,3384,3386,3392,3394,3396,3410,3412,3424,3426,3438,3440,3442,3445],[10,3315,3316],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3318,16],{"id":16},[10,3320,3321],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3323,22],{"id":22},[10,3325,3326],{},[26,3327],{"alt":3328,"src":3329},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3331,3332],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3334,44],{"id":44},[46,3336,3337,3340,3343],{},[49,3338,3339],{},"元组常用来表达固定数量、固定含义的一组值。",[49,3341,3342],{},"只有一个元素的元组必须保留尾随逗号。",[49,3344,3345],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3347,60],{"id":60},[10,3349,63],{},[65,3351,3353],{"className":67,"code":3352,"language":69,"meta":70,"style":70},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3354,3355,3360,3365,3370,3374,3379],{"__ignoreMap":70},[74,3356,3357],{"class":76,"line":77},[74,3358,3359],{},"point = (120, 80)\n",[74,3361,3362],{"class":76,"line":83},[74,3363,3364],{},"print(point[0])\n",[74,3366,3367],{"class":76,"line":89},[74,3368,3369],{},"print(point[1])\n",[74,3371,3372],{"class":76,"line":95},[74,3373,1095],{"emptyLinePlaceholder":227},[74,3375,3376],{"class":76,"line":101},[74,3377,3378],{},"single = (5,)\n",[74,3380,3381],{"class":76,"line":1147},[74,3382,3383],{},"print(single)\n",[10,3385,107],{},[65,3387,3390],{"className":3388,"code":3389,"language":113,"meta":70},[111],"120\n80\n(5,)\n",[34,3391,3389],{"__ignoreMap":70},[10,3393,118],{},[14,3395,121],{"id":121},[123,3397,3398,3404],{},[49,3399,3400,3403],{},[34,3401,3402],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[49,3405,3406,3409],{},[34,3407,3408],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3411,172],{"id":172},[46,3413,3414,3421],{},[49,3415,3416,3417,3420],{},"把 ",[34,3418,3419],{},"(5)"," 当作元组，实际它仍是整数。",[49,3422,3423],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3425,183],{"id":183},[123,3427,3428,3431],{},[49,3429,3430],{},"用元组表示宽度和高度。",[49,3432,2172,3433,2175,3435,3437],{},[34,3434,3419],{},[34,3436,3408],{}," 的类型。",[10,3439,201],{},[14,3441,204],{"id":204},[10,3443,3444],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3446,211],{},{"title":70,"searchDepth":83,"depth":83,"links":3448},[3449,3450,3451,3452,3453,3454,3455,3456],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3311,"description":3316},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[130,3464,3307],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3467,"title":3468,"body":3469,"category":130,"cover":224,"description":3473,"extension":225,"meta":3628,"navigation":227,"path":3629,"pinned":229,"publishedAt":230,"seo":3630,"slug":3631,"stem":3632,"summary":3633,"tags":3634,"updatedAt":230,"visible":227,"__hash__":3636},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3470,"toc":3618},[3471,3474,3476,3479,3481,3487,3497,3499,3513,3515,3517,3551,3553,3559,3561,3563,3578,3580,3599,3601,3609,3611,3613,3616],[10,3472,3473],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3475,16],{"id":16},[10,3477,3478],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3480,22],{"id":22},[10,3482,3483],{},[26,3484],{"alt":3485,"src":3486},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3488,3489,3490,3493,3494,3496],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3491,3492],{},"student[\"score\"]"," 读取的是键 ",[34,3495,2245],{}," 对应的值，而不是“第几个元素”。",[14,3498,44],{"id":44},[46,3500,3501,3504,3510],{},[49,3502,3503],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[49,3505,2338,3506,3509],{},[34,3507,3508],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[49,3511,3512],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3514,60],{"id":60},[10,3516,63],{},[65,3518,3520],{"className":67,"code":3519,"language":69,"meta":70,"style":70},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3521,3522,3527,3532,3536,3541,3546],{"__ignoreMap":70},[74,3523,3524],{"class":76,"line":77},[74,3525,3526],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[74,3528,3529],{"class":76,"line":83},[74,3530,3531],{},"print(student[\"name\"])\n",[74,3533,3534],{"class":76,"line":89},[74,3535,1095],{"emptyLinePlaceholder":227},[74,3537,3538],{"class":76,"line":95},[74,3539,3540],{},"student[\"score\"] = 95\n",[74,3542,3543],{"class":76,"line":101},[74,3544,3545],{},"student[\"city\"] = \"郑州\"\n",[74,3547,3548],{"class":76,"line":1147},[74,3549,3550],{},"print(student)\n",[10,3552,107],{},[65,3554,3557],{"className":3555,"code":3556,"language":113,"meta":70},[111],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3558,3556],{"__ignoreMap":70},[10,3560,118],{},[14,3562,121],{"id":121},[123,3564,3565,3568],{},[49,3566,3567],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[49,3569,3570,3571,3573,3574,3577],{},"给已有键 ",[34,3572,2245],{}," 赋值会更新映射，给新键 ",[34,3575,3576],{},"city"," 赋值会增加映射。",[14,3579,172],{"id":172},[46,3581,3582,3589],{},[49,3583,3584,3585,3588],{},"按位置理解字典并尝试 ",[34,3586,3587],{},"student[0]","，而实际键是字符串。",[49,3590,3591,3592,3595,3596,41],{},"直接读取不确定存在的键并忽略 ",[34,3593,3594],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3597,3598],{},"get()",[14,3600,183],{"id":183},[123,3602,3603,3606],{},[49,3604,3605],{},"建立一本书的标题、作者和页数字典。",[49,3607,3608],{},"添加分类键，再修改页数。",[10,3610,201],{},[14,3612,204],{"id":204},[10,3614,3615],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3617,211],{},{"title":70,"searchDepth":83,"depth":83,"links":3619},[3620,3621,3622,3623,3624,3625,3626,3627],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3468,"description":3473},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[130,3635,3307],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3638,"title":3639,"body":3640,"category":130,"cover":224,"description":3644,"extension":225,"meta":3793,"navigation":227,"path":3794,"pinned":229,"publishedAt":230,"seo":3795,"slug":3796,"stem":3797,"summary":3798,"tags":3799,"updatedAt":230,"visible":227,"__hash__":3801},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3641,"toc":3783},[3642,3645,3647,3650,3652,3658,3661,3663,3682,3684,3686,3720,3722,3728,3730,3732,3747,3749,3761,3763,3774,3776,3778,3781],[10,3643,3644],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3646,16],{"id":16},[10,3648,3649],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3651,22],{"id":22},[10,3653,3654],{},[26,3655],{"alt":3656,"src":3657},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3659,3660],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3662,44],{"id":44},[46,3664,3665,3668,3671],{},[49,3666,3667],{},"集合中的元素不重复。",[49,3669,3670],{},"集合是无序容器，不要依赖打印顺序或索引。",[49,3672,3673,3674,3677,3678,3681],{},"创建空集合必须写 ",[34,3675,3676],{},"set()","；",[34,3679,3680],{},"{}"," 创建的是空字典。",[14,3683,60],{"id":60},[10,3685,63],{},[65,3687,3689],{"className":67,"code":3688,"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,3690,3691,3696,3701,3705,3710,3715],{"__ignoreMap":70},[74,3692,3693],{"class":76,"line":77},[74,3694,3695],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[74,3697,3698],{"class":76,"line":83},[74,3699,3700],{},"right = {\"Python\", \"Docker\"}\n",[74,3702,3703],{"class":76,"line":89},[74,3704,1095],{"emptyLinePlaceholder":227},[74,3706,3707],{"class":76,"line":95},[74,3708,3709],{},"print(left & right)\n",[74,3711,3712],{"class":76,"line":101},[74,3713,3714],{},"print(left | right)\n",[74,3716,3717],{"class":76,"line":1147},[74,3718,3719],{},"print(\"Git\" in left)\n",[10,3721,107],{},[65,3723,3726],{"className":3724,"code":3725,"language":113,"meta":70},[111],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3727,3725],{"__ignoreMap":70},[10,3729,118],{},[14,3731,121],{"id":121},[123,3733,3734,3737],{},[49,3735,3736],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[49,3738,3739,3742,3743,3746],{},[34,3740,3741],{},"&"," 计算交集，",[34,3744,3745],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3748,172],{"id":172},[46,3750,3751,3758],{},[49,3752,2338,3753,3755,3756,41],{},[34,3754,3680],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3757,3676],{},[49,3759,3760],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3762,183],{"id":183},[123,3764,3765,3771],{},[49,3766,3767,3768,3770],{},"把包含重复标签的列表交给 ",[34,3769,3676],{}," 去重。",[49,3772,3773],{},"计算两组课程标签的交集和差集。",[10,3775,201],{},[14,3777,204],{"id":204},[10,3779,3780],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3782,211],{},{"title":70,"searchDepth":83,"depth":83,"links":3784},[3785,3786,3787,3788,3789,3790,3791,3792],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3639,"description":3644},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[130,3800,3307],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3803,"title":3804,"body":3805,"category":130,"cover":224,"description":3809,"extension":225,"meta":4007,"navigation":227,"path":4008,"pinned":229,"publishedAt":230,"seo":4009,"slug":4010,"stem":4011,"summary":4012,"tags":4013,"updatedAt":230,"visible":227,"__hash__":4016},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3806,"toc":3995},[3807,3810,3812,3815,3817,3823,3833,3835,3852,3854,3856,3906,3908,3914,3916,3918,3940,3942,3945,3951,3954,3956,3969,3971,3986,3988,3990,3993],[10,3808,3809],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3811,16],{"id":16},[10,3813,3814],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3816,22],{"id":22},[10,3818,3819],{},[26,3820],{"alt":3821,"src":3822},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3824,3825,3828,3829,3832],{},[34,3826,3827],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3830,3831],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3834,44],{"id":44},[46,3836,3837,3846,3849],{},[49,3838,3839,3841,3842,3845],{},[34,3840,2756],{}," 比较内容是否相等，",[34,3843,3844],{},"is"," 比较是否为同一个对象。",[49,3847,3848],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[49,3850,3851],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3853,60],{"id":60},[10,3855,63],{},[65,3857,3859],{"className":67,"code":3858,"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,3860,3861,3866,3871,3876,3880,3885,3890,3895,3900],{"__ignoreMap":70},[74,3862,3863],{"class":76,"line":77},[74,3864,3865],{},"tasks = [\"变量\", \"字符串\"]\n",[74,3867,3868],{"class":76,"line":83},[74,3869,3870],{},"shared = tasks\n",[74,3872,3873],{"class":76,"line":89},[74,3874,3875],{},"backup = tasks.copy()\n",[74,3877,3878],{"class":76,"line":95},[74,3879,1095],{"emptyLinePlaceholder":227},[74,3881,3882],{"class":76,"line":101},[74,3883,3884],{},"tasks.append(\"列表\")\n",[74,3886,3887],{"class":76,"line":1147},[74,3888,3889],{},"print(shared)\n",[74,3891,3892],{"class":76,"line":2488},[74,3893,3894],{},"print(backup)\n",[74,3896,3897],{"class":76,"line":2494},[74,3898,3899],{},"print(tasks is shared)\n",[74,3901,3903],{"class":76,"line":3902},9,[74,3904,3905],{},"print(tasks is backup)\n",[10,3907,107],{},[65,3909,3912],{"className":3910,"code":3911,"language":113,"meta":70},[111],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3913,3911],{"__ignoreMap":70},[10,3915,118],{},[14,3917,121],{"id":121},[123,3919,3920,3926],{},[49,3921,3922,3925],{},[34,3923,3924],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[49,3927,3928,3931,3932,3935,3936,3939],{},[34,3929,3930],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3933,3934],{},"shared"," 能观察到变化，",[34,3937,3938],{},"backup"," 不会。",[155,3941,157],{"id":157},[10,3943,3944],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3946,3947],{},[26,3948],{"alt":3949,"src":3950},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3952,3953],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3955,172],{"id":172},[46,3957,3958,3966],{},[49,3959,3960,3961,3963,3964,41],{},"用 ",[34,3962,2756],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,3965,3844],{},[49,3967,3968],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3970,183],{"id":183},[123,3972,3973,3976],{},[49,3974,3975],{},"让两个变量引用同一个字典并修改其中一个。",[49,3977,2338,3978,3981,3982,1156,3984,41],{},[34,3979,3980],{},"copy()"," 创建外层副本，再比较 ",[34,3983,3844],{},[34,3985,2756],{},[10,3987,201],{},[14,3989,204],{"id":204},[10,3991,3992],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3994,211],{},{"title":70,"searchDepth":83,"depth":83,"links":3996},[3997,3998,3999,4000,4001,4004,4005,4006],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":4002},[4003],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3804,"description":3809},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[130,4014,4015],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4018,"title":4019,"body":4020,"category":130,"cover":224,"description":4024,"extension":225,"meta":4237,"navigation":227,"path":4238,"pinned":229,"publishedAt":230,"seo":4239,"slug":4240,"stem":4241,"summary":4242,"tags":4243,"updatedAt":230,"visible":227,"__hash__":4245},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4021,"toc":4224},[4022,4025,4027,4030,4032,4038,4048,4050,4061,4063,4065,4118,4120,4126,4128,4130,4148,4150,4153,4159,4167,4170,4173,4179,4185,4187,4205,4207,4215,4217,4219,4222],[10,4023,4024],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4026,16],{"id":16},[10,4028,4029],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4031,22],{"id":22},[10,4033,4034],{},[26,4035],{"alt":4036,"src":4037},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4039,4040,2256,4042,2256,4045,4047],{},[34,4041,1155],{},[34,4043,4044],{},"elif",[34,4046,1159],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4049,44],{"id":44},[46,4051,4052,4055,4058],{},[49,4053,4054],{},"冒号表示接下来开始一个代码块。",[49,4056,4057],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[49,4059,4060],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4062,60],{"id":60},[10,4064,63],{},[65,4066,4068],{"className":67,"code":4067,"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,4069,4070,4075,4079,4084,4089,4094,4099,4103,4108,4112],{"__ignoreMap":70},[74,4071,4072],{"class":76,"line":77},[74,4073,4074],{},"score = int(input(\"请输入分数：\"))\n",[74,4076,4077],{"class":76,"line":83},[74,4078,1095],{"emptyLinePlaceholder":227},[74,4080,4081],{"class":76,"line":89},[74,4082,4083],{},"if score >= 90:\n",[74,4085,4086],{"class":76,"line":95},[74,4087,4088],{},"    level = \"优秀\"\n",[74,4090,4091],{"class":76,"line":101},[74,4092,4093],{},"elif score >= 60:\n",[74,4095,4096],{"class":76,"line":1147},[74,4097,4098],{},"    level = \"合格\"\n",[74,4100,4101],{"class":76,"line":2488},[74,4102,1144],{},[74,4104,4105],{"class":76,"line":2494},[74,4106,4107],{},"    level = \"需要继续学习\"\n",[74,4109,4110],{"class":76,"line":3902},[74,4111,1095],{"emptyLinePlaceholder":227},[74,4113,4115],{"class":76,"line":4114},10,[74,4116,4117],{},"print(level)\n",[10,4119,107],{},[65,4121,4124],{"className":4122,"code":4123,"language":113,"meta":70},[111],"输入 85 时输出：合格\n",[34,4125,4123],{"__ignoreMap":70},[10,4127,118],{},[14,4129,121],{"id":121},[123,4131,4132,4139],{},[49,4133,4134,4135,4138],{},"输入先转换为整数，程序从 ",[34,4136,4137],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[49,4140,4141,4144,4145,4147],{},[34,4142,4143],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4146,1159],{}," 被跳过；最终三个分支只会选择一个。",[155,4149,157],{"id":157},[10,4151,4152],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4154,4155],{},[26,4156],{"alt":4157,"src":4158},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4160,4161,4163,4164,4166],{},[34,4162,4137],{}," 必须放在 ",[34,4165,4143],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[155,4168,157],{"id":4169},"再看一个具体细节-1",[10,4171,4172],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4174,4175],{},[26,4176],{"alt":4177,"src":4178},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4180,4181,4182,4184],{},"同一缩进层级属于同一个代码块；回到 ",[34,4183,1155],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4186,172],{"id":172},[46,4188,4189,4195],{},[49,4190,4191,4192,4194],{},"先写 ",[34,4193,4143],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[49,4196,4197,4198,4200,4201,4204],{},"混用多个独立 ",[34,4199,1155],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4202,4203],{},"if\u002Felif\u002Felse"," 链。",[14,4206,183],{"id":183},[123,4208,4209,4212],{},[49,4210,4211],{},"根据温度输出“冷、适中、热”三个等级。",[49,4213,4214],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4216,201],{},[14,4218,204],{"id":204},[10,4220,4221],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4223,211],{},{"title":70,"searchDepth":83,"depth":83,"links":4225},[4226,4227,4228,4229,4230,4234,4235,4236],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":4231},[4232,4233],{"id":157,"depth":89,"text":157},{"id":4169,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4019,"description":4024},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[130,1155,4244],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4247,"title":4248,"body":4249,"category":130,"cover":224,"description":4253,"extension":225,"meta":4419,"navigation":227,"path":4420,"pinned":229,"publishedAt":230,"seo":4421,"slug":4422,"stem":4423,"summary":4424,"tags":4425,"updatedAt":230,"visible":227,"__hash__":4427},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4250,"toc":4407},[4251,4254,4256,4259,4261,4267,4273,4275,4290,4292,4294,4332,4334,4340,4342,4344,4359,4361,4364,4370,4376,4378,4386,4388,4398,4400,4402,4405],[10,4252,4253],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4255,16],{"id":16},[10,4257,4258],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4260,22],{"id":22},[10,4262,4263],{},[26,4264],{"alt":4265,"src":4266},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4268,4269,4272],{},[34,4270,4271],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4274,44],{"id":44},[46,4276,4277,4280,4283],{},[49,4278,4279],{},"进入循环前先准备参与条件判断的状态。",[49,4281,4282],{},"循环体中必须有机会让条件变为假。",[49,4284,4285,4286,4289],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4287,4288],{},"for"," 通常更直接。",[14,4291,60],{"id":60},[10,4293,63],{},[65,4295,4297],{"className":67,"code":4296,"language":69,"meta":70,"style":70},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4298,4299,4304,4308,4313,4318,4323,4327],{"__ignoreMap":70},[74,4300,4301],{"class":76,"line":77},[74,4302,4303],{},"count = 1\n",[74,4305,4306],{"class":76,"line":83},[74,4307,1095],{"emptyLinePlaceholder":227},[74,4309,4310],{"class":76,"line":89},[74,4311,4312],{},"while count \u003C= 3:\n",[74,4314,4315],{"class":76,"line":95},[74,4316,4317],{},"    print(\"第\", count, \"次练习\")\n",[74,4319,4320],{"class":76,"line":101},[74,4321,4322],{},"    count = count + 1\n",[74,4324,4325],{"class":76,"line":1147},[74,4326,1095],{"emptyLinePlaceholder":227},[74,4328,4329],{"class":76,"line":2488},[74,4330,4331],{},"print(\"练习结束\")\n",[10,4333,107],{},[65,4335,4338],{"className":4336,"code":4337,"language":113,"meta":70},[111],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4339,4337],{"__ignoreMap":70},[10,4341,118],{},[14,4343,121],{"id":121},[123,4345,4346,4353],{},[49,4347,4348,4349,4352],{},"进入循环前 ",[34,4350,4351],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[49,4354,4355,4356,4358],{},"循环体末尾把 ",[34,4357,4351],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[155,4360,157],{"id":157},[10,4362,4363],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4365,4366],{},[26,4367],{"alt":4368,"src":4369},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4371,4372,4373,4375],{},"第4次检查时 ",[34,4374,4351],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4377,172],{"id":172},[46,4379,4380,4383],{},[49,4381,4382],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[49,4384,4385],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4387,183],{"id":183},[123,4389,4390,4395],{},[49,4391,2338,4392,4394],{},[34,4393,4271],{}," 输出 1 到 5。",[49,4396,4397],{},"计算 1 到 10 的累加和。",[10,4399,201],{},[14,4401,204],{"id":204},[10,4403,4404],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4406,211],{},{"title":70,"searchDepth":83,"depth":83,"links":4408},[4409,4410,4411,4412,4413,4416,4417,4418],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":4414},[4415],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4248,"description":4253},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[130,4271,4426],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4429,"title":4430,"body":4431,"category":130,"cover":224,"description":4435,"extension":225,"meta":4583,"navigation":227,"path":4584,"pinned":229,"publishedAt":230,"seo":4585,"slug":4586,"stem":4587,"summary":4588,"tags":4589,"updatedAt":230,"visible":227,"__hash__":4591},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4432,"toc":4573},[4433,4436,4438,4441,4443,4449,4454,4456,4470,4472,4474,4512,4514,4520,4522,4524,4541,4543,4551,4553,4564,4566,4568,4571],[10,4434,4435],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4437,16],{"id":16},[10,4439,4440],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4442,22],{"id":22},[10,4444,4445],{},[26,4446],{"alt":4447,"src":4448},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4450,4451,4453],{},[34,4452,4288],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4455,44],{"id":44},[46,4457,4458,4464,4467],{},[49,4459,4460,4463],{},[34,4461,4462],{},"range(1, 4)"," 包含 1，不包含 4。",[49,4465,4466],{},"只需要元素时直接遍历元素，不必手工维护索引。",[49,4468,4469],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4471,60],{"id":60},[10,4473,63],{},[65,4475,4477],{"className":67,"code":4476,"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,4478,4479,4484,4488,4493,4498,4502,4507],{"__ignoreMap":70},[74,4480,4481],{"class":76,"line":77},[74,4482,4483],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[74,4485,4486],{"class":76,"line":83},[74,4487,1095],{"emptyLinePlaceholder":227},[74,4489,4490],{"class":76,"line":89},[74,4491,4492],{},"for course in courses:\n",[74,4494,4495],{"class":76,"line":95},[74,4496,4497],{},"    print(course)\n",[74,4499,4500],{"class":76,"line":101},[74,4501,1095],{"emptyLinePlaceholder":227},[74,4503,4504],{"class":76,"line":1147},[74,4505,4506],{},"for number in range(1, 4):\n",[74,4508,4509],{"class":76,"line":2488},[74,4510,4511],{},"    print(number)\n",[10,4513,107],{},[65,4515,4518],{"className":4516,"code":4517,"language":113,"meta":70},[111],"变量\n字符串\n列表\n1\n2\n3\n",[34,4519,4517],{"__ignoreMap":70},[10,4521,118],{},[14,4523,121],{"id":121},[123,4525,4526,4536],{},[49,4527,4528,4529,4531,4532,4535],{},"第一个 ",[34,4530,4288],{}," 依次从列表取得字符串，循环变量 ",[34,4533,4534],{},"course"," 每轮重新绑定。",[49,4537,4538,4540],{},[34,4539,4462],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4542,172],{"id":172},[46,4544,4545,4548],{},[49,4546,4547],{},"只需要元素却手工维护索引，增加越界风险。",[49,4549,4550],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4552,183],{"id":183},[123,4554,4555,4558],{},[49,4556,4557],{},"逐项输出一个字符串中的字符。",[49,4559,2338,4560,4563],{},[34,4561,4562],{},"range()"," 输出 2、4、6、8。",[10,4565,201],{},[14,4567,204],{"id":204},[10,4569,4570],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4572,211],{},{"title":70,"searchDepth":83,"depth":83,"links":4574},[4575,4576,4577,4578,4579,4580,4581,4582],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4430,"description":4435},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[130,4288,4590],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4593,"title":4594,"body":4595,"category":130,"cover":224,"description":4599,"extension":225,"meta":4773,"navigation":227,"path":4774,"pinned":229,"publishedAt":230,"seo":4775,"slug":4776,"stem":4777,"summary":4778,"tags":4779,"updatedAt":230,"visible":227,"__hash__":4780},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4596,"toc":4763},[4597,4600,4602,4605,4607,4613,4623,4625,4644,4646,4648,4700,4702,4708,4710,4712,4726,4728,4744,4746,4754,4756,4758,4761],[10,4598,4599],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4601,16],{"id":16},[10,4603,4604],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4606,22],{"id":22},[10,4608,4609],{},[26,4610],{"alt":4611,"src":4612},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4614,4615,4618,4619,4622],{},[34,4616,4617],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4620,4621],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4624,44],{"id":44},[46,4626,4627,4630,4638],{},[49,4628,4629],{},"先写普通循环，再在确有需要时加入流程控制语句。",[49,4631,4632,4634,4635,4637],{},[34,4633,4617],{}," 前要确认不会跳过 ",[34,4636,4271],{}," 循环中的状态更新。",[49,4639,4640,4641,4643],{},"多层嵌套中 ",[34,4642,4621],{}," 只结束它所在的最内层循环。",[14,4645,60],{"id":60},[10,4647,63],{},[65,4649,4651],{"className":67,"code":4650,"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,4652,4653,4658,4662,4667,4672,4677,4682,4687,4691,4695],{"__ignoreMap":70},[74,4654,4655],{"class":76,"line":77},[74,4656,4657],{},"numbers = [3, -1, 0, 8, 12]\n",[74,4659,4660],{"class":76,"line":83},[74,4661,1095],{"emptyLinePlaceholder":227},[74,4663,4664],{"class":76,"line":89},[74,4665,4666],{},"for number in numbers:\n",[74,4668,4669],{"class":76,"line":95},[74,4670,4671],{},"    if number \u003C 0:\n",[74,4673,4674],{"class":76,"line":101},[74,4675,4676],{},"        continue\n",[74,4678,4679],{"class":76,"line":1147},[74,4680,4681],{},"    if number == 0:\n",[74,4683,4684],{"class":76,"line":2488},[74,4685,4686],{},"        break\n",[74,4688,4689],{"class":76,"line":2494},[74,4690,4511],{},[74,4692,4693],{"class":76,"line":3902},[74,4694,1095],{"emptyLinePlaceholder":227},[74,4696,4697],{"class":76,"line":4114},[74,4698,4699],{},"print(\"循环结束\")\n",[10,4701,107],{},[65,4703,4706],{"className":4704,"code":4705,"language":113,"meta":70},[111],"3\n循环结束\n",[34,4707,4705],{"__ignoreMap":70},[10,4709,118],{},[14,4711,121],{"id":121},[123,4713,4714,4720],{},[49,4715,4716,4717,4719],{},"遇到 -1 时 ",[34,4718,4617],{}," 立即结束本轮，后面的判断和输出都不执行。",[49,4721,4722,4723,4725],{},"遇到 0 时 ",[34,4724,4621],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4727,172],{"id":172},[46,4729,4730,4735],{},[49,4731,3416,4732,4734],{},[34,4733,4617],{}," 当作结束循环，实际它只跳到下一轮。",[49,4736,4737,4738,4740,4741,4743],{},"在 ",[34,4739,4271],{}," 中把状态更新放在可能被 ",[34,4742,4617],{}," 跳过的位置，造成无限循环。",[14,4745,183],{"id":183},[123,4747,4748,4751],{},[49,4749,4750],{},"跳过列表中的空字符串并输出其他内容。",[49,4752,4753],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4755,201],{},[14,4757,204],{"id":204},[10,4759,4760],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4762,211],{},{"title":70,"searchDepth":83,"depth":83,"links":4764},[4765,4766,4767,4768,4769,4770,4771,4772],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4594,"description":4599},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[130,4621,4617],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4782,"title":4783,"body":4784,"category":130,"cover":224,"description":4788,"extension":225,"meta":4959,"navigation":227,"path":4960,"pinned":229,"publishedAt":230,"seo":4961,"slug":4962,"stem":4963,"summary":4964,"tags":4965,"updatedAt":230,"visible":227,"__hash__":4968},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4785,"toc":4947},[4786,4789,4791,4794,4796,4802,4805,4807,4831,4833,4835,4869,4871,4877,4879,4881,4898,4900,4903,4909,4912,4914,4928,4930,4938,4940,4942,4945],[10,4787,4788],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4790,16],{"id":16},[10,4792,4793],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4795,22],{"id":22},[10,4797,4798],{},[26,4799],{"alt":4800,"src":4801},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4803,4804],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4806,44],{"id":44},[46,4808,4809,4812,4815],{},[49,4810,4811],{},"每增加一层嵌套，阅读成本都会上升。",[49,4813,4814],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[49,4816,4817,4818,2256,4821,4824,4825,2256,4828,41],{},"变量名使用 ",[34,4819,4820],{},"row",[34,4822,4823],{},"cell"," 等层级含义，避免全部写成 ",[34,4826,4827],{},"i",[34,4829,4830],{},"j",[14,4832,60],{"id":60},[10,4834,63],{},[65,4836,4838],{"className":67,"code":4837,"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,4839,4840,4845,4849,4854,4859,4864],{"__ignoreMap":70},[74,4841,4842],{"class":76,"line":77},[74,4843,4844],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[74,4846,4847],{"class":76,"line":83},[74,4848,1095],{"emptyLinePlaceholder":227},[74,4850,4851],{"class":76,"line":89},[74,4852,4853],{},"for row in table:\n",[74,4855,4856],{"class":76,"line":95},[74,4857,4858],{},"    for cell in row:\n",[74,4860,4861],{"class":76,"line":101},[74,4862,4863],{},"        print(cell)\n",[74,4865,4866],{"class":76,"line":1147},[74,4867,4868],{},"    print(\"一行结束\")\n",[10,4870,107],{},[65,4872,4875],{"className":4873,"code":4874,"language":113,"meta":70},[111],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4876,4874],{"__ignoreMap":70},[10,4878,118],{},[14,4880,121],{"id":121},[123,4882,4883,4895],{},[49,4884,4885,4886,4888,4889,1156,4892,41],{},"外层变量 ",[34,4887,4820],{}," 先引用第一行列表，内层才依次处理 ",[34,4890,4891],{},"A1",[34,4893,4894],{},"A2",[49,4896,4897],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[155,4899,157],{"id":157},[10,4901,4902],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4904,4905],{},[26,4906],{"alt":4907,"src":4908},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4910,4911],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4913,172],{"id":172},[46,4915,4916,4925],{},[49,4917,4918,4919,1006,4922,4924],{},"把两层循环变量都叫 ",[34,4920,4921],{},"item",[34,4923,4827],{},"，难以确认当前层级。",[49,4926,4927],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4929,183],{"id":183},[123,4931,4932,4935],{},[49,4933,4934],{},"打印一个 2×3 数字表。",[49,4936,4937],{},"在内层增加条件，只输出大于 3 的元素。",[10,4939,201],{},[14,4941,204],{"id":204},[10,4943,4944],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4946,211],{},{"title":70,"searchDepth":83,"depth":83,"links":4948},[4949,4950,4951,4952,4953,4956,4957,4958],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":4954},[4955],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4783,"description":4788},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[130,4966,4967],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4970,"title":4971,"body":4972,"category":130,"cover":224,"description":4976,"extension":225,"meta":5114,"navigation":227,"path":5115,"pinned":229,"publishedAt":230,"seo":5116,"slug":5117,"stem":5118,"summary":5119,"tags":5120,"updatedAt":230,"visible":227,"__hash__":5123},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4973,"toc":5104},[4974,4977,4979,4982,4984,4990,4993,4995,5006,5008,5010,5048,5050,5056,5058,5060,5072,5074,5085,5087,5095,5097,5099,5102],[10,4975,4976],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4978,16],{"id":16},[10,4980,4981],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4983,22],{"id":22},[10,4985,4986],{},[26,4987],{"alt":4988,"src":4989},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4991,4992],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4994,44],{"id":44},[46,4996,4997,5000,5003],{},[49,4998,4999],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[49,5001,5002],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[49,5004,5005],{},"推导式创建新列表，不修改输入列表。",[14,5007,60],{"id":60},[10,5009,63],{},[65,5011,5013],{"className":67,"code":5012,"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,5014,5015,5020,5024,5029,5034,5038,5043],{"__ignoreMap":70},[74,5016,5017],{"class":76,"line":77},[74,5018,5019],{},"numbers = [1, 2, 3, 4, 5]\n",[74,5021,5022],{"class":76,"line":83},[74,5023,1095],{"emptyLinePlaceholder":227},[74,5025,5026],{"class":76,"line":89},[74,5027,5028],{},"squares = [number * number for number in numbers]\n",[74,5030,5031],{"class":76,"line":95},[74,5032,5033],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[74,5035,5036],{"class":76,"line":101},[74,5037,1095],{"emptyLinePlaceholder":227},[74,5039,5040],{"class":76,"line":1147},[74,5041,5042],{},"print(squares)\n",[74,5044,5045],{"class":76,"line":2488},[74,5046,5047],{},"print(even_squares)\n",[10,5049,107],{},[65,5051,5054],{"className":5052,"code":5053,"language":113,"meta":70},[111],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5055,5053],{"__ignoreMap":70},[10,5057,118],{},[14,5059,121],{"id":121},[123,5061,5062,5065],{},[49,5063,5064],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[49,5066,5067,5068,5071],{},"第二条先用 ",[34,5069,5070],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5073,172],{"id":172},[46,5075,5076,5082],{},[49,5077,5078,5079,5081],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5080,4288],{}," 开始找输入。",[49,5083,5084],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5086,183],{"id":183},[123,5088,5089,5092],{},[49,5090,5091],{},"把字符串列表转换为长度列表。",[49,5093,5094],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5096,201],{},[14,5098,204],{"id":204},[10,5100,5101],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5103,211],{},{"title":70,"searchDepth":83,"depth":83,"links":5105},[5106,5107,5108,5109,5110,5111,5112,5113],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4971,"description":4976},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[130,5121,5122],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5125,"title":5126,"body":5127,"category":130,"cover":224,"description":5131,"extension":225,"meta":5274,"navigation":227,"path":5275,"pinned":229,"publishedAt":230,"seo":5276,"slug":5277,"stem":5278,"summary":5279,"tags":5280,"updatedAt":230,"visible":227,"__hash__":5283},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5128,"toc":5264},[5129,5132,5134,5137,5139,5145,5148,5150,5161,5163,5165,5204,5206,5212,5214,5216,5231,5233,5241,5243,5255,5257,5259,5262],[10,5130,5131],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5133,16],{"id":16},[10,5135,5136],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5138,22],{"id":22},[10,5140,5141],{},[26,5142],{"alt":5143,"src":5144},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5146,5147],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5149,44],{"id":44},[46,5151,5152,5155,5158],{},[49,5153,5154],{},"函数名描述动作，使用小写字母和下划线。",[49,5156,5157],{},"函数定义要先执行，之后才能调用。",[49,5159,5160],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5162,60],{"id":60},[10,5164,63],{},[65,5166,5168],{"className":67,"code":5167,"language":69,"meta":70,"style":70},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5169,5170,5175,5180,5185,5189,5194,5199],{"__ignoreMap":70},[74,5171,5172],{"class":76,"line":77},[74,5173,5174],{},"def show_progress():\n",[74,5176,5177],{"class":76,"line":83},[74,5178,5179],{},"    print(\"正在学习函数\")\n",[74,5181,5182],{"class":76,"line":89},[74,5183,5184],{},"    print(\"本节完成 50%\")\n",[74,5186,5187],{"class":76,"line":95},[74,5188,1095],{"emptyLinePlaceholder":227},[74,5190,5191],{"class":76,"line":101},[74,5192,5193],{},"print(\"调用前\")\n",[74,5195,5196],{"class":76,"line":1147},[74,5197,5198],{},"show_progress()\n",[74,5200,5201],{"class":76,"line":2488},[74,5202,5203],{},"print(\"调用后\")\n",[10,5205,107],{},[65,5207,5210],{"className":5208,"code":5209,"language":113,"meta":70},[111],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5211,5209],{"__ignoreMap":70},[10,5213,118],{},[14,5215,121],{"id":121},[123,5217,5218,5224],{},[49,5219,935,5220,5223],{},[34,5221,5222],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[49,5225,5226,5227,5230],{},"运行到 ",[34,5228,5229],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5232,172],{"id":172},[46,5234,5235,5238],{},[49,5236,5237],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[49,5239,5240],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5242,183],{"id":183},[123,5244,5245,5252],{},[49,5246,5247,5248,5251],{},"定义 ",[34,5249,5250],{},"show_plan()"," 输出两行学习计划。",[49,5253,5254],{},"连续调用同一个函数两次，观察执行顺序。",[10,5256,201],{},[14,5258,204],{"id":204},[10,5260,5261],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5263,211],{},{"title":70,"searchDepth":83,"depth":83,"links":5265},[5266,5267,5268,5269,5270,5271,5272,5273],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5126,"description":5131},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[130,5281,5282],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5285,"title":5286,"body":5287,"category":130,"cover":224,"description":5291,"extension":225,"meta":5471,"navigation":227,"path":5472,"pinned":229,"publishedAt":230,"seo":5473,"slug":5474,"stem":5475,"summary":5476,"tags":5477,"updatedAt":230,"visible":227,"__hash__":5480},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5288,"toc":5459},[5289,5292,5294,5297,5299,5305,5312,5314,5331,5333,5335,5369,5371,5377,5379,5381,5402,5404,5407,5413,5423,5425,5440,5442,5450,5452,5454,5457],[10,5290,5291],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5293,16],{"id":16},[10,5295,5296],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5298,22],{"id":22},[10,5300,5301],{},[26,5302],{"alt":5303,"src":5304},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5306,5307,5308,5311],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5309,5310],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5313,44],{"id":44},[46,5315,5316,5319,5322],{},[49,5317,5318],{},"形参出现在函数定义中，实参出现在函数调用中。",[49,5320,5321],{},"局部变量默认只在函数内部可见。",[49,5323,5324,5325,5327,5328,41],{},"没有显式 ",[34,5326,5310],{}," 的函数会返回 ",[34,5329,5330],{},"None",[14,5332,60],{"id":60},[10,5334,63],{},[65,5336,5338],{"className":67,"code":5337,"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,5339,5340,5345,5350,5355,5359,5364],{"__ignoreMap":70},[74,5341,5342],{"class":76,"line":77},[74,5343,5344],{},"def calculate_total(price, count):\n",[74,5346,5347],{"class":76,"line":83},[74,5348,5349],{},"    total = price * count\n",[74,5351,5352],{"class":76,"line":89},[74,5353,5354],{},"    return total\n",[74,5356,5357],{"class":76,"line":95},[74,5358,1095],{"emptyLinePlaceholder":227},[74,5360,5361],{"class":76,"line":101},[74,5362,5363],{},"result = calculate_total(25, 4)\n",[74,5365,5366],{"class":76,"line":1147},[74,5367,5368],{},"print(result)\n",[10,5370,107],{},[65,5372,5375],{"className":5373,"code":5374,"language":113,"meta":70},[111],"100\n",[34,5376,5374],{"__ignoreMap":70},[10,5378,118],{},[14,5380,121],{"id":121},[123,5382,5383,5392],{},[49,5384,5385,5386,2256,5389,5391],{},"调用时 25 和 4 分别绑定到 ",[34,5387,5388],{},"price",[34,5390,4351],{},"，它们只在本次函数调用的局部范围中使用。",[49,5393,5394,5397,5398,5401],{},[34,5395,5396],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5399,5400],{},"result"," 并输出。",[155,5403,157],{"id":157},[10,5405,5406],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5408,5409],{},[26,5410],{"alt":5411,"src":5412},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5414,5415,2256,5417,1156,5419,5422],{},[34,5416,5388],{},[34,5418,4351],{},[34,5420,5421],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5424,172],{"id":172},[46,5426,5427,5434],{},[49,5428,5429,5430,5433],{},"在函数内部只 ",[34,5431,5432],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[49,5435,5436,5437,5439],{},"试图在函数外直接访问局部变量 ",[34,5438,5421],{},"，它的名字只在调用期间的局部作用域存在。",[14,5441,183],{"id":183},[123,5443,5444,5447],{},[49,5445,5446],{},"编写计算长方形面积的函数。",[49,5448,5449],{},"让函数返回结果后在调用方加上单位再输出。",[10,5451,201],{},[14,5453,204],{"id":204},[10,5455,5456],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5458,211],{},{"title":70,"searchDepth":83,"depth":83,"links":5460},[5461,5462,5463,5464,5465,5468,5469,5470],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":5466},[5467],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5286,"description":5291},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[130,5478,5479],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5482,"title":5483,"body":5484,"category":130,"cover":224,"description":5488,"extension":225,"meta":5668,"navigation":227,"path":5669,"pinned":229,"publishedAt":230,"seo":5670,"slug":5671,"stem":5672,"summary":5673,"tags":5674,"updatedAt":230,"visible":227,"__hash__":5677},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5485,"toc":5656},[5486,5489,5491,5494,5496,5502,5505,5507,5524,5526,5528,5580,5582,5588,5590,5592,5610,5612,5615,5621,5624,5626,5637,5639,5647,5649,5651,5654],[10,5487,5488],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5490,16],{"id":16},[10,5492,5493],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5495,22],{"id":22},[10,5497,5498],{},[26,5499],{"alt":5500,"src":5501},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5503,5504],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5506,44],{"id":44},[46,5508,5509,5512,5518],{},[49,5510,5511],{},"必需参数应放在有默认值的参数之前。",[49,5513,5514,5517],{},[34,5515,5516],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[49,5519,5520,5523],{},[34,5521,5522],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5525,60],{"id":60},[10,5527,63],{},[65,5529,5531],{"className":67,"code":5530,"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,5532,5533,5538,5543,5547,5552,5557,5561,5566,5571,5575],{"__ignoreMap":70},[74,5534,5535],{"class":76,"line":77},[74,5536,5537],{},"def build_title(name, level=\"基础\"):\n",[74,5539,5540],{"class":76,"line":83},[74,5541,5542],{},"    return name + \"｜\" + level\n",[74,5544,5545],{"class":76,"line":89},[74,5546,1095],{"emptyLinePlaceholder":227},[74,5548,5549],{"class":76,"line":95},[74,5550,5551],{},"print(build_title(\"Python\"))\n",[74,5553,5554],{"class":76,"line":101},[74,5555,5556],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[74,5558,5559],{"class":76,"line":1147},[74,5560,1095],{"emptyLinePlaceholder":227},[74,5562,5563],{"class":76,"line":2488},[74,5564,5565],{},"def total(*numbers):\n",[74,5567,5568],{"class":76,"line":2494},[74,5569,5570],{},"    return sum(numbers)\n",[74,5572,5573],{"class":76,"line":3902},[74,5574,1095],{"emptyLinePlaceholder":227},[74,5576,5577],{"class":76,"line":4114},[74,5578,5579],{},"print(total(10, 20, 30))\n",[10,5581,107],{},[65,5583,5586],{"className":5584,"code":5585,"language":113,"meta":70},[111],"Python｜基础\n异常处理｜进阶\n60\n",[34,5587,5585],{"__ignoreMap":70},[10,5589,118],{},[14,5591,121],{"id":121},[123,5593,5594,5601],{},[49,5595,5596,5597,5600],{},"第一次调用只提供必需参数，",[34,5598,5599],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[49,5602,5603,5606,5607,41],{},[34,5604,5605],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5608,5609],{},"sum()",[155,5611,157],{"id":157},[10,5613,5614],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5616,5617],{},[26,5618],{"alt":5619,"src":5620},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5622,5623],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5625,172],{"id":172},[46,5627,5628,5634],{},[49,5629,5630,5631,5633],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5632,5330],{}," 再在函数内创建。",[49,5635,5636],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5638,183],{"id":183},[123,5640,5641,5644],{},[49,5642,5643],{},"给问候函数增加默认称呼。",[49,5645,5646],{},"编写接收任意数量分数并返回总分的函数。",[10,5648,201],{},[14,5650,204],{"id":204},[10,5652,5653],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5655,211],{},{"title":70,"searchDepth":83,"depth":83,"links":5657},[5658,5659,5660,5661,5662,5665,5666,5667],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":5663},[5664],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5483,"description":5488},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[130,5675,5676],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5679,"title":5680,"body":5681,"category":130,"cover":224,"description":5685,"extension":225,"meta":5882,"navigation":227,"path":5883,"pinned":229,"publishedAt":230,"seo":5884,"slug":5885,"stem":5886,"summary":5887,"tags":5888,"updatedAt":230,"visible":227,"__hash__":5891},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5682,"toc":5870},[5683,5686,5688,5691,5693,5699,5702,5704,5721,5723,5725,5788,5790,5796,5798,5800,5827,5829,5832,5838,5841,5843,5851,5853,5861,5863,5865,5868],[10,5684,5685],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5687,16],{"id":16},[10,5689,5690],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5692,22],{"id":22},[10,5694,5695],{},[26,5696],{"alt":5697,"src":5698},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5700,5701],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5703,44],{"id":44},[46,5705,5706,5709,5712],{},[49,5707,5708],{},"函数内部赋值默认创建局部变量。",[49,5710,5711],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[49,5713,5714,2175,5717,5720],{},[34,5715,5716],{},"global",[34,5718,5719],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5722,60],{"id":60},[10,5724,63],{},[65,5726,5728],{"className":67,"code":5727,"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,5729,5730,5735,5739,5744,5749,5753,5758,5763,5768,5772,5777,5782],{"__ignoreMap":70},[74,5731,5732],{"class":76,"line":77},[74,5733,5734],{},"course = \"Python\"\n",[74,5736,5737],{"class":76,"line":83},[74,5738,1095],{"emptyLinePlaceholder":227},[74,5740,5741],{"class":76,"line":89},[74,5742,5743],{},"def outer():\n",[74,5745,5746],{"class":76,"line":95},[74,5747,5748],{},"    level = \"基础\"\n",[74,5750,5751],{"class":76,"line":101},[74,5752,1095],{"emptyLinePlaceholder":227},[74,5754,5755],{"class":76,"line":1147},[74,5756,5757],{},"    def show():\n",[74,5759,5760],{"class":76,"line":2488},[74,5761,5762],{},"        lesson = \"作用域\"\n",[74,5764,5765],{"class":76,"line":2494},[74,5766,5767],{},"        print(course, level, lesson)\n",[74,5769,5770],{"class":76,"line":3902},[74,5771,1095],{"emptyLinePlaceholder":227},[74,5773,5774],{"class":76,"line":4114},[74,5775,5776],{},"    show()\n",[74,5778,5780],{"class":76,"line":5779},11,[74,5781,1095],{"emptyLinePlaceholder":227},[74,5783,5785],{"class":76,"line":5784},12,[74,5786,5787],{},"outer()\n",[10,5789,107],{},[65,5791,5794],{"className":5792,"code":5793,"language":113,"meta":70},[111],"Python 基础 作用域\n",[34,5795,5793],{"__ignoreMap":70},[10,5797,118],{},[14,5799,121],{"id":121},[123,5801,5802,5819],{},[49,5803,5804,5807,5808,5811,5812,5814,5815,5818],{},[34,5805,5806],{},"show()"," 中查找 ",[34,5809,5810],{},"lesson"," 时先在局部找到，查找 ",[34,5813,5599],{}," 时到外层 ",[34,5816,5817],{},"outer()"," 找到。",[49,5820,5821,5823,5824,5826],{},[34,5822,4534],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5825,2207],{}," 最后在内置作用域找到。",[155,5828,157],{"id":157},[10,5830,5831],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5833,5834],{},[26,5835],{"alt":5836,"src":5837},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5839,5840],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5842,172],{"id":172},[46,5844,5845,5848],{},[49,5846,5847],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[49,5849,5850],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5852,183],{"id":183},[123,5854,5855,5858],{},[49,5856,5857],{},"在内外层定义同名变量，观察最近作用域优先。",[49,5859,5860],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5862,201],{},[14,5864,204],{"id":204},[10,5866,5867],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5869,211],{},{"title":70,"searchDepth":83,"depth":83,"links":5871},[5872,5873,5874,5875,5876,5879,5880,5881],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":5877},[5878],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5680,"description":5685},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[130,5889,5890],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5893,"title":5894,"body":5895,"category":130,"cover":224,"description":5899,"extension":225,"meta":6049,"navigation":227,"path":6050,"pinned":229,"publishedAt":230,"seo":6051,"slug":6052,"stem":6053,"summary":6054,"tags":6055,"updatedAt":230,"visible":227,"__hash__":6058},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5896,"toc":6039},[5897,5900,5902,5905,5907,5913,5916,5918,5937,5939,5941,5975,5977,5983,5985,5987,6002,6004,6016,6018,6030,6032,6034,6037],[10,5898,5899],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5901,16],{"id":16},[10,5903,5904],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5906,22],{"id":22},[10,5908,5909],{},[26,5910],{"alt":5911,"src":5912},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5914,5915],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5917,44],{"id":44},[46,5919,5920,5923,5926],{},[49,5921,5922],{},"文档字符串紧跟在函数定义后的第一条语句。",[49,5924,5925],{},"注解表达接口意图，不代替输入校验和测试。",[49,5927,5928,5929,2256,5931,2256,5933,5936],{},"基础注解优先使用 ",[34,5930,2259],{},[34,5932,2425],{},[34,5934,5935],{},"list[str]"," 等直接写法。",[14,5938,60],{"id":60},[10,5940,63],{},[65,5942,5944],{"className":67,"code":5943,"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,5945,5946,5951,5956,5961,5965,5970],{"__ignoreMap":70},[74,5947,5948],{"class":76,"line":77},[74,5949,5950],{},"def format_score(name: str, score: int) -> str:\n",[74,5952,5953],{"class":76,"line":83},[74,5954,5955],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[74,5957,5958],{"class":76,"line":89},[74,5959,5960],{},"    return name + \"：\" + str(score)\n",[74,5962,5963],{"class":76,"line":95},[74,5964,1095],{"emptyLinePlaceholder":227},[74,5966,5967],{"class":76,"line":101},[74,5968,5969],{},"print(format_score(\"小郑\", 95))\n",[74,5971,5972],{"class":76,"line":1147},[74,5973,5974],{},"print(format_score.__doc__)\n",[10,5976,107],{},[65,5978,5981],{"className":5979,"code":5980,"language":113,"meta":70},[111],"小郑：95\n返回带姓名的分数文本。\n",[34,5982,5980],{"__ignoreMap":70},[10,5984,118],{},[14,5986,121],{"id":121},[123,5988,5989,5999],{},[49,5990,5991,5992,5995,5996,5998],{},"函数签名说明 ",[34,5993,5994],{},"name"," 预期为字符串、",[34,5997,2245],{}," 预期为整数，返回值预期为字符串。",[49,6000,6001],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6003,172],{"id":172},[46,6005,6006,6013],{},[49,6007,6008,6009,6012],{},"认为加了 ",[34,6010,6011],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[49,6014,6015],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6017,183],{"id":183},[123,6019,6020,6023],{},[49,6021,6022],{},"为面积函数补充参数和返回值注解。",[49,6024,6025,6026,6029],{},"通过 ",[34,6027,6028],{},"函数名.__doc__"," 查看文档字符串。",[10,6031,201],{},[14,6033,204],{"id":204},[10,6035,6036],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6038,211],{},{"title":70,"searchDepth":83,"depth":83,"links":6040},[6041,6042,6043,6044,6045,6046,6047,6048],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5894,"description":5899},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[130,6056,6057],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6060,"title":6061,"body":6062,"category":130,"cover":224,"description":6066,"extension":225,"meta":6293,"navigation":227,"path":6294,"pinned":229,"publishedAt":230,"seo":6295,"slug":6296,"stem":6297,"summary":6298,"tags":6299,"updatedAt":230,"visible":227,"__hash__":6302},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6063,"toc":6281},[6064,6067,6069,6075,6077,6083,6094,6096,6114,6116,6123,6152,6159,6178,6187,6189,6195,6197,6199,6222,6224,6227,6233,6239,6241,6257,6259,6272,6274,6276,6279],[10,6065,6066],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6068,16],{"id":16},[10,6070,6071,6072,6074],{},"本篇只处理“模块、import 与 ",[293,6073,5994],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6076,22],{"id":22},[10,6078,6079],{},[26,6080],{"alt":6081,"src":6082},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6084,6085,6086,6089,6090,6093],{},"同一个文件直接运行时 ",[34,6087,6088],{},"__name__"," 等于 ",[34,6091,6092],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6095,44],{"id":44},[46,6097,6098,6104,6107],{},[49,6099,6100,6101,6103],{},"一个 ",[34,6102,1170],{}," 文件就是一个模块。",[49,6105,6106],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[49,6108,6109,6110,6113],{},"避免使用 ",[34,6111,6112],{},"from module import *","，它会让名字来源不清楚。",[14,6115,60],{"id":60},[10,6117,6118,6119,6122],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6120,6121],{},"calculator.py","：",[65,6124,6126],{"className":67,"code":6125,"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,6127,6128,6133,6138,6142,6147],{"__ignoreMap":70},[74,6129,6130],{"class":76,"line":77},[74,6131,6132],{},"def add(left, right):\n",[74,6134,6135],{"class":76,"line":83},[74,6136,6137],{},"    return left + right\n",[74,6139,6140],{"class":76,"line":89},[74,6141,1095],{"emptyLinePlaceholder":227},[74,6143,6144],{"class":76,"line":95},[74,6145,6146],{},"if __name__ == \"__main__\":\n",[74,6148,6149],{"class":76,"line":101},[74,6150,6151],{},"    print(add(2, 3))\n",[10,6153,6154,6155,6158],{},"再创建 ",[34,6156,6157],{},"app.py","，从模块中导入函数：",[65,6160,6162],{"className":67,"code":6161,"language":69,"meta":70,"style":70},"from calculator import add\n\nprint(add(10, 20))\n",[34,6163,6164,6169,6173],{"__ignoreMap":70},[74,6165,6166],{"class":76,"line":77},[74,6167,6168],{},"from calculator import add\n",[74,6170,6171],{"class":76,"line":83},[74,6172,1095],{"emptyLinePlaceholder":227},[74,6174,6175],{"class":76,"line":89},[74,6176,6177],{},"print(add(10, 20))\n",[10,6179,6180,6181,1156,6184,41],{},"分别执行 ",[34,6182,6183],{},"python3 calculator.py",[34,6185,6186],{},"python3 app.py",[10,6188,107],{},[65,6190,6193],{"className":6191,"code":6192,"language":113,"meta":70},[111],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6194,6192],{"__ignoreMap":70},[10,6196,118],{},[14,6198,121],{"id":121},[123,6200,6201,6211],{},[49,6202,6203,6204,6206,6207,6210],{},"直接运行 ",[34,6205,6121],{}," 时，模块名是 ",[34,6208,6209],{},"__main__","，入口代码输出 5。",[49,6212,6213,6215,6216,6218,6219,6221],{},[34,6214,6157],{}," 导入模块时，",[34,6217,6121],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6220,6157],{}," 调用函数输出 30。",[155,6223,157],{"id":157},[10,6225,6226],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6228,6229],{},[26,6230],{"alt":6231,"src":6232},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6234,6235,6236,6238],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6237,6209],{}," 保护下的演示代码。",[14,6240,172],{"id":172},[46,6242,6243,6250],{},[49,6244,6245,6246,1156,6248,41],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6247,6121],{},[34,6249,6157],{},[49,6251,6252,6253,6256],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6254,6255],{},"json.py","，导致导入目标被遮蔽。",[14,6258,183],{"id":183},[123,6260,6261,6267],{},[49,6262,2353,6263,6266],{},[34,6264,6265],{},"text_tools.py"," 并导出一个格式化函数。",[49,6268,6269,6270,41],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6271,6088],{},[10,6273,201],{},[14,6275,204],{"id":204},[10,6277,6278],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6280,211],{},{"title":70,"searchDepth":83,"depth":83,"links":6282},[6283,6284,6285,6286,6287,6290,6291,6292],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":6288},[6289],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6061,"description":6066},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[130,6300,6301],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6304,"title":6305,"body":6306,"category":130,"cover":224,"description":6310,"extension":225,"meta":6475,"navigation":227,"path":6476,"pinned":229,"publishedAt":230,"seo":6477,"slug":6478,"stem":6479,"summary":6480,"tags":6481,"updatedAt":230,"visible":227,"__hash__":6483},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6307,"toc":6465},[6308,6311,6313,6316,6318,6324,6327,6329,6343,6345,6347,6393,6395,6401,6403,6405,6431,6433,6443,6445,6456,6458,6460,6463],[10,6309,6310],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6312,16],{"id":16},[10,6314,6315],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6317,22],{"id":22},[10,6319,6320],{},[26,6321],{"alt":6322,"src":6323},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6325,6326],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6328,44],{"id":44},[46,6330,6331,6337,6340],{},[49,6332,6333,6336],{},[34,6334,6335],{},".venv"," 是常见目录名，不应提交到 Git。",[49,6338,6339],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[49,6341,6342],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6344,60],{"id":60},[10,6346,1573],{},[65,6348,6350],{"className":588,"code":6349,"language":590,"meta":70,"style":70},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6351,6352,6364,6372,6378,6388],{"__ignoreMap":70},[74,6353,6354,6356,6358,6361],{"class":76,"line":77},[74,6355,688],{"class":597},[74,6357,630],{"class":600},[74,6359,6360],{"class":633}," venv",[74,6362,6363],{"class":633}," .venv\n",[74,6365,6366,6369],{"class":76,"line":83},[74,6367,6368],{"class":600},"source",[74,6370,6371],{"class":633}," .venv\u002Fbin\u002Factivate\n",[74,6373,6374,6376],{"class":76,"line":89},[74,6375,69],{"class":597},[74,6377,601],{"class":600},[74,6379,6380,6382,6384,6386],{"class":76,"line":95},[74,6381,69],{"class":597},[74,6383,630],{"class":600},[74,6385,634],{"class":633},[74,6387,601],{"class":600},[74,6389,6390],{"class":76,"line":101},[74,6391,6392],{"class":597},"deactivate\n",[10,6394,107],{},[65,6396,6399],{"className":6397,"code":6398,"language":113,"meta":70},[111],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6400,6398],{"__ignoreMap":70},[10,6402,118],{},[14,6404,121],{"id":121},[123,6406,6407,6416],{},[49,6408,6409,6412,6413,6415],{},[34,6410,6411],{},"venv"," 根据当前 ",[34,6414,688],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[49,6417,6418,6419,2175,6421,6424,6425,3677,6427,6430],{},"激活后 ",[34,6420,69],{},[34,6422,6423],{},"python -m pip"," 优先指向 ",[34,6426,6335],{},[34,6428,6429],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6432,172],{"id":172},[46,6434,6435,6438],{},[49,6436,6437],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[49,6439,3416,6440,6442],{},[34,6441,6335],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6444,183],{"id":183},[123,6446,6447,6453],{},[49,6448,6449,6450,41],{},"创建虚拟环境并记录激活前后的 ",[34,6451,6452],{},"which python",[49,6454,6455],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6457,201],{},[14,6459,204],{"id":204},[10,6461,6462],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6464,1657],{},{"title":70,"searchDepth":83,"depth":83,"links":6466},[6467,6468,6469,6470,6471,6472,6473,6474],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6305,"description":6310},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[130,6482,259],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6485,"title":6486,"body":6487,"category":130,"cover":224,"description":6491,"extension":225,"meta":6679,"navigation":227,"path":6680,"pinned":229,"publishedAt":230,"seo":6681,"slug":6682,"stem":6683,"summary":6684,"tags":6685,"updatedAt":230,"visible":227,"__hash__":6688},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6488,"toc":6669},[6489,6492,6494,6497,6499,6505,6514,6516,6540,6542,6544,6597,6599,6605,6607,6609,6625,6627,6646,6648,6660,6662,6664,6667],[10,6490,6491],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6493,16],{"id":16},[10,6495,6496],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6498,22],{"id":22},[10,6500,6501],{},[26,6502],{"alt":6503,"src":6504},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6506,6507,6510,6511,6513],{},[34,6508,6509],{},"Path"," 使用 ",[34,6512,2435],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6515,44],{"id":44},[46,6517,6518,6521,6533],{},[49,6519,6520],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[49,6522,6523,2256,6526,2256,6529,6532],{},[34,6524,6525],{},"exists()",[34,6527,6528],{},"is_file()",[34,6530,6531],{},"is_dir()"," 检查真实文件系统状态。",[49,6534,6535,6536,6539],{},"创建目录前明确目标；",[34,6537,6538],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6541,60],{"id":60},[10,6543,63],{},[65,6545,6547],{"className":67,"code":6546,"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,6548,6549,6554,6558,6563,6568,6573,6577,6582,6587,6592],{"__ignoreMap":70},[74,6550,6551],{"class":76,"line":77},[74,6552,6553],{},"from pathlib import Path\n",[74,6555,6556],{"class":76,"line":83},[74,6557,1095],{"emptyLinePlaceholder":227},[74,6559,6560],{"class":76,"line":89},[74,6561,6562],{},"project = Path.cwd()\n",[74,6564,6565],{"class":76,"line":95},[74,6566,6567],{},"data_dir = project \u002F \"data\"\n",[74,6569,6570],{"class":76,"line":101},[74,6571,6572],{},"file_path = data_dir \u002F \"records.json\"\n",[74,6574,6575],{"class":76,"line":1147},[74,6576,1095],{"emptyLinePlaceholder":227},[74,6578,6579],{"class":76,"line":2488},[74,6580,6581],{},"print(project)\n",[74,6583,6584],{"class":76,"line":2494},[74,6585,6586],{},"print(file_path.name)\n",[74,6588,6589],{"class":76,"line":3902},[74,6590,6591],{},"print(file_path.suffix)\n",[74,6593,6594],{"class":76,"line":4114},[74,6595,6596],{},"print(file_path.exists())\n",[10,6598,107],{},[65,6600,6603],{"className":6601,"code":6602,"language":113,"meta":70},[111],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6604,6602],{"__ignoreMap":70},[10,6606,118],{},[14,6608,121],{"id":121},[123,6610,6611,6617],{},[49,6612,6613,6616],{},[34,6614,6615],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[49,6618,2338,6619,6621,6622,6624],{},[34,6620,2435],{}," 组合路径片段只创建新的 ",[34,6623,6509],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6626,172],{"id":172},[46,6628,6629,6637],{},[49,6630,3416,6631,6633,6634,6636],{},[34,6632,6509],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6635,6525],{}," 等方法确认。",[49,6638,6639,6640,1006,6642,6645],{},"手工拼接 ",[34,6641,2435],{},[34,6643,6644],{},"\\"," 分隔符，降低跨平台可读性。",[14,6647,183],{"id":183},[123,6649,6650,6657],{},[49,6651,6652,6653,6656],{},"组合 ",[34,6654,6655],{},"output\u002Freport.txt"," 路径但先不创建文件。",[49,6658,6659],{},"输出路径的父目录、文件名和扩展名。",[10,6661,201],{},[14,6663,204],{"id":204},[10,6665,6666],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6668,211],{},{"title":70,"searchDepth":83,"depth":83,"links":6670},[6671,6672,6673,6674,6675,6676,6677,6678],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6486,"description":6491},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[130,6686,6687],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6690,"title":6691,"body":6692,"category":130,"cover":224,"description":6696,"extension":225,"meta":6874,"navigation":227,"path":6875,"pinned":229,"publishedAt":230,"seo":6876,"slug":6877,"stem":6878,"summary":6879,"tags":6880,"updatedAt":230,"visible":227,"__hash__":6883},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6693,"toc":6864},[6694,6697,6699,6702,6704,6710,6713,6715,6743,6745,6747,6804,6806,6812,6814,6816,6827,6829,6842,6844,6855,6857,6859,6862],[10,6695,6696],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6698,16],{"id":16},[10,6700,6701],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6703,22],{"id":22},[10,6705,6706],{},[26,6707],{"alt":6708,"src":6709},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6711,6712],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6714,44],{"id":44},[46,6716,6717,6723,6732],{},[49,6718,6719,6722],{},[34,6720,6721],{},"w"," 模式会截断原文件，写入前必须确认目标。",[49,6724,6725,6728,6729,41],{},[34,6726,6727],{},"r"," 模式读取不存在文件会产生 ",[34,6730,6731],{},"FileNotFoundError",[49,6733,6734,6735,6738,6739,6742],{},"本篇显式调用 ",[34,6736,6737],{},"close()","；第 34 篇会用 ",[34,6740,6741],{},"with"," 更可靠地管理关闭动作。",[14,6744,60],{"id":60},[10,6746,63],{},[65,6748,6750],{"className":67,"code":6749,"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,6751,6752,6756,6760,6765,6770,6775,6780,6784,6789,6794,6799],{"__ignoreMap":70},[74,6753,6754],{"class":76,"line":77},[74,6755,6553],{},[74,6757,6758],{"class":76,"line":83},[74,6759,1095],{"emptyLinePlaceholder":227},[74,6761,6762],{"class":76,"line":89},[74,6763,6764],{},"file_path = Path(\"notes.txt\")\n",[74,6766,6767],{"class":76,"line":95},[74,6768,6769],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[74,6771,6772],{"class":76,"line":101},[74,6773,6774],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[74,6776,6777],{"class":76,"line":1147},[74,6778,6779],{},"writer.close()\n",[74,6781,6782],{"class":76,"line":2488},[74,6783,1095],{"emptyLinePlaceholder":227},[74,6785,6786],{"class":76,"line":2494},[74,6787,6788],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[74,6790,6791],{"class":76,"line":3902},[74,6792,6793],{},"content = reader.read()\n",[74,6795,6796],{"class":76,"line":4114},[74,6797,6798],{},"reader.close()\n",[74,6800,6801],{"class":76,"line":5779},[74,6802,6803],{},"print(content)\n",[10,6805,107],{},[65,6807,6810],{"className":6808,"code":6809,"language":113,"meta":70},[111],"变量\n循环\n函数\n",[34,6811,6809],{"__ignoreMap":70},[10,6813,118],{},[14,6815,121],{"id":121},[123,6817,6818,6824],{},[49,6819,6820,6821,6823],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6822,6737],{}," 确保缓冲内容交给文件系统。",[49,6825,6826],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6828,172],{"id":172},[46,6830,6831,6836],{},[49,6832,2338,6833,6835],{},[34,6834,6721],{}," 模式打开重要文件却未确认覆盖风险。",[49,6837,6838,6839,41],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6840,6841],{},"encoding=\"utf-8\"",[14,6843,183],{"id":183},[123,6845,6846,6849],{},[49,6847,6848],{},"写入三行学习记录并读取。",[49,6850,6851,6852,6854],{},"改用 ",[34,6853,334],{}," 模式追加一行，确认原内容仍保留。",[10,6856,201],{},[14,6858,204],{"id":204},[10,6860,6861],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6863,211],{},{"title":70,"searchDepth":83,"depth":83,"links":6865},[6866,6867,6868,6869,6870,6871,6872,6873],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6691,"description":6696},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[130,6881,6882],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6885,"title":6886,"body":6887,"category":130,"cover":224,"description":6891,"extension":225,"meta":7058,"navigation":227,"path":7059,"pinned":229,"publishedAt":230,"seo":7060,"slug":7061,"stem":7062,"summary":7063,"tags":7064,"updatedAt":230,"visible":227,"__hash__":7067},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6888,"toc":7048},[6889,6892,6894,6897,6899,6905,6915,6917,6931,6933,6935,6995,6997,7003,7005,7007,7019,7021,7029,7031,7039,7041,7043,7046],[10,6890,6891],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6893,16],{"id":16},[10,6895,6896],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6898,22],{"id":22},[10,6900,6901],{},[26,6902],{"alt":6903,"src":6904},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6906,6907,6910,6911,6914],{},[34,6908,6909],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6912,6913],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6916,44],{"id":44},[46,6918,6919,6922,6928],{},[49,6920,6921],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[49,6923,6924,6927],{},[34,6925,6926],{},"ensure_ascii=False"," 让中文以可读字符写入。",[49,6929,6930],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6932,60],{"id":60},[10,6934,63],{},[65,6936,6938],{"className":67,"code":6937,"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,6939,6940,6945,6949,6954,6958,6963,6968,6972,6976,6981,6986,6990],{"__ignoreMap":70},[74,6941,6942],{"class":76,"line":77},[74,6943,6944],{},"import json\n",[74,6946,6947],{"class":76,"line":83},[74,6948,1095],{"emptyLinePlaceholder":227},[74,6950,6951],{"class":76,"line":89},[74,6952,6953],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[74,6955,6956],{"class":76,"line":95},[74,6957,1095],{"emptyLinePlaceholder":227},[74,6959,6960],{"class":76,"line":101},[74,6961,6962],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[74,6964,6965],{"class":76,"line":1147},[74,6966,6967],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[74,6969,6970],{"class":76,"line":2488},[74,6971,6779],{},[74,6973,6974],{"class":76,"line":2494},[74,6975,1095],{"emptyLinePlaceholder":227},[74,6977,6978],{"class":76,"line":3902},[74,6979,6980],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[74,6982,6983],{"class":76,"line":4114},[74,6984,6985],{},"loaded = json.load(reader)\n",[74,6987,6988],{"class":76,"line":5779},[74,6989,6798],{},[74,6991,6992],{"class":76,"line":5784},[74,6993,6994],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6996,107],{},[65,6998,7001],{"className":6999,"code":7000,"language":113,"meta":70},[111],"Python 60\n",[34,7002,7000],{"__ignoreMap":70},[10,7004,118],{},[14,7006,121],{"id":121},[123,7008,7009,7014],{},[49,7010,7011,7013],{},[34,7012,6909],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[49,7015,7016,7018],{},[34,7017,6913],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7020,172],{"id":172},[46,7022,7023,7026],{},[49,7024,7025],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[49,7027,7028],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7030,183],{"id":183},[123,7032,7033,7036],{},[49,7034,7035],{},"保存包含两条学习记录的列表。",[49,7037,7038],{},"读取后修改进度，再重新写回文件。",[10,7040,201],{},[14,7042,204],{"id":204},[10,7044,7045],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7047,211],{},{"title":70,"searchDepth":83,"depth":83,"links":7049},[7050,7051,7052,7053,7054,7055,7056,7057],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6886,"description":6891},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[130,7065,7066],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7069,"title":7070,"body":7071,"category":130,"cover":224,"description":7075,"extension":225,"meta":7259,"navigation":227,"path":7260,"pinned":229,"publishedAt":230,"seo":7261,"slug":7262,"stem":7263,"summary":7264,"tags":7265,"updatedAt":230,"visible":227,"__hash__":7268},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7072,"toc":7249},[7073,7076,7078,7081,7083,7089,7095,7097,7119,7121,7123,7186,7188,7194,7196,7198,7214,7216,7230,7232,7240,7242,7244,7247],[10,7074,7075],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7077,16],{"id":16},[10,7079,7080],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7082,22],{"id":22},[10,7084,7085],{},[26,7086],{"alt":7087,"src":7088},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7090,7091,7094],{},[34,7092,7093],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7096,44],{"id":44},[46,7098,7099,7109,7116],{},[49,7100,2338,7101,7104,7105,7108],{},[34,7102,7103],{},"newline=\"\""," 让 ",[34,7106,7107],{},"csv"," 模块正确处理换行。",[49,7110,7111,7112,7115],{},"字段顺序由 ",[34,7113,7114],{},"fieldnames"," 决定，字典键需要与字段名一致。",[49,7117,7118],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7120,60],{"id":60},[10,7122,63],{},[65,7124,7126],{"className":67,"code":7125,"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,7127,7128,7133,7137,7142,7147,7152,7157,7162,7166,7171,7176,7181],{"__ignoreMap":70},[74,7129,7130],{"class":76,"line":77},[74,7131,7132],{},"import csv\n",[74,7134,7135],{"class":76,"line":83},[74,7136,1095],{"emptyLinePlaceholder":227},[74,7138,7139],{"class":76,"line":89},[74,7140,7141],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[74,7143,7144],{"class":76,"line":95},[74,7145,7146],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[74,7148,7149],{"class":76,"line":101},[74,7150,7151],{},"writer.writeheader()\n",[74,7153,7154],{"class":76,"line":1147},[74,7155,7156],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[74,7158,7159],{"class":76,"line":2488},[74,7160,7161],{},"writer_file.close()\n",[74,7163,7164],{"class":76,"line":2494},[74,7165,1095],{"emptyLinePlaceholder":227},[74,7167,7168],{"class":76,"line":3902},[74,7169,7170],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[74,7172,7173],{"class":76,"line":4114},[74,7174,7175],{},"for row in csv.DictReader(reader_file):\n",[74,7177,7178],{"class":76,"line":5779},[74,7179,7180],{},"    print(row[\"name\"], row[\"score\"])\n",[74,7182,7183],{"class":76,"line":5784},[74,7184,7185],{},"reader_file.close()\n",[10,7187,107],{},[65,7189,7192],{"className":7190,"code":7191,"language":113,"meta":70},[111],"小郑 95\n",[34,7193,7191],{"__ignoreMap":70},[10,7195,118],{},[14,7197,121],{"id":121},[123,7199,7200,7209],{},[49,7201,7202,7205,7206,7208],{},[34,7203,7204],{},"DictWriter"," 按 ",[34,7207,7114],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[49,7210,7211,7213],{},[34,7212,7093],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7215,172],{"id":172},[46,7217,7218,7221],{},[49,7219,7220],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[49,7222,7223,7224,7226,7227,7229],{},"在 macOS 以外环境忽略 ",[34,7225,7103],{}," 可能出现额外空行；统一交给 ",[34,7228,7107],{}," 模块管理换行。",[14,7231,183],{"id":183},[123,7233,7234,7237],{},[49,7235,7236],{},"写入三名学习者的课程和分数。",[49,7238,7239],{},"读取 CSV 后把分数字符串转换为整数。",[10,7241,201],{},[14,7243,204],{"id":204},[10,7245,7246],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7248,211],{},{"title":70,"searchDepth":83,"depth":83,"links":7250},[7251,7252,7253,7254,7255,7256,7257,7258],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7070,"description":7075},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[130,7266,7267],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7270,"title":7271,"body":7272,"category":130,"cover":224,"description":7276,"extension":225,"meta":7549,"navigation":227,"path":7550,"pinned":229,"publishedAt":230,"seo":7551,"slug":7552,"stem":7553,"summary":7554,"tags":7555,"updatedAt":230,"visible":227,"__hash__":7558},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7273,"toc":7536},[7274,7277,7279,7282,7284,7290,7301,7303,7320,7322,7324,7399,7401,7407,7409,7411,7436,7438,7447,7453,7464,7466,7472,7478,7487,7489,7504,7506,7527,7529,7531,7534],[10,7275,7276],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7278,16],{"id":16},[10,7280,7281],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7283,22],{"id":22},[10,7285,7286],{},[26,7287],{"alt":7288,"src":7289},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7291,7292,7293,7296,7297,7300],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7294,7295],{},"except","；无论是否异常，",[34,7298,7299],{},"finally"," 都会在离开结构前执行。",[14,7302,44],{"id":44},[46,7304,7305,7311,7317],{},[49,7306,7307,7308,7310],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7309,7295],{}," 吞掉全部错误。",[49,7312,7313,7316],{},[34,7314,7315],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[49,7318,7319],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7321,60],{"id":60},[10,7323,63],{},[65,7325,7327],{"className":67,"code":7326,"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,7328,7329,7334,7339,7344,7349,7354,7358,7363,7368,7373,7378,7382,7387,7393],{"__ignoreMap":70},[74,7330,7331],{"class":76,"line":77},[74,7332,7333],{},"def parse_age(text):\n",[74,7335,7336],{"class":76,"line":83},[74,7337,7338],{},"    age = int(text)\n",[74,7340,7341],{"class":76,"line":89},[74,7342,7343],{},"    if age \u003C 0:\n",[74,7345,7346],{"class":76,"line":95},[74,7347,7348],{},"        raise ValueError(\"年龄不能为负数\")\n",[74,7350,7351],{"class":76,"line":101},[74,7352,7353],{},"    return age\n",[74,7355,7356],{"class":76,"line":1147},[74,7357,1095],{"emptyLinePlaceholder":227},[74,7359,7360],{"class":76,"line":2488},[74,7361,7362],{},"try:\n",[74,7364,7365],{"class":76,"line":2494},[74,7366,7367],{},"    age = parse_age(\"18\")\n",[74,7369,7370],{"class":76,"line":3902},[74,7371,7372],{},"except ValueError as error:\n",[74,7374,7375],{"class":76,"line":4114},[74,7376,7377],{},"    print(\"输入错误：\", error)\n",[74,7379,7380],{"class":76,"line":5779},[74,7381,1144],{},[74,7383,7384],{"class":76,"line":5784},[74,7385,7386],{},"    print(\"年龄：\", age)\n",[74,7388,7390],{"class":76,"line":7389},13,[74,7391,7392],{},"finally:\n",[74,7394,7396],{"class":76,"line":7395},14,[74,7397,7398],{},"    print(\"处理结束\")\n",[10,7400,107],{},[65,7402,7405],{"className":7403,"code":7404,"language":113,"meta":70},[111],"年龄： 18\n处理结束\n",[34,7406,7404],{"__ignoreMap":70},[10,7408,118],{},[14,7410,121],{"id":121},[123,7412,7413,7425],{},[49,7414,7415,7417,7418,7420,7421,7424],{},[34,7416,2985],{}," 或主动 ",[34,7419,7315],{}," 都可能产生 ",[34,7422,7423],{},"ValueError","，控制流立即离开当前正常路径。",[49,7426,7427,7428,7430,7431,7433,7434,41],{},"有异常时进入匹配的 ",[34,7429,7295],{},"；没有异常时执行 ",[34,7432,1159],{},"；两种情况最后都会执行 ",[34,7435,7299],{},[155,7437,157],{"id":157},[10,7439,7440,2256,7442,1156,7444,7446],{},[34,7441,7295],{},[34,7443,1159],{},[34,7445,7299],{}," 的职责不同，不能只看它们出现的顺序。",[10,7448,7449],{},[26,7450],{"alt":7451,"src":7452},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7454,7455,7457,7458,7460,7461,7463],{},[34,7456,7295],{}," 处理匹配异常，",[34,7459,1159],{}," 只在无异常时运行，",[34,7462,7299],{}," 负责两条路径都需要的清理动作。",[155,7465,157],{"id":4169},[10,7467,7468,7471],{},[34,7469,7470],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7473,7474],{},[26,7475],{"alt":7476,"src":7477},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7479,7480,7481,7483,7484,7486],{},"只把可能产生预期异常的操作放进 ",[34,7482,7470],{},"，后续正常业务放进 ",[34,7485,1159],{},"，错误边界会更清楚。",[14,7488,172],{"id":172},[46,7490,7491,7498],{},[49,7492,7493,7494,7497],{},"使用裸 ",[34,7495,7496],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[49,7499,7500,7501,7503],{},"把整个程序包在一个巨大 ",[34,7502,7470],{}," 中，无法判断究竟哪一步允许失败。",[14,7505,183],{"id":183},[123,7507,7508,7521],{},[49,7509,7510,7511,7514,7515,1156,7518,41],{},"让 ",[34,7512,7513],{},"parse_age"," 分别处理 ",[34,7516,7517],{},"\"abc\"",[34,7519,7520],{},"\"-1\"",[49,7522,7523,7524,7526],{},"为文件读取捕获 ",[34,7525,6731],{}," 并给出清晰提示。",[10,7528,201],{},[14,7530,204],{"id":204},[10,7532,7533],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7535,211],{},{"title":70,"searchDepth":83,"depth":83,"links":7537},[7538,7539,7540,7541,7542,7546,7547,7548],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":7543},[7544,7545],{"id":157,"depth":89,"text":157},{"id":4169,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7271,"description":7276},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[130,7556,7557],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7560,"title":7561,"body":7562,"category":130,"cover":224,"description":7566,"extension":225,"meta":7742,"navigation":227,"path":7743,"pinned":229,"publishedAt":230,"seo":7744,"slug":7745,"stem":7746,"summary":7747,"tags":7748,"updatedAt":230,"visible":227,"__hash__":7750},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7563,"toc":7732},[7564,7567,7569,7572,7574,7580,7586,7588,7604,7606,7608,7662,7664,7670,7672,7674,7687,7689,7702,7704,7723,7725,7727,7730],[10,7565,7566],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7568,16],{"id":16},[10,7570,7571],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7573,22],{"id":22},[10,7575,7576],{},[26,7577],{"alt":7578,"src":7579},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7581,7582,7583,7585],{},"进入 ",[34,7584,6741],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7587,44],{"id":44},[46,7589,7590,7595,7601],{},[49,7591,7592,7594],{},[34,7593,6741],{}," 把资源获取和释放配成一个清晰边界。",[49,7596,7597,7600],{},[34,7598,7599],{},"as file"," 得到的是上下文返回的资源对象。",[49,7602,7603],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7605,60],{"id":60},[10,7607,63],{},[65,7609,7611],{"className":67,"code":7610,"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,7612,7613,7617,7621,7625,7629,7634,7639,7643,7648,7653,7657],{"__ignoreMap":70},[74,7614,7615],{"class":76,"line":77},[74,7616,6553],{},[74,7618,7619],{"class":76,"line":83},[74,7620,1095],{"emptyLinePlaceholder":227},[74,7622,7623],{"class":76,"line":89},[74,7624,6764],{},[74,7626,7627],{"class":76,"line":95},[74,7628,1095],{"emptyLinePlaceholder":227},[74,7630,7631],{"class":76,"line":101},[74,7632,7633],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,7635,7636],{"class":76,"line":1147},[74,7637,7638],{},"    file.write(\"上下文管理器\\n\")\n",[74,7640,7641],{"class":76,"line":2488},[74,7642,1095],{"emptyLinePlaceholder":227},[74,7644,7645],{"class":76,"line":2494},[74,7646,7647],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[74,7649,7650],{"class":76,"line":3902},[74,7651,7652],{},"    print(file.read())\n",[74,7654,7655],{"class":76,"line":4114},[74,7656,1095],{"emptyLinePlaceholder":227},[74,7658,7659],{"class":76,"line":5779},[74,7660,7661],{},"print(file.closed)\n",[10,7663,107],{},[65,7665,7668],{"className":7666,"code":7667,"language":113,"meta":70},[111],"上下文管理器\n\nTrue\n",[34,7669,7667],{"__ignoreMap":70},[10,7671,118],{},[14,7673,121],{"id":121},[123,7675,7676,7684],{},[49,7677,7582,7678,7680,7681,41],{},[34,7679,6741],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7682,7683],{},"file",[49,7685,7686],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7688,172],{"id":172},[46,7690,7691,7696],{},[49,7692,4737,7693,7695],{},[34,7694,6741],{}," 代码块外继续读写已经关闭的文件对象。",[49,7697,7698,7699,7701],{},"误以为 ",[34,7700,6741],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7703,183],{"id":183},[123,7705,7706,7715],{},[49,7707,7708,7709,7712,7713,41],{},"把第 30 篇的手动 ",[34,7710,7711],{},"open\u002Fclose"," 改写为 ",[34,7714,6741],{},[49,7716,4737,7717,7719,7720,41],{},[34,7718,6741],{}," 块后检查 ",[34,7721,7722],{},"file.closed",[10,7724,201],{},[14,7726,204],{"id":204},[10,7728,7729],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7731,211],{},{"title":70,"searchDepth":83,"depth":83,"links":7733},[7734,7735,7736,7737,7738,7739,7740,7741],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7561,"description":7566},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[130,6741,7749],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7752,"title":7753,"body":7754,"category":130,"cover":224,"description":7758,"extension":225,"meta":7970,"navigation":227,"path":7971,"pinned":229,"publishedAt":230,"seo":7972,"slug":7973,"stem":7974,"summary":7975,"tags":7976,"updatedAt":230,"visible":227,"__hash__":7979},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7755,"toc":7958},[7756,7759,7761,7764,7766,7772,7775,7777,7794,7796,7798,7866,7868,7874,7876,7878,7903,7905,7908,7914,7923,7925,7936,7938,7949,7951,7953,7956],[10,7757,7758],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7760,16],{"id":16},[10,7762,7763],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7765,22],{"id":22},[10,7767,7768],{},[26,7769],{"alt":7770,"src":7771},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7773,7774],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7776,44],{"id":44},[46,7778,7779,7785,7791],{},[49,7780,7781,7784],{},[34,7782,7783],{},"self"," 表示当前实例，由方法调用自动传入。",[49,7786,7787,7790],{},[34,7788,7789],{},"__init__"," 在实例创建过程中初始化属性。",[49,7792,7793],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7795,60],{"id":60},[10,7797,63],{},[65,7799,7801],{"className":67,"code":7800,"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,7802,7803,7808,7813,7818,7823,7827,7832,7837,7842,7847,7851,7856,7861],{"__ignoreMap":70},[74,7804,7805],{"class":76,"line":77},[74,7806,7807],{},"class LearningRecord:\n",[74,7809,7810],{"class":76,"line":83},[74,7811,7812],{},"    def __init__(self, course, progress=0):\n",[74,7814,7815],{"class":76,"line":89},[74,7816,7817],{},"        self.course = course\n",[74,7819,7820],{"class":76,"line":95},[74,7821,7822],{},"        self.progress = progress\n",[74,7824,7825],{"class":76,"line":101},[74,7826,1095],{"emptyLinePlaceholder":227},[74,7828,7829],{"class":76,"line":1147},[74,7830,7831],{},"    def advance(self, amount):\n",[74,7833,7834],{"class":76,"line":2488},[74,7835,7836],{},"        self.progress = self.progress + amount\n",[74,7838,7839],{"class":76,"line":2494},[74,7840,7841],{},"        if self.progress > 100:\n",[74,7843,7844],{"class":76,"line":3902},[74,7845,7846],{},"            self.progress = 100\n",[74,7848,7849],{"class":76,"line":4114},[74,7850,1095],{"emptyLinePlaceholder":227},[74,7852,7853],{"class":76,"line":5779},[74,7854,7855],{},"record = LearningRecord(\"Python\", 40)\n",[74,7857,7858],{"class":76,"line":5784},[74,7859,7860],{},"record.advance(15)\n",[74,7862,7863],{"class":76,"line":7389},[74,7864,7865],{},"print(record.course, record.progress)\n",[10,7867,107],{},[65,7869,7872],{"className":7870,"code":7871,"language":113,"meta":70},[111],"Python 55\n",[34,7873,7871],{"__ignoreMap":70},[10,7875,118],{},[14,7877,121],{"id":121},[123,7879,7880,7890],{},[49,7881,7882,7883,7886,7887,7889],{},"调用 ",[34,7884,7885],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7888,7789],{}," 把课程和进度保存在该实例属性中。",[49,7891,7892,7895,7896,7899,7900,7902],{},[34,7893,7894],{},"record.advance(15)"," 自动把 ",[34,7897,7898],{},"record"," 作为 ",[34,7901,7783],{},"，方法更新同一实例的进度并限制上限。",[155,7904,157],{"id":157},[10,7906,7907],{},"类是共同定义，实例则各自保存状态。",[10,7909,7910],{},[26,7911],{"alt":7912,"src":7913},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7915,7916,7917,1156,7919,7922],{},"两个实例共享同一套方法定义，但 ",[34,7918,4534],{},[34,7920,7921],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7924,172],{"id":172},[46,7926,7927,7933],{},[49,7928,7929,7930,7932],{},"调用实例方法时手工再传一次 ",[34,7931,7783],{},"。通过实例调用时 Python 会自动绑定。",[49,7934,7935],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7937,183],{"id":183},[123,7939,7940,7946],{},[49,7941,5247,7942,7945],{},[34,7943,7944],{},"Book"," 类，保存标题和阅读页数。",[49,7947,7948],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7950,201],{},[14,7952,204],{"id":204},[10,7954,7955],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7957,211],{},{"title":70,"searchDepth":83,"depth":83,"links":7959},[7960,7961,7962,7963,7964,7967,7968,7969],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":7965},[7966],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7753,"description":7758},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[130,7977,7978],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7981,"title":7982,"body":7983,"category":130,"cover":224,"description":7987,"extension":225,"meta":8165,"navigation":227,"path":8166,"pinned":229,"publishedAt":230,"seo":8167,"slug":8168,"stem":8169,"summary":8170,"tags":8171,"updatedAt":230,"visible":227,"__hash__":8174},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7984,"toc":8155},[7985,7988,7990,7993,7995,8001,8004,8006,8017,8019,8021,8088,8090,8096,8098,8100,8119,8121,8129,8131,8146,8148,8150,8153],[10,7986,7987],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7989,16],{"id":16},[10,7991,7992],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7994,22],{"id":22},[10,7996,7997],{},[26,7998],{"alt":7999,"src":8000},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8002,8003],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8005,44],{"id":44},[46,8007,8008,8011,8014],{},[49,8009,8010],{},"封装让对象通过方法维护自己的有效状态。",[49,8012,8013],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[49,8015,8016],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8018,60],{"id":60},[10,8020,63],{},[65,8022,8024],{"className":67,"code":8023,"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,8025,8026,8031,8036,8041,8045,8050,8055,8060,8064,8069,8074,8078,8083],{"__ignoreMap":70},[74,8027,8028],{"class":76,"line":77},[74,8029,8030],{},"class Storage:\n",[74,8032,8033],{"class":76,"line":83},[74,8034,8035],{},"    def save(self, text):\n",[74,8037,8038],{"class":76,"line":89},[74,8039,8040],{},"        print(\"保存：\", text)\n",[74,8042,8043],{"class":76,"line":95},[74,8044,1095],{"emptyLinePlaceholder":227},[74,8046,8047],{"class":76,"line":101},[74,8048,8049],{},"class LearningService:\n",[74,8051,8052],{"class":76,"line":1147},[74,8053,8054],{},"    def __init__(self, storage):\n",[74,8056,8057],{"class":76,"line":2488},[74,8058,8059],{},"        self.storage = storage\n",[74,8061,8062],{"class":76,"line":2494},[74,8063,1095],{"emptyLinePlaceholder":227},[74,8065,8066],{"class":76,"line":3902},[74,8067,8068],{},"    def finish_lesson(self, title):\n",[74,8070,8071],{"class":76,"line":4114},[74,8072,8073],{},"        self.storage.save(title)\n",[74,8075,8076],{"class":76,"line":5779},[74,8077,1095],{"emptyLinePlaceholder":227},[74,8079,8080],{"class":76,"line":5784},[74,8081,8082],{},"service = LearningService(Storage())\n",[74,8084,8085],{"class":76,"line":7389},[74,8086,8087],{},"service.finish_lesson(\"异常处理\")\n",[10,8089,107],{},[65,8091,8094],{"className":8092,"code":8093,"language":113,"meta":70},[111],"保存： 异常处理\n",[34,8095,8093],{"__ignoreMap":70},[10,8097,118],{},[14,8099,121],{"id":121},[123,8101,8102,8112],{},[49,8103,8104,8107,8108,8111],{},[34,8105,8106],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8109,8110],{},"save()"," 的协作对象。",[49,8113,8114,8115,8118],{},"调用业务方法时，服务把保存动作委托给 ",[34,8116,8117],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8120,172],{"id":172},[46,8122,8123,8126],{},[49,8124,8125],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[49,8127,8128],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8130,183],{"id":183},[123,8132,8133,8143],{},[49,8134,8135,8136,8139,8140,41],{},"用组合让 ",[34,8137,8138],{},"OrderService"," 使用一个 ",[34,8141,8142],{},"Notifier",[49,8144,8145],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8147,201],{},[14,8149,204],{"id":204},[10,8151,8152],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8154,211],{},{"title":70,"searchDepth":83,"depth":83,"links":8156},[8157,8158,8159,8160,8161,8162,8163,8164],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7982,"description":7987},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[130,8172,8173],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8176,"title":8177,"body":8178,"category":130,"cover":224,"description":8182,"extension":225,"meta":8385,"navigation":227,"path":8386,"pinned":229,"publishedAt":230,"seo":8387,"slug":8388,"stem":8389,"summary":8390,"tags":8391,"updatedAt":230,"visible":227,"__hash__":8394},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8179,"toc":8373},[8180,8183,8185,8188,8190,8196,8203,8205,8230,8232,8234,8286,8288,8294,8296,8298,8319,8321,8327,8333,8339,8341,8349,8351,8364,8366,8368,8371],[10,8181,8182],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8184,16],{"id":16},[10,8186,8187],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8189,22],{"id":22},[10,8191,8192],{},[26,8193],{"alt":8194,"src":8195},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8197,8198,8199,8202],{},"生成器运行到 ",[34,8200,8201],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8204,44],{"id":44},[46,8206,8207,8217,8227],{},[49,8208,8209,8212,8213,8216],{},[34,8210,8211],{},"iter()"," 从可迭代对象取得迭代器，",[34,8214,8215],{},"next()"," 请求下一个值。",[49,8218,8219,8220,8223,8224,8226],{},"没有更多值时迭代器抛出 ",[34,8221,8222],{},"StopIteration","，",[34,8225,4288],{}," 会自动处理。",[49,8228,8229],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8231,60],{"id":60},[10,8233,63],{},[65,8235,8237],{"className":67,"code":8236,"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,8238,8239,8244,8249,8254,8259,8264,8268,8273,8278,8282],{"__ignoreMap":70},[74,8240,8241],{"class":76,"line":77},[74,8242,8243],{},"def countdown(start):\n",[74,8245,8246],{"class":76,"line":83},[74,8247,8248],{},"    current = start\n",[74,8250,8251],{"class":76,"line":89},[74,8252,8253],{},"    while current > 0:\n",[74,8255,8256],{"class":76,"line":95},[74,8257,8258],{},"        yield current\n",[74,8260,8261],{"class":76,"line":101},[74,8262,8263],{},"        current = current - 1\n",[74,8265,8266],{"class":76,"line":1147},[74,8267,1095],{"emptyLinePlaceholder":227},[74,8269,8270],{"class":76,"line":2488},[74,8271,8272],{},"iterator = countdown(3)\n",[74,8274,8275],{"class":76,"line":2494},[74,8276,8277],{},"print(next(iterator))\n",[74,8279,8280],{"class":76,"line":3902},[74,8281,8277],{},[74,8283,8284],{"class":76,"line":4114},[74,8285,8277],{},[10,8287,107],{},[65,8289,8292],{"className":8290,"code":8291,"language":113,"meta":70},[111],"3\n2\n1\n",[34,8293,8291],{"__ignoreMap":70},[10,8295,118],{},[14,8297,121],{"id":121},[123,8299,8300,8306],{},[49,8301,7882,8302,8305],{},[34,8303,8304],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[49,8307,8308,8309,8311,8312,8314,8315,8318],{},"每次 ",[34,8310,8215],{}," 运行到下一个 ",[34,8313,8201],{}," 并暂停，局部变量 ",[34,8316,8317],{},"current"," 和执行位置被保留。",[155,8320,157],{"id":157},[10,8322,8323,8324,8326],{},"生成器的暂停位置可以展开成多次 ",[34,8325,8215],{}," 的时间线。",[10,8328,8329],{},[26,8330],{"alt":8331,"src":8332},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8334,8335,8336,8338],{},"每次请求只推进到下一个 ",[34,8337,8201],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8340,172],{"id":172},[46,8342,8343,8346],{},[49,8344,8345],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[49,8347,8348],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8350,183],{"id":183},[123,8352,8353,8356],{},[49,8354,8355],{},"编写产生 1 到指定上限偶数的生成器。",[49,8357,3960,8358,8360,8361,8363],{},[34,8359,4288],{}," 遍历生成器，比较手动 ",[34,8362,8215],{}," 的差异。",[10,8365,201],{},[14,8367,204],{"id":204},[10,8369,8370],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8372,211],{},{"title":70,"searchDepth":83,"depth":83,"links":8374},[8375,8376,8377,8378,8379,8382,8383,8384],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":8380},[8381],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8177,"description":8182},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[130,8392,8393],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8396,"title":8397,"body":8398,"category":130,"cover":224,"description":8402,"extension":225,"meta":8626,"navigation":227,"path":8627,"pinned":229,"publishedAt":230,"seo":8628,"slug":8629,"stem":8630,"summary":8631,"tags":8632,"updatedAt":230,"visible":227,"__hash__":8634},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8399,"toc":8614},[8400,8403,8405,8408,8410,8416,8419,8421,8441,8443,8445,8527,8529,8535,8537,8539,8561,8563,8566,8572,8579,8581,8591,8593,8605,8607,8609,8612],[10,8401,8402],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8404,16],{"id":16},[10,8406,8407],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8409,22],{"id":22},[10,8411,8412],{},[26,8413],{"alt":8414,"src":8415},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8417,8418],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8420,44],{"id":44},[46,8422,8423,8432,8435],{},[49,8424,8425,8428,8429,41],{},[34,8426,8427],{},"@trace"," 等价于 ",[34,8430,8431],{},"add = trace(add)",[49,8433,8434],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[49,8436,8437,8440],{},[34,8438,8439],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8442,60],{"id":60},[10,8444,63],{},[65,8446,8448],{"className":67,"code":8447,"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,8449,8450,8455,8459,8464,8469,8474,8479,8484,8489,8494,8499,8503,8508,8512,8516,8521],{"__ignoreMap":70},[74,8451,8452],{"class":76,"line":77},[74,8453,8454],{},"from functools import wraps\n",[74,8456,8457],{"class":76,"line":83},[74,8458,1095],{"emptyLinePlaceholder":227},[74,8460,8461],{"class":76,"line":89},[74,8462,8463],{},"def trace(function):\n",[74,8465,8466],{"class":76,"line":95},[74,8467,8468],{},"    @wraps(function)\n",[74,8470,8471],{"class":76,"line":101},[74,8472,8473],{},"    def wrapper(*args, **kwargs):\n",[74,8475,8476],{"class":76,"line":1147},[74,8477,8478],{},"        print(\"开始：\", function.__name__)\n",[74,8480,8481],{"class":76,"line":2488},[74,8482,8483],{},"        result = function(*args, **kwargs)\n",[74,8485,8486],{"class":76,"line":2494},[74,8487,8488],{},"        print(\"结束：\", function.__name__)\n",[74,8490,8491],{"class":76,"line":3902},[74,8492,8493],{},"        return result\n",[74,8495,8496],{"class":76,"line":4114},[74,8497,8498],{},"    return wrapper\n",[74,8500,8501],{"class":76,"line":5779},[74,8502,1095],{"emptyLinePlaceholder":227},[74,8504,8505],{"class":76,"line":5784},[74,8506,8507],{},"@trace\n",[74,8509,8510],{"class":76,"line":7389},[74,8511,6132],{},[74,8513,8514],{"class":76,"line":7395},[74,8515,6137],{},[74,8517,8519],{"class":76,"line":8518},15,[74,8520,1095],{"emptyLinePlaceholder":227},[74,8522,8524],{"class":76,"line":8523},16,[74,8525,8526],{},"print(add(2, 3))\n",[10,8528,107],{},[65,8530,8533],{"className":8531,"code":8532,"language":113,"meta":70},[111],"开始： add\n结束： add\n5\n",[34,8534,8532],{"__ignoreMap":70},[10,8536,118],{},[14,8538,121],{"id":121},[123,8540,8541,8558],{},[49,8542,8543,8544,8547,8548,8551,8552,8555,8556,41],{},"解释器执行定义时，把原 ",[34,8545,8546],{},"add"," 函数交给 ",[34,8549,8550],{},"trace","，返回的 ",[34,8553,8554],{},"wrapper"," 重新绑定到名字 ",[34,8557,8546],{},[49,8559,8560],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[155,8562,157],{"id":157},[10,8564,8565],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8567,8568],{},[26,8569],{"alt":8570,"src":8571},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8573,8574,8576,8577,41],{},[34,8575,8427],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8578,8431],{},[14,8580,172],{"id":172},[46,8582,8583,8588],{},[49,8584,8585,8586,41],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8587,5330],{},[49,8589,8590],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8592,183],{"id":183},[123,8594,8595,8598],{},[49,8596,8597],{},"编写只记录调用次数的简单装饰器。",[49,8599,8600,8601,8604],{},"删除包装函数的 ",[34,8602,8603],{},"return result","，观察调用方得到什么。",[10,8606,201],{},[14,8608,204],{"id":204},[10,8610,8611],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8613,211],{},{"title":70,"searchDepth":83,"depth":83,"links":8615},[8616,8617,8618,8619,8620,8623,8624,8625],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":8621},[8622],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8397,"description":8402},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[130,8633,5281],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8636,"title":8637,"body":8638,"category":130,"cover":224,"description":8642,"extension":225,"meta":8829,"navigation":227,"path":8830,"pinned":229,"publishedAt":230,"seo":8831,"slug":8832,"stem":8833,"summary":8834,"tags":8835,"updatedAt":230,"visible":227,"__hash__":8838},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8639,"toc":8817},[8640,8643,8645,8648,8650,8656,8659,8661,8672,8674,8676,8751,8753,8759,8761,8763,8774,8776,8779,8785,8788,8790,8798,8800,8808,8810,8812,8815],[10,8641,8642],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8644,16],{"id":16},[10,8646,8647],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8649,22],{"id":22},[10,8651,8652],{},[26,8653],{"alt":8654,"src":8655},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8657,8658],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8660,44],{"id":44},[46,8662,8663,8666,8669],{},[49,8664,8665],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[49,8667,8668],{},"日志记录运行状态，测试判断结果是否符合约定。",[49,8670,8671],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8673,60],{"id":60},[10,8675,63],{},[65,8677,8679],{"className":67,"code":8678,"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,8680,8681,8686,8691,8695,8700,8704,8709,8714,8719,8723,8728,8733,8738,8742,8746],{"__ignoreMap":70},[74,8682,8683],{"class":76,"line":77},[74,8684,8685],{},"import logging\n",[74,8687,8688],{"class":76,"line":83},[74,8689,8690],{},"import unittest\n",[74,8692,8693],{"class":76,"line":89},[74,8694,1095],{"emptyLinePlaceholder":227},[74,8696,8697],{"class":76,"line":95},[74,8698,8699],{},"logging.basicConfig(level=logging.INFO)\n",[74,8701,8702],{"class":76,"line":101},[74,8703,1095],{"emptyLinePlaceholder":227},[74,8705,8706],{"class":76,"line":1147},[74,8707,8708],{},"def clamp_progress(value):\n",[74,8710,8711],{"class":76,"line":2488},[74,8712,8713],{},"    logging.info(\"检查进度：%s\", value)\n",[74,8715,8716],{"class":76,"line":2494},[74,8717,8718],{},"    return max(0, min(100, value))\n",[74,8720,8721],{"class":76,"line":3902},[74,8722,1095],{"emptyLinePlaceholder":227},[74,8724,8725],{"class":76,"line":4114},[74,8726,8727],{},"class ProgressTest(unittest.TestCase):\n",[74,8729,8730],{"class":76,"line":5779},[74,8731,8732],{},"    def test_upper_limit(self):\n",[74,8734,8735],{"class":76,"line":5784},[74,8736,8737],{},"        self.assertEqual(clamp_progress(120), 100)\n",[74,8739,8740],{"class":76,"line":7389},[74,8741,1095],{"emptyLinePlaceholder":227},[74,8743,8744],{"class":76,"line":7395},[74,8745,6146],{},[74,8747,8748],{"class":76,"line":8518},[74,8749,8750],{},"    unittest.main()\n",[10,8752,107],{},[65,8754,8757],{"className":8755,"code":8756,"language":113,"meta":70},[111],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8758,8756],{"__ignoreMap":70},[10,8760,118],{},[14,8762,121],{"id":121},[123,8764,8765,8771],{},[49,8766,8767,8770],{},[34,8768,8769],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[49,8772,8773],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[155,8775,157],{"id":157},[10,8777,8778],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8780,8781],{},[26,8782],{"alt":8783,"src":8784},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8786,8787],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8789,172],{"id":172},[46,8791,8792,8795],{},[49,8793,8794],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[49,8796,8797],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8799,183],{"id":183},[123,8801,8802,8805],{},[49,8803,8804],{},"为负数进度增加测试。",[49,8806,8807],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8809,201],{},[14,8811,204],{"id":204},[10,8813,8814],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8816,211],{},{"title":70,"searchDepth":83,"depth":83,"links":8818},[8819,8820,8821,8822,8823,8826,8827,8828],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":8824},[8825],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8637,"description":8642},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[130,8836,8837],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8840,"title":8841,"body":8842,"category":130,"cover":224,"description":8846,"extension":225,"meta":9146,"navigation":227,"path":9147,"pinned":229,"publishedAt":230,"seo":9148,"slug":9149,"stem":9150,"summary":9151,"tags":9152,"updatedAt":230,"visible":227,"__hash__":9155},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8843,"toc":9133},[8844,8847,8849,8852,8854,8860,8863,8865,8880,8882,8884,9031,9033,9039,9041,9043,9056,9058,9061,9067,9070,9072,9075,9081,9088,9090,9101,9103,9124,9126,9128,9131],[10,8845,8846],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8848,16],{"id":16},[10,8850,8851],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8853,22],{"id":22},[10,8855,8856],{},[26,8857],{"alt":8858,"src":8859},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8861,8862],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8864,44],{"id":44},[46,8866,8867,8870,8873],{},[49,8868,8869],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[49,8871,8872],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[49,8874,8875,8876,8879],{},"实际扩展前先为 ",[34,8877,8878],{},"add()"," 和存储边界补充测试。",[14,8881,60],{"id":60},[10,8883,63],{},[65,8885,8887],{"className":67,"code":8886,"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,8888,8889,8893,8897,8901,8906,8911,8916,8921,8925,8930,8935,8940,8945,8950,8954,8959,8964,8970,8975,8981,8986,8991,8997,9003,9009,9014,9020,9025],{"__ignoreMap":70},[74,8890,8891],{"class":76,"line":77},[74,8892,6944],{},[74,8894,8895],{"class":76,"line":83},[74,8896,6553],{},[74,8898,8899],{"class":76,"line":89},[74,8900,1095],{"emptyLinePlaceholder":227},[74,8902,8903],{"class":76,"line":95},[74,8904,8905],{},"class LearningRecords:\n",[74,8907,8908],{"class":76,"line":101},[74,8909,8910],{},"    def __init__(self, file_path):\n",[74,8912,8913],{"class":76,"line":1147},[74,8914,8915],{},"        self.file_path = Path(file_path)\n",[74,8917,8918],{"class":76,"line":2488},[74,8919,8920],{},"        self.items = []\n",[74,8922,8923],{"class":76,"line":2494},[74,8924,1095],{"emptyLinePlaceholder":227},[74,8926,8927],{"class":76,"line":3902},[74,8928,8929],{},"    def add(self, title):\n",[74,8931,8932],{"class":76,"line":4114},[74,8933,8934],{},"        title = title.strip()\n",[74,8936,8937],{"class":76,"line":5779},[74,8938,8939],{},"        if not title:\n",[74,8941,8942],{"class":76,"line":5784},[74,8943,8944],{},"            raise ValueError(\"课程名称不能为空\")\n",[74,8946,8947],{"class":76,"line":7389},[74,8948,8949],{},"        self.items.append({\"title\": title, \"done\": False})\n",[74,8951,8952],{"class":76,"line":7395},[74,8953,1095],{"emptyLinePlaceholder":227},[74,8955,8956],{"class":76,"line":8518},[74,8957,8958],{},"    def save(self):\n",[74,8960,8961],{"class":76,"line":8523},[74,8962,8963],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,8965,8967],{"class":76,"line":8966},17,[74,8968,8969],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[74,8971,8973],{"class":76,"line":8972},18,[74,8974,1095],{"emptyLinePlaceholder":227},[74,8976,8978],{"class":76,"line":8977},19,[74,8979,8980],{},"records = LearningRecords(\"learning-records.json\")\n",[74,8982,8984],{"class":76,"line":8983},20,[74,8985,1095],{"emptyLinePlaceholder":227},[74,8987,8989],{"class":76,"line":8988},21,[74,8990,7362],{},[74,8992,8994],{"class":76,"line":8993},22,[74,8995,8996],{},"    title = input(\"输入已学习课程：\")\n",[74,8998,9000],{"class":76,"line":8999},23,[74,9001,9002],{},"    records.add(title)\n",[74,9004,9006],{"class":76,"line":9005},24,[74,9007,9008],{},"    records.save()\n",[74,9010,9012],{"class":76,"line":9011},25,[74,9013,7372],{},[74,9015,9017],{"class":76,"line":9016},26,[74,9018,9019],{},"    print(\"无法保存：\", error)\n",[74,9021,9023],{"class":76,"line":9022},27,[74,9024,1144],{},[74,9026,9028],{"class":76,"line":9027},28,[74,9029,9030],{},"    print(\"已保存 1 条学习记录\")\n",[10,9032,107],{},[65,9034,9037],{"className":9035,"code":9036,"language":113,"meta":70},[111],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9038,9036],{"__ignoreMap":70},[10,9040,118],{},[14,9042,121],{"id":121},[123,9044,9045,9051],{},[49,9046,9047,9048,9050],{},"输入层取得课程名后，",[34,9049,8878],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[49,9052,9053,9055],{},[34,9054,8110],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[155,9057,157],{"id":157},[10,9059,9060],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9062,9063],{},[26,9064],{"alt":9065,"src":9066},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9068,9069],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[155,9071,157],{"id":4169},[10,9073,9074],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9076,9077],{},[26,9078],{"alt":9079,"src":9080},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9082,9083,9084,9087],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9085,9086],{},"load()"," 把文件状态恢复到内存。",[14,9089,172],{"id":172},[46,9091,9092,9095],{},[49,9093,9094],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[49,9096,9097,9098,9100],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9099,9086],{}," 是下一项必要扩展。",[14,9102,183],{"id":183},[123,9104,9105,9111,9114],{},[49,9106,9107,9108,9110],{},"增加 ",[34,9109,9086],{},"，文件不存在时从空列表开始。",[49,9112,9113],{},"增加按序号标记完成的功能，并校验序号范围。",[49,9115,9116,9117,9120,9121,9123],{},"把输入循环放进 ",[34,9118,9119],{},"main()","，通过 ",[34,9122,6088],{}," 控制程序入口。",[10,9125,201],{},[14,9127,204],{"id":204},[10,9129,9130],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,9132,211],{},{"title":70,"searchDepth":83,"depth":83,"links":9134},[9135,9136,9137,9138,9139,9143,9144,9145],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":9140},[9141,9142],{"id":157,"depth":89,"text":157},{"id":4169,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8841,"description":8846},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[130,9153,9154],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9157,9260,9379,9510,9653,9778,9915,10052,10193,10362,10499,10632,10755,10884,11011,11174,11350,11491,11620,11769,11912,12033,12156,12305,12458,12623,12750,12931,13074,13231,13382,13529,13684,13902,14057,14232,14383,14550,14737,14900,15142,15382],{"id":1392,"title":1393,"body":9158,"category":130,"cover":224,"description":1398,"extension":225,"meta":9257,"navigation":227,"path":1517,"pinned":229,"publishedAt":230,"seo":9258,"slug":1519,"stem":1520,"summary":1521,"tags":9259,"updatedAt":230,"visible":227,"__hash__":1524},{"type":7,"value":9159,"toc":9247},[9160,9162,9164,9166,9168,9172,9176,9178,9188,9190,9192,9200,9202,9207,9209,9211,9221,9223,9231,9233,9239,9241,9243,9245],[10,9161,1398],{},[14,9163,16],{"id":16},[10,9165,1403],{},[14,9167,22],{"id":22},[10,9169,9170],{},[26,9171],{"alt":1410,"src":1411},[10,9173,9174,1416],{},[34,9175,1170],{},[14,9177,44],{"id":44},[46,9179,9180,9184,9186],{},[49,9181,1423,9182,1426],{},[34,9183,1170],{},[49,9185,1429],{},[49,9187,1432],{},[14,9189,60],{"id":60},[10,9191,63],{},[65,9193,9194],{"className":67,"code":1439,"language":69,"meta":70,"style":70},[34,9195,9196],{"__ignoreMap":70},[74,9197,9198],{"class":76,"line":77},[74,9199,1439],{},[10,9201,107],{},[65,9203,9205],{"className":9204,"code":1451,"language":113,"meta":70},[111],[34,9206,1451],{"__ignoreMap":70},[10,9208,118],{},[14,9210,121],{"id":121},[123,9212,9213,9217],{},[49,9214,1462,9215,1466],{},[34,9216,1465],{},[49,9218,1469,9219,1473],{},[34,9220,1472],{},[14,9222,172],{"id":172},[46,9224,9225,9227],{},[49,9226,1480],{},[49,9228,1483,9229,1486],{},[34,9230,1170],{},[14,9232,183],{"id":183},[123,9234,9235,9237],{},[49,9236,1493],{},[49,9238,1496],{},[10,9240,201],{},[14,9242,204],{"id":204},[10,9244,1503],{},[209,9246,211],{},{"title":70,"searchDepth":83,"depth":83,"links":9248},[9249,9250,9251,9252,9253,9254,9255,9256],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":1393,"description":1398},[130,1388,1523],{"id":1526,"title":1527,"body":9261,"category":130,"cover":224,"description":1532,"extension":225,"meta":9376,"navigation":227,"path":1669,"pinned":229,"publishedAt":230,"seo":9377,"slug":1671,"stem":1672,"summary":1673,"tags":9378,"updatedAt":230,"visible":227,"__hash__":1676},{"type":7,"value":9262,"toc":9366},[9263,9265,9267,9269,9271,9275,9279,9281,9291,9293,9295,9315,9317,9322,9324,9326,9336,9338,9348,9350,9358,9360,9362,9364],[10,9264,1532],{},[14,9266,16],{"id":16},[10,9268,1537],{},[14,9270,22],{"id":22},[10,9272,9273],{},[26,9274],{"alt":1544,"src":1545},[10,9276,1548,9277,1551],{},[34,9278,688],{},[14,9280,44],{"id":44},[46,9282,9283,9285,9287],{},[49,9284,1558],{},[49,9286,1561],{},[49,9288,1564,9289,1568],{},[34,9290,1567],{},[14,9292,60],{"id":60},[10,9294,1573],{},[65,9296,9297],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,9298,9299,9305],{"__ignoreMap":70},[74,9300,9301,9303],{"class":76,"line":77},[74,9302,688],{"class":597},[74,9304,601],{"class":600},[74,9306,9307,9309,9311,9313],{"class":76,"line":83},[74,9308,688],{"class":597},[74,9310,630],{"class":600},[74,9312,634],{"class":633},[74,9314,601],{"class":600},[10,9316,107],{},[65,9318,9320],{"className":9319,"code":1599,"language":113,"meta":70},[111],[34,9321,1599],{"__ignoreMap":70},[10,9323,118],{},[14,9325,121],{"id":121},[123,9327,9328,9332],{},[49,9329,9330,1613],{},[34,9331,1612],{},[49,9333,9334,1618],{},[34,9335,696],{},[14,9337,172],{"id":172},[46,9339,9340,9344],{},[49,9341,1625,9342,1628],{},[34,9343,688],{},[49,9345,1631,9346,1634],{},[34,9347,688],{},[14,9349,183],{"id":183},[123,9351,9352,9356],{},[49,9353,935,9354,1644],{},[34,9355,1643],{},[49,9357,1647],{},[10,9359,201],{},[14,9361,204],{"id":204},[10,9363,1654],{},[209,9365,1657],{},{"title":70,"searchDepth":83,"depth":83,"links":9367},[9368,9369,9370,9371,9372,9373,9374,9375],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":1527,"description":1532},[130,1675,1049],{"id":1678,"title":1679,"body":9380,"category":130,"cover":224,"description":1845,"extension":225,"meta":9507,"navigation":227,"path":1847,"pinned":229,"publishedAt":230,"seo":9508,"slug":1849,"stem":1850,"summary":1851,"tags":9509,"updatedAt":230,"visible":227,"__hash__":1855},{"type":7,"value":9381,"toc":9497},[9382,9386,9388,9390,9392,9396,9398,9400,9416,9418,9420,9440,9442,9447,9449,9451,9463,9465,9475,9477,9487,9489,9491,9495],[10,9383,1684,9384,1687],{},[34,9385,1170],{},[14,9387,16],{"id":16},[10,9389,1692],{},[14,9391,22],{"id":22},[10,9393,9394],{},[26,9395],{"alt":1699,"src":1700},[10,9397,1703],{},[14,9399,44],{"id":44},[46,9401,9402,9408,9412],{},[49,9403,1710,9404,1713,9406,41],{},[34,9405,688],{},[34,9407,1716],{},[49,9409,1719,9410,1723],{},[34,9411,1722],{},[49,9413,1726,9414,1729],{},[34,9415,1170],{},[14,9417,60],{"id":60},[10,9419,63],{},[65,9421,9422],{"className":1736,"code":1737,"language":1738,"meta":70,"style":70},[34,9423,9424,9428,9432,9436],{"__ignoreMap":70},[74,9425,9426],{"class":76,"line":77},[74,9427,1745],{},[74,9429,9430],{"class":76,"line":83},[74,9431,1750],{},[74,9433,9434],{"class":76,"line":89},[74,9435,1755],{},[74,9437,9438],{"class":76,"line":95},[74,9439,1760],{},[10,9441,107],{},[65,9443,9445],{"className":9444,"code":1766,"language":113,"meta":70},[111],[34,9446,1766],{"__ignoreMap":70},[10,9448,118],{},[14,9450,121],{"id":121},[123,9452,9453,9459],{},[49,9454,1777,9455,1781,9457,41],{},[34,9456,1780],{},[34,9458,1784],{},[49,9460,1787,9461,1790],{},[34,9462,1472],{},[14,9464,172],{"id":172},[46,9466,9467,9473],{},[49,9468,1797,9469,1800,9471,1803],{},[34,9470,1716],{},[34,9472,1170],{},[49,9474,1806],{},[14,9476,183],{"id":183},[123,9478,9479,9483],{},[49,9480,1813,9481,41],{},[34,9482,1816],{},[49,9484,1819,9485,1822],{},[34,9486,1472],{},[10,9488,201],{},[14,9490,204],{"id":204},[10,9492,1829,9493,1832],{},[34,9494,1170],{},[209,9496,211],{},{"title":70,"searchDepth":83,"depth":83,"links":9498},[9499,9500,9501,9502,9503,9504,9505,9506],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":1679,"description":1845},[130,1853,1854],{"id":1857,"title":1858,"body":9511,"category":130,"cover":224,"description":1863,"extension":225,"meta":9650,"navigation":227,"path":2035,"pinned":229,"publishedAt":230,"seo":9651,"slug":2037,"stem":2038,"summary":2039,"tags":9652,"updatedAt":230,"visible":227,"__hash__":2043},{"type":7,"value":9512,"toc":9640},[9513,9515,9517,9519,9521,9525,9529,9531,9543,9545,9547,9583,9585,9590,9592,9594,9610,9612,9622,9624,9632,9634,9636,9638],[10,9514,1863],{},[14,9516,16],{"id":16},[10,9518,1868],{},[14,9520,22],{"id":22},[10,9522,9523],{},[26,9524],{"alt":1875,"src":1876},[10,9526,9527,1882],{},[34,9528,1881],{},[14,9530,44],{"id":44},[46,9532,9533,9535,9541],{},[49,9534,1889],{},[49,9536,9537,1895,9539,1899],{},[34,9538,1894],{},[34,9540,1898],{},[49,9542,1902],{},[14,9544,60],{"id":60},[10,9546,1573],{},[65,9548,9549],{"className":588,"code":1909,"language":590,"meta":70,"style":70},[34,9550,9551,9557,9563,9567,9577],{"__ignoreMap":70},[74,9552,9553,9555],{"class":76,"line":77},[74,9554,1916],{"class":597},[74,9556,1919],{"class":633},[74,9558,9559,9561],{"class":76,"line":83},[74,9560,1924],{"class":600},[74,9562,1919],{"class":633},[74,9564,9565],{"class":76,"line":89},[74,9566,1931],{"class":600},[74,9568,9569,9571,9573,9575],{"class":76,"line":95},[74,9570,1936],{"class":600},[74,9572,1939],{"class":633},[74,9574,1943],{"class":1942},[74,9576,1214],{"class":633},[74,9578,9579,9581],{"class":76,"line":101},[74,9580,688],{"class":597},[74,9582,1214],{"class":633},[10,9584,107],{},[65,9586,9588],{"className":9587,"code":1957,"language":113,"meta":70},[111],[34,9589,1957],{"__ignoreMap":70},[10,9591,118],{},[14,9593,121],{"id":121},[123,9595,9596,9604],{},[49,9597,9598,1970,9600,1973,9602,1976],{},[34,9599,1916],{},[34,9601,1924],{},[34,9603,1894],{},[49,9605,9606,1981,9608,1985],{},[34,9607,1881],{},[34,9609,1984],{},[14,9611,172],{"id":172},[46,9613,9614,9620],{},[49,9615,1992,9616,1156,9618,41],{},[34,9617,1894],{},[34,9619,1898],{},[49,9621,1999],{},[14,9623,183],{"id":183},[123,9625,9626,9630],{},[49,9627,2006,9628,2010],{},[34,9629,2009],{},[49,9631,2013],{},[10,9633,201],{},[14,9635,204],{"id":204},[10,9637,2020],{},[209,9639,2023],{},{"title":70,"searchDepth":83,"depth":83,"links":9641},[9642,9643,9644,9645,9646,9647,9648,9649],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":1858,"description":1863},[130,2041,2042],{"id":2045,"title":2046,"body":9654,"category":130,"cover":224,"description":2051,"extension":225,"meta":9775,"navigation":227,"path":2200,"pinned":229,"publishedAt":230,"seo":9776,"slug":2202,"stem":2203,"summary":2204,"tags":9777,"updatedAt":230,"visible":227,"__hash__":2208},{"type":7,"value":9655,"toc":9765},[9656,9658,9660,9662,9664,9668,9676,9678,9692,9694,9696,9712,9714,9719,9721,9723,9737,9739,9745,9747,9757,9759,9761,9763],[10,9657,2051],{},[14,9659,16],{"id":16},[10,9661,2056],{},[14,9663,22],{"id":22},[10,9665,9666],{},[26,9667],{"alt":2063,"src":2064},[10,9669,2067,9670,41,9672,2073,9674,41],{},[34,9671,1472],{},[34,9673,2072],{},[34,9675,1780],{},[14,9677,44],{"id":44},[46,9679,9680,9684,9690],{},[49,9681,9682,2085],{},[34,9683,2084],{},[49,9685,9686,2091,9688,41],{},[34,9687,2090],{},[34,9689,2094],{},[49,9691,2097],{},[14,9693,60],{"id":60},[10,9695,63],{},[65,9697,9698],{"className":67,"code":2104,"language":69,"meta":70,"style":70},[34,9699,9700,9704,9708],{"__ignoreMap":70},[74,9701,9702],{"class":76,"line":77},[74,9703,2111],{},[74,9705,9706],{"class":76,"line":83},[74,9707,2116],{},[74,9709,9710],{"class":76,"line":89},[74,9711,2121],{},[10,9713,107],{},[65,9715,9717],{"className":9716,"code":2127,"language":113,"meta":70},[111],[34,9718,2127],{"__ignoreMap":70},[10,9720,118],{},[14,9722,121],{"id":121},[123,9724,9725,9731],{},[49,9726,9727,2141,9729,41],{},[34,9728,2140],{},[34,9730,2094],{},[49,9732,9733,2148,9735,2152],{},[34,9734,1472],{},[34,9736,2151],{},[14,9738,172],{"id":172},[46,9740,9741,9743],{},[49,9742,2159],{},[49,9744,2162],{},[14,9746,183],{"id":183},[123,9748,9749,9751],{},[49,9750,2169],{},[49,9752,2172,9753,2175,9755,2179],{},[34,9754,2072],{},[34,9756,2178],{},[10,9758,201],{},[14,9760,204],{"id":204},[10,9762,2186],{},[209,9764,211],{},{"title":70,"searchDepth":83,"depth":83,"links":9766},[9767,9768,9769,9770,9771,9772,9773,9774],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":2046,"description":2051},[130,2206,2207],{"id":2210,"title":2211,"body":9779,"category":130,"cover":224,"description":2216,"extension":225,"meta":9912,"navigation":227,"path":2384,"pinned":229,"publishedAt":230,"seo":9913,"slug":2386,"stem":2387,"summary":2388,"tags":9914,"updatedAt":230,"visible":227,"__hash__":2392},{"type":7,"value":9780,"toc":9902},[9781,9783,9785,9787,9789,9793,9795,9797,9813,9815,9817,9841,9843,9848,9850,9852,9868,9870,9882,9884,9894,9896,9898,9900],[10,9782,2216],{},[14,9784,16],{"id":16},[10,9786,2221],{},[14,9788,22],{"id":22},[10,9790,9791],{},[26,9792],{"alt":2228,"src":2229},[10,9794,2232],{},[14,9796,44],{"id":44},[46,9798,9799,9801,9807],{},[49,9800,2239],{},[49,9802,2242,9803,2175,9805,2249],{},[34,9804,2245],{},[34,9806,2248],{},[49,9808,2252,9809,2256,9811,2260],{},[34,9810,2255],{},[34,9812,2259],{},[14,9814,60],{"id":60},[10,9816,63],{},[65,9818,9819],{"className":67,"code":2267,"language":69,"meta":70,"style":70},[34,9820,9821,9825,9829,9833,9837],{"__ignoreMap":70},[74,9822,9823],{"class":76,"line":77},[74,9824,2274],{},[74,9826,9827],{"class":76,"line":83},[74,9828,2279],{},[74,9830,9831],{"class":76,"line":89},[74,9832,1095],{"emptyLinePlaceholder":227},[74,9834,9835],{"class":76,"line":95},[74,9836,2288],{},[74,9838,9839],{"class":76,"line":101},[74,9840,2279],{},[10,9842,107],{},[65,9844,9846],{"className":9845,"code":2298,"language":113,"meta":70},[111],[34,9847,2298],{"__ignoreMap":70},[10,9849,118],{},[14,9851,121],{"id":121},[123,9853,9854,9860],{},[49,9855,935,9856,2312,9858,2315],{},[34,9857,2311],{},[34,9859,2245],{},[49,9861,935,9862,2321,9864,2325,9866,41],{},[34,9863,2320],{},[34,9865,2324],{},[34,9867,2328],{},[14,9869,172],{"id":172},[46,9871,9872,9874],{},[49,9873,2335],{},[49,9875,2338,9876,2256,9878,2256,9880,2346],{},[34,9877,2255],{},[34,9879,2259],{},[34,9881,2345],{},[14,9883,183],{"id":183},[123,9885,9886,9892],{},[49,9887,2353,9888,1156,9890,2360],{},[34,9889,2356],{},[34,9891,2359],{},[49,9893,2363],{},[10,9895,201],{},[14,9897,204],{"id":204},[10,9899,2370],{},[209,9901,211],{},{"title":70,"searchDepth":83,"depth":83,"links":9903},[9904,9905,9906,9907,9908,9909,9910,9911],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":2211,"description":2216},[130,2390,2391],{"id":2394,"title":2395,"body":9916,"category":130,"cover":224,"description":2400,"extension":225,"meta":10049,"navigation":227,"path":2567,"pinned":229,"publishedAt":230,"seo":10050,"slug":2569,"stem":2570,"summary":2571,"tags":10051,"updatedAt":230,"visible":227,"__hash__":2575},{"type":7,"value":9917,"toc":10039},[9918,9920,9922,9924,9926,9930,9932,9934,9952,9954,9956,9992,9994,9999,10001,10003,10013,10015,10023,10025,10031,10033,10035,10037],[10,9919,2400],{},[14,9921,16],{"id":16},[10,9923,2405],{},[14,9925,22],{"id":22},[10,9927,9928],{},[26,9929],{"alt":2412,"src":2413},[10,9931,2416],{},[14,9933,44],{"id":44},[46,9935,9936,9942,9950],{},[49,9937,9938,2426,9940,2430],{},[34,9939,2425],{},[34,9941,2429],{},[49,9943,9944,2436,9946,2440,9948,2444],{},[34,9945,2435],{},[34,9947,2439],{},[34,9949,2443],{},[49,9951,2447],{},[14,9953,60],{"id":60},[10,9955,63],{},[65,9957,9958],{"className":67,"code":2454,"language":69,"meta":70,"style":70},[34,9959,9960,9964,9968,9972,9976,9980,9984,9988],{"__ignoreMap":70},[74,9961,9962],{"class":76,"line":77},[74,9963,2461],{},[74,9965,9966],{"class":76,"line":83},[74,9967,2466],{},[74,9969,9970],{"class":76,"line":89},[74,9971,2471],{},[74,9973,9974],{"class":76,"line":95},[74,9975,1095],{"emptyLinePlaceholder":227},[74,9977,9978],{"class":76,"line":101},[74,9979,2480],{},[74,9981,9982],{"class":76,"line":1147},[74,9983,2485],{},[74,9985,9986],{"class":76,"line":2488},[74,9987,2491],{},[74,9989,9990],{"class":76,"line":2494},[74,9991,2497],{},[10,9993,107],{},[65,9995,9997],{"className":9996,"code":2503,"language":113,"meta":70},[111],[34,9998,2503],{"__ignoreMap":70},[10,10000,118],{},[14,10002,121],{"id":121},[123,10004,10005,10009],{},[49,10006,10007,2517],{},[34,10008,2516],{},[49,10010,10011,2523],{},[34,10012,2522],{},[14,10014,172],{"id":172},[46,10016,10017,10021],{},[49,10018,2530,10019,41],{},[34,10020,2533],{},[49,10022,2536],{},[14,10024,183],{"id":183},[123,10026,10027,10029],{},[49,10028,2543],{},[49,10030,2546],{},[10,10032,201],{},[14,10034,204],{"id":204},[10,10036,2553],{},[209,10038,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10040},[10041,10042,10043,10044,10045,10046,10047,10048],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":2395,"description":2400},[130,2573,2574],{"id":4,"title":5,"body":10053,"category":130,"cover":224,"description":12,"extension":225,"meta":10190,"navigation":227,"path":228,"pinned":229,"publishedAt":230,"seo":10191,"slug":232,"stem":233,"summary":234,"tags":10192,"updatedAt":230,"visible":227,"__hash__":238},{"type":7,"value":10054,"toc":10178},[10055,10057,10059,10061,10063,10067,10073,10075,10083,10085,10087,10111,10113,10118,10120,10122,10140,10142,10144,10148,10150,10152,10158,10160,10170,10172,10174,10176],[10,10056,12],{},[14,10058,16],{"id":16},[10,10060,19],{},[14,10062,22],{"id":22},[10,10064,10065],{},[26,10066],{"alt":28,"src":29},[10,10068,32,10069,37,10071,41],{},[34,10070,36],{},[34,10072,40],{},[14,10074,44],{"id":44},[46,10076,10077,10079,10081],{},[49,10078,51],{},[49,10080,54],{},[49,10082,57],{},[14,10084,60],{"id":60},[10,10086,63],{},[65,10088,10089],{"className":67,"code":68,"language":69,"meta":70,"style":70},[34,10090,10091,10095,10099,10103,10107],{"__ignoreMap":70},[74,10092,10093],{"class":76,"line":77},[74,10094,80],{},[74,10096,10097],{"class":76,"line":83},[74,10098,86],{},[74,10100,10101],{"class":76,"line":89},[74,10102,92],{},[74,10104,10105],{"class":76,"line":95},[74,10106,98],{},[74,10108,10109],{"class":76,"line":101},[74,10110,104],{},[10,10112,107],{},[65,10114,10116],{"className":10115,"code":112,"language":113,"meta":70},[111],[34,10117,112],{"__ignoreMap":70},[10,10119,118],{},[14,10121,121],{"id":121},[123,10123,10124,10132],{},[49,10125,127,10126,131,10128,135,10130,139],{},[34,10127,130],{},[34,10129,134],{},[34,10131,138],{},[49,10133,10134,145,10136,149,10138,153],{},[34,10135,144],{},[34,10137,148],{},[34,10139,152],{},[155,10141,157],{"id":157},[10,10143,160],{},[10,10145,10146],{},[26,10147],{"alt":165,"src":166},[10,10149,169],{},[14,10151,172],{"id":172},[46,10153,10154,10156],{},[49,10155,177],{},[49,10157,180],{},[14,10159,183],{"id":183},[123,10161,10162,10168],{},[49,10163,188,10164,192,10166,41],{},[34,10165,191],{},[34,10167,195],{},[49,10169,198],{},[10,10171,201],{},[14,10173,204],{"id":204},[10,10175,207],{},[209,10177,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10179},[10180,10181,10182,10183,10184,10187,10188,10189],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":10185},[10186],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5,"description":12},[130,236,237],{"id":2718,"title":2719,"body":10194,"category":130,"cover":224,"description":2724,"extension":225,"meta":10359,"navigation":227,"path":2939,"pinned":229,"publishedAt":230,"seo":10360,"slug":2941,"stem":2942,"summary":2943,"tags":10361,"updatedAt":230,"visible":227,"__hash__":2947},{"type":7,"value":10195,"toc":10347},[10196,10198,10200,10202,10204,10208,10214,10216,10236,10238,10240,10276,10278,10283,10285,10287,10301,10303,10305,10309,10315,10317,10327,10329,10339,10341,10343,10345],[10,10197,2724],{},[14,10199,16],{"id":16},[10,10201,2729],{},[14,10203,22],{"id":22},[10,10205,10206],{},[26,10207],{"alt":2736,"src":2737},[10,10209,2740,10210,1006,10212,2747],{},[34,10211,2743],{},[34,10213,2746],{},[14,10215,44],{"id":44},[46,10217,10218,10226,10234],{},[49,10219,10220,2757,10222,2761,10224,2765],{},[34,10221,2756],{},[34,10223,2760],{},[34,10225,2764],{},[49,10227,10228,2771,10230,2775,10232,2779],{},[34,10229,2770],{},[34,10231,2774],{},[34,10233,2778],{},[49,10235,2782],{},[14,10237,60],{"id":60},[10,10239,63],{},[65,10241,10242],{"className":67,"code":2789,"language":69,"meta":70,"style":70},[34,10243,10244,10248,10252,10256,10260,10264,10268,10272],{"__ignoreMap":70},[74,10245,10246],{"class":76,"line":77},[74,10247,2796],{},[74,10249,10250],{"class":76,"line":83},[74,10251,2801],{},[74,10253,10254],{"class":76,"line":89},[74,10255,1095],{"emptyLinePlaceholder":227},[74,10257,10258],{"class":76,"line":95},[74,10259,2810],{},[74,10261,10262],{"class":76,"line":101},[74,10263,2815],{},[74,10265,10266],{"class":76,"line":1147},[74,10267,2820],{},[74,10269,10270],{"class":76,"line":2488},[74,10271,2825],{},[74,10273,10274],{"class":76,"line":2494},[74,10275,2830],{},[10,10277,107],{},[65,10279,10281],{"className":10280,"code":2836,"language":113,"meta":70},[111],[34,10282,2836],{"__ignoreMap":70},[10,10284,118],{},[14,10286,121],{"id":121},[123,10288,10289,10295],{},[49,10290,10291,2850,10293,2854],{},[34,10292,2849],{},[34,10294,2853],{},[49,10296,10297,2860,10299,2863],{},[34,10298,2859],{},[34,10300,2778],{},[155,10302,157],{"id":157},[10,10304,2868],{},[10,10306,10307],{},[26,10308],{"alt":2873,"src":2874},[10,10310,10311,2879,10313,2882],{},[34,10312,2770],{},[34,10314,2774],{},[14,10316,172],{"id":172},[46,10318,10319,10325],{},[49,10320,2889,10321,2892,10323,2895],{},[34,10322,2764],{},[34,10324,2756],{},[49,10326,2898],{},[14,10328,183],{"id":183},[123,10330,10331,10335],{},[49,10332,2905,10333,2909],{},[34,10334,2908],{},[49,10336,2912,10337,2916],{},[34,10338,2915],{},[10,10340,201],{},[14,10342,204],{"id":204},[10,10344,2923],{},[209,10346,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10348},[10349,10350,10351,10352,10353,10356,10357,10358],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":10354},[10355],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":2719,"description":2724},[130,2945,2946],{"id":2949,"title":2950,"body":10363,"category":130,"cover":224,"description":2955,"extension":225,"meta":10496,"navigation":227,"path":3124,"pinned":229,"publishedAt":230,"seo":10497,"slug":3126,"stem":3127,"summary":3128,"tags":10498,"updatedAt":230,"visible":227,"__hash__":3131},{"type":7,"value":10364,"toc":10486},[10365,10367,10369,10371,10373,10377,10387,10389,10399,10401,10403,10431,10433,10438,10440,10442,10456,10458,10466,10468,10478,10480,10482,10484],[10,10366,2955],{},[14,10368,16],{"id":16},[10,10370,2960],{},[14,10372,22],{"id":22},[10,10374,10375],{},[26,10376],{"alt":2967,"src":2968},[10,10378,10379,2974,10381,2978,10383,2982,10385,2986],{},[34,10380,2973],{},[34,10382,2977],{},[34,10384,2981],{},[34,10386,2985],{},[14,10388,44],{"id":44},[46,10390,10391,10393,10397],{},[49,10392,2993],{},[49,10394,10395,2998],{},[34,10396,2985],{},[49,10398,3001],{},[14,10400,60],{"id":60},[10,10402,63],{},[65,10404,10405],{"className":67,"code":3008,"language":69,"meta":70,"style":70},[34,10406,10407,10411,10415,10419,10423,10427],{"__ignoreMap":70},[74,10408,10409],{"class":76,"line":77},[74,10410,3015],{},[74,10412,10413],{"class":76,"line":83},[74,10414,3020],{},[74,10416,10417],{"class":76,"line":89},[74,10418,3025],{},[74,10420,10421],{"class":76,"line":95},[74,10422,1095],{"emptyLinePlaceholder":227},[74,10424,10425],{"class":76,"line":101},[74,10426,3034],{},[74,10428,10429],{"class":76,"line":1147},[74,10430,3039],{},[10,10432,107],{},[65,10434,10436],{"className":10435,"code":3045,"language":113,"meta":70},[111],[34,10437,3045],{"__ignoreMap":70},[10,10439,118],{},[14,10441,121],{"id":121},[123,10443,10444,10450],{},[49,10445,3056,10446,3059,10448,3063],{},[34,10447,2973],{},[34,10449,3062],{},[49,10451,10452,3069,10454,3073],{},[34,10453,3068],{},[34,10455,3072],{},[14,10457,172],{"id":172},[46,10459,10460,10464],{},[49,10461,3080,10462,3084],{},[34,10463,3083],{},[49,10465,3087],{},[14,10467,183],{"id":183},[123,10469,10470,10472],{},[49,10471,3094],{},[49,10473,1719,10474,3100,10476,3103],{},[34,10475,3099],{},[34,10477,2985],{},[10,10479,201],{},[14,10481,204],{"id":204},[10,10483,3110],{},[209,10485,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10487},[10488,10489,10490,10491,10492,10493,10494,10495],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":2950,"description":2955},[130,2345,3130],{"id":3133,"title":3134,"body":10500,"category":130,"cover":224,"description":3139,"extension":225,"meta":10629,"navigation":227,"path":3300,"pinned":229,"publishedAt":230,"seo":10630,"slug":3302,"stem":3303,"summary":3304,"tags":10631,"updatedAt":230,"visible":227,"__hash__":3308},{"type":7,"value":10501,"toc":10619},[10502,10504,10506,10508,10510,10514,10518,10520,10530,10532,10534,10566,10568,10573,10575,10577,10589,10591,10601,10603,10611,10613,10615,10617],[10,10503,3139],{},[14,10505,16],{"id":16},[10,10507,3144],{},[14,10509,22],{"id":22},[10,10511,10512],{},[26,10513],{"alt":3151,"src":3152},[10,10515,3155,10516,3159],{},[34,10517,3158],{},[14,10519,44],{"id":44},[46,10521,10522,10524,10526],{},[49,10523,3166],{},[49,10525,3169],{},[49,10527,3172,10528,41],{},[34,10529,3175],{},[14,10531,60],{"id":60},[10,10533,63],{},[65,10535,10536],{"className":67,"code":3182,"language":69,"meta":70,"style":70},[34,10537,10538,10542,10546,10550,10554,10558,10562],{"__ignoreMap":70},[74,10539,10540],{"class":76,"line":77},[74,10541,3189],{},[74,10543,10544],{"class":76,"line":83},[74,10545,3194],{},[74,10547,10548],{"class":76,"line":89},[74,10549,1095],{"emptyLinePlaceholder":227},[74,10551,10552],{"class":76,"line":95},[74,10553,3203],{},[74,10555,10556],{"class":76,"line":101},[74,10557,3208],{},[74,10559,10560],{"class":76,"line":1147},[74,10561,3213],{},[74,10563,10564],{"class":76,"line":2488},[74,10565,3218],{},[10,10567,107],{},[65,10569,10571],{"className":10570,"code":3224,"language":113,"meta":70},[111],[34,10572,3224],{"__ignoreMap":70},[10,10574,118],{},[14,10576,121],{"id":121},[123,10578,10579,10581],{},[49,10580,3235],{},[49,10582,10583,3241,10585,3245,10587,3249],{},[34,10584,3240],{},[34,10586,3244],{},[34,10588,3248],{},[14,10590,172],{"id":172},[46,10592,10593,10599],{},[49,10594,3256,10595,3260,10597,41],{},[34,10596,3259],{},[34,10598,3263],{},[49,10600,3266],{},[14,10602,183],{"id":183},[123,10604,10605,10607],{},[49,10606,3273],{},[49,10608,3276,10609,3279],{},[34,10610,3248],{},[10,10612,201],{},[14,10614,204],{"id":204},[10,10616,3286],{},[209,10618,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10620},[10621,10622,10623,10624,10625,10626,10627,10628],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":3134,"description":3139},[130,3306,3307],{"id":3310,"title":3311,"body":10633,"category":130,"cover":224,"description":3316,"extension":225,"meta":10752,"navigation":227,"path":3458,"pinned":229,"publishedAt":230,"seo":10753,"slug":3460,"stem":3461,"summary":3462,"tags":10754,"updatedAt":230,"visible":227,"__hash__":3465},{"type":7,"value":10634,"toc":10742},[10635,10637,10639,10641,10643,10647,10649,10651,10659,10661,10663,10691,10693,10698,10700,10702,10712,10714,10722,10724,10734,10736,10738,10740],[10,10636,3316],{},[14,10638,16],{"id":16},[10,10640,3321],{},[14,10642,22],{"id":22},[10,10644,10645],{},[26,10646],{"alt":3328,"src":3329},[10,10648,3332],{},[14,10650,44],{"id":44},[46,10652,10653,10655,10657],{},[49,10654,3339],{},[49,10656,3342],{},[49,10658,3345],{},[14,10660,60],{"id":60},[10,10662,63],{},[65,10664,10665],{"className":67,"code":3352,"language":69,"meta":70,"style":70},[34,10666,10667,10671,10675,10679,10683,10687],{"__ignoreMap":70},[74,10668,10669],{"class":76,"line":77},[74,10670,3359],{},[74,10672,10673],{"class":76,"line":83},[74,10674,3364],{},[74,10676,10677],{"class":76,"line":89},[74,10678,3369],{},[74,10680,10681],{"class":76,"line":95},[74,10682,1095],{"emptyLinePlaceholder":227},[74,10684,10685],{"class":76,"line":101},[74,10686,3378],{},[74,10688,10689],{"class":76,"line":1147},[74,10690,3383],{},[10,10692,107],{},[65,10694,10696],{"className":10695,"code":3389,"language":113,"meta":70},[111],[34,10697,3389],{"__ignoreMap":70},[10,10699,118],{},[14,10701,121],{"id":121},[123,10703,10704,10708],{},[49,10705,10706,3403],{},[34,10707,3402],{},[49,10709,10710,3409],{},[34,10711,3408],{},[14,10713,172],{"id":172},[46,10715,10716,10720],{},[49,10717,3416,10718,3420],{},[34,10719,3419],{},[49,10721,3423],{},[14,10723,183],{"id":183},[123,10725,10726,10728],{},[49,10727,3430],{},[49,10729,2172,10730,2175,10732,3437],{},[34,10731,3419],{},[34,10733,3408],{},[10,10735,201],{},[14,10737,204],{"id":204},[10,10739,3444],{},[209,10741,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10743},[10744,10745,10746,10747,10748,10749,10750,10751],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":3311,"description":3316},[130,3464,3307],{"id":3467,"title":3468,"body":10756,"category":130,"cover":224,"description":3473,"extension":225,"meta":10881,"navigation":227,"path":3629,"pinned":229,"publishedAt":230,"seo":10882,"slug":3631,"stem":3632,"summary":3633,"tags":10883,"updatedAt":230,"visible":227,"__hash__":3636},{"type":7,"value":10757,"toc":10871},[10758,10760,10762,10764,10766,10770,10776,10778,10788,10790,10792,10820,10822,10827,10829,10831,10841,10843,10855,10857,10863,10865,10867,10869],[10,10759,3473],{},[14,10761,16],{"id":16},[10,10763,3478],{},[14,10765,22],{"id":22},[10,10767,10768],{},[26,10769],{"alt":3485,"src":3486},[10,10771,3489,10772,3493,10774,3496],{},[34,10773,3492],{},[34,10775,2245],{},[14,10777,44],{"id":44},[46,10779,10780,10782,10786],{},[49,10781,3503],{},[49,10783,2338,10784,3509],{},[34,10785,3508],{},[49,10787,3512],{},[14,10789,60],{"id":60},[10,10791,63],{},[65,10793,10794],{"className":67,"code":3519,"language":69,"meta":70,"style":70},[34,10795,10796,10800,10804,10808,10812,10816],{"__ignoreMap":70},[74,10797,10798],{"class":76,"line":77},[74,10799,3526],{},[74,10801,10802],{"class":76,"line":83},[74,10803,3531],{},[74,10805,10806],{"class":76,"line":89},[74,10807,1095],{"emptyLinePlaceholder":227},[74,10809,10810],{"class":76,"line":95},[74,10811,3540],{},[74,10813,10814],{"class":76,"line":101},[74,10815,3545],{},[74,10817,10818],{"class":76,"line":1147},[74,10819,3550],{},[10,10821,107],{},[65,10823,10825],{"className":10824,"code":3556,"language":113,"meta":70},[111],[34,10826,3556],{"__ignoreMap":70},[10,10828,118],{},[14,10830,121],{"id":121},[123,10832,10833,10835],{},[49,10834,3567],{},[49,10836,3570,10837,3573,10839,3577],{},[34,10838,2245],{},[34,10840,3576],{},[14,10842,172],{"id":172},[46,10844,10845,10849],{},[49,10846,3584,10847,3588],{},[34,10848,3587],{},[49,10850,3591,10851,3595,10853,41],{},[34,10852,3594],{},[34,10854,3598],{},[14,10856,183],{"id":183},[123,10858,10859,10861],{},[49,10860,3605],{},[49,10862,3608],{},[10,10864,201],{},[14,10866,204],{"id":204},[10,10868,3615],{},[209,10870,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10872},[10873,10874,10875,10876,10877,10878,10879,10880],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":3468,"description":3473},[130,3635,3307],{"id":3638,"title":3639,"body":10885,"category":130,"cover":224,"description":3644,"extension":225,"meta":11008,"navigation":227,"path":3794,"pinned":229,"publishedAt":230,"seo":11009,"slug":3796,"stem":3797,"summary":3798,"tags":11010,"updatedAt":230,"visible":227,"__hash__":3801},{"type":7,"value":10886,"toc":10998},[10887,10889,10891,10893,10895,10899,10901,10903,10915,10917,10919,10947,10949,10954,10956,10958,10968,10970,10980,10982,10990,10992,10994,10996],[10,10888,3644],{},[14,10890,16],{"id":16},[10,10892,3649],{},[14,10894,22],{"id":22},[10,10896,10897],{},[26,10898],{"alt":3656,"src":3657},[10,10900,3660],{},[14,10902,44],{"id":44},[46,10904,10905,10907,10909],{},[49,10906,3667],{},[49,10908,3670],{},[49,10910,3673,10911,3677,10913,3681],{},[34,10912,3676],{},[34,10914,3680],{},[14,10916,60],{"id":60},[10,10918,63],{},[65,10920,10921],{"className":67,"code":3688,"language":69,"meta":70,"style":70},[34,10922,10923,10927,10931,10935,10939,10943],{"__ignoreMap":70},[74,10924,10925],{"class":76,"line":77},[74,10926,3695],{},[74,10928,10929],{"class":76,"line":83},[74,10930,3700],{},[74,10932,10933],{"class":76,"line":89},[74,10934,1095],{"emptyLinePlaceholder":227},[74,10936,10937],{"class":76,"line":95},[74,10938,3709],{},[74,10940,10941],{"class":76,"line":101},[74,10942,3714],{},[74,10944,10945],{"class":76,"line":1147},[74,10946,3719],{},[10,10948,107],{},[65,10950,10952],{"className":10951,"code":3725,"language":113,"meta":70},[111],[34,10953,3725],{"__ignoreMap":70},[10,10955,118],{},[14,10957,121],{"id":121},[123,10959,10960,10962],{},[49,10961,3736],{},[49,10963,10964,3742,10966,3746],{},[34,10965,3741],{},[34,10967,3745],{},[14,10969,172],{"id":172},[46,10971,10972,10978],{},[49,10973,2338,10974,3755,10976,41],{},[34,10975,3680],{},[34,10977,3676],{},[49,10979,3760],{},[14,10981,183],{"id":183},[123,10983,10984,10988],{},[49,10985,3767,10986,3770],{},[34,10987,3676],{},[49,10989,3773],{},[10,10991,201],{},[14,10993,204],{"id":204},[10,10995,3780],{},[209,10997,211],{},{"title":70,"searchDepth":83,"depth":83,"links":10999},[11000,11001,11002,11003,11004,11005,11006,11007],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":3639,"description":3644},[130,3800,3307],{"id":3803,"title":3804,"body":11012,"category":130,"cover":224,"description":3809,"extension":225,"meta":11171,"navigation":227,"path":4008,"pinned":229,"publishedAt":230,"seo":11172,"slug":4010,"stem":4011,"summary":4012,"tags":11173,"updatedAt":230,"visible":227,"__hash__":4016},{"type":7,"value":11013,"toc":11159},[11014,11016,11018,11020,11022,11026,11032,11034,11046,11048,11050,11090,11092,11097,11099,11101,11115,11117,11119,11123,11125,11127,11137,11139,11151,11153,11155,11157],[10,11015,3809],{},[14,11017,16],{"id":16},[10,11019,3814],{},[14,11021,22],{"id":22},[10,11023,11024],{},[26,11025],{"alt":3821,"src":3822},[10,11027,11028,3828,11030,3832],{},[34,11029,3827],{},[34,11031,3831],{},[14,11033,44],{"id":44},[46,11035,11036,11042,11044],{},[49,11037,11038,3841,11040,3845],{},[34,11039,2756],{},[34,11041,3844],{},[49,11043,3848],{},[49,11045,3851],{},[14,11047,60],{"id":60},[10,11049,63],{},[65,11051,11052],{"className":67,"code":3858,"language":69,"meta":70,"style":70},[34,11053,11054,11058,11062,11066,11070,11074,11078,11082,11086],{"__ignoreMap":70},[74,11055,11056],{"class":76,"line":77},[74,11057,3865],{},[74,11059,11060],{"class":76,"line":83},[74,11061,3870],{},[74,11063,11064],{"class":76,"line":89},[74,11065,3875],{},[74,11067,11068],{"class":76,"line":95},[74,11069,1095],{"emptyLinePlaceholder":227},[74,11071,11072],{"class":76,"line":101},[74,11073,3884],{},[74,11075,11076],{"class":76,"line":1147},[74,11077,3889],{},[74,11079,11080],{"class":76,"line":2488},[74,11081,3894],{},[74,11083,11084],{"class":76,"line":2494},[74,11085,3899],{},[74,11087,11088],{"class":76,"line":3902},[74,11089,3905],{},[10,11091,107],{},[65,11093,11095],{"className":11094,"code":3911,"language":113,"meta":70},[111],[34,11096,3911],{"__ignoreMap":70},[10,11098,118],{},[14,11100,121],{"id":121},[123,11102,11103,11107],{},[49,11104,11105,3925],{},[34,11106,3924],{},[49,11108,11109,3931,11111,3935,11113,3939],{},[34,11110,3930],{},[34,11112,3934],{},[34,11114,3938],{},[155,11116,157],{"id":157},[10,11118,3944],{},[10,11120,11121],{},[26,11122],{"alt":3949,"src":3950},[10,11124,3953],{},[14,11126,172],{"id":172},[46,11128,11129,11135],{},[49,11130,3960,11131,3963,11133,41],{},[34,11132,2756],{},[34,11134,3844],{},[49,11136,3968],{},[14,11138,183],{"id":183},[123,11140,11141,11143],{},[49,11142,3975],{},[49,11144,2338,11145,3981,11147,1156,11149,41],{},[34,11146,3980],{},[34,11148,3844],{},[34,11150,2756],{},[10,11152,201],{},[14,11154,204],{"id":204},[10,11156,3992],{},[209,11158,211],{},{"title":70,"searchDepth":83,"depth":83,"links":11160},[11161,11162,11163,11164,11165,11168,11169,11170],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":11166},[11167],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":3804,"description":3809},[130,4014,4015],{"id":4018,"title":4019,"body":11175,"category":130,"cover":224,"description":4024,"extension":225,"meta":11347,"navigation":227,"path":4238,"pinned":229,"publishedAt":230,"seo":11348,"slug":4240,"stem":4241,"summary":4242,"tags":11349,"updatedAt":230,"visible":227,"__hash__":4245},{"type":7,"value":11176,"toc":11334},[11177,11179,11181,11183,11185,11189,11197,11199,11207,11209,11211,11255,11257,11262,11264,11266,11278,11280,11282,11286,11292,11294,11296,11300,11304,11306,11318,11320,11326,11328,11330,11332],[10,11178,4024],{},[14,11180,16],{"id":16},[10,11182,4029],{},[14,11184,22],{"id":22},[10,11186,11187],{},[26,11188],{"alt":4036,"src":4037},[10,11190,11191,2256,11193,2256,11195,4047],{},[34,11192,1155],{},[34,11194,4044],{},[34,11196,1159],{},[14,11198,44],{"id":44},[46,11200,11201,11203,11205],{},[49,11202,4054],{},[49,11204,4057],{},[49,11206,4060],{},[14,11208,60],{"id":60},[10,11210,63],{},[65,11212,11213],{"className":67,"code":4067,"language":69,"meta":70,"style":70},[34,11214,11215,11219,11223,11227,11231,11235,11239,11243,11247,11251],{"__ignoreMap":70},[74,11216,11217],{"class":76,"line":77},[74,11218,4074],{},[74,11220,11221],{"class":76,"line":83},[74,11222,1095],{"emptyLinePlaceholder":227},[74,11224,11225],{"class":76,"line":89},[74,11226,4083],{},[74,11228,11229],{"class":76,"line":95},[74,11230,4088],{},[74,11232,11233],{"class":76,"line":101},[74,11234,4093],{},[74,11236,11237],{"class":76,"line":1147},[74,11238,4098],{},[74,11240,11241],{"class":76,"line":2488},[74,11242,1144],{},[74,11244,11245],{"class":76,"line":2494},[74,11246,4107],{},[74,11248,11249],{"class":76,"line":3902},[74,11250,1095],{"emptyLinePlaceholder":227},[74,11252,11253],{"class":76,"line":4114},[74,11254,4117],{},[10,11256,107],{},[65,11258,11260],{"className":11259,"code":4123,"language":113,"meta":70},[111],[34,11261,4123],{"__ignoreMap":70},[10,11263,118],{},[14,11265,121],{"id":121},[123,11267,11268,11272],{},[49,11269,4134,11270,4138],{},[34,11271,4137],{},[49,11273,11274,4144,11276,4147],{},[34,11275,4143],{},[34,11277,1159],{},[155,11279,157],{"id":157},[10,11281,4152],{},[10,11283,11284],{},[26,11285],{"alt":4157,"src":4158},[10,11287,11288,4163,11290,4166],{},[34,11289,4137],{},[34,11291,4143],{},[155,11293,157],{"id":4169},[10,11295,4172],{},[10,11297,11298],{},[26,11299],{"alt":4177,"src":4178},[10,11301,4181,11302,4184],{},[34,11303,1155],{},[14,11305,172],{"id":172},[46,11307,11308,11312],{},[49,11309,4191,11310,4194],{},[34,11311,4143],{},[49,11313,4197,11314,4200,11316,4204],{},[34,11315,1155],{},[34,11317,4203],{},[14,11319,183],{"id":183},[123,11321,11322,11324],{},[49,11323,4211],{},[49,11325,4214],{},[10,11327,201],{},[14,11329,204],{"id":204},[10,11331,4221],{},[209,11333,211],{},{"title":70,"searchDepth":83,"depth":83,"links":11335},[11336,11337,11338,11339,11340,11344,11345,11346],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":11341},[11342,11343],{"id":157,"depth":89,"text":157},{"id":4169,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":4019,"description":4024},[130,1155,4244],{"id":4247,"title":4248,"body":11351,"category":130,"cover":224,"description":4253,"extension":225,"meta":11488,"navigation":227,"path":4420,"pinned":229,"publishedAt":230,"seo":11489,"slug":4422,"stem":4423,"summary":4424,"tags":11490,"updatedAt":230,"visible":227,"__hash__":4427},{"type":7,"value":11352,"toc":11476},[11353,11355,11357,11359,11361,11365,11369,11371,11381,11383,11385,11417,11419,11424,11426,11428,11438,11440,11442,11446,11450,11452,11458,11460,11468,11470,11472,11474],[10,11354,4253],{},[14,11356,16],{"id":16},[10,11358,4258],{},[14,11360,22],{"id":22},[10,11362,11363],{},[26,11364],{"alt":4265,"src":4266},[10,11366,11367,4272],{},[34,11368,4271],{},[14,11370,44],{"id":44},[46,11372,11373,11375,11377],{},[49,11374,4279],{},[49,11376,4282],{},[49,11378,4285,11379,4289],{},[34,11380,4288],{},[14,11382,60],{"id":60},[10,11384,63],{},[65,11386,11387],{"className":67,"code":4296,"language":69,"meta":70,"style":70},[34,11388,11389,11393,11397,11401,11405,11409,11413],{"__ignoreMap":70},[74,11390,11391],{"class":76,"line":77},[74,11392,4303],{},[74,11394,11395],{"class":76,"line":83},[74,11396,1095],{"emptyLinePlaceholder":227},[74,11398,11399],{"class":76,"line":89},[74,11400,4312],{},[74,11402,11403],{"class":76,"line":95},[74,11404,4317],{},[74,11406,11407],{"class":76,"line":101},[74,11408,4322],{},[74,11410,11411],{"class":76,"line":1147},[74,11412,1095],{"emptyLinePlaceholder":227},[74,11414,11415],{"class":76,"line":2488},[74,11416,4331],{},[10,11418,107],{},[65,11420,11422],{"className":11421,"code":4337,"language":113,"meta":70},[111],[34,11423,4337],{"__ignoreMap":70},[10,11425,118],{},[14,11427,121],{"id":121},[123,11429,11430,11434],{},[49,11431,4348,11432,4352],{},[34,11433,4351],{},[49,11435,4355,11436,4358],{},[34,11437,4351],{},[155,11439,157],{"id":157},[10,11441,4363],{},[10,11443,11444],{},[26,11445],{"alt":4368,"src":4369},[10,11447,4372,11448,4375],{},[34,11449,4351],{},[14,11451,172],{"id":172},[46,11453,11454,11456],{},[49,11455,4382],{},[49,11457,4385],{},[14,11459,183],{"id":183},[123,11461,11462,11466],{},[49,11463,2338,11464,4394],{},[34,11465,4271],{},[49,11467,4397],{},[10,11469,201],{},[14,11471,204],{"id":204},[10,11473,4404],{},[209,11475,211],{},{"title":70,"searchDepth":83,"depth":83,"links":11477},[11478,11479,11480,11481,11482,11485,11486,11487],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":11483},[11484],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":4248,"description":4253},[130,4271,4426],{"id":4429,"title":4430,"body":11492,"category":130,"cover":224,"description":4435,"extension":225,"meta":11617,"navigation":227,"path":4584,"pinned":229,"publishedAt":230,"seo":11618,"slug":4586,"stem":4587,"summary":4588,"tags":11619,"updatedAt":230,"visible":227,"__hash__":4591},{"type":7,"value":11493,"toc":11607},[11494,11496,11498,11500,11502,11506,11510,11512,11522,11524,11526,11558,11560,11565,11567,11569,11581,11583,11589,11591,11599,11601,11603,11605],[10,11495,4435],{},[14,11497,16],{"id":16},[10,11499,4440],{},[14,11501,22],{"id":22},[10,11503,11504],{},[26,11505],{"alt":4447,"src":4448},[10,11507,11508,4453],{},[34,11509,4288],{},[14,11511,44],{"id":44},[46,11513,11514,11518,11520],{},[49,11515,11516,4463],{},[34,11517,4462],{},[49,11519,4466],{},[49,11521,4469],{},[14,11523,60],{"id":60},[10,11525,63],{},[65,11527,11528],{"className":67,"code":4476,"language":69,"meta":70,"style":70},[34,11529,11530,11534,11538,11542,11546,11550,11554],{"__ignoreMap":70},[74,11531,11532],{"class":76,"line":77},[74,11533,4483],{},[74,11535,11536],{"class":76,"line":83},[74,11537,1095],{"emptyLinePlaceholder":227},[74,11539,11540],{"class":76,"line":89},[74,11541,4492],{},[74,11543,11544],{"class":76,"line":95},[74,11545,4497],{},[74,11547,11548],{"class":76,"line":101},[74,11549,1095],{"emptyLinePlaceholder":227},[74,11551,11552],{"class":76,"line":1147},[74,11553,4506],{},[74,11555,11556],{"class":76,"line":2488},[74,11557,4511],{},[10,11559,107],{},[65,11561,11563],{"className":11562,"code":4517,"language":113,"meta":70},[111],[34,11564,4517],{"__ignoreMap":70},[10,11566,118],{},[14,11568,121],{"id":121},[123,11570,11571,11577],{},[49,11572,4528,11573,4531,11575,4535],{},[34,11574,4288],{},[34,11576,4534],{},[49,11578,11579,4540],{},[34,11580,4462],{},[14,11582,172],{"id":172},[46,11584,11585,11587],{},[49,11586,4547],{},[49,11588,4550],{},[14,11590,183],{"id":183},[123,11592,11593,11595],{},[49,11594,4557],{},[49,11596,2338,11597,4563],{},[34,11598,4562],{},[10,11600,201],{},[14,11602,204],{"id":204},[10,11604,4570],{},[209,11606,211],{},{"title":70,"searchDepth":83,"depth":83,"links":11608},[11609,11610,11611,11612,11613,11614,11615,11616],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":4430,"description":4435},[130,4288,4590],{"id":4593,"title":4594,"body":11621,"category":130,"cover":224,"description":4599,"extension":225,"meta":11766,"navigation":227,"path":4774,"pinned":229,"publishedAt":230,"seo":11767,"slug":4776,"stem":4777,"summary":4778,"tags":11768,"updatedAt":230,"visible":227,"__hash__":4780},{"type":7,"value":11622,"toc":11756},[11623,11625,11627,11629,11631,11635,11641,11643,11657,11659,11661,11705,11707,11712,11714,11716,11726,11728,11740,11742,11748,11750,11752,11754],[10,11624,4599],{},[14,11626,16],{"id":16},[10,11628,4604],{},[14,11630,22],{"id":22},[10,11632,11633],{},[26,11634],{"alt":4611,"src":4612},[10,11636,11637,4618,11639,4622],{},[34,11638,4617],{},[34,11640,4621],{},[14,11642,44],{"id":44},[46,11644,11645,11647,11653],{},[49,11646,4629],{},[49,11648,11649,4634,11651,4637],{},[34,11650,4617],{},[34,11652,4271],{},[49,11654,4640,11655,4643],{},[34,11656,4621],{},[14,11658,60],{"id":60},[10,11660,63],{},[65,11662,11663],{"className":67,"code":4650,"language":69,"meta":70,"style":70},[34,11664,11665,11669,11673,11677,11681,11685,11689,11693,11697,11701],{"__ignoreMap":70},[74,11666,11667],{"class":76,"line":77},[74,11668,4657],{},[74,11670,11671],{"class":76,"line":83},[74,11672,1095],{"emptyLinePlaceholder":227},[74,11674,11675],{"class":76,"line":89},[74,11676,4666],{},[74,11678,11679],{"class":76,"line":95},[74,11680,4671],{},[74,11682,11683],{"class":76,"line":101},[74,11684,4676],{},[74,11686,11687],{"class":76,"line":1147},[74,11688,4681],{},[74,11690,11691],{"class":76,"line":2488},[74,11692,4686],{},[74,11694,11695],{"class":76,"line":2494},[74,11696,4511],{},[74,11698,11699],{"class":76,"line":3902},[74,11700,1095],{"emptyLinePlaceholder":227},[74,11702,11703],{"class":76,"line":4114},[74,11704,4699],{},[10,11706,107],{},[65,11708,11710],{"className":11709,"code":4705,"language":113,"meta":70},[111],[34,11711,4705],{"__ignoreMap":70},[10,11713,118],{},[14,11715,121],{"id":121},[123,11717,11718,11722],{},[49,11719,4716,11720,4719],{},[34,11721,4617],{},[49,11723,4722,11724,4725],{},[34,11725,4621],{},[14,11727,172],{"id":172},[46,11729,11730,11734],{},[49,11731,3416,11732,4734],{},[34,11733,4617],{},[49,11735,4737,11736,4740,11738,4743],{},[34,11737,4271],{},[34,11739,4617],{},[14,11741,183],{"id":183},[123,11743,11744,11746],{},[49,11745,4750],{},[49,11747,4753],{},[10,11749,201],{},[14,11751,204],{"id":204},[10,11753,4760],{},[209,11755,211],{},{"title":70,"searchDepth":83,"depth":83,"links":11757},[11758,11759,11760,11761,11762,11763,11764,11765],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":4594,"description":4599},[130,4621,4617],{"id":4782,"title":4783,"body":11770,"category":130,"cover":224,"description":4788,"extension":225,"meta":11909,"navigation":227,"path":4960,"pinned":229,"publishedAt":230,"seo":11910,"slug":4962,"stem":4963,"summary":4964,"tags":11911,"updatedAt":230,"visible":227,"__hash__":4968},{"type":7,"value":11771,"toc":11897},[11772,11774,11776,11778,11780,11784,11786,11788,11804,11806,11808,11836,11838,11843,11845,11847,11859,11861,11863,11867,11869,11871,11881,11883,11889,11891,11893,11895],[10,11773,4788],{},[14,11775,16],{"id":16},[10,11777,4793],{},[14,11779,22],{"id":22},[10,11781,11782],{},[26,11783],{"alt":4800,"src":4801},[10,11785,4804],{},[14,11787,44],{"id":44},[46,11789,11790,11792,11794],{},[49,11791,4811],{},[49,11793,4814],{},[49,11795,4817,11796,2256,11798,4824,11800,2256,11802,41],{},[34,11797,4820],{},[34,11799,4823],{},[34,11801,4827],{},[34,11803,4830],{},[14,11805,60],{"id":60},[10,11807,63],{},[65,11809,11810],{"className":67,"code":4837,"language":69,"meta":70,"style":70},[34,11811,11812,11816,11820,11824,11828,11832],{"__ignoreMap":70},[74,11813,11814],{"class":76,"line":77},[74,11815,4844],{},[74,11817,11818],{"class":76,"line":83},[74,11819,1095],{"emptyLinePlaceholder":227},[74,11821,11822],{"class":76,"line":89},[74,11823,4853],{},[74,11825,11826],{"class":76,"line":95},[74,11827,4858],{},[74,11829,11830],{"class":76,"line":101},[74,11831,4863],{},[74,11833,11834],{"class":76,"line":1147},[74,11835,4868],{},[10,11837,107],{},[65,11839,11841],{"className":11840,"code":4874,"language":113,"meta":70},[111],[34,11842,4874],{"__ignoreMap":70},[10,11844,118],{},[14,11846,121],{"id":121},[123,11848,11849,11857],{},[49,11850,4885,11851,4888,11853,1156,11855,41],{},[34,11852,4820],{},[34,11854,4891],{},[34,11856,4894],{},[49,11858,4897],{},[155,11860,157],{"id":157},[10,11862,4902],{},[10,11864,11865],{},[26,11866],{"alt":4907,"src":4908},[10,11868,4911],{},[14,11870,172],{"id":172},[46,11872,11873,11879],{},[49,11874,4918,11875,1006,11877,4924],{},[34,11876,4921],{},[34,11878,4827],{},[49,11880,4927],{},[14,11882,183],{"id":183},[123,11884,11885,11887],{},[49,11886,4934],{},[49,11888,4937],{},[10,11890,201],{},[14,11892,204],{"id":204},[10,11894,4944],{},[209,11896,211],{},{"title":70,"searchDepth":83,"depth":83,"links":11898},[11899,11900,11901,11902,11903,11906,11907,11908],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":11904},[11905],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":4783,"description":4788},[130,4966,4967],{"id":4970,"title":4971,"body":11913,"category":130,"cover":224,"description":4976,"extension":225,"meta":12030,"navigation":227,"path":5115,"pinned":229,"publishedAt":230,"seo":12031,"slug":5117,"stem":5118,"summary":5119,"tags":12032,"updatedAt":230,"visible":227,"__hash__":5123},{"type":7,"value":11914,"toc":12020},[11915,11917,11919,11921,11923,11927,11929,11931,11939,11941,11943,11975,11977,11982,11984,11986,11994,11996,12004,12006,12012,12014,12016,12018],[10,11916,4976],{},[14,11918,16],{"id":16},[10,11920,4981],{},[14,11922,22],{"id":22},[10,11924,11925],{},[26,11926],{"alt":4988,"src":4989},[10,11928,4992],{},[14,11930,44],{"id":44},[46,11932,11933,11935,11937],{},[49,11934,4999],{},[49,11936,5002],{},[49,11938,5005],{},[14,11940,60],{"id":60},[10,11942,63],{},[65,11944,11945],{"className":67,"code":5012,"language":69,"meta":70,"style":70},[34,11946,11947,11951,11955,11959,11963,11967,11971],{"__ignoreMap":70},[74,11948,11949],{"class":76,"line":77},[74,11950,5019],{},[74,11952,11953],{"class":76,"line":83},[74,11954,1095],{"emptyLinePlaceholder":227},[74,11956,11957],{"class":76,"line":89},[74,11958,5028],{},[74,11960,11961],{"class":76,"line":95},[74,11962,5033],{},[74,11964,11965],{"class":76,"line":101},[74,11966,1095],{"emptyLinePlaceholder":227},[74,11968,11969],{"class":76,"line":1147},[74,11970,5042],{},[74,11972,11973],{"class":76,"line":2488},[74,11974,5047],{},[10,11976,107],{},[65,11978,11980],{"className":11979,"code":5053,"language":113,"meta":70},[111],[34,11981,5053],{"__ignoreMap":70},[10,11983,118],{},[14,11985,121],{"id":121},[123,11987,11988,11990],{},[49,11989,5064],{},[49,11991,5067,11992,5071],{},[34,11993,5070],{},[14,11995,172],{"id":172},[46,11997,11998,12002],{},[49,11999,5078,12000,5081],{},[34,12001,4288],{},[49,12003,5084],{},[14,12005,183],{"id":183},[123,12007,12008,12010],{},[49,12009,5091],{},[49,12011,5094],{},[10,12013,201],{},[14,12015,204],{"id":204},[10,12017,5101],{},[209,12019,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12021},[12022,12023,12024,12025,12026,12027,12028,12029],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":4971,"description":4976},[130,5121,5122],{"id":5125,"title":5126,"body":12034,"category":130,"cover":224,"description":5131,"extension":225,"meta":12153,"navigation":227,"path":5275,"pinned":229,"publishedAt":230,"seo":12154,"slug":5277,"stem":5278,"summary":5279,"tags":12155,"updatedAt":230,"visible":227,"__hash__":5283},{"type":7,"value":12035,"toc":12143},[12036,12038,12040,12042,12044,12048,12050,12052,12060,12062,12064,12096,12098,12103,12105,12107,12117,12119,12125,12127,12135,12137,12139,12141],[10,12037,5131],{},[14,12039,16],{"id":16},[10,12041,5136],{},[14,12043,22],{"id":22},[10,12045,12046],{},[26,12047],{"alt":5143,"src":5144},[10,12049,5147],{},[14,12051,44],{"id":44},[46,12053,12054,12056,12058],{},[49,12055,5154],{},[49,12057,5157],{},[49,12059,5160],{},[14,12061,60],{"id":60},[10,12063,63],{},[65,12065,12066],{"className":67,"code":5167,"language":69,"meta":70,"style":70},[34,12067,12068,12072,12076,12080,12084,12088,12092],{"__ignoreMap":70},[74,12069,12070],{"class":76,"line":77},[74,12071,5174],{},[74,12073,12074],{"class":76,"line":83},[74,12075,5179],{},[74,12077,12078],{"class":76,"line":89},[74,12079,5184],{},[74,12081,12082],{"class":76,"line":95},[74,12083,1095],{"emptyLinePlaceholder":227},[74,12085,12086],{"class":76,"line":101},[74,12087,5193],{},[74,12089,12090],{"class":76,"line":1147},[74,12091,5198],{},[74,12093,12094],{"class":76,"line":2488},[74,12095,5203],{},[10,12097,107],{},[65,12099,12101],{"className":12100,"code":5209,"language":113,"meta":70},[111],[34,12102,5209],{"__ignoreMap":70},[10,12104,118],{},[14,12106,121],{"id":121},[123,12108,12109,12113],{},[49,12110,935,12111,5223],{},[34,12112,5222],{},[49,12114,5226,12115,5230],{},[34,12116,5229],{},[14,12118,172],{"id":172},[46,12120,12121,12123],{},[49,12122,5237],{},[49,12124,5240],{},[14,12126,183],{"id":183},[123,12128,12129,12133],{},[49,12130,5247,12131,5251],{},[34,12132,5250],{},[49,12134,5254],{},[10,12136,201],{},[14,12138,204],{"id":204},[10,12140,5261],{},[209,12142,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12144},[12145,12146,12147,12148,12149,12150,12151,12152],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5126,"description":5131},[130,5281,5282],{"id":5285,"title":5286,"body":12157,"category":130,"cover":224,"description":5291,"extension":225,"meta":12302,"navigation":227,"path":5472,"pinned":229,"publishedAt":230,"seo":12303,"slug":5474,"stem":5475,"summary":5476,"tags":12304,"updatedAt":230,"visible":227,"__hash__":5480},{"type":7,"value":12158,"toc":12290},[12159,12161,12163,12165,12167,12171,12175,12177,12189,12191,12193,12221,12223,12228,12230,12232,12246,12248,12250,12254,12262,12264,12274,12276,12282,12284,12286,12288],[10,12160,5291],{},[14,12162,16],{"id":16},[10,12164,5296],{},[14,12166,22],{"id":22},[10,12168,12169],{},[26,12170],{"alt":5303,"src":5304},[10,12172,5307,12173,5311],{},[34,12174,5310],{},[14,12176,44],{"id":44},[46,12178,12179,12181,12183],{},[49,12180,5318],{},[49,12182,5321],{},[49,12184,5324,12185,5327,12187,41],{},[34,12186,5310],{},[34,12188,5330],{},[14,12190,60],{"id":60},[10,12192,63],{},[65,12194,12195],{"className":67,"code":5337,"language":69,"meta":70,"style":70},[34,12196,12197,12201,12205,12209,12213,12217],{"__ignoreMap":70},[74,12198,12199],{"class":76,"line":77},[74,12200,5344],{},[74,12202,12203],{"class":76,"line":83},[74,12204,5349],{},[74,12206,12207],{"class":76,"line":89},[74,12208,5354],{},[74,12210,12211],{"class":76,"line":95},[74,12212,1095],{"emptyLinePlaceholder":227},[74,12214,12215],{"class":76,"line":101},[74,12216,5363],{},[74,12218,12219],{"class":76,"line":1147},[74,12220,5368],{},[10,12222,107],{},[65,12224,12226],{"className":12225,"code":5374,"language":113,"meta":70},[111],[34,12227,5374],{"__ignoreMap":70},[10,12229,118],{},[14,12231,121],{"id":121},[123,12233,12234,12240],{},[49,12235,5385,12236,2256,12238,5391],{},[34,12237,5388],{},[34,12239,4351],{},[49,12241,12242,5397,12244,5401],{},[34,12243,5396],{},[34,12245,5400],{},[155,12247,157],{"id":157},[10,12249,5406],{},[10,12251,12252],{},[26,12253],{"alt":5411,"src":5412},[10,12255,12256,2256,12258,1156,12260,5422],{},[34,12257,5388],{},[34,12259,4351],{},[34,12261,5421],{},[14,12263,172],{"id":172},[46,12265,12266,12270],{},[49,12267,5429,12268,5433],{},[34,12269,5432],{},[49,12271,5436,12272,5439],{},[34,12273,5421],{},[14,12275,183],{"id":183},[123,12277,12278,12280],{},[49,12279,5446],{},[49,12281,5449],{},[10,12283,201],{},[14,12285,204],{"id":204},[10,12287,5456],{},[209,12289,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12291},[12292,12293,12294,12295,12296,12299,12300,12301],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":12297},[12298],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5286,"description":5291},[130,5478,5479],{"id":5482,"title":5483,"body":12306,"category":130,"cover":224,"description":5488,"extension":225,"meta":12455,"navigation":227,"path":5669,"pinned":229,"publishedAt":230,"seo":12456,"slug":5671,"stem":5672,"summary":5673,"tags":12457,"updatedAt":230,"visible":227,"__hash__":5677},{"type":7,"value":12307,"toc":12443},[12308,12310,12312,12314,12316,12320,12322,12324,12336,12338,12340,12384,12386,12391,12393,12395,12407,12409,12411,12415,12417,12419,12427,12429,12435,12437,12439,12441],[10,12309,5488],{},[14,12311,16],{"id":16},[10,12313,5493],{},[14,12315,22],{"id":22},[10,12317,12318],{},[26,12319],{"alt":5500,"src":5501},[10,12321,5504],{},[14,12323,44],{"id":44},[46,12325,12326,12328,12332],{},[49,12327,5511],{},[49,12329,12330,5517],{},[34,12331,5516],{},[49,12333,12334,5523],{},[34,12335,5522],{},[14,12337,60],{"id":60},[10,12339,63],{},[65,12341,12342],{"className":67,"code":5530,"language":69,"meta":70,"style":70},[34,12343,12344,12348,12352,12356,12360,12364,12368,12372,12376,12380],{"__ignoreMap":70},[74,12345,12346],{"class":76,"line":77},[74,12347,5537],{},[74,12349,12350],{"class":76,"line":83},[74,12351,5542],{},[74,12353,12354],{"class":76,"line":89},[74,12355,1095],{"emptyLinePlaceholder":227},[74,12357,12358],{"class":76,"line":95},[74,12359,5551],{},[74,12361,12362],{"class":76,"line":101},[74,12363,5556],{},[74,12365,12366],{"class":76,"line":1147},[74,12367,1095],{"emptyLinePlaceholder":227},[74,12369,12370],{"class":76,"line":2488},[74,12371,5565],{},[74,12373,12374],{"class":76,"line":2494},[74,12375,5570],{},[74,12377,12378],{"class":76,"line":3902},[74,12379,1095],{"emptyLinePlaceholder":227},[74,12381,12382],{"class":76,"line":4114},[74,12383,5579],{},[10,12385,107],{},[65,12387,12389],{"className":12388,"code":5585,"language":113,"meta":70},[111],[34,12390,5585],{"__ignoreMap":70},[10,12392,118],{},[14,12394,121],{"id":121},[123,12396,12397,12401],{},[49,12398,5596,12399,5600],{},[34,12400,5599],{},[49,12402,12403,5606,12405,41],{},[34,12404,5605],{},[34,12406,5609],{},[155,12408,157],{"id":157},[10,12410,5614],{},[10,12412,12413],{},[26,12414],{"alt":5619,"src":5620},[10,12416,5623],{},[14,12418,172],{"id":172},[46,12420,12421,12425],{},[49,12422,5630,12423,5633],{},[34,12424,5330],{},[49,12426,5636],{},[14,12428,183],{"id":183},[123,12430,12431,12433],{},[49,12432,5643],{},[49,12434,5646],{},[10,12436,201],{},[14,12438,204],{"id":204},[10,12440,5653],{},[209,12442,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12444},[12445,12446,12447,12448,12449,12452,12453,12454],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":12450},[12451],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5483,"description":5488},[130,5675,5676],{"id":5679,"title":5680,"body":12459,"category":130,"cover":224,"description":5685,"extension":225,"meta":12620,"navigation":227,"path":5883,"pinned":229,"publishedAt":230,"seo":12621,"slug":5885,"stem":5886,"summary":5887,"tags":12622,"updatedAt":230,"visible":227,"__hash__":5891},{"type":7,"value":12460,"toc":12608},[12461,12463,12465,12467,12469,12473,12475,12477,12489,12491,12493,12545,12547,12552,12554,12556,12574,12576,12578,12582,12584,12586,12592,12594,12600,12602,12604,12606],[10,12462,5685],{},[14,12464,16],{"id":16},[10,12466,5690],{},[14,12468,22],{"id":22},[10,12470,12471],{},[26,12472],{"alt":5697,"src":5698},[10,12474,5701],{},[14,12476,44],{"id":44},[46,12478,12479,12481,12483],{},[49,12480,5708],{},[49,12482,5711],{},[49,12484,12485,2175,12487,5720],{},[34,12486,5716],{},[34,12488,5719],{},[14,12490,60],{"id":60},[10,12492,63],{},[65,12494,12495],{"className":67,"code":5727,"language":69,"meta":70,"style":70},[34,12496,12497,12501,12505,12509,12513,12517,12521,12525,12529,12533,12537,12541],{"__ignoreMap":70},[74,12498,12499],{"class":76,"line":77},[74,12500,5734],{},[74,12502,12503],{"class":76,"line":83},[74,12504,1095],{"emptyLinePlaceholder":227},[74,12506,12507],{"class":76,"line":89},[74,12508,5743],{},[74,12510,12511],{"class":76,"line":95},[74,12512,5748],{},[74,12514,12515],{"class":76,"line":101},[74,12516,1095],{"emptyLinePlaceholder":227},[74,12518,12519],{"class":76,"line":1147},[74,12520,5757],{},[74,12522,12523],{"class":76,"line":2488},[74,12524,5762],{},[74,12526,12527],{"class":76,"line":2494},[74,12528,5767],{},[74,12530,12531],{"class":76,"line":3902},[74,12532,1095],{"emptyLinePlaceholder":227},[74,12534,12535],{"class":76,"line":4114},[74,12536,5776],{},[74,12538,12539],{"class":76,"line":5779},[74,12540,1095],{"emptyLinePlaceholder":227},[74,12542,12543],{"class":76,"line":5784},[74,12544,5787],{},[10,12546,107],{},[65,12548,12550],{"className":12549,"code":5793,"language":113,"meta":70},[111],[34,12551,5793],{"__ignoreMap":70},[10,12553,118],{},[14,12555,121],{"id":121},[123,12557,12558,12568],{},[49,12559,12560,5807,12562,5811,12564,5814,12566,5818],{},[34,12561,5806],{},[34,12563,5810],{},[34,12565,5599],{},[34,12567,5817],{},[49,12569,12570,5823,12572,5826],{},[34,12571,4534],{},[34,12573,2207],{},[155,12575,157],{"id":157},[10,12577,5831],{},[10,12579,12580],{},[26,12581],{"alt":5836,"src":5837},[10,12583,5840],{},[14,12585,172],{"id":172},[46,12587,12588,12590],{},[49,12589,5847],{},[49,12591,5850],{},[14,12593,183],{"id":183},[123,12595,12596,12598],{},[49,12597,5857],{},[49,12599,5860],{},[10,12601,201],{},[14,12603,204],{"id":204},[10,12605,5867],{},[209,12607,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12609},[12610,12611,12612,12613,12614,12617,12618,12619],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":12615},[12616],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5680,"description":5685},[130,5889,5890],{"id":5893,"title":5894,"body":12624,"category":130,"cover":224,"description":5899,"extension":225,"meta":12747,"navigation":227,"path":6050,"pinned":229,"publishedAt":230,"seo":12748,"slug":6052,"stem":6053,"summary":6054,"tags":12749,"updatedAt":230,"visible":227,"__hash__":6058},{"type":7,"value":12625,"toc":12737},[12626,12628,12630,12632,12634,12638,12640,12642,12656,12658,12660,12688,12690,12695,12697,12699,12709,12711,12719,12721,12729,12731,12733,12735],[10,12627,5899],{},[14,12629,16],{"id":16},[10,12631,5904],{},[14,12633,22],{"id":22},[10,12635,12636],{},[26,12637],{"alt":5911,"src":5912},[10,12639,5915],{},[14,12641,44],{"id":44},[46,12643,12644,12646,12648],{},[49,12645,5922],{},[49,12647,5925],{},[49,12649,5928,12650,2256,12652,2256,12654,5936],{},[34,12651,2259],{},[34,12653,2425],{},[34,12655,5935],{},[14,12657,60],{"id":60},[10,12659,63],{},[65,12661,12662],{"className":67,"code":5943,"language":69,"meta":70,"style":70},[34,12663,12664,12668,12672,12676,12680,12684],{"__ignoreMap":70},[74,12665,12666],{"class":76,"line":77},[74,12667,5950],{},[74,12669,12670],{"class":76,"line":83},[74,12671,5955],{},[74,12673,12674],{"class":76,"line":89},[74,12675,5960],{},[74,12677,12678],{"class":76,"line":95},[74,12679,1095],{"emptyLinePlaceholder":227},[74,12681,12682],{"class":76,"line":101},[74,12683,5969],{},[74,12685,12686],{"class":76,"line":1147},[74,12687,5974],{},[10,12689,107],{},[65,12691,12693],{"className":12692,"code":5980,"language":113,"meta":70},[111],[34,12694,5980],{"__ignoreMap":70},[10,12696,118],{},[14,12698,121],{"id":121},[123,12700,12701,12707],{},[49,12702,5991,12703,5995,12705,5998],{},[34,12704,5994],{},[34,12706,2245],{},[49,12708,6001],{},[14,12710,172],{"id":172},[46,12712,12713,12717],{},[49,12714,6008,12715,6012],{},[34,12716,6011],{},[49,12718,6015],{},[14,12720,183],{"id":183},[123,12722,12723,12725],{},[49,12724,6022],{},[49,12726,6025,12727,6029],{},[34,12728,6028],{},[10,12730,201],{},[14,12732,204],{"id":204},[10,12734,6036],{},[209,12736,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12738},[12739,12740,12741,12742,12743,12744,12745,12746],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":5894,"description":5899},[130,6056,6057],{"id":6060,"title":6061,"body":12751,"category":130,"cover":224,"description":6066,"extension":225,"meta":12928,"navigation":227,"path":6294,"pinned":229,"publishedAt":230,"seo":12929,"slug":6296,"stem":6297,"summary":6298,"tags":12930,"updatedAt":230,"visible":227,"__hash__":6302},{"type":7,"value":12752,"toc":12916},[12753,12755,12757,12761,12763,12767,12773,12775,12787,12789,12793,12817,12821,12837,12843,12845,12850,12852,12854,12870,12872,12874,12878,12882,12884,12896,12898,12908,12910,12912,12914],[10,12754,6066],{},[14,12756,16],{"id":16},[10,12758,6071,12759,6074],{},[293,12760,5994],{},[14,12762,22],{"id":22},[10,12764,12765],{},[26,12766],{"alt":6081,"src":6082},[10,12768,6085,12769,6089,12771,6093],{},[34,12770,6088],{},[34,12772,6092],{},[14,12774,44],{"id":44},[46,12776,12777,12781,12783],{},[49,12778,6100,12779,6103],{},[34,12780,1170],{},[49,12782,6106],{},[49,12784,6109,12785,6113],{},[34,12786,6112],{},[14,12788,60],{"id":60},[10,12790,6118,12791,6122],{},[34,12792,6121],{},[65,12794,12795],{"className":67,"code":6125,"language":69,"meta":70,"style":70},[34,12796,12797,12801,12805,12809,12813],{"__ignoreMap":70},[74,12798,12799],{"class":76,"line":77},[74,12800,6132],{},[74,12802,12803],{"class":76,"line":83},[74,12804,6137],{},[74,12806,12807],{"class":76,"line":89},[74,12808,1095],{"emptyLinePlaceholder":227},[74,12810,12811],{"class":76,"line":95},[74,12812,6146],{},[74,12814,12815],{"class":76,"line":101},[74,12816,6151],{},[10,12818,6154,12819,6158],{},[34,12820,6157],{},[65,12822,12823],{"className":67,"code":6161,"language":69,"meta":70,"style":70},[34,12824,12825,12829,12833],{"__ignoreMap":70},[74,12826,12827],{"class":76,"line":77},[74,12828,6168],{},[74,12830,12831],{"class":76,"line":83},[74,12832,1095],{"emptyLinePlaceholder":227},[74,12834,12835],{"class":76,"line":89},[74,12836,6177],{},[10,12838,6180,12839,1156,12841,41],{},[34,12840,6183],{},[34,12842,6186],{},[10,12844,107],{},[65,12846,12848],{"className":12847,"code":6192,"language":113,"meta":70},[111],[34,12849,6192],{"__ignoreMap":70},[10,12851,118],{},[14,12853,121],{"id":121},[123,12855,12856,12862],{},[49,12857,6203,12858,6206,12860,6210],{},[34,12859,6121],{},[34,12861,6209],{},[49,12863,12864,6215,12866,6218,12868,6221],{},[34,12865,6157],{},[34,12867,6121],{},[34,12869,6157],{},[155,12871,157],{"id":157},[10,12873,6226],{},[10,12875,12876],{},[26,12877],{"alt":6231,"src":6232},[10,12879,6235,12880,6238],{},[34,12881,6209],{},[14,12883,172],{"id":172},[46,12885,12886,12892],{},[49,12887,6245,12888,1156,12890,41],{},[34,12889,6121],{},[34,12891,6157],{},[49,12893,6252,12894,6256],{},[34,12895,6255],{},[14,12897,183],{"id":183},[123,12899,12900,12904],{},[49,12901,2353,12902,6266],{},[34,12903,6265],{},[49,12905,6269,12906,41],{},[34,12907,6088],{},[10,12909,201],{},[14,12911,204],{"id":204},[10,12913,6278],{},[209,12915,211],{},{"title":70,"searchDepth":83,"depth":83,"links":12917},[12918,12919,12920,12921,12922,12925,12926,12927],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":12923},[12924],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":6061,"description":6066},[130,6300,6301],{"id":6304,"title":6305,"body":12932,"category":130,"cover":224,"description":6310,"extension":225,"meta":13071,"navigation":227,"path":6476,"pinned":229,"publishedAt":230,"seo":13072,"slug":6478,"stem":6479,"summary":6480,"tags":13073,"updatedAt":230,"visible":227,"__hash__":6483},{"type":7,"value":12933,"toc":13061},[12934,12936,12938,12940,12942,12946,12948,12950,12960,12962,12964,13004,13006,13011,13013,13015,13033,13035,13043,13045,13053,13055,13057,13059],[10,12935,6310],{},[14,12937,16],{"id":16},[10,12939,6315],{},[14,12941,22],{"id":22},[10,12943,12944],{},[26,12945],{"alt":6322,"src":6323},[10,12947,6326],{},[14,12949,44],{"id":44},[46,12951,12952,12956,12958],{},[49,12953,12954,6336],{},[34,12955,6335],{},[49,12957,6339],{},[49,12959,6342],{},[14,12961,60],{"id":60},[10,12963,1573],{},[65,12965,12966],{"className":588,"code":6349,"language":590,"meta":70,"style":70},[34,12967,12968,12978,12984,12990,13000],{"__ignoreMap":70},[74,12969,12970,12972,12974,12976],{"class":76,"line":77},[74,12971,688],{"class":597},[74,12973,630],{"class":600},[74,12975,6360],{"class":633},[74,12977,6363],{"class":633},[74,12979,12980,12982],{"class":76,"line":83},[74,12981,6368],{"class":600},[74,12983,6371],{"class":633},[74,12985,12986,12988],{"class":76,"line":89},[74,12987,69],{"class":597},[74,12989,601],{"class":600},[74,12991,12992,12994,12996,12998],{"class":76,"line":95},[74,12993,69],{"class":597},[74,12995,630],{"class":600},[74,12997,634],{"class":633},[74,12999,601],{"class":600},[74,13001,13002],{"class":76,"line":101},[74,13003,6392],{"class":597},[10,13005,107],{},[65,13007,13009],{"className":13008,"code":6398,"language":113,"meta":70},[111],[34,13010,6398],{"__ignoreMap":70},[10,13012,118],{},[14,13014,121],{"id":121},[123,13016,13017,13023],{},[49,13018,13019,6412,13021,6415],{},[34,13020,6411],{},[34,13022,688],{},[49,13024,6418,13025,2175,13027,6424,13029,3677,13031,6430],{},[34,13026,69],{},[34,13028,6423],{},[34,13030,6335],{},[34,13032,6429],{},[14,13034,172],{"id":172},[46,13036,13037,13039],{},[49,13038,6437],{},[49,13040,3416,13041,6442],{},[34,13042,6335],{},[14,13044,183],{"id":183},[123,13046,13047,13051],{},[49,13048,6449,13049,41],{},[34,13050,6452],{},[49,13052,6455],{},[10,13054,201],{},[14,13056,204],{"id":204},[10,13058,6462],{},[209,13060,1657],{},{"title":70,"searchDepth":83,"depth":83,"links":13062},[13063,13064,13065,13066,13067,13068,13069,13070],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":6305,"description":6310},[130,6482,259],{"id":6485,"title":6486,"body":13075,"category":130,"cover":224,"description":6491,"extension":225,"meta":13228,"navigation":227,"path":6680,"pinned":229,"publishedAt":230,"seo":13229,"slug":6682,"stem":6683,"summary":6684,"tags":13230,"updatedAt":230,"visible":227,"__hash__":6688},{"type":7,"value":13076,"toc":13218},[13077,13079,13081,13083,13085,13089,13095,13097,13113,13115,13117,13161,13163,13168,13170,13172,13184,13186,13200,13202,13210,13212,13214,13216],[10,13078,6491],{},[14,13080,16],{"id":16},[10,13082,6496],{},[14,13084,22],{"id":22},[10,13086,13087],{},[26,13088],{"alt":6503,"src":6504},[10,13090,13091,6510,13093,6513],{},[34,13092,6509],{},[34,13094,2435],{},[14,13096,44],{"id":44},[46,13098,13099,13101,13109],{},[49,13100,6520],{},[49,13102,13103,2256,13105,2256,13107,6532],{},[34,13104,6525],{},[34,13106,6528],{},[34,13108,6531],{},[49,13110,6535,13111,6539],{},[34,13112,6538],{},[14,13114,60],{"id":60},[10,13116,63],{},[65,13118,13119],{"className":67,"code":6546,"language":69,"meta":70,"style":70},[34,13120,13121,13125,13129,13133,13137,13141,13145,13149,13153,13157],{"__ignoreMap":70},[74,13122,13123],{"class":76,"line":77},[74,13124,6553],{},[74,13126,13127],{"class":76,"line":83},[74,13128,1095],{"emptyLinePlaceholder":227},[74,13130,13131],{"class":76,"line":89},[74,13132,6562],{},[74,13134,13135],{"class":76,"line":95},[74,13136,6567],{},[74,13138,13139],{"class":76,"line":101},[74,13140,6572],{},[74,13142,13143],{"class":76,"line":1147},[74,13144,1095],{"emptyLinePlaceholder":227},[74,13146,13147],{"class":76,"line":2488},[74,13148,6581],{},[74,13150,13151],{"class":76,"line":2494},[74,13152,6586],{},[74,13154,13155],{"class":76,"line":3902},[74,13156,6591],{},[74,13158,13159],{"class":76,"line":4114},[74,13160,6596],{},[10,13162,107],{},[65,13164,13166],{"className":13165,"code":6602,"language":113,"meta":70},[111],[34,13167,6602],{"__ignoreMap":70},[10,13169,118],{},[14,13171,121],{"id":121},[123,13173,13174,13178],{},[49,13175,13176,6616],{},[34,13177,6615],{},[49,13179,2338,13180,6621,13182,6624],{},[34,13181,2435],{},[34,13183,6509],{},[14,13185,172],{"id":172},[46,13187,13188,13194],{},[49,13189,3416,13190,6633,13192,6636],{},[34,13191,6509],{},[34,13193,6525],{},[49,13195,6639,13196,1006,13198,6645],{},[34,13197,2435],{},[34,13199,6644],{},[14,13201,183],{"id":183},[123,13203,13204,13208],{},[49,13205,6652,13206,6656],{},[34,13207,6655],{},[49,13209,6659],{},[10,13211,201],{},[14,13213,204],{"id":204},[10,13215,6666],{},[209,13217,211],{},{"title":70,"searchDepth":83,"depth":83,"links":13219},[13220,13221,13222,13223,13224,13225,13226,13227],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":6486,"description":6491},[130,6686,6687],{"id":6690,"title":6691,"body":13232,"category":130,"cover":224,"description":6696,"extension":225,"meta":13379,"navigation":227,"path":6875,"pinned":229,"publishedAt":230,"seo":13380,"slug":6877,"stem":6878,"summary":6879,"tags":13381,"updatedAt":230,"visible":227,"__hash__":6883},{"type":7,"value":13233,"toc":13369},[13234,13236,13238,13240,13242,13246,13248,13250,13268,13270,13272,13320,13322,13327,13329,13331,13339,13341,13351,13353,13361,13363,13365,13367],[10,13235,6696],{},[14,13237,16],{"id":16},[10,13239,6701],{},[14,13241,22],{"id":22},[10,13243,13244],{},[26,13245],{"alt":6708,"src":6709},[10,13247,6712],{},[14,13249,44],{"id":44},[46,13251,13252,13256,13262],{},[49,13253,13254,6722],{},[34,13255,6721],{},[49,13257,13258,6728,13260,41],{},[34,13259,6727],{},[34,13261,6731],{},[49,13263,6734,13264,6738,13266,6742],{},[34,13265,6737],{},[34,13267,6741],{},[14,13269,60],{"id":60},[10,13271,63],{},[65,13273,13274],{"className":67,"code":6749,"language":69,"meta":70,"style":70},[34,13275,13276,13280,13284,13288,13292,13296,13300,13304,13308,13312,13316],{"__ignoreMap":70},[74,13277,13278],{"class":76,"line":77},[74,13279,6553],{},[74,13281,13282],{"class":76,"line":83},[74,13283,1095],{"emptyLinePlaceholder":227},[74,13285,13286],{"class":76,"line":89},[74,13287,6764],{},[74,13289,13290],{"class":76,"line":95},[74,13291,6769],{},[74,13293,13294],{"class":76,"line":101},[74,13295,6774],{},[74,13297,13298],{"class":76,"line":1147},[74,13299,6779],{},[74,13301,13302],{"class":76,"line":2488},[74,13303,1095],{"emptyLinePlaceholder":227},[74,13305,13306],{"class":76,"line":2494},[74,13307,6788],{},[74,13309,13310],{"class":76,"line":3902},[74,13311,6793],{},[74,13313,13314],{"class":76,"line":4114},[74,13315,6798],{},[74,13317,13318],{"class":76,"line":5779},[74,13319,6803],{},[10,13321,107],{},[65,13323,13325],{"className":13324,"code":6809,"language":113,"meta":70},[111],[34,13326,6809],{"__ignoreMap":70},[10,13328,118],{},[14,13330,121],{"id":121},[123,13332,13333,13337],{},[49,13334,6820,13335,6823],{},[34,13336,6737],{},[49,13338,6826],{},[14,13340,172],{"id":172},[46,13342,13343,13347],{},[49,13344,2338,13345,6835],{},[34,13346,6721],{},[49,13348,6838,13349,41],{},[34,13350,6841],{},[14,13352,183],{"id":183},[123,13354,13355,13357],{},[49,13356,6848],{},[49,13358,6851,13359,6854],{},[34,13360,334],{},[10,13362,201],{},[14,13364,204],{"id":204},[10,13366,6861],{},[209,13368,211],{},{"title":70,"searchDepth":83,"depth":83,"links":13370},[13371,13372,13373,13374,13375,13376,13377,13378],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":6691,"description":6696},[130,6881,6882],{"id":6885,"title":6886,"body":13383,"category":130,"cover":224,"description":6891,"extension":225,"meta":13526,"navigation":227,"path":7059,"pinned":229,"publishedAt":230,"seo":13527,"slug":7061,"stem":7062,"summary":7063,"tags":13528,"updatedAt":230,"visible":227,"__hash__":7067},{"type":7,"value":13384,"toc":13516},[13385,13387,13389,13391,13393,13397,13403,13405,13415,13417,13419,13471,13473,13478,13480,13482,13492,13494,13500,13502,13508,13510,13512,13514],[10,13386,6891],{},[14,13388,16],{"id":16},[10,13390,6896],{},[14,13392,22],{"id":22},[10,13394,13395],{},[26,13396],{"alt":6903,"src":6904},[10,13398,13399,6910,13401,6914],{},[34,13400,6909],{},[34,13402,6913],{},[14,13404,44],{"id":44},[46,13406,13407,13409,13413],{},[49,13408,6921],{},[49,13410,13411,6927],{},[34,13412,6926],{},[49,13414,6930],{},[14,13416,60],{"id":60},[10,13418,63],{},[65,13420,13421],{"className":67,"code":6937,"language":69,"meta":70,"style":70},[34,13422,13423,13427,13431,13435,13439,13443,13447,13451,13455,13459,13463,13467],{"__ignoreMap":70},[74,13424,13425],{"class":76,"line":77},[74,13426,6944],{},[74,13428,13429],{"class":76,"line":83},[74,13430,1095],{"emptyLinePlaceholder":227},[74,13432,13433],{"class":76,"line":89},[74,13434,6953],{},[74,13436,13437],{"class":76,"line":95},[74,13438,1095],{"emptyLinePlaceholder":227},[74,13440,13441],{"class":76,"line":101},[74,13442,6962],{},[74,13444,13445],{"class":76,"line":1147},[74,13446,6967],{},[74,13448,13449],{"class":76,"line":2488},[74,13450,6779],{},[74,13452,13453],{"class":76,"line":2494},[74,13454,1095],{"emptyLinePlaceholder":227},[74,13456,13457],{"class":76,"line":3902},[74,13458,6980],{},[74,13460,13461],{"class":76,"line":4114},[74,13462,6985],{},[74,13464,13465],{"class":76,"line":5779},[74,13466,6798],{},[74,13468,13469],{"class":76,"line":5784},[74,13470,6994],{},[10,13472,107],{},[65,13474,13476],{"className":13475,"code":7000,"language":113,"meta":70},[111],[34,13477,7000],{"__ignoreMap":70},[10,13479,118],{},[14,13481,121],{"id":121},[123,13483,13484,13488],{},[49,13485,13486,7013],{},[34,13487,6909],{},[49,13489,13490,7018],{},[34,13491,6913],{},[14,13493,172],{"id":172},[46,13495,13496,13498],{},[49,13497,7025],{},[49,13499,7028],{},[14,13501,183],{"id":183},[123,13503,13504,13506],{},[49,13505,7035],{},[49,13507,7038],{},[10,13509,201],{},[14,13511,204],{"id":204},[10,13513,7045],{},[209,13515,211],{},{"title":70,"searchDepth":83,"depth":83,"links":13517},[13518,13519,13520,13521,13522,13523,13524,13525],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":6886,"description":6891},[130,7065,7066],{"id":7069,"title":7070,"body":13530,"category":130,"cover":224,"description":7075,"extension":225,"meta":13681,"navigation":227,"path":7260,"pinned":229,"publishedAt":230,"seo":13682,"slug":7262,"stem":7263,"summary":7264,"tags":13683,"updatedAt":230,"visible":227,"__hash__":7268},{"type":7,"value":13531,"toc":13671},[13532,13534,13536,13538,13540,13544,13548,13550,13564,13566,13568,13620,13622,13627,13629,13631,13643,13645,13655,13657,13663,13665,13667,13669],[10,13533,7075],{},[14,13535,16],{"id":16},[10,13537,7080],{},[14,13539,22],{"id":22},[10,13541,13542],{},[26,13543],{"alt":7087,"src":7088},[10,13545,13546,7094],{},[34,13547,7093],{},[14,13549,44],{"id":44},[46,13551,13552,13558,13562],{},[49,13553,2338,13554,7104,13556,7108],{},[34,13555,7103],{},[34,13557,7107],{},[49,13559,7111,13560,7115],{},[34,13561,7114],{},[49,13563,7118],{},[14,13565,60],{"id":60},[10,13567,63],{},[65,13569,13570],{"className":67,"code":7125,"language":69,"meta":70,"style":70},[34,13571,13572,13576,13580,13584,13588,13592,13596,13600,13604,13608,13612,13616],{"__ignoreMap":70},[74,13573,13574],{"class":76,"line":77},[74,13575,7132],{},[74,13577,13578],{"class":76,"line":83},[74,13579,1095],{"emptyLinePlaceholder":227},[74,13581,13582],{"class":76,"line":89},[74,13583,7141],{},[74,13585,13586],{"class":76,"line":95},[74,13587,7146],{},[74,13589,13590],{"class":76,"line":101},[74,13591,7151],{},[74,13593,13594],{"class":76,"line":1147},[74,13595,7156],{},[74,13597,13598],{"class":76,"line":2488},[74,13599,7161],{},[74,13601,13602],{"class":76,"line":2494},[74,13603,1095],{"emptyLinePlaceholder":227},[74,13605,13606],{"class":76,"line":3902},[74,13607,7170],{},[74,13609,13610],{"class":76,"line":4114},[74,13611,7175],{},[74,13613,13614],{"class":76,"line":5779},[74,13615,7180],{},[74,13617,13618],{"class":76,"line":5784},[74,13619,7185],{},[10,13621,107],{},[65,13623,13625],{"className":13624,"code":7191,"language":113,"meta":70},[111],[34,13626,7191],{"__ignoreMap":70},[10,13628,118],{},[14,13630,121],{"id":121},[123,13632,13633,13639],{},[49,13634,13635,7205,13637,7208],{},[34,13636,7204],{},[34,13638,7114],{},[49,13640,13641,7213],{},[34,13642,7093],{},[14,13644,172],{"id":172},[46,13646,13647,13649],{},[49,13648,7220],{},[49,13650,7223,13651,7226,13653,7229],{},[34,13652,7103],{},[34,13654,7107],{},[14,13656,183],{"id":183},[123,13658,13659,13661],{},[49,13660,7236],{},[49,13662,7239],{},[10,13664,201],{},[14,13666,204],{"id":204},[10,13668,7246],{},[209,13670,211],{},{"title":70,"searchDepth":83,"depth":83,"links":13672},[13673,13674,13675,13676,13677,13678,13679,13680],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":7070,"description":7075},[130,7266,7267],{"id":7270,"title":7271,"body":13685,"category":130,"cover":224,"description":7276,"extension":225,"meta":13899,"navigation":227,"path":7550,"pinned":229,"publishedAt":230,"seo":13900,"slug":7552,"stem":7553,"summary":7554,"tags":13901,"updatedAt":230,"visible":227,"__hash__":7558},{"type":7,"value":13686,"toc":13886},[13687,13689,13691,13693,13695,13699,13705,13707,13719,13721,13723,13783,13785,13790,13792,13794,13812,13814,13822,13826,13834,13836,13840,13844,13850,13852,13862,13864,13878,13880,13882,13884],[10,13688,7276],{},[14,13690,16],{"id":16},[10,13692,7281],{},[14,13694,22],{"id":22},[10,13696,13697],{},[26,13698],{"alt":7288,"src":7289},[10,13700,7292,13701,7296,13703,7300],{},[34,13702,7295],{},[34,13704,7299],{},[14,13706,44],{"id":44},[46,13708,13709,13713,13717],{},[49,13710,7307,13711,7310],{},[34,13712,7295],{},[49,13714,13715,7316],{},[34,13716,7315],{},[49,13718,7319],{},[14,13720,60],{"id":60},[10,13722,63],{},[65,13724,13725],{"className":67,"code":7326,"language":69,"meta":70,"style":70},[34,13726,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775,13779],{"__ignoreMap":70},[74,13728,13729],{"class":76,"line":77},[74,13730,7333],{},[74,13732,13733],{"class":76,"line":83},[74,13734,7338],{},[74,13736,13737],{"class":76,"line":89},[74,13738,7343],{},[74,13740,13741],{"class":76,"line":95},[74,13742,7348],{},[74,13744,13745],{"class":76,"line":101},[74,13746,7353],{},[74,13748,13749],{"class":76,"line":1147},[74,13750,1095],{"emptyLinePlaceholder":227},[74,13752,13753],{"class":76,"line":2488},[74,13754,7362],{},[74,13756,13757],{"class":76,"line":2494},[74,13758,7367],{},[74,13760,13761],{"class":76,"line":3902},[74,13762,7372],{},[74,13764,13765],{"class":76,"line":4114},[74,13766,7377],{},[74,13768,13769],{"class":76,"line":5779},[74,13770,1144],{},[74,13772,13773],{"class":76,"line":5784},[74,13774,7386],{},[74,13776,13777],{"class":76,"line":7389},[74,13778,7392],{},[74,13780,13781],{"class":76,"line":7395},[74,13782,7398],{},[10,13784,107],{},[65,13786,13788],{"className":13787,"code":7404,"language":113,"meta":70},[111],[34,13789,7404],{"__ignoreMap":70},[10,13791,118],{},[14,13793,121],{"id":121},[123,13795,13796,13804],{},[49,13797,13798,7417,13800,7420,13802,7424],{},[34,13799,2985],{},[34,13801,7315],{},[34,13803,7423],{},[49,13805,7427,13806,7430,13808,7433,13810,41],{},[34,13807,7295],{},[34,13809,1159],{},[34,13811,7299],{},[155,13813,157],{"id":157},[10,13815,13816,2256,13818,1156,13820,7446],{},[34,13817,7295],{},[34,13819,1159],{},[34,13821,7299],{},[10,13823,13824],{},[26,13825],{"alt":7451,"src":7452},[10,13827,13828,7457,13830,7460,13832,7463],{},[34,13829,7295],{},[34,13831,1159],{},[34,13833,7299],{},[155,13835,157],{"id":4169},[10,13837,13838,7471],{},[34,13839,7470],{},[10,13841,13842],{},[26,13843],{"alt":7476,"src":7477},[10,13845,7480,13846,7483,13848,7486],{},[34,13847,7470],{},[34,13849,1159],{},[14,13851,172],{"id":172},[46,13853,13854,13858],{},[49,13855,7493,13856,7497],{},[34,13857,7496],{},[49,13859,7500,13860,7503],{},[34,13861,7470],{},[14,13863,183],{"id":183},[123,13865,13866,13874],{},[49,13867,7510,13868,7514,13870,1156,13872,41],{},[34,13869,7513],{},[34,13871,7517],{},[34,13873,7520],{},[49,13875,7523,13876,7526],{},[34,13877,6731],{},[10,13879,201],{},[14,13881,204],{"id":204},[10,13883,7533],{},[209,13885,211],{},{"title":70,"searchDepth":83,"depth":83,"links":13887},[13888,13889,13890,13891,13892,13896,13897,13898],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":13893},[13894,13895],{"id":157,"depth":89,"text":157},{"id":4169,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":7271,"description":7276},[130,7556,7557],{"id":7560,"title":7561,"body":13903,"category":130,"cover":224,"description":7566,"extension":225,"meta":14054,"navigation":227,"path":7743,"pinned":229,"publishedAt":230,"seo":14055,"slug":7745,"stem":7746,"summary":7747,"tags":14056,"updatedAt":230,"visible":227,"__hash__":7750},{"type":7,"value":13904,"toc":14044},[13905,13907,13909,13911,13913,13917,13921,13923,13935,13937,13939,13987,13989,13994,13996,13998,14008,14010,14020,14022,14036,14038,14040,14042],[10,13906,7566],{},[14,13908,16],{"id":16},[10,13910,7571],{},[14,13912,22],{"id":22},[10,13914,13915],{},[26,13916],{"alt":7578,"src":7579},[10,13918,7582,13919,7585],{},[34,13920,6741],{},[14,13922,44],{"id":44},[46,13924,13925,13929,13933],{},[49,13926,13927,7594],{},[34,13928,6741],{},[49,13930,13931,7600],{},[34,13932,7599],{},[49,13934,7603],{},[14,13936,60],{"id":60},[10,13938,63],{},[65,13940,13941],{"className":67,"code":7610,"language":69,"meta":70,"style":70},[34,13942,13943,13947,13951,13955,13959,13963,13967,13971,13975,13979,13983],{"__ignoreMap":70},[74,13944,13945],{"class":76,"line":77},[74,13946,6553],{},[74,13948,13949],{"class":76,"line":83},[74,13950,1095],{"emptyLinePlaceholder":227},[74,13952,13953],{"class":76,"line":89},[74,13954,6764],{},[74,13956,13957],{"class":76,"line":95},[74,13958,1095],{"emptyLinePlaceholder":227},[74,13960,13961],{"class":76,"line":101},[74,13962,7633],{},[74,13964,13965],{"class":76,"line":1147},[74,13966,7638],{},[74,13968,13969],{"class":76,"line":2488},[74,13970,1095],{"emptyLinePlaceholder":227},[74,13972,13973],{"class":76,"line":2494},[74,13974,7647],{},[74,13976,13977],{"class":76,"line":3902},[74,13978,7652],{},[74,13980,13981],{"class":76,"line":4114},[74,13982,1095],{"emptyLinePlaceholder":227},[74,13984,13985],{"class":76,"line":5779},[74,13986,7661],{},[10,13988,107],{},[65,13990,13992],{"className":13991,"code":7667,"language":113,"meta":70},[111],[34,13993,7667],{"__ignoreMap":70},[10,13995,118],{},[14,13997,121],{"id":121},[123,13999,14000,14006],{},[49,14001,7582,14002,7680,14004,41],{},[34,14003,6741],{},[34,14005,7683],{},[49,14007,7686],{},[14,14009,172],{"id":172},[46,14011,14012,14016],{},[49,14013,4737,14014,7695],{},[34,14015,6741],{},[49,14017,7698,14018,7701],{},[34,14019,6741],{},[14,14021,183],{"id":183},[123,14023,14024,14030],{},[49,14025,7708,14026,7712,14028,41],{},[34,14027,7711],{},[34,14029,6741],{},[49,14031,4737,14032,7719,14034,41],{},[34,14033,6741],{},[34,14035,7722],{},[10,14037,201],{},[14,14039,204],{"id":204},[10,14041,7729],{},[209,14043,211],{},{"title":70,"searchDepth":83,"depth":83,"links":14045},[14046,14047,14048,14049,14050,14051,14052,14053],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":7561,"description":7566},[130,6741,7749],{"id":7752,"title":7753,"body":14058,"category":130,"cover":224,"description":7758,"extension":225,"meta":14229,"navigation":227,"path":7971,"pinned":229,"publishedAt":230,"seo":14230,"slug":7973,"stem":7974,"summary":7975,"tags":14231,"updatedAt":230,"visible":227,"__hash__":7979},{"type":7,"value":14059,"toc":14217},[14060,14062,14064,14066,14068,14072,14074,14076,14088,14090,14092,14148,14150,14155,14157,14159,14175,14177,14179,14183,14189,14191,14199,14201,14209,14211,14213,14215],[10,14061,7758],{},[14,14063,16],{"id":16},[10,14065,7763],{},[14,14067,22],{"id":22},[10,14069,14070],{},[26,14071],{"alt":7770,"src":7771},[10,14073,7774],{},[14,14075,44],{"id":44},[46,14077,14078,14082,14086],{},[49,14079,14080,7784],{},[34,14081,7783],{},[49,14083,14084,7790],{},[34,14085,7789],{},[49,14087,7793],{},[14,14089,60],{"id":60},[10,14091,63],{},[65,14093,14094],{"className":67,"code":7800,"language":69,"meta":70,"style":70},[34,14095,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140,14144],{"__ignoreMap":70},[74,14097,14098],{"class":76,"line":77},[74,14099,7807],{},[74,14101,14102],{"class":76,"line":83},[74,14103,7812],{},[74,14105,14106],{"class":76,"line":89},[74,14107,7817],{},[74,14109,14110],{"class":76,"line":95},[74,14111,7822],{},[74,14113,14114],{"class":76,"line":101},[74,14115,1095],{"emptyLinePlaceholder":227},[74,14117,14118],{"class":76,"line":1147},[74,14119,7831],{},[74,14121,14122],{"class":76,"line":2488},[74,14123,7836],{},[74,14125,14126],{"class":76,"line":2494},[74,14127,7841],{},[74,14129,14130],{"class":76,"line":3902},[74,14131,7846],{},[74,14133,14134],{"class":76,"line":4114},[74,14135,1095],{"emptyLinePlaceholder":227},[74,14137,14138],{"class":76,"line":5779},[74,14139,7855],{},[74,14141,14142],{"class":76,"line":5784},[74,14143,7860],{},[74,14145,14146],{"class":76,"line":7389},[74,14147,7865],{},[10,14149,107],{},[65,14151,14153],{"className":14152,"code":7871,"language":113,"meta":70},[111],[34,14154,7871],{"__ignoreMap":70},[10,14156,118],{},[14,14158,121],{"id":121},[123,14160,14161,14167],{},[49,14162,7882,14163,7886,14165,7889],{},[34,14164,7885],{},[34,14166,7789],{},[49,14168,14169,7895,14171,7899,14173,7902],{},[34,14170,7894],{},[34,14172,7898],{},[34,14174,7783],{},[155,14176,157],{"id":157},[10,14178,7907],{},[10,14180,14181],{},[26,14182],{"alt":7912,"src":7913},[10,14184,7916,14185,1156,14187,7922],{},[34,14186,4534],{},[34,14188,7921],{},[14,14190,172],{"id":172},[46,14192,14193,14197],{},[49,14194,7929,14195,7932],{},[34,14196,7783],{},[49,14198,7935],{},[14,14200,183],{"id":183},[123,14202,14203,14207],{},[49,14204,5247,14205,7945],{},[34,14206,7944],{},[49,14208,7948],{},[10,14210,201],{},[14,14212,204],{"id":204},[10,14214,7955],{},[209,14216,211],{},{"title":70,"searchDepth":83,"depth":83,"links":14218},[14219,14220,14221,14222,14223,14226,14227,14228],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":14224},[14225],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":7753,"description":7758},[130,7977,7978],{"id":7981,"title":7982,"body":14233,"category":130,"cover":224,"description":7987,"extension":225,"meta":14380,"navigation":227,"path":8166,"pinned":229,"publishedAt":230,"seo":14381,"slug":8168,"stem":8169,"summary":8170,"tags":14382,"updatedAt":230,"visible":227,"__hash__":8174},{"type":7,"value":14234,"toc":14370},[14235,14237,14239,14241,14243,14247,14249,14251,14259,14261,14263,14319,14321,14326,14328,14330,14342,14344,14350,14352,14362,14364,14366,14368],[10,14236,7987],{},[14,14238,16],{"id":16},[10,14240,7992],{},[14,14242,22],{"id":22},[10,14244,14245],{},[26,14246],{"alt":7999,"src":8000},[10,14248,8003],{},[14,14250,44],{"id":44},[46,14252,14253,14255,14257],{},[49,14254,8010],{},[49,14256,8013],{},[49,14258,8016],{},[14,14260,60],{"id":60},[10,14262,63],{},[65,14264,14265],{"className":67,"code":8023,"language":69,"meta":70,"style":70},[34,14266,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311,14315],{"__ignoreMap":70},[74,14268,14269],{"class":76,"line":77},[74,14270,8030],{},[74,14272,14273],{"class":76,"line":83},[74,14274,8035],{},[74,14276,14277],{"class":76,"line":89},[74,14278,8040],{},[74,14280,14281],{"class":76,"line":95},[74,14282,1095],{"emptyLinePlaceholder":227},[74,14284,14285],{"class":76,"line":101},[74,14286,8049],{},[74,14288,14289],{"class":76,"line":1147},[74,14290,8054],{},[74,14292,14293],{"class":76,"line":2488},[74,14294,8059],{},[74,14296,14297],{"class":76,"line":2494},[74,14298,1095],{"emptyLinePlaceholder":227},[74,14300,14301],{"class":76,"line":3902},[74,14302,8068],{},[74,14304,14305],{"class":76,"line":4114},[74,14306,8073],{},[74,14308,14309],{"class":76,"line":5779},[74,14310,1095],{"emptyLinePlaceholder":227},[74,14312,14313],{"class":76,"line":5784},[74,14314,8082],{},[74,14316,14317],{"class":76,"line":7389},[74,14318,8087],{},[10,14320,107],{},[65,14322,14324],{"className":14323,"code":8093,"language":113,"meta":70},[111],[34,14325,8093],{"__ignoreMap":70},[10,14327,118],{},[14,14329,121],{"id":121},[123,14331,14332,14338],{},[49,14333,14334,8107,14336,8111],{},[34,14335,8106],{},[34,14337,8110],{},[49,14339,8114,14340,8118],{},[34,14341,8117],{},[14,14343,172],{"id":172},[46,14345,14346,14348],{},[49,14347,8125],{},[49,14349,8128],{},[14,14351,183],{"id":183},[123,14353,14354,14360],{},[49,14355,8135,14356,8139,14358,41],{},[34,14357,8138],{},[34,14359,8142],{},[49,14361,8145],{},[10,14363,201],{},[14,14365,204],{"id":204},[10,14367,8152],{},[209,14369,211],{},{"title":70,"searchDepth":83,"depth":83,"links":14371},[14372,14373,14374,14375,14376,14377,14378,14379],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":7982,"description":7987},[130,8172,8173],{"id":8176,"title":8177,"body":14384,"category":130,"cover":224,"description":8182,"extension":225,"meta":14547,"navigation":227,"path":8386,"pinned":229,"publishedAt":230,"seo":14548,"slug":8388,"stem":8389,"summary":8390,"tags":14549,"updatedAt":230,"visible":227,"__hash__":8394},{"type":7,"value":14385,"toc":14535},[14386,14388,14390,14392,14394,14398,14402,14404,14420,14422,14424,14468,14470,14475,14477,14479,14493,14495,14499,14503,14507,14509,14515,14517,14527,14529,14531,14533],[10,14387,8182],{},[14,14389,16],{"id":16},[10,14391,8187],{},[14,14393,22],{"id":22},[10,14395,14396],{},[26,14397],{"alt":8194,"src":8195},[10,14399,8198,14400,8202],{},[34,14401,8201],{},[14,14403,44],{"id":44},[46,14405,14406,14412,14418],{},[49,14407,14408,8212,14410,8216],{},[34,14409,8211],{},[34,14411,8215],{},[49,14413,8219,14414,8223,14416,8226],{},[34,14415,8222],{},[34,14417,4288],{},[49,14419,8229],{},[14,14421,60],{"id":60},[10,14423,63],{},[65,14425,14426],{"className":67,"code":8236,"language":69,"meta":70,"style":70},[34,14427,14428,14432,14436,14440,14444,14448,14452,14456,14460,14464],{"__ignoreMap":70},[74,14429,14430],{"class":76,"line":77},[74,14431,8243],{},[74,14433,14434],{"class":76,"line":83},[74,14435,8248],{},[74,14437,14438],{"class":76,"line":89},[74,14439,8253],{},[74,14441,14442],{"class":76,"line":95},[74,14443,8258],{},[74,14445,14446],{"class":76,"line":101},[74,14447,8263],{},[74,14449,14450],{"class":76,"line":1147},[74,14451,1095],{"emptyLinePlaceholder":227},[74,14453,14454],{"class":76,"line":2488},[74,14455,8272],{},[74,14457,14458],{"class":76,"line":2494},[74,14459,8277],{},[74,14461,14462],{"class":76,"line":3902},[74,14463,8277],{},[74,14465,14466],{"class":76,"line":4114},[74,14467,8277],{},[10,14469,107],{},[65,14471,14473],{"className":14472,"code":8291,"language":113,"meta":70},[111],[34,14474,8291],{"__ignoreMap":70},[10,14476,118],{},[14,14478,121],{"id":121},[123,14480,14481,14485],{},[49,14482,7882,14483,8305],{},[34,14484,8304],{},[49,14486,8308,14487,8311,14489,8314,14491,8318],{},[34,14488,8215],{},[34,14490,8201],{},[34,14492,8317],{},[155,14494,157],{"id":157},[10,14496,8323,14497,8326],{},[34,14498,8215],{},[10,14500,14501],{},[26,14502],{"alt":8331,"src":8332},[10,14504,8335,14505,8338],{},[34,14506,8201],{},[14,14508,172],{"id":172},[46,14510,14511,14513],{},[49,14512,8345],{},[49,14514,8348],{},[14,14516,183],{"id":183},[123,14518,14519,14521],{},[49,14520,8355],{},[49,14522,3960,14523,8360,14525,8363],{},[34,14524,4288],{},[34,14526,8215],{},[10,14528,201],{},[14,14530,204],{"id":204},[10,14532,8370],{},[209,14534,211],{},{"title":70,"searchDepth":83,"depth":83,"links":14536},[14537,14538,14539,14540,14541,14544,14545,14546],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":14542},[14543],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":8177,"description":8182},[130,8392,8393],{"id":8396,"title":8397,"body":14551,"category":130,"cover":224,"description":8402,"extension":225,"meta":14734,"navigation":227,"path":8627,"pinned":229,"publishedAt":230,"seo":14735,"slug":8629,"stem":8630,"summary":8631,"tags":14736,"updatedAt":230,"visible":227,"__hash__":8634},{"type":7,"value":14552,"toc":14722},[14553,14555,14557,14559,14561,14565,14567,14569,14583,14585,14587,14655,14657,14662,14664,14666,14680,14682,14684,14688,14694,14696,14704,14706,14714,14716,14718,14720],[10,14554,8402],{},[14,14556,16],{"id":16},[10,14558,8407],{},[14,14560,22],{"id":22},[10,14562,14563],{},[26,14564],{"alt":8414,"src":8415},[10,14566,8418],{},[14,14568,44],{"id":44},[46,14570,14571,14577,14579],{},[49,14572,14573,8428,14575,41],{},[34,14574,8427],{},[34,14576,8431],{},[49,14578,8434],{},[49,14580,14581,8440],{},[34,14582,8439],{},[14,14584,60],{"id":60},[10,14586,63],{},[65,14588,14589],{"className":67,"code":8447,"language":69,"meta":70,"style":70},[34,14590,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647,14651],{"__ignoreMap":70},[74,14592,14593],{"class":76,"line":77},[74,14594,8454],{},[74,14596,14597],{"class":76,"line":83},[74,14598,1095],{"emptyLinePlaceholder":227},[74,14600,14601],{"class":76,"line":89},[74,14602,8463],{},[74,14604,14605],{"class":76,"line":95},[74,14606,8468],{},[74,14608,14609],{"class":76,"line":101},[74,14610,8473],{},[74,14612,14613],{"class":76,"line":1147},[74,14614,8478],{},[74,14616,14617],{"class":76,"line":2488},[74,14618,8483],{},[74,14620,14621],{"class":76,"line":2494},[74,14622,8488],{},[74,14624,14625],{"class":76,"line":3902},[74,14626,8493],{},[74,14628,14629],{"class":76,"line":4114},[74,14630,8498],{},[74,14632,14633],{"class":76,"line":5779},[74,14634,1095],{"emptyLinePlaceholder":227},[74,14636,14637],{"class":76,"line":5784},[74,14638,8507],{},[74,14640,14641],{"class":76,"line":7389},[74,14642,6132],{},[74,14644,14645],{"class":76,"line":7395},[74,14646,6137],{},[74,14648,14649],{"class":76,"line":8518},[74,14650,1095],{"emptyLinePlaceholder":227},[74,14652,14653],{"class":76,"line":8523},[74,14654,8526],{},[10,14656,107],{},[65,14658,14660],{"className":14659,"code":8532,"language":113,"meta":70},[111],[34,14661,8532],{"__ignoreMap":70},[10,14663,118],{},[14,14665,121],{"id":121},[123,14667,14668,14678],{},[49,14669,8543,14670,8547,14672,8551,14674,8555,14676,41],{},[34,14671,8546],{},[34,14673,8550],{},[34,14675,8554],{},[34,14677,8546],{},[49,14679,8560],{},[155,14681,157],{"id":157},[10,14683,8565],{},[10,14685,14686],{},[26,14687],{"alt":8570,"src":8571},[10,14689,14690,8576,14692,41],{},[34,14691,8427],{},[34,14693,8431],{},[14,14695,172],{"id":172},[46,14697,14698,14702],{},[49,14699,8585,14700,41],{},[34,14701,5330],{},[49,14703,8590],{},[14,14705,183],{"id":183},[123,14707,14708,14710],{},[49,14709,8597],{},[49,14711,8600,14712,8604],{},[34,14713,8603],{},[10,14715,201],{},[14,14717,204],{"id":204},[10,14719,8611],{},[209,14721,211],{},{"title":70,"searchDepth":83,"depth":83,"links":14723},[14724,14725,14726,14727,14728,14731,14732,14733],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":14729},[14730],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":8397,"description":8402},[130,8633,5281],{"id":8636,"title":8637,"body":14738,"category":130,"cover":224,"description":8642,"extension":225,"meta":14897,"navigation":227,"path":8830,"pinned":229,"publishedAt":230,"seo":14898,"slug":8832,"stem":8833,"summary":8834,"tags":14899,"updatedAt":230,"visible":227,"__hash__":8838},{"type":7,"value":14739,"toc":14885},[14740,14742,14744,14746,14748,14752,14754,14756,14764,14766,14768,14832,14834,14839,14841,14843,14851,14853,14855,14859,14861,14863,14869,14871,14877,14879,14881,14883],[10,14741,8642],{},[14,14743,16],{"id":16},[10,14745,8647],{},[14,14747,22],{"id":22},[10,14749,14750],{},[26,14751],{"alt":8654,"src":8655},[10,14753,8658],{},[14,14755,44],{"id":44},[46,14757,14758,14760,14762],{},[49,14759,8665],{},[49,14761,8668],{},[49,14763,8671],{},[14,14765,60],{"id":60},[10,14767,63],{},[65,14769,14770],{"className":67,"code":8678,"language":69,"meta":70,"style":70},[34,14771,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824,14828],{"__ignoreMap":70},[74,14773,14774],{"class":76,"line":77},[74,14775,8685],{},[74,14777,14778],{"class":76,"line":83},[74,14779,8690],{},[74,14781,14782],{"class":76,"line":89},[74,14783,1095],{"emptyLinePlaceholder":227},[74,14785,14786],{"class":76,"line":95},[74,14787,8699],{},[74,14789,14790],{"class":76,"line":101},[74,14791,1095],{"emptyLinePlaceholder":227},[74,14793,14794],{"class":76,"line":1147},[74,14795,8708],{},[74,14797,14798],{"class":76,"line":2488},[74,14799,8713],{},[74,14801,14802],{"class":76,"line":2494},[74,14803,8718],{},[74,14805,14806],{"class":76,"line":3902},[74,14807,1095],{"emptyLinePlaceholder":227},[74,14809,14810],{"class":76,"line":4114},[74,14811,8727],{},[74,14813,14814],{"class":76,"line":5779},[74,14815,8732],{},[74,14817,14818],{"class":76,"line":5784},[74,14819,8737],{},[74,14821,14822],{"class":76,"line":7389},[74,14823,1095],{"emptyLinePlaceholder":227},[74,14825,14826],{"class":76,"line":7395},[74,14827,6146],{},[74,14829,14830],{"class":76,"line":8518},[74,14831,8750],{},[10,14833,107],{},[65,14835,14837],{"className":14836,"code":8756,"language":113,"meta":70},[111],[34,14838,8756],{"__ignoreMap":70},[10,14840,118],{},[14,14842,121],{"id":121},[123,14844,14845,14849],{},[49,14846,14847,8770],{},[34,14848,8769],{},[49,14850,8773],{},[155,14852,157],{"id":157},[10,14854,8778],{},[10,14856,14857],{},[26,14858],{"alt":8783,"src":8784},[10,14860,8787],{},[14,14862,172],{"id":172},[46,14864,14865,14867],{},[49,14866,8794],{},[49,14868,8797],{},[14,14870,183],{"id":183},[123,14872,14873,14875],{},[49,14874,8804],{},[49,14876,8807],{},[10,14878,201],{},[14,14880,204],{"id":204},[10,14882,8814],{},[209,14884,211],{},{"title":70,"searchDepth":83,"depth":83,"links":14886},[14887,14888,14889,14890,14891,14894,14895,14896],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":14892},[14893],{"id":157,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":8637,"description":8642},[130,8836,8837],{"id":8840,"title":8841,"body":14901,"category":130,"cover":224,"description":8846,"extension":225,"meta":15139,"navigation":227,"path":9147,"pinned":229,"publishedAt":230,"seo":15140,"slug":9149,"stem":9150,"summary":9151,"tags":15141,"updatedAt":230,"visible":227,"__hash__":9155},{"type":7,"value":14902,"toc":15126},[14903,14905,14907,14909,14911,14915,14917,14919,14929,14931,14933,15049,15051,15056,15058,15060,15070,15072,15074,15078,15080,15082,15084,15088,15092,15094,15102,15104,15118,15120,15122,15124],[10,14904,8846],{},[14,14906,16],{"id":16},[10,14908,8851],{},[14,14910,22],{"id":22},[10,14912,14913],{},[26,14914],{"alt":8858,"src":8859},[10,14916,8862],{},[14,14918,44],{"id":44},[46,14920,14921,14923,14925],{},[49,14922,8869],{},[49,14924,8872],{},[49,14926,8875,14927,8879],{},[34,14928,8878],{},[14,14930,60],{"id":60},[10,14932,63],{},[65,14934,14935],{"className":67,"code":8886,"language":69,"meta":70,"style":70},[34,14936,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,15041,15045],{"__ignoreMap":70},[74,14938,14939],{"class":76,"line":77},[74,14940,6944],{},[74,14942,14943],{"class":76,"line":83},[74,14944,6553],{},[74,14946,14947],{"class":76,"line":89},[74,14948,1095],{"emptyLinePlaceholder":227},[74,14950,14951],{"class":76,"line":95},[74,14952,8905],{},[74,14954,14955],{"class":76,"line":101},[74,14956,8910],{},[74,14958,14959],{"class":76,"line":1147},[74,14960,8915],{},[74,14962,14963],{"class":76,"line":2488},[74,14964,8920],{},[74,14966,14967],{"class":76,"line":2494},[74,14968,1095],{"emptyLinePlaceholder":227},[74,14970,14971],{"class":76,"line":3902},[74,14972,8929],{},[74,14974,14975],{"class":76,"line":4114},[74,14976,8934],{},[74,14978,14979],{"class":76,"line":5779},[74,14980,8939],{},[74,14982,14983],{"class":76,"line":5784},[74,14984,8944],{},[74,14986,14987],{"class":76,"line":7389},[74,14988,8949],{},[74,14990,14991],{"class":76,"line":7395},[74,14992,1095],{"emptyLinePlaceholder":227},[74,14994,14995],{"class":76,"line":8518},[74,14996,8958],{},[74,14998,14999],{"class":76,"line":8523},[74,15000,8963],{},[74,15002,15003],{"class":76,"line":8966},[74,15004,8969],{},[74,15006,15007],{"class":76,"line":8972},[74,15008,1095],{"emptyLinePlaceholder":227},[74,15010,15011],{"class":76,"line":8977},[74,15012,8980],{},[74,15014,15015],{"class":76,"line":8983},[74,15016,1095],{"emptyLinePlaceholder":227},[74,15018,15019],{"class":76,"line":8988},[74,15020,7362],{},[74,15022,15023],{"class":76,"line":8993},[74,15024,8996],{},[74,15026,15027],{"class":76,"line":8999},[74,15028,9002],{},[74,15030,15031],{"class":76,"line":9005},[74,15032,9008],{},[74,15034,15035],{"class":76,"line":9011},[74,15036,7372],{},[74,15038,15039],{"class":76,"line":9016},[74,15040,9019],{},[74,15042,15043],{"class":76,"line":9022},[74,15044,1144],{},[74,15046,15047],{"class":76,"line":9027},[74,15048,9030],{},[10,15050,107],{},[65,15052,15054],{"className":15053,"code":9036,"language":113,"meta":70},[111],[34,15055,9036],{"__ignoreMap":70},[10,15057,118],{},[14,15059,121],{"id":121},[123,15061,15062,15066],{},[49,15063,9047,15064,9050],{},[34,15065,8878],{},[49,15067,15068,9055],{},[34,15069,8110],{},[155,15071,157],{"id":157},[10,15073,9060],{},[10,15075,15076],{},[26,15077],{"alt":9065,"src":9066},[10,15079,9069],{},[155,15081,157],{"id":4169},[10,15083,9074],{},[10,15085,15086],{},[26,15087],{"alt":9079,"src":9080},[10,15089,9083,15090,9087],{},[34,15091,9086],{},[14,15093,172],{"id":172},[46,15095,15096,15098],{},[49,15097,9094],{},[49,15099,9097,15100,9100],{},[34,15101,9086],{},[14,15103,183],{"id":183},[123,15105,15106,15110,15112],{},[49,15107,9107,15108,9110],{},[34,15109,9086],{},[49,15111,9113],{},[49,15113,9116,15114,9120,15116,9123],{},[34,15115,9119],{},[34,15117,6088],{},[10,15119,201],{},[14,15121,204],{"id":204},[10,15123,9130],{},[209,15125,211],{},{"title":70,"searchDepth":83,"depth":83,"links":15127},[15128,15129,15130,15131,15132,15136,15137,15138],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":44,"depth":83,"text":44},{"id":60,"depth":83,"text":60},{"id":121,"depth":83,"text":121,"children":15133},[15134,15135],{"id":157,"depth":89,"text":157},{"id":4169,"depth":89,"text":157},{"id":172,"depth":83,"text":172},{"id":183,"depth":83,"text":183},{"id":204,"depth":83,"text":204},{},{"title":8841,"description":8846},[130,9153,9154],{"id":1053,"title":1054,"body":15143,"category":130,"cover":1062,"description":70,"extension":225,"meta":15379,"navigation":227,"path":1381,"pinned":229,"publishedAt":1382,"seo":15380,"slug":1384,"stem":1385,"summary":1386,"tags":15381,"updatedAt":1382,"visible":227,"__hash__":1390},{"type":7,"value":15144,"toc":15364},[15145,15149,15151,15153,15155,15157,15177,15179,15184,15186,15188,15216,15222,15224,15228,15230,15250,15252,15262,15264,15266,15268,15270,15272,15274,15276,15278,15280,15300,15302,15304,15308,15310,15312,15314,15316,15320,15322,15340,15342,15344,15346,15348,15350,15352,15354,15356,15358,15360,15362],[10,15146,15147],{},[26,15148],{"alt":1061,"src":1062},[10,15150,1065],{},[10,15152,1068],{},[14,15154,1072],{"id":1071},[10,15156,1075],{},[65,15158,15159],{"className":67,"code":1078,"language":69,"meta":70,"style":70},[34,15160,15161,15165,15169,15173],{"__ignoreMap":70},[74,15162,15163],{"class":76,"line":77},[74,15164,1085],{},[74,15166,15167],{"class":76,"line":83},[74,15168,1090],{},[74,15170,15171],{"class":76,"line":89},[74,15172,1095],{"emptyLinePlaceholder":227},[74,15174,15175],{"class":76,"line":95},[74,15176,1100],{},[10,15178,1103],{},[65,15180,15182],{"className":15181,"code":1107,"language":113,"meta":70},[111],[34,15183,1107],{"__ignoreMap":70},[10,15185,1112],{},[10,15187,1115],{},[65,15189,15190],{"className":67,"code":1118,"language":69,"meta":70,"style":70},[34,15191,15192,15196,15200,15204,15208,15212],{"__ignoreMap":70},[74,15193,15194],{"class":76,"line":77},[74,15195,1125],{},[74,15197,15198],{"class":76,"line":83},[74,15199,1095],{"emptyLinePlaceholder":227},[74,15201,15202],{"class":76,"line":89},[74,15203,1134],{},[74,15205,15206],{"class":76,"line":95},[74,15207,1139],{},[74,15209,15210],{"class":76,"line":101},[74,15211,1144],{},[74,15213,15214],{"class":76,"line":1147},[74,15215,1150],{},[10,15217,15218,1156,15220,1160],{},[34,15219,1155],{},[34,15221,1159],{},[14,15223,1164],{"id":1163},[10,15225,1167,15226,1171],{},[34,15227,1170],{},[10,15229,1174],{},[65,15231,15232],{"className":67,"code":1177,"language":69,"meta":70,"style":70},[34,15233,15234,15238,15242,15246],{"__ignoreMap":70},[74,15235,15236],{"class":76,"line":77},[74,15237,1184],{},[74,15239,15240],{"class":76,"line":83},[74,15241,1189],{},[74,15243,15244],{"class":76,"line":89},[74,15245,1194],{},[74,15247,15248],{"class":76,"line":95},[74,15249,1199],{},[10,15251,1202],{},[65,15253,15254],{"className":588,"code":1205,"language":590,"meta":70,"style":70},[34,15255,15256],{"__ignoreMap":70},[74,15257,15258,15260],{"class":76,"line":77},[74,15259,688],{"class":597},[74,15261,1214],{"class":633},[10,15263,1217],{},[14,15265,1221],{"id":1220},[155,15267,1224],{"id":1224},[10,15269,1227],{},[155,15271,1230],{"id":1230},[10,15273,1233],{},[155,15275,1236],{"id":1236},[10,15277,1239],{},[10,15279,1242],{},[65,15281,15282],{"className":67,"code":1245,"language":69,"meta":70,"style":70},[34,15283,15284,15288,15292,15296],{"__ignoreMap":70},[74,15285,15286],{"class":76,"line":77},[74,15287,1252],{},[74,15289,15290],{"class":76,"line":83},[74,15291,1095],{"emptyLinePlaceholder":227},[74,15293,15294],{"class":76,"line":89},[74,15295,1261],{},[74,15297,15298],{"class":76,"line":95},[74,15299,1266],{},[10,15301,1269],{},[155,15303,1272],{"id":1272},[10,15305,1275,15306,1278],{},[34,15307,259],{},[10,15309,1281],{},[155,15311,1284],{"id":1284},[10,15313,1287],{},[14,15315,1291],{"id":1290},[10,15317,15318],{},[26,15319],{"alt":1296,"src":1297},[10,15321,1300],{},[46,15323,15324,15326,15328,15330,15332,15334,15336,15338],{},[49,15325,1305],{},[49,15327,1308],{},[49,15329,1311],{},[49,15331,1314],{},[49,15333,1317],{},[49,15335,1320],{},[49,15337,1323],{},[49,15339,1326],{},[10,15341,1329],{},[14,15343,1333],{"id":1332},[10,15345,1336],{},[10,15347,1339],{},[14,15349,1343],{"id":1342},[10,15351,1346],{},[10,15353,1349],{},[10,15355,1352],{},[14,15357,1355],{"id":1355},[10,15359,1358],{},[10,15361,1361],{},[209,15363,1364],{},{"title":70,"searchDepth":83,"depth":83,"links":15365},[15366,15367,15368,15375,15376,15377,15378],{"id":1071,"depth":83,"text":1072},{"id":1163,"depth":83,"text":1164},{"id":1220,"depth":83,"text":1221,"children":15369},[15370,15371,15372,15373,15374],{"id":1224,"depth":89,"text":1224},{"id":1230,"depth":89,"text":1230},{"id":1236,"depth":89,"text":1236},{"id":1272,"depth":89,"text":1272},{"id":1284,"depth":89,"text":1284},{"id":1290,"depth":83,"text":1291},{"id":1332,"depth":83,"text":1333},{"id":1342,"depth":83,"text":1343},{"id":1355,"depth":83,"text":1355},{},{"title":1054,"description":70},[130,1388,1389],{"id":241,"title":242,"body":15383,"category":130,"cover":224,"description":70,"extension":225,"meta":15962,"navigation":227,"path":1042,"pinned":229,"publishedAt":1043,"seo":15963,"slug":1045,"stem":1046,"summary":1047,"tags":15964,"updatedAt":1043,"visible":227,"__hash__":1051},{"type":7,"value":15384,"toc":15938},[15385,15387,15389,15391,15395,15397,15399,15423,15435,15437,15439,15444,15448,15452,15464,15468,15472,15476,15478,15512,15514,15518,15522,15524,15546,15576,15588,15598,15606,15608,15614,15624,15626,15631,15635,15637,15651,15657,15677,15679,15681,15683,15693,15697,15699,15708,15712,15714,15716,15736,15740,15742,15744,15746,15748,15768,15770,15772,15774,15800,15802,15818,15820,15836,15840,15842,15844,15864,15866,15868,15870,15874,15884,15886,15888,15890,15900,15908,15910,15912,15926,15936],[14,15386,247],{"id":247},[10,15388,250],{},[10,15390,253],{},[10,15392,256,15393,260],{},[34,15394,259],{},[14,15396,263],{"id":263},[10,15398,266],{},[268,15400,15401,15403],{},[10,15402,272],{},[268,15404,15405,15411,15413,15417,15419],{},[10,15406,277,15407,281,15409,285],{},[34,15408,280],{},[34,15410,284],{},[10,15412,288],{},[10,15414,291,15415,296],{},[293,15416,295],{},[10,15418,299],{},[10,15420,15421],{},[26,15422],{"alt":304,"src":305},[268,15424,15425,15427],{},[10,15426,310],{},[268,15428,15429,15431],{},[10,15430,315],{},[10,15432,15433],{},[26,15434],{"alt":320,"src":321},[14,15436,325],{"id":324},[155,15438,329],{"id":328},[10,15440,332,15441,340],{},[334,15442,339],{"href":336,"rel":15443},[338],[268,15445,15446],{},[10,15447,345],{},[10,15449,15450],{},[26,15451],{"alt":350,"src":351},[46,15453,15454,15458,15462],{},[49,15455,356,15456,41],{},[293,15457,359],{},[49,15459,362,15460,41],{},[293,15461,365],{},[49,15463,368],{},[10,15465,15466],{},[26,15467],{"alt":373,"src":374},[268,15469,15470],{},[10,15471,379],{},[10,15473,15474],{},[26,15475],{"alt":384,"src":385},[155,15477,389],{"id":388},[268,15479,15480,15484,15488,15508],{},[268,15481,15482],{},[10,15483,396],{},[10,15485,399,15486,403],{},[293,15487,402],{},[65,15489,15490],{"className":67,"code":406,"language":69,"meta":70,"style":70},[34,15491,15492,15496,15500,15504],{"__ignoreMap":70},[74,15493,15494],{"class":76,"line":77},[74,15495,413],{},[74,15497,15498],{"class":76,"line":83},[74,15499,418],{},[74,15501,15502],{"class":76,"line":89},[74,15503,423],{},[74,15505,15506],{"class":76,"line":95},[74,15507,428],{},[10,15509,431,15510,435],{},[293,15511,434],{},[10,15513,438],{},[10,15515,441,15516,444],{},[34,15517,69],{},[10,15519,15520],{},[26,15521],{"alt":449,"src":450},[10,15523,453],{},[268,15525,15526,15528,15532],{},[10,15527,458],{},[10,15529,15530],{},[293,15531,463],{},[268,15533,15534,15538,15542],{},[10,15535,468,15536,471],{},[34,15537,69],{},[10,15539,474,15540,477],{},[34,15541,69],{},[10,15543,480,15544,484],{},[293,15545,483],{},[268,15547,15548,15550,15554],{},[10,15549,489],{},[10,15551,15552],{},[293,15553,494],{},[268,15555,15556,15562,15570,15572],{},[10,15557,15558,502,15560,506],{},[34,15559,501],{},[34,15561,505],{},[10,15563,509,15564,512,15566,516,15568,520],{},[34,15565,501],{},[293,15567,515],{},[293,15569,519],{},[10,15571,523],{},[10,15573,15574,529],{},[293,15575,528],{},[268,15577,15578,15580],{},[10,15579,534],{},[268,15581,15582,15586],{},[10,15583,539,15584,543],{},[293,15585,542],{},[10,15587,546],{},[268,15589,15590,15594],{},[10,15591,551,15592],{},[293,15593,554],{},[10,15595,15596],{},[26,15597],{"alt":559,"src":560},[268,15599,15600,15602],{},[10,15601,565],{},[10,15603,15604],{},[26,15605],{"alt":559,"src":570},[155,15607,574],{"id":573},[10,15609,577,15610,581,15612,585],{},[34,15611,580],{},[34,15613,584],{},[65,15615,15616],{"className":588,"code":589,"language":590,"meta":70,"style":70},[34,15617,15618],{"__ignoreMap":70},[74,15619,15620,15622],{"class":76,"line":77},[74,15621,69],{"class":597},[74,15623,601],{"class":600},[10,15625,604],{},[65,15627,15629],{"className":15628,"code":608,"language":113,"meta":70},[111],[34,15630,608],{"__ignoreMap":70},[10,15632,15633],{},[26,15634],{"alt":559,"src":615},[10,15636,618],{},[65,15638,15639],{"className":588,"code":621,"language":590,"meta":70,"style":70},[34,15640,15641],{"__ignoreMap":70},[74,15642,15643,15645,15647,15649],{"class":76,"line":77},[74,15644,69],{"class":597},[74,15646,630],{"class":600},[74,15648,634],{"class":633},[74,15650,601],{"class":600},[10,15652,639,15653,642,15655,646],{},[34,15654,69],{},[34,15656,645],{},[65,15658,15659],{"className":588,"code":649,"language":590,"meta":70,"style":70},[34,15660,15661,15667],{"__ignoreMap":70},[74,15662,15663,15665],{"class":76,"line":77},[74,15664,505],{"class":597},[74,15666,601],{"class":600},[74,15668,15669,15671,15673,15675],{"class":76,"line":83},[74,15670,505],{"class":597},[74,15672,630],{"class":600},[74,15674,634],{"class":633},[74,15676,601],{"class":600},[14,15678,671],{"id":670},[155,15680,675],{"id":674},[10,15682,678],{},[65,15684,15685],{"className":588,"code":681,"language":590,"meta":70,"style":70},[34,15686,15687],{"__ignoreMap":70},[74,15688,15689,15691],{"class":76,"line":77},[74,15690,688],{"class":597},[74,15692,601],{"class":600},[10,15694,693,15695,697],{},[34,15696,696],{},[155,15698,701],{"id":700},[10,15700,332,15701,709,15704,41,15706,716],{},[334,15702,708],{"href":706,"rel":15703},[338],[293,15705,712],{},[34,15707,715],{},[10,15709,719,15710,723],{},[34,15711,722],{},[155,15713,727],{"id":726},[10,15715,730],{},[65,15717,15718],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,15719,15720,15726],{"__ignoreMap":70},[74,15721,15722,15724],{"class":76,"line":77},[74,15723,688],{"class":597},[74,15725,601],{"class":600},[74,15727,15728,15730,15732,15734],{"class":76,"line":83},[74,15729,688],{"class":597},[74,15731,630],{"class":600},[74,15733,634],{"class":633},[74,15735,601],{"class":600},[10,15737,754,15738,757],{},[34,15739,688],{},[14,15741,761],{"id":760},[10,15743,764],{},[155,15745,768],{"id":767},[10,15747,771],{},[65,15749,15750],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,15751,15752,15758],{"__ignoreMap":70},[74,15753,15754,15756],{"class":76,"line":77},[74,15755,688],{"class":597},[74,15757,601],{"class":600},[74,15759,15760,15762,15764,15766],{"class":76,"line":83},[74,15761,688],{"class":597},[74,15763,630],{"class":600},[74,15765,634],{"class":633},[74,15767,601],{"class":600},[10,15769,794],{},[155,15771,798],{"id":797},[10,15773,801],{},[65,15775,15776],{"className":588,"code":804,"language":590,"meta":70,"style":70},[34,15777,15778,15786],{"__ignoreMap":70},[74,15779,15780,15782,15784],{"class":76,"line":77},[74,15781,811],{"class":597},[74,15783,814],{"class":633},[74,15785,817],{"class":633},[74,15787,15788,15790,15792,15794,15796,15798],{"class":76,"line":83},[74,15789,811],{"class":597},[74,15791,814],{"class":633},[74,15793,826],{"class":633},[74,15795,829],{"class":633},[74,15797,832],{"class":633},[74,15799,835],{"class":633},[10,15801,838],{},[65,15803,15804],{"className":588,"code":841,"language":590,"meta":70,"style":70},[34,15805,15806],{"__ignoreMap":70},[74,15807,15808,15810,15812,15814,15816],{"class":76,"line":77},[74,15809,811],{"class":597},[74,15811,850],{"class":633},[74,15813,826],{"class":633},[74,15815,829],{"class":633},[74,15817,857],{"class":633},[10,15819,860],{},[65,15821,15822],{"className":588,"code":863,"language":590,"meta":70,"style":70},[34,15823,15824],{"__ignoreMap":70},[74,15825,15826,15828,15830,15832,15834],{"class":76,"line":77},[74,15827,811],{"class":597},[74,15829,872],{"class":633},[74,15831,875],{"class":600},[74,15833,878],{"class":633},[74,15835,881],{"class":633},[10,15837,15838,886],{},[34,15839,811],{},[155,15841,890],{"id":889},[10,15843,893],{},[65,15845,15846],{"className":588,"code":733,"language":590,"meta":70,"style":70},[34,15847,15848,15854],{"__ignoreMap":70},[74,15849,15850,15852],{"class":76,"line":77},[74,15851,688],{"class":597},[74,15853,601],{"class":600},[74,15855,15856,15858,15860,15862],{"class":76,"line":83},[74,15857,688],{"class":597},[74,15859,630],{"class":600},[74,15861,634],{"class":633},[74,15863,601],{"class":600},[10,15865,916],{},[14,15867,919],{"id":919},[155,15869,923],{"id":922},[10,15871,926,15872,930],{},[34,15873,929],{},[123,15875,15876,15880,15882],{},[49,15877,935,15878,938],{},[34,15879,645],{},[49,15881,941],{},[49,15883,944],{},[10,15885,947],{},[155,15887,951],{"id":950},[10,15889,954],{},[65,15891,15892],{"className":588,"code":681,"language":590,"meta":70,"style":70},[34,15893,15894],{"__ignoreMap":70},[74,15895,15896,15898],{"class":76,"line":77},[74,15897,688],{"class":597},[74,15899,601],{"class":600},[10,15901,967,15902,970,15904,973,15906,41],{},[34,15903,688],{},[34,15905,69],{},[34,15907,688],{},[155,15909,979],{"id":978},[10,15911,982],{},[65,15913,15914],{"className":588,"code":985,"language":590,"meta":70,"style":70},[34,15915,15916],{"__ignoreMap":70},[74,15917,15918,15920,15922,15924],{"class":76,"line":77},[74,15919,688],{"class":597},[74,15921,630],{"class":600},[74,15923,634],{"class":633},[74,15925,601],{"class":600},[10,15927,1000,15928,1003,15930,1006,15932,1009,15934,1013],{},[34,15929,688],{},[34,15931,69],{},[34,15933,505],{},[34,15935,1012],{},[209,15937,1016],{},{"title":70,"searchDepth":83,"depth":83,"links":15939},[15940,15941,15942,15947,15952,15957],{"id":247,"depth":83,"text":247},{"id":263,"depth":83,"text":263},{"id":324,"depth":83,"text":325,"children":15943},[15944,15945,15946],{"id":328,"depth":89,"text":329},{"id":388,"depth":89,"text":389},{"id":573,"depth":89,"text":574},{"id":670,"depth":83,"text":671,"children":15948},[15949,15950,15951],{"id":674,"depth":89,"text":675},{"id":700,"depth":89,"text":701},{"id":726,"depth":89,"text":727},{"id":760,"depth":83,"text":761,"children":15953},[15954,15955,15956],{"id":767,"depth":89,"text":768},{"id":797,"depth":89,"text":798},{"id":889,"depth":89,"text":890},{"id":919,"depth":83,"text":919,"children":15958},[15959,15960,15961],{"id":922,"depth":89,"text":923},{"id":950,"depth":89,"text":951},{"id":978,"depth":89,"text":979},{},{"title":242,"description":70},[130,1049,1050],1786973364497]