[{"data":1,"prerenderedAt":15975},["ShallowReactive",2],{"post-python-text-files-encoding":3,"sidebar-posts":250,"post-related-source":9166},{"id":4,"title":5,"body":6,"category":235,"cover":236,"description":12,"extension":237,"meta":238,"navigation":96,"path":239,"pinned":240,"publishedAt":241,"seo":242,"slug":243,"stem":244,"summary":245,"tags":246,"updatedAt":241,"visible":96,"__hash__":249},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":8,"toc":225},"minimark",[9,13,17,20,23,30,33,36,68,71,74,151,154,162,165,168,180,183,197,200,212,215,218,221],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[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\u002F30-text-encoding.svg",[10,31,32],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,34,35],{"id":35},"核心概念",[37,38,39,47,57],"ul",{},[40,41,42,46],"li",{},[43,44,45],"code",{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,48,49,52,53,56],{},[43,50,51],{},"r"," 模式读取不存在文件会产生 ",[43,54,55],{},"FileNotFoundError","。",[40,58,59,60,63,64,67],{},"本篇显式调用 ",[43,61,62],{},"close()","；第 34 篇会用 ",[43,65,66],{},"with"," 更可靠地管理关闭动作。",[14,69,70],{"id":70},"跟着示例运行",[10,72,73],{},"把下面代码保存到本课脚本并运行：",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-python shiki shiki-themes github-dark","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","python","",[43,82,83,91,98,104,110,116,122,127,133,139,145],{"__ignoreMap":80},[84,85,88],"span",{"class":86,"line":87},"line",1,[84,89,90],{},"from pathlib import Path\n",[84,92,94],{"class":86,"line":93},2,[84,95,97],{"emptyLinePlaceholder":96},true,"\n",[84,99,101],{"class":86,"line":100},3,[84,102,103],{},"file_path = Path(\"notes.txt\")\n",[84,105,107],{"class":86,"line":106},4,[84,108,109],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[84,111,113],{"class":86,"line":112},5,[84,114,115],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[84,117,119],{"class":86,"line":118},6,[84,120,121],{},"writer.close()\n",[84,123,125],{"class":86,"line":124},7,[84,126,97],{"emptyLinePlaceholder":96},[84,128,130],{"class":86,"line":129},8,[84,131,132],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[84,134,136],{"class":86,"line":135},9,[84,137,138],{},"content = reader.read()\n",[84,140,142],{"class":86,"line":141},10,[84,143,144],{},"reader.close()\n",[84,146,148],{"class":86,"line":147},11,[84,149,150],{},"print(content)\n",[10,152,153],{},"预期结果：",[75,155,160],{"className":156,"code":158,"language":159,"meta":80},[157],"language-text","变量\n循环\n函数\n","text",[43,161,158],{"__ignoreMap":80},[10,163,164],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,166,167],{"id":167},"按执行顺序拆开看",[169,170,171,177],"ol",{},[40,172,173,174,176],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[43,175,62],{}," 确保缓冲内容交给文件系统。",[40,178,179],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,181,182],{"id":182},"初学者容易混淆的地方",[37,184,185,191],{},[40,186,187,188,190],{},"使用 ",[43,189,45],{}," 模式打开重要文件却未确认覆盖风险。",[40,192,193,194,56],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[43,195,196],{},"encoding=\"utf-8\"",[14,198,199],{"id":199},"练习",[169,201,202,205],{},[40,203,204],{},"写入三行学习记录并读取。",[40,206,207,208,211],{},"改用 ",[43,209,210],{},"a"," 模式追加一行，确认原内容仍保留。",[10,213,214],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,216,217],{"id":217},"本篇边界",[10,219,220],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,223,224],"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":80,"searchDepth":93,"depth":93,"links":226},[227,228,229,230,231,232,233,234],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",false,"2026-08-17",{"title":5,"description":12},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[235,247,248],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",[251,1063,1400,1534,1686,1865,2053,2218,2401,2582,2775,3006,3190,3367,3524,3695,3860,4074,4302,4484,4648,4837,5025,5180,5340,5537,5734,5947,6114,6358,6539,6743,6894,7078,7279,7569,7761,7990,8185,8405,8645,8849],{"id":252,"title":253,"body":254,"category":235,"cover":236,"description":80,"extension":237,"meta":1052,"navigation":96,"path":1053,"pinned":240,"publishedAt":1054,"seo":1055,"slug":1056,"stem":1057,"summary":1058,"tags":1059,"updatedAt":1054,"visible":96,"__hash__":1062},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":255,"toc":1028},[256,259,262,265,272,275,278,317,333,337,342,352,357,363,380,386,391,397,401,447,450,456,462,465,496,541,558,572,582,586,597,613,616,622,627,630,648,658,679,683,687,690,702,709,713,728,735,739,742,763,769,773,776,780,783,803,806,810,813,847,850,869,872,893,898,902,905,925,928,931,935,942,956,959,963,966,976,987,991,994,1009,1025],[14,257,258],{"id":258},"引言",[10,260,261],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,263,264],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,266,267,268,271],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[43,269,270],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,273,274],{"id":274},"扫盲",[10,276,277],{},"那么这里有几个概念：",[279,280,281,284],"blockquote",{},[10,282,283],{},"为什么需要安装python解释器？",[279,285,286,297,300,308,311],{},[10,287,288,289,292,293,296],{},"我们写的代码，电脑其实看不懂，电脑只认识",[43,290,291],{},"0","和",[43,294,295],{},"1","组成的机器指令。",[10,298,299],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,301,302,303,307],{},"这样，我们就能用",[304,305,306],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,309,310],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,312,313],{},[26,314],{"alt":315,"src":316},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[279,318,319,322],{},[10,320,321],{},"pip又是什么？",[279,323,324,327],{},[10,325,326],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,328,329],{},[26,330],{"alt":331,"src":332},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,334,336],{"id":335},"windows-安装","Windows 安装",[338,339,341],"h3",{"id":340},"_1-下载官方安装程序","1. 下载官方安装程序",[10,343,344,345,351],{},"打开 ",[210,346,350],{"href":347,"rel":348},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[349],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[279,353,354],{},[10,355,356],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,358,359],{},[26,360],{"alt":361,"src":362},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,364,365,371,377],{},[40,366,367,368,56],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[304,369,370],{},"Windows installer (64-bit)",[40,372,373,374,56],{},"搭载 ARM 处理器的 Windows 设备选择 ",[304,375,376],{},"Windows installer (ARM64)",[40,378,379],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,381,382],{},[26,383],{"alt":384,"src":385},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[279,387,388],{},[10,389,390],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,392,393],{},[26,394],{"alt":395,"src":396},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[338,398,400],{"id":399},"_2-安装并加入-path","2. 安装并加入 PATH",[279,402,403,408,415,440],{},[279,404,405],{},[10,406,407],{},"PATH 环境变量",[10,409,410,411,414],{},"Windows 有一个特殊的变量叫 ",[304,412,413],{},"PATH","，它里面存了一串文件夹路径，比如：",[75,416,418],{"className":77,"code":417,"language":79,"meta":80,"style":80},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[43,419,420,425,430,435],{"__ignoreMap":80},[84,421,422],{"class":86,"line":87},[84,423,424],{},"D:\\Python313\\\n",[84,426,427],{"class":86,"line":93},[84,428,429],{},"D:\\Python313\\Scripts\\\n",[84,431,432],{"class":86,"line":100},[84,433,434],{},"C:\\Windows\\System32\\\n",[84,436,437],{"class":86,"line":106},[84,438,439],{},"...\n",[10,441,442,443,446],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[304,444,445],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,448,449],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,451,452,453,455],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[43,454,79],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,457,458],{},[26,459],{"alt":460,"src":461},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,463,464],{},"对安装界面最底部的两个勾选项分别解释 :",[279,466,467,470,475],{},[10,468,469],{},"Add python.exe to PATH",[10,471,472],{},[304,473,474],{},"把 Python 添加到系统环境变量",[279,476,477,483,489],{},[10,478,479,480,482],{},"勾选后，你可以在命令行任意位置直接输入 ",[43,481,79],{}," 就能运行",[10,484,485,486,488],{},"不勾选的话，命令行输入 ",[43,487,79],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,490,491,492,495],{},"必须",[304,493,494],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[279,497,498,501,506],{},[10,499,500],{},"Use admin privileges when installing py.exe",[10,502,503],{},[304,504,505],{},"使用管理员权限安装 py.exe（Python 启动器）",[279,507,508,518,532,535],{},[10,509,510,513,514,517],{},[43,511,512],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[43,515,516],{},"py"," 来启动 Python。",[10,519,520,521,523,524,527,528,531],{},"勾选后，",[43,522,512],{}," 会安装到",[304,525,526],{},"系统级目录","，电脑上",[304,529,530],{},"所有用户账户","都能用",[10,533,534],{},"不勾选，只有当前用户能用",[10,536,537,540],{},[304,538,539],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[279,542,543,546],{},[10,544,545],{},"操作建议",[279,547,548,555],{},[10,549,550,551,554],{},"两个都勾上之后，再点 ",[304,552,553],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,556,557],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[279,559,560,566],{},[10,561,562,563],{},"Python 安装的",[304,564,565],{},"可选功能页",[10,567,568],{},[26,569],{"alt":570,"src":571},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[279,573,574,577],{},[10,575,576],{},"高级选项页",[10,578,579],{},[26,580],{"alt":570,"src":581},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[338,583,585],{"id":584},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,587,588,589,592,593,596],{},"按 ",[43,590,591],{},"Win + R","，输入 ",[43,594,595],{},"cmd"," 并回车，然后执行：",[75,598,602],{"className":599,"code":600,"language":601,"meta":80,"style":80},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[43,603,604],{"__ignoreMap":80},[84,605,606,609],{"class":86,"line":87},[84,607,79],{"class":608},"svObZ",[84,610,612],{"class":611},"sDLfK"," --version\n",[10,614,615],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[75,617,620],{"className":618,"code":619,"language":159,"meta":80},[157],"Python 3.x.x\n",[43,621,619],{"__ignoreMap":80},[10,623,624],{},[26,625],{"alt":570,"src":626},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,628,629],{},"继续检查 pip：",[75,631,633],{"className":599,"code":632,"language":601,"meta":80,"style":80},"python -m pip --version\n",[43,634,635],{"__ignoreMap":80},[84,636,637,639,642,646],{"class":86,"line":87},[84,638,79],{"class":608},[84,640,641],{"class":611}," -m",[84,643,645],{"class":644},"sU2Wk"," pip",[84,647,612],{"class":611},[10,649,650,651,653,654,657],{},"如果 ",[43,652,79],{}," 无法识别，但 ",[43,655,656],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[75,659,661],{"className":599,"code":660,"language":601,"meta":80,"style":80},"py --version\npy -m pip --version\n",[43,662,663,669],{"__ignoreMap":80},[84,664,665,667],{"class":86,"line":87},[84,666,516],{"class":608},[84,668,612],{"class":611},[84,670,671,673,675,677],{"class":86,"line":93},[84,672,516],{"class":608},[84,674,641],{"class":611},[84,676,645],{"class":644},[84,678,612],{"class":611},[14,680,682],{"id":681},"macos-安装","macOS 安装",[338,684,686],{"id":685},"_1-先检查现有环境","1. 先检查现有环境",[10,688,689],{},"打开“终端”应用，执行：",[75,691,693],{"className":599,"code":692,"language":601,"meta":80,"style":80},"python3 --version\n",[43,694,695],{"__ignoreMap":80},[84,696,697,700],{"class":86,"line":87},[84,698,699],{"class":608},"python3",[84,701,612],{"class":611},[10,703,704,705,708],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[43,706,707],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[338,710,712],{"id":711},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,714,344,715,720,721,56,724,727],{},[210,716,719],{"href":717,"rel":718},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[349],"Python macOS 下载页","，下载当前稳定版的 ",[304,722,723],{},"macOS 64-bit universal2 installer",[43,725,726],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,729,730,731,734],{},"下载完成后打开 ",[43,732,733],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[338,736,738],{"id":737},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,740,741],{},"安装完成后重新打开终端，执行：",[75,743,745],{"className":599,"code":744,"language":601,"meta":80,"style":80},"python3 --version\npython3 -m pip --version\n",[43,746,747,753],{"__ignoreMap":80},[84,748,749,751],{"class":86,"line":87},[84,750,699],{"class":608},[84,752,612],{"class":611},[84,754,755,757,759,761],{"class":86,"line":93},[84,756,699],{"class":608},[84,758,641],{"class":611},[84,760,645],{"class":644},[84,762,612],{"class":611},[10,764,765,766,768],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[43,767,699],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,770,772],{"id":771},"linux-安装","Linux 安装",[10,774,775],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[338,777,779],{"id":778},"_1-检查是否已经安装","1. 检查是否已经安装",[10,781,782],{},"打开终端，执行：",[75,784,785],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,786,787,793],{"__ignoreMap":80},[84,788,789,791],{"class":86,"line":87},[84,790,699],{"class":608},[84,792,612],{"class":611},[84,794,795,797,799,801],{"class":86,"line":93},[84,796,699],{"class":608},[84,798,641],{"class":611},[84,800,645],{"class":644},[84,802,612],{"class":611},[10,804,805],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[338,807,809],{"id":808},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,811,812],{},"Ubuntu 或 Debian：",[75,814,816],{"className":599,"code":815,"language":601,"meta":80,"style":80},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[43,817,818,829],{"__ignoreMap":80},[84,819,820,823,826],{"class":86,"line":87},[84,821,822],{"class":608},"sudo",[84,824,825],{"class":644}," apt",[84,827,828],{"class":644}," update\n",[84,830,831,833,835,838,841,844],{"class":86,"line":93},[84,832,822],{"class":608},[84,834,825],{"class":644},[84,836,837],{"class":644}," install",[84,839,840],{"class":644}," python3",[84,842,843],{"class":644}," python3-pip",[84,845,846],{"class":644}," python3-venv\n",[10,848,849],{},"Fedora：",[75,851,853],{"className":599,"code":852,"language":601,"meta":80,"style":80},"sudo dnf install python3 python3-pip\n",[43,854,855],{"__ignoreMap":80},[84,856,857,859,862,864,866],{"class":86,"line":87},[84,858,822],{"class":608},[84,860,861],{"class":644}," dnf",[84,863,837],{"class":644},[84,865,840],{"class":644},[84,867,868],{"class":644}," python3-pip\n",[10,870,871],{},"Arch Linux：",[75,873,875],{"className":599,"code":874,"language":601,"meta":80,"style":80},"sudo pacman -S python python-pip\n",[43,876,877],{"__ignoreMap":80},[84,878,879,881,884,887,890],{"class":86,"line":87},[84,880,822],{"class":608},[84,882,883],{"class":644}," pacman",[84,885,886],{"class":611}," -S",[84,888,889],{"class":644}," python",[84,891,892],{"class":644}," python-pip\n",[10,894,895,897],{},[43,896,822],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[338,899,901],{"id":900},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,903,904],{},"安装结束后执行：",[75,906,907],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,908,909,915],{"__ignoreMap":80},[84,910,911,913],{"class":86,"line":87},[84,912,699],{"class":608},[84,914,612],{"class":611},[84,916,917,919,921,923],{"class":86,"line":93},[84,918,699],{"class":608},[84,920,641],{"class":611},[84,922,645],{"class":644},[84,924,612],{"class":611},[10,926,927],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,929,930],{"id":930},"常见问题",[338,932,934],{"id":933},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,936,937,938,941],{},"先关闭当前命令提示符并重新打开，再执行 ",[43,939,940],{},"python --version","。如果仍然失败，按下面的顺序检查：",[169,943,944,950,953],{},[40,945,946,947,949],{},"执行 ",[43,948,656],{},"，确认 Python Launcher 是否可用。",[40,951,952],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,954,955],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,957,958],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[338,960,962],{"id":961},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,964,965],{},"先尝试：",[75,967,968],{"className":599,"code":692,"language":601,"meta":80,"style":80},[43,969,970],{"__ignoreMap":80},[84,971,972,974],{"class":86,"line":87},[84,973,699],{"class":608},[84,975,612],{"class":611},[10,977,978,979,981,982,984,985,56],{},"在这两个系统中，只有 ",[43,980,699],{}," 命令而没有 ",[43,983,79],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[43,986,699],{},[338,988,990],{"id":989},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,992,993],{},"先使用模块方式检查：",[75,995,997],{"className":599,"code":996,"language":601,"meta":80,"style":80},"python3 -m pip --version\n",[43,998,999],{"__ignoreMap":80},[84,1000,1001,1003,1005,1007],{"class":86,"line":87},[84,1002,699],{"class":608},[84,1004,641],{"class":611},[84,1006,645],{"class":644},[84,1008,612],{"class":611},[10,1010,1011,1012,1014,1015,1017,1018,1020,1021,1024],{},"Windows 用户将命令中的 ",[43,1013,699],{}," 换成 ",[43,1016,79],{}," 或 ",[43,1019,516],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[43,1022,1023],{},"python3-pip","；不要直接使用其他系统的安装命令。",[222,1026,1027],{},"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":80,"searchDepth":93,"depth":93,"links":1029},[1030,1031,1032,1037,1042,1047],{"id":258,"depth":93,"text":258},{"id":274,"depth":93,"text":274},{"id":335,"depth":93,"text":336,"children":1033},[1034,1035,1036],{"id":340,"depth":100,"text":341},{"id":399,"depth":100,"text":400},{"id":584,"depth":100,"text":585},{"id":681,"depth":93,"text":682,"children":1038},[1039,1040,1041],{"id":685,"depth":100,"text":686},{"id":711,"depth":100,"text":712},{"id":737,"depth":100,"text":738},{"id":771,"depth":93,"text":772,"children":1043},[1044,1045,1046],{"id":778,"depth":100,"text":779},{"id":808,"depth":100,"text":809},{"id":900,"depth":100,"text":901},{"id":930,"depth":93,"text":930,"children":1048},[1049,1050,1051],{"id":933,"depth":100,"text":934},{"id":961,"depth":100,"text":962},{"id":989,"depth":100,"text":990},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":253,"description":80},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[235,1060,1061],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1064,"title":1065,"body":1066,"category":235,"cover":1073,"description":80,"extension":237,"meta":1389,"navigation":96,"path":1390,"pinned":240,"publishedAt":1391,"seo":1392,"slug":1393,"stem":1394,"summary":1395,"tags":1396,"updatedAt":1391,"visible":96,"__hash__":1399},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1067,"toc":1374},[1068,1074,1077,1080,1084,1087,1111,1114,1120,1123,1126,1160,1170,1174,1181,1184,1209,1212,1224,1227,1231,1234,1237,1240,1243,1246,1249,1252,1276,1279,1282,1288,1291,1294,1297,1301,1307,1310,1336,1339,1343,1346,1349,1353,1356,1359,1362,1365,1368,1371],[10,1069,1070],{},[26,1071],{"alt":1072,"src":1073},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1075,1076],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1078,1079],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1081,1083],{"id":1082},"python-代码是什么样的","Python 代码是什么样的",[10,1085,1086],{},"下面是一段简单的 Python 代码：",[75,1088,1090],{"className":77,"code":1089,"language":79,"meta":80,"style":80},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[43,1091,1092,1097,1102,1106],{"__ignoreMap":80},[84,1093,1094],{"class":86,"line":87},[84,1095,1096],{},"name = \"Python\"\n",[84,1098,1099],{"class":86,"line":93},[84,1100,1101],{},"year = 2026\n",[84,1103,1104],{"class":86,"line":100},[84,1105,97],{"emptyLinePlaceholder":96},[84,1107,1108],{"class":86,"line":106},[84,1109,1110],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1112,1113],{},"运行结果：",[75,1115,1118],{"className":1116,"code":1117,"language":159,"meta":80},[157],"正在学习 Python，当前年份是 2026\n",[43,1119,1117],{"__ignoreMap":80},[10,1121,1122],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1124,1125],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[75,1127,1129],{"className":77,"code":1128,"language":79,"meta":80,"style":80},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[43,1130,1131,1136,1140,1145,1150,1155],{"__ignoreMap":80},[84,1132,1133],{"class":86,"line":87},[84,1134,1135],{},"score = 85\n",[84,1137,1138],{"class":86,"line":93},[84,1139,97],{"emptyLinePlaceholder":96},[84,1141,1142],{"class":86,"line":100},[84,1143,1144],{},"if score >= 60:\n",[84,1146,1147],{"class":86,"line":106},[84,1148,1149],{},"    print(\"成绩合格\")\n",[84,1151,1152],{"class":86,"line":112},[84,1153,1154],{},"else:\n",[84,1156,1157],{"class":86,"line":118},[84,1158,1159],{},"    print(\"需要继续学习\")\n",[10,1161,1162,1165,1166,1169],{},[43,1163,1164],{},"if"," 和 ",[43,1167,1168],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1171,1173],{"id":1172},"python-如何运行代码","Python 如何运行代码",[10,1175,1176,1177,1180],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[43,1178,1179],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1182,1183],{},"交互式环境适合快速验证一个表达式：",[75,1185,1187],{"className":77,"code":1186,"language":79,"meta":80,"style":80},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[43,1188,1189,1194,1199,1204],{"__ignoreMap":80},[84,1190,1191],{"class":86,"line":87},[84,1192,1193],{},">>> 10 + 20\n",[84,1195,1196],{"class":86,"line":93},[84,1197,1198],{},"30\n",[84,1200,1201],{"class":86,"line":100},[84,1202,1203],{},">>> \"Python\".lower()\n",[84,1205,1206],{"class":86,"line":106},[84,1207,1208],{},"'python'\n",[10,1210,1211],{},"需要保存和重复运行的程序，则可以写入文件：",[75,1213,1215],{"className":599,"code":1214,"language":601,"meta":80,"style":80},"python3 hello.py\n",[43,1216,1217],{"__ignoreMap":80},[84,1218,1219,1221],{"class":86,"line":87},[84,1220,699],{"class":608},[84,1222,1223],{"class":644}," hello.py\n",[10,1225,1226],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1228,1230],{"id":1229},"python-的特点","Python 的特点",[338,1232,1233],{"id":1233},"语法相对简洁",[10,1235,1236],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[338,1238,1239],{"id":1239},"支持多种编程方式",[10,1241,1242],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[338,1244,1245],{"id":1245},"标准库比较完整",[10,1247,1248],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1250,1251],{},"例如，获取当前时间：",[75,1253,1255],{"className":77,"code":1254,"language":79,"meta":80,"style":80},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[43,1256,1257,1262,1266,1271],{"__ignoreMap":80},[84,1258,1259],{"class":86,"line":87},[84,1260,1261],{},"from datetime import datetime\n",[84,1263,1264],{"class":86,"line":93},[84,1265,97],{"emptyLinePlaceholder":96},[84,1267,1268],{"class":86,"line":100},[84,1269,1270],{},"now = datetime.now()\n",[84,1272,1273],{"class":86,"line":106},[84,1274,1275],{},"print(now)\n",[10,1277,1278],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[338,1280,1281],{"id":1281},"第三方工具丰富",[10,1283,1284,1285,1287],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[43,1286,270],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1289,1290],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[338,1292,1293],{"id":1293},"支持多个操作系统",[10,1295,1296],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1298,1300],{"id":1299},"python-可以做什么","Python 可以做什么",[10,1302,1303],{},[26,1304],{"alt":1305,"src":1306},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1308,1309],{},"Python 的应用范围比较广，常见方向包括：",[37,1311,1312,1315,1318,1321,1324,1327,1330,1333],{},[40,1313,1314],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1316,1317],{},"开发网站后端和 API 服务；",[40,1319,1320],{},"进行数据清洗、统计分析和图表展示；",[40,1322,1323],{},"编写网络爬虫和信息采集工具；",[40,1325,1326],{},"开发自动化测试程序；",[40,1328,1329],{},"进行机器学习和人工智能开发；",[40,1331,1332],{},"编写运维、监控和辅助开发工具；",[40,1334,1335],{},"开发部分桌面应用和插件。",[10,1337,1338],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1340,1342],{"id":1341},"python-的发展","Python 的发展",[10,1344,1345],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1347,1348],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1350,1352],{"id":1351},"python-也有局限","Python 也有局限",[10,1354,1355],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1357,1358],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1360,1361],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1363,1364],{"id":1364},"写在最后",[10,1366,1367],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1369,1370],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[222,1372,1373],{},"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":80,"searchDepth":93,"depth":93,"links":1375},[1376,1377,1378,1385,1386,1387,1388],{"id":1082,"depth":93,"text":1083},{"id":1172,"depth":93,"text":1173},{"id":1229,"depth":93,"text":1230,"children":1379},[1380,1381,1382,1383,1384],{"id":1233,"depth":100,"text":1233},{"id":1239,"depth":100,"text":1239},{"id":1245,"depth":100,"text":1245},{"id":1281,"depth":100,"text":1281},{"id":1293,"depth":100,"text":1293},{"id":1299,"depth":93,"text":1300},{"id":1341,"depth":93,"text":1342},{"id":1351,"depth":93,"text":1352},{"id":1364,"depth":93,"text":1364},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1065,"description":80},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[235,1397,1398],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1401,"title":1402,"body":1403,"category":235,"cover":236,"description":1407,"extension":237,"meta":1525,"navigation":96,"path":1526,"pinned":240,"publishedAt":241,"seo":1527,"slug":1528,"stem":1529,"summary":1530,"tags":1531,"updatedAt":241,"visible":96,"__hash__":1533},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1404,"toc":1515},[1405,1408,1410,1413,1415,1421,1426,1428,1442,1444,1446,1455,1457,1463,1465,1467,1483,1485,1496,1498,1506,1508,1510,1513],[10,1406,1407],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1409,16],{"id":16},[10,1411,1412],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1414,22],{"id":22},[10,1416,1417],{},[26,1418],{"alt":1419,"src":1420},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1422,1423,1425],{},[43,1424,1179],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1427,35],{"id":35},[37,1429,1430,1436,1439],{},[40,1431,1432,1433,1435],{},"源代码是人编写的文本，通常保存在 ",[43,1434,1179],{}," 文件中。",[40,1437,1438],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1440,1441],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1443,70],{"id":70},[10,1445,73],{},[75,1447,1449],{"className":77,"code":1448,"language":79,"meta":80,"style":80},"print(\"你好，Python\")\n",[43,1450,1451],{"__ignoreMap":80},[84,1452,1453],{"class":86,"line":87},[84,1454,1448],{},[10,1456,153],{},[75,1458,1461],{"className":1459,"code":1460,"language":159,"meta":80},[157],"你好，Python\n",[43,1462,1460],{"__ignoreMap":80},[10,1464,164],{},[14,1466,167],{"id":167},[169,1468,1469,1476],{},[40,1470,1471,1472,1475],{},"终端启动解释器后，解释器读取 ",[43,1473,1474],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1477,1478,1479,1482],{},"字符串对象先准备好，再交给 ",[43,1480,1481],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1484,182],{"id":182},[37,1486,1487,1490],{},[40,1488,1489],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1491,1492,1493,1495],{},"认为 ",[43,1494,1179],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1497,199],{"id":199},[169,1499,1500,1503],{},[40,1501,1502],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1504,1505],{},"把示例文字改成自己的学习目标并重新运行。",[10,1507,214],{},[14,1509,217],{"id":217},[10,1511,1512],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,1514,224],{},{"title":80,"searchDepth":93,"depth":93,"links":1516},[1517,1518,1519,1520,1521,1522,1523,1524],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1402,"description":1407},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[235,1397,1532],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1535,"title":1536,"body":1537,"category":235,"cover":236,"description":1541,"extension":237,"meta":1677,"navigation":96,"path":1678,"pinned":240,"publishedAt":241,"seo":1679,"slug":1680,"stem":1681,"summary":1682,"tags":1683,"updatedAt":241,"visible":96,"__hash__":1685},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1538,"toc":1667},[1539,1542,1544,1547,1549,1555,1561,1563,1578,1580,1583,1603,1605,1611,1613,1615,1628,1630,1644,1646,1657,1659,1661,1664],[10,1540,1541],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1543,16],{"id":16},[10,1545,1546],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1548,22],{"id":22},[10,1550,1551],{},[26,1552],{"alt":1553,"src":1554},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1556,1557,1558,1560],{},"终端收到 ",[43,1559,699],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1562,35],{"id":35},[37,1564,1565,1568,1571],{},[40,1566,1567],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1569,1570],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1572,1573,1574,1577],{},"检查 pip 时使用 ",[43,1575,1576],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1579,70],{"id":70},[10,1581,1582],{},"在 macOS 终端执行：",[75,1584,1585],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,1586,1587,1593],{"__ignoreMap":80},[84,1588,1589,1591],{"class":86,"line":87},[84,1590,699],{"class":608},[84,1592,612],{"class":611},[84,1594,1595,1597,1599,1601],{"class":86,"line":93},[84,1596,699],{"class":608},[84,1598,641],{"class":611},[84,1600,645],{"class":644},[84,1602,612],{"class":611},[10,1604,153],{},[75,1606,1609],{"className":1607,"code":1608,"language":159,"meta":80},[157],"Python 3.14.x\npip 版本信息与安装路径\n",[43,1610,1608],{"__ignoreMap":80},[10,1612,164],{},[14,1614,167],{"id":167},[169,1616,1617,1623],{},[40,1618,1619,1622],{},[43,1620,1621],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1624,1625,1627],{},[43,1626,707],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1629,182],{"id":182},[37,1631,1632,1638],{},[40,1633,1634,1635,1637],{},"看到系统已有 ",[43,1636,699],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1639,1640,1641,1643],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[43,1642,699],{},"，不修改系统自带工具。",[14,1645,199],{"id":199},[169,1647,1648,1654],{},[40,1649,946,1650,1653],{},[43,1651,1652],{},"which python3","，记录当前解释器路径。",[40,1655,1656],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1658,214],{},[14,1660,217],{"id":217},[10,1662,1663],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,1665,1666],{},"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":80,"searchDepth":93,"depth":93,"links":1668},[1669,1670,1671,1672,1673,1674,1675,1676],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1536,"description":1541},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[235,1684,1060],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1687,"title":1688,"body":1689,"category":235,"cover":236,"description":1854,"extension":237,"meta":1855,"navigation":96,"path":1856,"pinned":240,"publishedAt":241,"seo":1857,"slug":1858,"stem":1859,"summary":1860,"tags":1861,"updatedAt":241,"visible":96,"__hash__":1864},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1690,"toc":1844},[1691,1697,1699,1702,1704,1710,1713,1715,1739,1741,1743,1770,1772,1778,1780,1782,1800,1802,1816,1818,1832,1834,1836,1842],[10,1692,1693,1694,1696],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[43,1695,1179],{}," 脚本。",[14,1698,16],{"id":16},[10,1700,1701],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1703,22],{"id":22},[10,1705,1706],{},[26,1707],{"alt":1708,"src":1709},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1711,1712],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1714,35],{"id":35},[37,1716,1717,1726,1733],{},[40,1718,1719,1720,1722,1723,56],{},"在终端输入 ",[43,1721,699],{}," 进入 REPL，提示符通常是 ",[43,1724,1725],{},">>>",[40,1727,1728,1729,1732],{},"输入 ",[43,1730,1731],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1734,1735,1736,1738],{},"需要保存、复查或多次运行的代码应写入 ",[43,1737,1179],{}," 文件。",[14,1740,70],{"id":70},[10,1742,73],{},[75,1744,1748],{"className":1745,"code":1746,"language":1747,"meta":80,"style":80},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[43,1749,1750,1755,1760,1765],{"__ignoreMap":80},[84,1751,1752],{"class":86,"line":87},[84,1753,1754],{},">>> 2 + 3\n",[84,1756,1757],{"class":86,"line":93},[84,1758,1759],{},"5\n",[84,1761,1762],{"class":86,"line":100},[84,1763,1764],{},">>> \"python\".upper()\n",[84,1766,1767],{"class":86,"line":106},[84,1768,1769],{},"'PYTHON'\n",[10,1771,153],{},[75,1773,1776],{"className":1774,"code":1775,"language":159,"meta":80},[157],"REPL 会直接显示表达式结果\n",[43,1777,1775],{"__ignoreMap":80},[10,1779,164],{},[14,1781,167],{"id":167},[169,1783,1784,1794],{},[40,1785,1786,1787,1790,1791,56],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[43,1788,1789],{},"2 + 3"," 能直接看到 ",[43,1792,1793],{},"5",[40,1795,1796,1797,1799],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[43,1798,1481],{}," 才会写到标准输出。",[14,1801,182],{"id":182},[37,1803,1804,1813],{},[40,1805,1806,1807,1809,1810,1812],{},"把提示符 ",[43,1808,1725],{}," 复制进 ",[43,1811,1179],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1814,1815],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1817,199],{"id":199},[169,1819,1820,1826],{},[40,1821,1822,1823,56],{},"在 REPL 计算 ",[43,1824,1825],{},"12 * 8",[40,1827,1828,1829,1831],{},"把同一表达式写入脚本；观察脚本中不调用 ",[43,1830,1481],{}," 时是否显示结果。",[10,1833,214],{},[14,1835,217],{"id":217},[10,1837,1838,1839,1841],{},"本篇目标是根据任务选择 REPL 或 ",[43,1840,1179],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,1843,224],{},{"title":80,"searchDepth":93,"depth":93,"links":1845},[1846,1847,1848,1849,1850,1851,1852,1853],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1688,"description":1854},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[235,1862,1863],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1866,"title":1867,"body":1868,"category":235,"cover":236,"description":1872,"extension":237,"meta":2043,"navigation":96,"path":2044,"pinned":240,"publishedAt":241,"seo":2045,"slug":2046,"stem":2047,"summary":2048,"tags":2049,"updatedAt":241,"visible":96,"__hash__":2052},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1869,"toc":2033},[1870,1873,1875,1878,1880,1886,1892,1894,1912,1914,1916,1961,1963,1969,1971,1973,1995,1997,2009,2011,2023,2025,2027,2030],[10,1871,1872],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1874,16],{"id":16},[10,1876,1877],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1879,22],{"id":22},[10,1881,1882],{},[26,1883],{"alt":1884,"src":1885},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1887,1888,1891],{},[43,1889,1890],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1893,35],{"id":35},[37,1895,1896,1899,1909],{},[40,1897,1898],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1900,1901,1904,1905,1908],{},[43,1902,1903],{},"pwd"," 显示当前目录，",[43,1906,1907],{},"ls"," 显示目录里的文件。",[40,1910,1911],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1913,70],{"id":70},[10,1915,1582],{},[75,1917,1919],{"className":599,"code":1918,"language":601,"meta":80,"style":80},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[43,1920,1921,1929,1936,1941,1955],{"__ignoreMap":80},[84,1922,1923,1926],{"class":86,"line":87},[84,1924,1925],{"class":608},"mkdir",[84,1927,1928],{"class":644}," python-study\n",[84,1930,1931,1934],{"class":86,"line":93},[84,1932,1933],{"class":611},"cd",[84,1935,1928],{"class":644},[84,1937,1938],{"class":86,"line":100},[84,1939,1940],{"class":611},"pwd\n",[84,1942,1943,1946,1949,1953],{"class":86,"line":106},[84,1944,1945],{"class":611},"printf",[84,1947,1948],{"class":644}," 'print(\"项目已经运行\")\\n'",[84,1950,1952],{"class":1951},"snl16"," >",[84,1954,1223],{"class":644},[84,1956,1957,1959],{"class":86,"line":112},[84,1958,699],{"class":608},[84,1960,1223],{"class":644},[10,1962,153],{},[75,1964,1967],{"className":1965,"code":1966,"language":159,"meta":80},[157],"项目已经运行\n",[43,1968,1966],{"__ignoreMap":80},[10,1970,164],{},[14,1972,167],{"id":167},[169,1974,1975,1986],{},[40,1976,1977,1979,1980,1982,1983,1985],{},[43,1978,1925],{}," 创建目录，",[43,1981,1933],{}," 改变终端当前目录，",[43,1984,1903],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1987,1988,1990,1991,1994],{},[43,1989,1890],{}," 会在当前目录寻找 ",[43,1992,1993],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1996,182],{"id":182},[37,1998,1999,2006],{},[40,2000,2001,2002,1165,2004,56],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[43,2003,1903],{},[43,2005,1907],{},[40,2007,2008],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2010,199],{"id":199},[169,2012,2013,2020],{},[40,2014,2015,2016,2019],{},"新建 ",[43,2017,2018],{},"lesson01.py"," 并输出课程编号。",[40,2021,2022],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2024,214],{},[14,2026,217],{"id":217},[10,2028,2029],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,2031,2032],{},"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":80,"searchDepth":93,"depth":93,"links":2034},[2035,2036,2037,2038,2039,2040,2041,2042],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1867,"description":1872},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[235,2050,2051],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2054,"title":2055,"body":2056,"category":235,"cover":236,"description":2060,"extension":237,"meta":2208,"navigation":96,"path":2209,"pinned":240,"publishedAt":241,"seo":2210,"slug":2211,"stem":2212,"summary":2213,"tags":2214,"updatedAt":241,"visible":96,"__hash__":2217},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2057,"toc":2198},[2058,2061,2063,2066,2068,2074,2085,2087,2107,2109,2111,2131,2133,2139,2141,2143,2162,2164,2172,2174,2189,2191,2193,2196],[10,2059,2060],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2062,16],{"id":16},[10,2064,2065],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2067,22],{"id":22},[10,2069,2070],{},[26,2071],{"alt":2072,"src":2073},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2075,2076,2077,56,2079,2082,2083,56],{},"Python 先计算表达式，再把得到的对象交给 ",[43,2078,1481],{},[43,2080,2081],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[43,2084,1789],{},[14,2086,35],{"id":35},[37,2088,2089,2095,2104],{},[40,2090,2091,2094],{},[43,2092,2093],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2096,2097,2100,2101,56],{},[43,2098,2099],{},"7 + 5"," 是表达式，运行时先求值得到 ",[43,2102,2103],{},"12",[40,2105,2106],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2108,70],{"id":70},[10,2110,73],{},[75,2112,2114],{"className":77,"code":2113,"language":79,"meta":80,"style":80},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[43,2115,2116,2121,2126],{"__ignoreMap":80},[84,2117,2118],{"class":86,"line":87},[84,2119,2120],{},"print(42)\n",[84,2122,2123],{"class":86,"line":93},[84,2124,2125],{},"print(7 + 5)\n",[84,2127,2128],{"class":86,"line":100},[84,2129,2130],{},"print(\"Python 基础课\")\n",[10,2132,153],{},[75,2134,2137],{"className":2135,"code":2136,"language":159,"meta":80},[157],"42\n12\nPython 基础课\n",[43,2138,2136],{"__ignoreMap":80},[10,2140,164],{},[14,2142,167],{"id":167},[169,2144,2145,2153],{},[40,2146,2147,2150,2151,56],{},[43,2148,2149],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[43,2152,2103],{},[40,2154,2155,2157,2158,2161],{},[43,2156,1481],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[43,2159,2160],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2163,182],{"id":182},[37,2165,2166,2169],{},[40,2167,2168],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2170,2171],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2173,199],{"id":199},[169,2175,2176,2179],{},[40,2177,2178],{},"分别输出一个整数、一个小数和一段文本。",[40,2180,2181,2182,2184,2185,2188],{},"比较 ",[43,2183,2081],{}," 与 ",[43,2186,2187],{},"print(\"2 + 3\")"," 的结果。",[10,2190,214],{},[14,2192,217],{"id":217},[10,2194,2195],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,2197,224],{},{"title":80,"searchDepth":93,"depth":93,"links":2199},[2200,2201,2202,2203,2204,2205,2206,2207],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2055,"description":2060},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[235,2215,2216],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2219,"title":2220,"body":2221,"category":235,"cover":236,"description":2225,"extension":237,"meta":2391,"navigation":96,"path":2392,"pinned":240,"publishedAt":241,"seo":2393,"slug":2394,"stem":2395,"summary":2396,"tags":2397,"updatedAt":241,"visible":96,"__hash__":2400},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2222,"toc":2381},[2223,2226,2228,2231,2233,2239,2242,2244,2270,2272,2274,2302,2304,2310,2312,2314,2338,2340,2355,2357,2372,2374,2376,2379],[10,2224,2225],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2227,16],{"id":16},[10,2229,2230],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2232,22],{"id":22},[10,2234,2235],{},[26,2236],{"alt":2237,"src":2238},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2240,2241],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2243,35],{"id":35},[37,2245,2246,2249,2259],{},[40,2247,2248],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2250,2251,2252,2184,2255,2258],{},"变量名区分大小写，",[43,2253,2254],{},"score",[43,2256,2257],{},"Score"," 是两个名字。",[40,2260,2261,2262,2265,2266,2269],{},"使用能表达含义的名称；不要用 ",[43,2263,2264],{},"list","、",[43,2267,2268],{},"str"," 等内置名称作为普通变量名。",[14,2271,70],{"id":70},[10,2273,73],{},[75,2275,2277],{"className":77,"code":2276,"language":79,"meta":80,"style":80},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[43,2278,2279,2284,2289,2293,2298],{"__ignoreMap":80},[84,2280,2281],{"class":86,"line":87},[84,2282,2283],{},"score = 90\n",[84,2285,2286],{"class":86,"line":93},[84,2287,2288],{},"print(score)\n",[84,2290,2291],{"class":86,"line":100},[84,2292,97],{"emptyLinePlaceholder":96},[84,2294,2295],{"class":86,"line":106},[84,2296,2297],{},"score = 95\n",[84,2299,2300],{"class":86,"line":112},[84,2301,2288],{},[10,2303,153],{},[75,2305,2308],{"className":2306,"code":2307,"language":159,"meta":80},[157],"90\n95\n",[43,2309,2307],{"__ignoreMap":80},[10,2311,164],{},[14,2313,167],{"id":167},[169,2315,2316,2325],{},[40,2317,946,2318,2321,2322,2324],{},[43,2319,2320],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[43,2323,2254],{}," 再绑定到它。",[40,2326,946,2327,2330,2331,2334,2335,56],{},[43,2328,2329],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[43,2332,2333],{},"90"," 没有被改造成 ",[43,2336,2337],{},"95",[14,2339,182],{"id":182},[37,2341,2342,2345],{},[40,2343,2344],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2346,187,2347,2265,2349,2265,2351,2354],{},[43,2348,2264],{},[43,2350,2268],{},[43,2352,2353],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2356,199],{"id":199},[169,2358,2359,2369],{},[40,2360,2361,2362,1165,2365,2368],{},"创建 ",[43,2363,2364],{},"course_name",[43,2366,2367],{},"lesson_count"," 两个变量并输出。",[40,2370,2371],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2373,214],{},[14,2375,217],{"id":217},[10,2377,2378],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,2380,224],{},{"title":80,"searchDepth":93,"depth":93,"links":2382},[2383,2384,2385,2386,2387,2388,2389,2390],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2220,"description":2225},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[235,2398,2399],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2402,"title":2403,"body":2404,"category":235,"cover":236,"description":2408,"extension":237,"meta":2572,"navigation":96,"path":2573,"pinned":240,"publishedAt":241,"seo":2574,"slug":2575,"stem":2576,"summary":2577,"tags":2578,"updatedAt":241,"visible":96,"__hash__":2581},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2405,"toc":2562},[2406,2409,2411,2414,2416,2422,2425,2427,2456,2458,2460,2504,2506,2512,2514,2516,2530,2532,2543,2545,2553,2555,2557,2560],[10,2407,2408],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2410,16],{"id":16},[10,2412,2413],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2415,22],{"id":22},[10,2417,2418],{},[26,2419],{"alt":2420,"src":2421},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2423,2424],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2426,35],{"id":35},[37,2428,2429,2439,2453],{},[40,2430,2431,2434,2435,2438],{},[43,2432,2433],{},"int"," 表示整数，",[43,2436,2437],{},"float"," 表示浮点数。",[40,2440,2441,2444,2445,2448,2449,2452],{},[43,2442,2443],{},"\u002F"," 总是进行真除法；",[43,2446,2447],{},"\u002F\u002F"," 是向下取整除法，",[43,2450,2451],{},"%"," 得到余数。",[40,2454,2455],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2457,70],{"id":70},[10,2459,73],{},[75,2461,2463],{"className":77,"code":2462,"language":79,"meta":80,"style":80},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[43,2464,2465,2470,2475,2480,2484,2489,2494,2499],{"__ignoreMap":80},[84,2466,2467],{"class":86,"line":87},[84,2468,2469],{},"price = 25\n",[84,2471,2472],{"class":86,"line":93},[84,2473,2474],{},"count = 4\n",[84,2476,2477],{"class":86,"line":100},[84,2478,2479],{},"discount = 0.9\n",[84,2481,2482],{"class":86,"line":106},[84,2483,97],{"emptyLinePlaceholder":96},[84,2485,2486],{"class":86,"line":112},[84,2487,2488],{},"total = price * count * discount\n",[84,2490,2491],{"class":86,"line":118},[84,2492,2493],{},"average = total \u002F count\n",[84,2495,2496],{"class":86,"line":124},[84,2497,2498],{},"print(total)\n",[84,2500,2501],{"class":86,"line":129},[84,2502,2503],{},"print(average)\n",[10,2505,153],{},[75,2507,2510],{"className":2508,"code":2509,"language":159,"meta":80},[157],"90.0\n22.5\n",[43,2511,2509],{"__ignoreMap":80},[10,2513,164],{},[14,2515,167],{"id":167},[169,2517,2518,2524],{},[40,2519,2520,2523],{},[43,2521,2522],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2525,2526,2529],{},[43,2527,2528],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2531,182],{"id":182},[37,2533,2534,2540],{},[40,2535,2536,2537,56],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[43,2538,2539],{},"decimal.Decimal",[40,2541,2542],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2544,199],{"id":199},[169,2546,2547,2550],{},[40,2548,2549],{},"计算 137 除以 10 的商和余数。",[40,2551,2552],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2554,214],{},[14,2556,217],{"id":217},[10,2558,2559],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,2561,224],{},{"title":80,"searchDepth":93,"depth":93,"links":2563},[2564,2565,2566,2567,2568,2569,2570,2571],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2403,"description":2408},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[235,2579,2580],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2583,"title":2584,"body":2585,"category":235,"cover":236,"description":2589,"extension":237,"meta":2765,"navigation":96,"path":2766,"pinned":240,"publishedAt":241,"seo":2767,"slug":2768,"stem":2769,"summary":2770,"tags":2771,"updatedAt":241,"visible":96,"__hash__":2774},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2586,"toc":2753},[2587,2590,2592,2595,2597,2603,2613,2615,2626,2628,2630,2660,2662,2668,2670,2672,2702,2705,2708,2714,2717,2719,2727,2729,2744,2746,2748,2751],[10,2588,2589],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2591,16],{"id":16},[10,2593,2594],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2596,22],{"id":22},[10,2598,2599],{},[26,2600],{"alt":2601,"src":2602},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2604,2605,2606,2609,2610,56],{},"切片 ",[43,2607,2608],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[43,2611,2612],{},"stop - start",[14,2614,35],{"id":35},[37,2616,2617,2620,2623],{},[40,2618,2619],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2621,2622],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2624,2625],{},"切片会创建新的字符串，不会修改原字符串。",[14,2627,70],{"id":70},[10,2629,73],{},[75,2631,2633],{"className":77,"code":2632,"language":79,"meta":80,"style":80},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[43,2634,2635,2640,2645,2650,2655],{"__ignoreMap":80},[84,2636,2637],{"class":86,"line":87},[84,2638,2639],{},"language = \"Python\"\n",[84,2641,2642],{"class":86,"line":93},[84,2643,2644],{},"print(language[0])\n",[84,2646,2647],{"class":86,"line":100},[84,2648,2649],{},"print(language[-1])\n",[84,2651,2652],{"class":86,"line":106},[84,2653,2654],{},"print(language[0:3])\n",[84,2656,2657],{"class":86,"line":112},[84,2658,2659],{},"print(language + \" 3.14\")\n",[10,2661,153],{},[75,2663,2666],{"className":2664,"code":2665,"language":159,"meta":80},[157],"P\nn\nPyt\nPython 3.14\n",[43,2667,2665],{"__ignoreMap":80},[10,2669,164],{},[14,2671,167],{"id":167},[169,2673,2674,2688],{},[40,2675,2676,2677,2679,2680,2683,2684,2687],{},"字符串 ",[43,2678,235],{}," 的正索引从 ",[43,2681,2682],{},"P"," 的 0 开始，负索引从末尾 ",[43,2685,2686],{},"n"," 的 -1 开始。",[40,2689,2690,2693,2694,2697,2698,2701],{},[43,2691,2692],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[43,2695,2696],{},"Pyt","；索引 3 的 ",[43,2699,2700],{},"h"," 不在结果中。",[338,2703,2704],{"id":2704},"再看一个具体细节",[10,2706,2707],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2709,2710],{},[26,2711],{"alt":2712,"src":2713},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2715,2716],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2718,182],{"id":182},[37,2720,2721,2724],{},[40,2722,2723],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2725,2726],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2728,199],{"id":199},[169,2730,2731,2741],{},[40,2732,2733,2734,2737,2738,56],{},"从 ",[43,2735,2736],{},"\"programming\""," 中切出 ",[43,2739,2740],{},"\"gram\"",[40,2742,2743],{},"使用负索引取得字符串倒数第二个字符。",[10,2745,214],{},[14,2747,217],{"id":217},[10,2749,2750],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,2752,224],{},{"title":80,"searchDepth":93,"depth":93,"links":2754},[2755,2756,2757,2758,2759,2762,2763,2764],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":2760},[2761],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2584,"description":2589},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[235,2772,2773],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2776,"title":2777,"body":2778,"category":235,"cover":236,"description":2782,"extension":237,"meta":2996,"navigation":96,"path":2997,"pinned":240,"publishedAt":241,"seo":2998,"slug":2999,"stem":3000,"summary":3001,"tags":3002,"updatedAt":241,"visible":96,"__hash__":3005},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2779,"toc":2984},[2780,2783,2785,2788,2790,2796,2806,2808,2841,2843,2845,2889,2891,2897,2899,2901,2922,2924,2927,2933,2941,2943,2957,2959,2975,2977,2979,2982],[10,2781,2782],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2784,16],{"id":16},[10,2786,2787],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2789,22],{"id":22},[10,2791,2792],{},[26,2793],{"alt":2794,"src":2795},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2797,2798,2799,1017,2802,2805],{},"比较表达式先产生 ",[43,2800,2801],{},"True",[43,2803,2804],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2807,35],{"id":35},[37,2809,2810,2824,2838],{},[40,2811,2812,2815,2816,2819,2820,2823],{},[43,2813,2814],{},"=="," 判断是否相等，",[43,2817,2818],{},"!="," 判断是否不等；单个 ",[43,2821,2822],{},"="," 是赋值。",[40,2825,2826,2829,2830,2833,2834,2837],{},[43,2827,2828],{},"and"," 要求两侧都为真，",[43,2831,2832],{},"or"," 只需一侧为真，",[43,2835,2836],{},"not"," 取反。",[40,2839,2840],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2842,70],{"id":70},[10,2844,73],{},[75,2846,2848],{"className":77,"code":2847,"language":79,"meta":80,"style":80},"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",[43,2849,2850,2855,2860,2864,2869,2874,2879,2884],{"__ignoreMap":80},[84,2851,2852],{"class":86,"line":87},[84,2853,2854],{},"age = 20\n",[84,2856,2857],{"class":86,"line":93},[84,2858,2859],{},"has_ticket = True\n",[84,2861,2862],{"class":86,"line":100},[84,2863,97],{"emptyLinePlaceholder":96},[84,2865,2866],{"class":86,"line":106},[84,2867,2868],{},"is_adult = age >= 18\n",[84,2870,2871],{"class":86,"line":112},[84,2872,2873],{},"can_enter = is_adult and has_ticket\n",[84,2875,2876],{"class":86,"line":118},[84,2877,2878],{},"print(is_adult)\n",[84,2880,2881],{"class":86,"line":124},[84,2882,2883],{},"print(can_enter)\n",[84,2885,2886],{"class":86,"line":129},[84,2887,2888],{},"print(not has_ticket)\n",[10,2890,153],{},[75,2892,2895],{"className":2893,"code":2894,"language":159,"meta":80},[157],"True\nTrue\nFalse\n",[43,2896,2894],{"__ignoreMap":80},[10,2898,164],{},[14,2900,167],{"id":167},[169,2902,2903,2913],{},[40,2904,2905,2908,2909,2912],{},[43,2906,2907],{},"age >= 18"," 先产生布尔值并绑定给 ",[43,2910,2911],{},"is_adult","，这一步没有任何分支跳转。",[40,2914,2915,2918,2919,2921],{},[43,2916,2917],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[43,2920,2836],{}," 只对紧随其后的值取反。",[338,2923,2704],{"id":2704},[10,2925,2926],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2928,2929],{},[26,2930],{"alt":2931,"src":2932},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2934,2935,2937,2938,2940],{},[43,2936,2828],{}," 只有“真、真”得到真；",[43,2939,2832],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2942,182],{"id":182},[37,2944,2945,2954],{},[40,2946,2947,2948,2950,2951,2953],{},"用单个等号判断相等。",[43,2949,2822],{}," 是赋值，",[43,2952,2814],{}," 才是相等比较。",[40,2955,2956],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2958,199],{"id":199},[169,2960,2961,2968],{},[40,2962,2963,2964,2967],{},"判断数字 ",[43,2965,2966],{},"15"," 是否同时大于 10 且小于 20。",[40,2969,2970,2971,2974],{},"分别修改年龄和票据状态，记录 ",[43,2972,2973],{},"can_enter"," 的四种组合结果。",[10,2976,214],{},[14,2978,217],{"id":217},[10,2980,2981],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,2983,224],{},{"title":80,"searchDepth":93,"depth":93,"links":2985},[2986,2987,2988,2989,2990,2993,2994,2995],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":2991},[2992],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2777,"description":2782},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[235,3003,3004],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3007,"title":3008,"body":3009,"category":235,"cover":236,"description":3013,"extension":237,"meta":3181,"navigation":96,"path":3182,"pinned":240,"publishedAt":241,"seo":3183,"slug":3184,"stem":3185,"summary":3186,"tags":3187,"updatedAt":241,"visible":96,"__hash__":3189},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3010,"toc":3171},[3011,3014,3016,3019,3021,3027,3045,3047,3060,3062,3064,3098,3100,3106,3108,3110,3132,3134,3146,3148,3162,3164,3166,3169],[10,3012,3013],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3015,16],{"id":16},[10,3017,3018],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3020,22],{"id":22},[10,3022,3023],{},[26,3024],{"alt":3025,"src":3026},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3028,3029,3032,3033,3036,3037,3040,3041,3044],{},[43,3030,3031],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[43,3034,3035],{},"18","，程序首先得到的也是 ",[43,3038,3039],{},"\"18\"","，需要 ",[43,3042,3043],{},"int()"," 后才能按整数参与计算。",[14,3046,35],{"id":35},[37,3048,3049,3052,3057],{},[40,3050,3051],{},"提示文字应告诉用户需要输入什么。",[40,3053,3054,3056],{},[43,3055,3043],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3058,3059],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3061,70],{"id":70},[10,3063,73],{},[75,3065,3067],{"className":77,"code":3066,"language":79,"meta":80,"style":80},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[43,3068,3069,3074,3079,3084,3088,3093],{"__ignoreMap":80},[84,3070,3071],{"class":86,"line":87},[84,3072,3073],{},"name = input(\"请输入姓名：\")\n",[84,3075,3076],{"class":86,"line":93},[84,3077,3078],{},"age_text = input(\"请输入年龄：\")\n",[84,3080,3081],{"class":86,"line":100},[84,3082,3083],{},"age = int(age_text)\n",[84,3085,3086],{"class":86,"line":106},[84,3087,97],{"emptyLinePlaceholder":96},[84,3089,3090],{"class":86,"line":112},[84,3091,3092],{},"print(\"你好，\" + name)\n",[84,3094,3095],{"class":86,"line":118},[84,3096,3097],{},"print(age + 1)\n",[10,3099,153],{},[75,3101,3104],{"className":3102,"code":3103,"language":159,"meta":80},[157],"根据输入显示姓名，并输出下一年的年龄\n",[43,3105,3103],{"__ignoreMap":80},[10,3107,164],{},[14,3109,167],{"id":167},[169,3111,3112,3122],{},[40,3113,3114,3115,3117,3118,3121],{},"两次 ",[43,3116,3031],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[43,3119,3120],{},"age_text"," 用来提醒这仍是文本。",[40,3123,3124,3127,3128,3131],{},[43,3125,3126],{},"int(age_text)"," 创建整数对象，后面的 ",[43,3129,3130],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3133,182],{"id":182},[37,3135,3136,3143],{},[40,3137,3138,3139,3142],{},"直接计算 ",[43,3140,3141],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3144,3145],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3147,199],{"id":199},[169,3149,3150,3153],{},[40,3151,3152],{},"接收两个整数并输出它们的和。",[40,3154,1728,3155,3158,3159,3161],{},[43,3156,3157],{},"18.5"," 给 ",[43,3160,3043],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3163,214],{},[14,3165,217],{"id":217},[10,3167,3168],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,3170,224],{},{"title":80,"searchDepth":93,"depth":93,"links":3172},[3173,3174,3175,3176,3177,3178,3179,3180],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3008,"description":3013},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[235,2353,3188],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3191,"title":3192,"body":3193,"category":235,"cover":236,"description":3197,"extension":237,"meta":3357,"navigation":96,"path":3358,"pinned":240,"publishedAt":241,"seo":3359,"slug":3360,"stem":3361,"summary":3362,"tags":3363,"updatedAt":241,"visible":96,"__hash__":3366},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3194,"toc":3347},[3195,3198,3200,3203,3205,3211,3218,3220,3234,3236,3238,3277,3279,3285,3287,3289,3308,3310,3325,3327,3338,3340,3342,3345],[10,3196,3197],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3199,16],{"id":16},[10,3201,3202],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3204,22],{"id":22},[10,3206,3207],{},[26,3208],{"alt":3209,"src":3210},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3212,3213,3214,3217],{},"列表为元素维护从 0 开始的位置索引。修改 ",[43,3215,3216],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3219,35],{"id":35},[37,3221,3222,3225,3228],{},[40,3223,3224],{},"列表使用方括号，元素之间用逗号分隔。",[40,3226,3227],{},"列表可变，可以替换、追加和删除元素。",[40,3229,3230,3231,56],{},"访问不存在的索引会产生 ",[43,3232,3233],{},"IndexError",[14,3235,70],{"id":70},[10,3237,73],{},[75,3239,3241],{"className":77,"code":3240,"language":79,"meta":80,"style":80},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[43,3242,3243,3248,3253,3257,3262,3267,3272],{"__ignoreMap":80},[84,3244,3245],{"class":86,"line":87},[84,3246,3247],{},"scores = [82, 90, 76]\n",[84,3249,3250],{"class":86,"line":93},[84,3251,3252],{},"print(scores[0])\n",[84,3254,3255],{"class":86,"line":100},[84,3256,97],{"emptyLinePlaceholder":96},[84,3258,3259],{"class":86,"line":106},[84,3260,3261],{},"scores[1] = 95\n",[84,3263,3264],{"class":86,"line":112},[84,3265,3266],{},"scores.append(88)\n",[84,3268,3269],{"class":86,"line":118},[84,3270,3271],{},"print(scores)\n",[84,3273,3274],{"class":86,"line":124},[84,3275,3276],{},"print(len(scores))\n",[10,3278,153],{},[75,3280,3283],{"className":3281,"code":3282,"language":159,"meta":80},[157],"82\n[82, 95, 76, 88]\n4\n",[43,3284,3282],{"__ignoreMap":80},[10,3286,164],{},[14,3288,167],{"id":167},[169,3290,3291,3294],{},[40,3292,3293],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3295,3296,3299,3300,3303,3304,3307],{},[43,3297,3298],{},"scores[1] = 95"," 替换第二个位置，",[43,3301,3302],{},"append(88)"," 在末尾增加新位置，",[43,3305,3306],{},"len()"," 因而从 3 变为 4。",[14,3309,182],{"id":182},[37,3311,3312,3322],{},[40,3313,3314,3315,3318,3319,56],{},"访问 ",[43,3316,3317],{},"scores[len(scores)]","。最后一个合法正索引是 ",[43,3320,3321],{},"len(scores) - 1",[40,3323,3324],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3326,199],{"id":199},[169,3328,3329,3332],{},[40,3330,3331],{},"建立三项学习任务列表，再追加第四项。",[40,3333,3334,3335,3337],{},"修改第二项，并用 ",[43,3336,3306],{}," 检查元素数量。",[10,3339,214],{},[14,3341,217],{"id":217},[10,3343,3344],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,3346,224],{},{"title":80,"searchDepth":93,"depth":93,"links":3348},[3349,3350,3351,3352,3353,3354,3355,3356],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3192,"description":3197},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[235,3364,3365],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3368,"title":3369,"body":3370,"category":235,"cover":236,"description":3374,"extension":237,"meta":3515,"navigation":96,"path":3516,"pinned":240,"publishedAt":241,"seo":3517,"slug":3518,"stem":3519,"summary":3520,"tags":3521,"updatedAt":241,"visible":96,"__hash__":3523},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3371,"toc":3505},[3372,3375,3377,3380,3382,3388,3391,3393,3404,3406,3408,3442,3444,3450,3452,3454,3468,3470,3482,3484,3496,3498,3500,3503],[10,3373,3374],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3376,16],{"id":16},[10,3378,3379],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3381,22],{"id":22},[10,3383,3384],{},[26,3385],{"alt":3386,"src":3387},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3389,3390],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3392,35],{"id":35},[37,3394,3395,3398,3401],{},[40,3396,3397],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3399,3400],{},"只有一个元素的元组必须保留尾随逗号。",[40,3402,3403],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3405,70],{"id":70},[10,3407,73],{},[75,3409,3411],{"className":77,"code":3410,"language":79,"meta":80,"style":80},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[43,3412,3413,3418,3423,3428,3432,3437],{"__ignoreMap":80},[84,3414,3415],{"class":86,"line":87},[84,3416,3417],{},"point = (120, 80)\n",[84,3419,3420],{"class":86,"line":93},[84,3421,3422],{},"print(point[0])\n",[84,3424,3425],{"class":86,"line":100},[84,3426,3427],{},"print(point[1])\n",[84,3429,3430],{"class":86,"line":106},[84,3431,97],{"emptyLinePlaceholder":96},[84,3433,3434],{"class":86,"line":112},[84,3435,3436],{},"single = (5,)\n",[84,3438,3439],{"class":86,"line":118},[84,3440,3441],{},"print(single)\n",[10,3443,153],{},[75,3445,3448],{"className":3446,"code":3447,"language":159,"meta":80},[157],"120\n80\n(5,)\n",[43,3449,3447],{"__ignoreMap":80},[10,3451,164],{},[14,3453,167],{"id":167},[169,3455,3456,3462],{},[40,3457,3458,3461],{},[43,3459,3460],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3463,3464,3467],{},[43,3465,3466],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3469,182],{"id":182},[37,3471,3472,3479],{},[40,3473,3474,3475,3478],{},"把 ",[43,3476,3477],{},"(5)"," 当作元组，实际它仍是整数。",[40,3480,3481],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3483,199],{"id":199},[169,3485,3486,3489],{},[40,3487,3488],{},"用元组表示宽度和高度。",[40,3490,2181,3491,2184,3493,3495],{},[43,3492,3477],{},[43,3494,3466],{}," 的类型。",[10,3497,214],{},[14,3499,217],{"id":217},[10,3501,3502],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,3504,224],{},{"title":80,"searchDepth":93,"depth":93,"links":3506},[3507,3508,3509,3510,3511,3512,3513,3514],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3369,"description":3374},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[235,3522,3365],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3525,"title":3526,"body":3527,"category":235,"cover":236,"description":3531,"extension":237,"meta":3686,"navigation":96,"path":3687,"pinned":240,"publishedAt":241,"seo":3688,"slug":3689,"stem":3690,"summary":3691,"tags":3692,"updatedAt":241,"visible":96,"__hash__":3694},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3528,"toc":3676},[3529,3532,3534,3537,3539,3545,3555,3557,3571,3573,3575,3609,3611,3617,3619,3621,3636,3638,3657,3659,3667,3669,3671,3674],[10,3530,3531],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3533,16],{"id":16},[10,3535,3536],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3538,22],{"id":22},[10,3540,3541],{},[26,3542],{"alt":3543,"src":3544},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3546,3547,3548,3551,3552,3554],{},"字典通过键定位值，不使用连续位置表达含义。",[43,3549,3550],{},"student[\"score\"]"," 读取的是键 ",[43,3553,2254],{}," 对应的值，而不是“第几个元素”。",[14,3556,35],{"id":35},[37,3558,3559,3562,3568],{},[40,3560,3561],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3563,187,3564,3567],{},[43,3565,3566],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3569,3570],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3572,70],{"id":70},[10,3574,73],{},[75,3576,3578],{"className":77,"code":3577,"language":79,"meta":80,"style":80},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[43,3579,3580,3585,3590,3594,3599,3604],{"__ignoreMap":80},[84,3581,3582],{"class":86,"line":87},[84,3583,3584],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[84,3586,3587],{"class":86,"line":93},[84,3588,3589],{},"print(student[\"name\"])\n",[84,3591,3592],{"class":86,"line":100},[84,3593,97],{"emptyLinePlaceholder":96},[84,3595,3596],{"class":86,"line":106},[84,3597,3598],{},"student[\"score\"] = 95\n",[84,3600,3601],{"class":86,"line":112},[84,3602,3603],{},"student[\"city\"] = \"郑州\"\n",[84,3605,3606],{"class":86,"line":118},[84,3607,3608],{},"print(student)\n",[10,3610,153],{},[75,3612,3615],{"className":3613,"code":3614,"language":159,"meta":80},[157],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[43,3616,3614],{"__ignoreMap":80},[10,3618,164],{},[14,3620,167],{"id":167},[169,3622,3623,3626],{},[40,3624,3625],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3627,3628,3629,3631,3632,3635],{},"给已有键 ",[43,3630,2254],{}," 赋值会更新映射，给新键 ",[43,3633,3634],{},"city"," 赋值会增加映射。",[14,3637,182],{"id":182},[37,3639,3640,3647],{},[40,3641,3642,3643,3646],{},"按位置理解字典并尝试 ",[43,3644,3645],{},"student[0]","，而实际键是字符串。",[40,3648,3649,3650,3653,3654,56],{},"直接读取不确定存在的键并忽略 ",[43,3651,3652],{},"KeyError","；后续可根据场景使用成员检查或 ",[43,3655,3656],{},"get()",[14,3658,199],{"id":199},[169,3660,3661,3664],{},[40,3662,3663],{},"建立一本书的标题、作者和页数字典。",[40,3665,3666],{},"添加分类键，再修改页数。",[10,3668,214],{},[14,3670,217],{"id":217},[10,3672,3673],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,3675,224],{},{"title":80,"searchDepth":93,"depth":93,"links":3677},[3678,3679,3680,3681,3682,3683,3684,3685],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3526,"description":3531},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[235,3693,3365],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3696,"title":3697,"body":3698,"category":235,"cover":236,"description":3702,"extension":237,"meta":3851,"navigation":96,"path":3852,"pinned":240,"publishedAt":241,"seo":3853,"slug":3854,"stem":3855,"summary":3856,"tags":3857,"updatedAt":241,"visible":96,"__hash__":3859},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3699,"toc":3841},[3700,3703,3705,3708,3710,3716,3719,3721,3740,3742,3744,3778,3780,3786,3788,3790,3805,3807,3819,3821,3832,3834,3836,3839],[10,3701,3702],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3704,16],{"id":16},[10,3706,3707],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3709,22],{"id":22},[10,3711,3712],{},[26,3713],{"alt":3714,"src":3715},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3717,3718],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3720,35],{"id":35},[37,3722,3723,3726,3729],{},[40,3724,3725],{},"集合中的元素不重复。",[40,3727,3728],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3730,3731,3732,3735,3736,3739],{},"创建空集合必须写 ",[43,3733,3734],{},"set()","；",[43,3737,3738],{},"{}"," 创建的是空字典。",[14,3741,70],{"id":70},[10,3743,73],{},[75,3745,3747],{"className":77,"code":3746,"language":79,"meta":80,"style":80},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[43,3748,3749,3754,3759,3763,3768,3773],{"__ignoreMap":80},[84,3750,3751],{"class":86,"line":87},[84,3752,3753],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[84,3755,3756],{"class":86,"line":93},[84,3757,3758],{},"right = {\"Python\", \"Docker\"}\n",[84,3760,3761],{"class":86,"line":100},[84,3762,97],{"emptyLinePlaceholder":96},[84,3764,3765],{"class":86,"line":106},[84,3766,3767],{},"print(left & right)\n",[84,3769,3770],{"class":86,"line":112},[84,3771,3772],{},"print(left | right)\n",[84,3774,3775],{"class":86,"line":118},[84,3776,3777],{},"print(\"Git\" in left)\n",[10,3779,153],{},[75,3781,3784],{"className":3782,"code":3783,"language":159,"meta":80},[157],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[43,3785,3783],{"__ignoreMap":80},[10,3787,164],{},[14,3789,167],{"id":167},[169,3791,3792,3795],{},[40,3793,3794],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3796,3797,3800,3801,3804],{},[43,3798,3799],{},"&"," 计算交集，",[43,3802,3803],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3806,182],{"id":182},[37,3808,3809,3816],{},[40,3810,187,3811,3813,3814,56],{},[43,3812,3738],{}," 创建空集合，实际得到空字典；空集合应写 ",[43,3815,3734],{},[40,3817,3818],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3820,199],{"id":199},[169,3822,3823,3829],{},[40,3824,3825,3826,3828],{},"把包含重复标签的列表交给 ",[43,3827,3734],{}," 去重。",[40,3830,3831],{},"计算两组课程标签的交集和差集。",[10,3833,214],{},[14,3835,217],{"id":217},[10,3837,3838],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,3840,224],{},{"title":80,"searchDepth":93,"depth":93,"links":3842},[3843,3844,3845,3846,3847,3848,3849,3850],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3697,"description":3702},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[235,3858,3365],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3861,"title":3862,"body":3863,"category":235,"cover":236,"description":3867,"extension":237,"meta":4064,"navigation":96,"path":4065,"pinned":240,"publishedAt":241,"seo":4066,"slug":4067,"stem":4068,"summary":4069,"tags":4070,"updatedAt":241,"visible":96,"__hash__":4073},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3864,"toc":4052},[3865,3868,3870,3873,3875,3881,3891,3893,3910,3912,3914,3963,3965,3971,3973,3975,3997,3999,4002,4008,4011,4013,4026,4028,4043,4045,4047,4050],[10,3866,3867],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3869,16],{"id":16},[10,3871,3872],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3874,22],{"id":22},[10,3876,3877],{},[26,3878],{"alt":3879,"src":3880},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3882,3883,3886,3887,3890],{},[43,3884,3885],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[43,3888,3889],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3892,35],{"id":35},[37,3894,3895,3904,3907],{},[40,3896,3897,3899,3900,3903],{},[43,3898,2814],{}," 比较内容是否相等，",[43,3901,3902],{},"is"," 比较是否为同一个对象。",[40,3905,3906],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3908,3909],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3911,70],{"id":70},[10,3913,73],{},[75,3915,3917],{"className":77,"code":3916,"language":79,"meta":80,"style":80},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[43,3918,3919,3924,3929,3934,3938,3943,3948,3953,3958],{"__ignoreMap":80},[84,3920,3921],{"class":86,"line":87},[84,3922,3923],{},"tasks = [\"变量\", \"字符串\"]\n",[84,3925,3926],{"class":86,"line":93},[84,3927,3928],{},"shared = tasks\n",[84,3930,3931],{"class":86,"line":100},[84,3932,3933],{},"backup = tasks.copy()\n",[84,3935,3936],{"class":86,"line":106},[84,3937,97],{"emptyLinePlaceholder":96},[84,3939,3940],{"class":86,"line":112},[84,3941,3942],{},"tasks.append(\"列表\")\n",[84,3944,3945],{"class":86,"line":118},[84,3946,3947],{},"print(shared)\n",[84,3949,3950],{"class":86,"line":124},[84,3951,3952],{},"print(backup)\n",[84,3954,3955],{"class":86,"line":129},[84,3956,3957],{},"print(tasks is shared)\n",[84,3959,3960],{"class":86,"line":135},[84,3961,3962],{},"print(tasks is backup)\n",[10,3964,153],{},[75,3966,3969],{"className":3967,"code":3968,"language":159,"meta":80},[157],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[43,3970,3968],{"__ignoreMap":80},[10,3972,164],{},[14,3974,167],{"id":167},[169,3976,3977,3983],{},[40,3978,3979,3982],{},[43,3980,3981],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3984,3985,3988,3989,3992,3993,3996],{},[43,3986,3987],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[43,3990,3991],{},"shared"," 能观察到变化，",[43,3994,3995],{},"backup"," 不会。",[338,3998,2704],{"id":2704},[10,4000,4001],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4003,4004],{},[26,4005],{"alt":4006,"src":4007},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4009,4010],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4012,182],{"id":182},[37,4014,4015,4023],{},[40,4016,4017,4018,4020,4021,56],{},"用 ",[43,4019,2814],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[43,4022,3902],{},[40,4024,4025],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4027,199],{"id":199},[169,4029,4030,4033],{},[40,4031,4032],{},"让两个变量引用同一个字典并修改其中一个。",[40,4034,187,4035,4038,4039,1165,4041,56],{},[43,4036,4037],{},"copy()"," 创建外层副本，再比较 ",[43,4040,3902],{},[43,4042,2814],{},[10,4044,214],{},[14,4046,217],{"id":217},[10,4048,4049],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,4051,224],{},{"title":80,"searchDepth":93,"depth":93,"links":4053},[4054,4055,4056,4057,4058,4061,4062,4063],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":4059},[4060],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3862,"description":3867},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[235,4071,4072],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4075,"title":4076,"body":4077,"category":235,"cover":236,"description":4081,"extension":237,"meta":4293,"navigation":96,"path":4294,"pinned":240,"publishedAt":241,"seo":4295,"slug":4296,"stem":4297,"summary":4298,"tags":4299,"updatedAt":241,"visible":96,"__hash__":4301},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4078,"toc":4280},[4079,4082,4084,4087,4089,4095,4105,4107,4118,4120,4122,4174,4176,4182,4184,4186,4204,4206,4209,4215,4223,4226,4229,4235,4241,4243,4261,4263,4271,4273,4275,4278],[10,4080,4081],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4083,16],{"id":16},[10,4085,4086],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4088,22],{"id":22},[10,4090,4091],{},[26,4092],{"alt":4093,"src":4094},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4096,4097,2265,4099,2265,4102,4104],{},[43,4098,1164],{},[43,4100,4101],{},"elif",[43,4103,1168],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4106,35],{"id":35},[37,4108,4109,4112,4115],{},[40,4110,4111],{},"冒号表示接下来开始一个代码块。",[40,4113,4114],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4116,4117],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4119,70],{"id":70},[10,4121,73],{},[75,4123,4125],{"className":77,"code":4124,"language":79,"meta":80,"style":80},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[43,4126,4127,4132,4136,4141,4146,4151,4156,4160,4165,4169],{"__ignoreMap":80},[84,4128,4129],{"class":86,"line":87},[84,4130,4131],{},"score = int(input(\"请输入分数：\"))\n",[84,4133,4134],{"class":86,"line":93},[84,4135,97],{"emptyLinePlaceholder":96},[84,4137,4138],{"class":86,"line":100},[84,4139,4140],{},"if score >= 90:\n",[84,4142,4143],{"class":86,"line":106},[84,4144,4145],{},"    level = \"优秀\"\n",[84,4147,4148],{"class":86,"line":112},[84,4149,4150],{},"elif score >= 60:\n",[84,4152,4153],{"class":86,"line":118},[84,4154,4155],{},"    level = \"合格\"\n",[84,4157,4158],{"class":86,"line":124},[84,4159,1154],{},[84,4161,4162],{"class":86,"line":129},[84,4163,4164],{},"    level = \"需要继续学习\"\n",[84,4166,4167],{"class":86,"line":135},[84,4168,97],{"emptyLinePlaceholder":96},[84,4170,4171],{"class":86,"line":141},[84,4172,4173],{},"print(level)\n",[10,4175,153],{},[75,4177,4180],{"className":4178,"code":4179,"language":159,"meta":80},[157],"输入 85 时输出：合格\n",[43,4181,4179],{"__ignoreMap":80},[10,4183,164],{},[14,4185,167],{"id":167},[169,4187,4188,4195],{},[40,4189,4190,4191,4194],{},"输入先转换为整数，程序从 ",[43,4192,4193],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4196,4197,4200,4201,4203],{},[43,4198,4199],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[43,4202,1168],{}," 被跳过；最终三个分支只会选择一个。",[338,4205,2704],{"id":2704},[10,4207,4208],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4210,4211],{},[26,4212],{"alt":4213,"src":4214},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4216,4217,4219,4220,4222],{},[43,4218,4193],{}," 必须放在 ",[43,4221,4199],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[338,4224,2704],{"id":4225},"再看一个具体细节-1",[10,4227,4228],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4230,4231],{},[26,4232],{"alt":4233,"src":4234},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4236,4237,4238,4240],{},"同一缩进层级属于同一个代码块；回到 ",[43,4239,1164],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4242,182],{"id":182},[37,4244,4245,4251],{},[40,4246,4247,4248,4250],{},"先写 ",[43,4249,4199],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4252,4253,4254,4256,4257,4260],{},"混用多个独立 ",[43,4255,1164],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[43,4258,4259],{},"if\u002Felif\u002Felse"," 链。",[14,4262,199],{"id":199},[169,4264,4265,4268],{},[40,4266,4267],{},"根据温度输出“冷、适中、热”三个等级。",[40,4269,4270],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4272,214],{},[14,4274,217],{"id":217},[10,4276,4277],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,4279,224],{},{"title":80,"searchDepth":93,"depth":93,"links":4281},[4282,4283,4284,4285,4286,4290,4291,4292],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":4287},[4288,4289],{"id":2704,"depth":100,"text":2704},{"id":4225,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4076,"description":4081},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[235,1164,4300],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4303,"title":4304,"body":4305,"category":235,"cover":236,"description":4309,"extension":237,"meta":4475,"navigation":96,"path":4476,"pinned":240,"publishedAt":241,"seo":4477,"slug":4478,"stem":4479,"summary":4480,"tags":4481,"updatedAt":241,"visible":96,"__hash__":4483},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4306,"toc":4463},[4307,4310,4312,4315,4317,4323,4329,4331,4346,4348,4350,4388,4390,4396,4398,4400,4415,4417,4420,4426,4432,4434,4442,4444,4454,4456,4458,4461],[10,4308,4309],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4311,16],{"id":16},[10,4313,4314],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4316,22],{"id":22},[10,4318,4319],{},[26,4320],{"alt":4321,"src":4322},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4324,4325,4328],{},[43,4326,4327],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4330,35],{"id":35},[37,4332,4333,4336,4339],{},[40,4334,4335],{},"进入循环前先准备参与条件判断的状态。",[40,4337,4338],{},"循环体中必须有机会让条件变为假。",[40,4340,4341,4342,4345],{},"能够预先确定遍历对象时，后续介绍的 ",[43,4343,4344],{},"for"," 通常更直接。",[14,4347,70],{"id":70},[10,4349,73],{},[75,4351,4353],{"className":77,"code":4352,"language":79,"meta":80,"style":80},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[43,4354,4355,4360,4364,4369,4374,4379,4383],{"__ignoreMap":80},[84,4356,4357],{"class":86,"line":87},[84,4358,4359],{},"count = 1\n",[84,4361,4362],{"class":86,"line":93},[84,4363,97],{"emptyLinePlaceholder":96},[84,4365,4366],{"class":86,"line":100},[84,4367,4368],{},"while count \u003C= 3:\n",[84,4370,4371],{"class":86,"line":106},[84,4372,4373],{},"    print(\"第\", count, \"次练习\")\n",[84,4375,4376],{"class":86,"line":112},[84,4377,4378],{},"    count = count + 1\n",[84,4380,4381],{"class":86,"line":118},[84,4382,97],{"emptyLinePlaceholder":96},[84,4384,4385],{"class":86,"line":124},[84,4386,4387],{},"print(\"练习结束\")\n",[10,4389,153],{},[75,4391,4394],{"className":4392,"code":4393,"language":159,"meta":80},[157],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[43,4395,4393],{"__ignoreMap":80},[10,4397,164],{},[14,4399,167],{"id":167},[169,4401,4402,4409],{},[40,4403,4404,4405,4408],{},"进入循环前 ",[43,4406,4407],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4410,4411,4412,4414],{},"循环体末尾把 ",[43,4413,4407],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[338,4416,2704],{"id":2704},[10,4418,4419],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4421,4422],{},[26,4423],{"alt":4424,"src":4425},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4427,4428,4429,4431],{},"第4次检查时 ",[43,4430,4407],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4433,182],{"id":182},[37,4435,4436,4439],{},[40,4437,4438],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4440,4441],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4443,199],{"id":199},[169,4445,4446,4451],{},[40,4447,187,4448,4450],{},[43,4449,4327],{}," 输出 1 到 5。",[40,4452,4453],{},"计算 1 到 10 的累加和。",[10,4455,214],{},[14,4457,217],{"id":217},[10,4459,4460],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,4462,224],{},{"title":80,"searchDepth":93,"depth":93,"links":4464},[4465,4466,4467,4468,4469,4472,4473,4474],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":4470},[4471],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4304,"description":4309},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[235,4327,4482],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4485,"title":4486,"body":4487,"category":235,"cover":236,"description":4491,"extension":237,"meta":4639,"navigation":96,"path":4640,"pinned":240,"publishedAt":241,"seo":4641,"slug":4642,"stem":4643,"summary":4644,"tags":4645,"updatedAt":241,"visible":96,"__hash__":4647},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4488,"toc":4629},[4489,4492,4494,4497,4499,4505,4510,4512,4526,4528,4530,4568,4570,4576,4578,4580,4597,4599,4607,4609,4620,4622,4624,4627],[10,4490,4491],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4493,16],{"id":16},[10,4495,4496],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4498,22],{"id":22},[10,4500,4501],{},[26,4502],{"alt":4503,"src":4504},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4506,4507,4509],{},[43,4508,4344],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4511,35],{"id":35},[37,4513,4514,4520,4523],{},[40,4515,4516,4519],{},[43,4517,4518],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4521,4522],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4524,4525],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4527,70],{"id":70},[10,4529,73],{},[75,4531,4533],{"className":77,"code":4532,"language":79,"meta":80,"style":80},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[43,4534,4535,4540,4544,4549,4554,4558,4563],{"__ignoreMap":80},[84,4536,4537],{"class":86,"line":87},[84,4538,4539],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[84,4541,4542],{"class":86,"line":93},[84,4543,97],{"emptyLinePlaceholder":96},[84,4545,4546],{"class":86,"line":100},[84,4547,4548],{},"for course in courses:\n",[84,4550,4551],{"class":86,"line":106},[84,4552,4553],{},"    print(course)\n",[84,4555,4556],{"class":86,"line":112},[84,4557,97],{"emptyLinePlaceholder":96},[84,4559,4560],{"class":86,"line":118},[84,4561,4562],{},"for number in range(1, 4):\n",[84,4564,4565],{"class":86,"line":124},[84,4566,4567],{},"    print(number)\n",[10,4569,153],{},[75,4571,4574],{"className":4572,"code":4573,"language":159,"meta":80},[157],"变量\n字符串\n列表\n1\n2\n3\n",[43,4575,4573],{"__ignoreMap":80},[10,4577,164],{},[14,4579,167],{"id":167},[169,4581,4582,4592],{},[40,4583,4584,4585,4587,4588,4591],{},"第一个 ",[43,4586,4344],{}," 依次从列表取得字符串，循环变量 ",[43,4589,4590],{},"course"," 每轮重新绑定。",[40,4593,4594,4596],{},[43,4595,4518],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4598,182],{"id":182},[37,4600,4601,4604],{},[40,4602,4603],{},"只需要元素却手工维护索引，增加越界风险。",[40,4605,4606],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4608,199],{"id":199},[169,4610,4611,4614],{},[40,4612,4613],{},"逐项输出一个字符串中的字符。",[40,4615,187,4616,4619],{},[43,4617,4618],{},"range()"," 输出 2、4、6、8。",[10,4621,214],{},[14,4623,217],{"id":217},[10,4625,4626],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,4628,224],{},{"title":80,"searchDepth":93,"depth":93,"links":4630},[4631,4632,4633,4634,4635,4636,4637,4638],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4486,"description":4491},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[235,4344,4646],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4649,"title":4650,"body":4651,"category":235,"cover":236,"description":4655,"extension":237,"meta":4829,"navigation":96,"path":4830,"pinned":240,"publishedAt":241,"seo":4831,"slug":4832,"stem":4833,"summary":4834,"tags":4835,"updatedAt":241,"visible":96,"__hash__":4836},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4652,"toc":4819},[4653,4656,4658,4661,4663,4669,4679,4681,4700,4702,4704,4756,4758,4764,4766,4768,4782,4784,4800,4802,4810,4812,4814,4817],[10,4654,4655],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4657,16],{"id":16},[10,4659,4660],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4662,22],{"id":22},[10,4664,4665],{},[26,4666],{"alt":4667,"src":4668},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4670,4671,4674,4675,4678],{},[43,4672,4673],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[43,4676,4677],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4680,35],{"id":35},[37,4682,4683,4686,4694],{},[40,4684,4685],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4687,4688,4690,4691,4693],{},[43,4689,4673],{}," 前要确认不会跳过 ",[43,4692,4327],{}," 循环中的状态更新。",[40,4695,4696,4697,4699],{},"多层嵌套中 ",[43,4698,4677],{}," 只结束它所在的最内层循环。",[14,4701,70],{"id":70},[10,4703,73],{},[75,4705,4707],{"className":77,"code":4706,"language":79,"meta":80,"style":80},"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",[43,4708,4709,4714,4718,4723,4728,4733,4738,4743,4747,4751],{"__ignoreMap":80},[84,4710,4711],{"class":86,"line":87},[84,4712,4713],{},"numbers = [3, -1, 0, 8, 12]\n",[84,4715,4716],{"class":86,"line":93},[84,4717,97],{"emptyLinePlaceholder":96},[84,4719,4720],{"class":86,"line":100},[84,4721,4722],{},"for number in numbers:\n",[84,4724,4725],{"class":86,"line":106},[84,4726,4727],{},"    if number \u003C 0:\n",[84,4729,4730],{"class":86,"line":112},[84,4731,4732],{},"        continue\n",[84,4734,4735],{"class":86,"line":118},[84,4736,4737],{},"    if number == 0:\n",[84,4739,4740],{"class":86,"line":124},[84,4741,4742],{},"        break\n",[84,4744,4745],{"class":86,"line":129},[84,4746,4567],{},[84,4748,4749],{"class":86,"line":135},[84,4750,97],{"emptyLinePlaceholder":96},[84,4752,4753],{"class":86,"line":141},[84,4754,4755],{},"print(\"循环结束\")\n",[10,4757,153],{},[75,4759,4762],{"className":4760,"code":4761,"language":159,"meta":80},[157],"3\n循环结束\n",[43,4763,4761],{"__ignoreMap":80},[10,4765,164],{},[14,4767,167],{"id":167},[169,4769,4770,4776],{},[40,4771,4772,4773,4775],{},"遇到 -1 时 ",[43,4774,4673],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4777,4778,4779,4781],{},"遇到 0 时 ",[43,4780,4677],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4783,182],{"id":182},[37,4785,4786,4791],{},[40,4787,3474,4788,4790],{},[43,4789,4673],{}," 当作结束循环，实际它只跳到下一轮。",[40,4792,4793,4794,4796,4797,4799],{},"在 ",[43,4795,4327],{}," 中把状态更新放在可能被 ",[43,4798,4673],{}," 跳过的位置，造成无限循环。",[14,4801,199],{"id":199},[169,4803,4804,4807],{},[40,4805,4806],{},"跳过列表中的空字符串并输出其他内容。",[40,4808,4809],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4811,214],{},[14,4813,217],{"id":217},[10,4815,4816],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,4818,224],{},{"title":80,"searchDepth":93,"depth":93,"links":4820},[4821,4822,4823,4824,4825,4826,4827,4828],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4650,"description":4655},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[235,4677,4673],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4838,"title":4839,"body":4840,"category":235,"cover":236,"description":4844,"extension":237,"meta":5015,"navigation":96,"path":5016,"pinned":240,"publishedAt":241,"seo":5017,"slug":5018,"stem":5019,"summary":5020,"tags":5021,"updatedAt":241,"visible":96,"__hash__":5024},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4841,"toc":5003},[4842,4845,4847,4850,4852,4858,4861,4863,4887,4889,4891,4925,4927,4933,4935,4937,4954,4956,4959,4965,4968,4970,4984,4986,4994,4996,4998,5001],[10,4843,4844],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4846,16],{"id":16},[10,4848,4849],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4851,22],{"id":22},[10,4853,4854],{},[26,4855],{"alt":4856,"src":4857},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4859,4860],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4862,35],{"id":35},[37,4864,4865,4868,4871],{},[40,4866,4867],{},"每增加一层嵌套，阅读成本都会上升。",[40,4869,4870],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4872,4873,4874,2265,4877,4880,4881,2265,4884,56],{},"变量名使用 ",[43,4875,4876],{},"row",[43,4878,4879],{},"cell"," 等层级含义，避免全部写成 ",[43,4882,4883],{},"i",[43,4885,4886],{},"j",[14,4888,70],{"id":70},[10,4890,73],{},[75,4892,4894],{"className":77,"code":4893,"language":79,"meta":80,"style":80},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[43,4895,4896,4901,4905,4910,4915,4920],{"__ignoreMap":80},[84,4897,4898],{"class":86,"line":87},[84,4899,4900],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[84,4902,4903],{"class":86,"line":93},[84,4904,97],{"emptyLinePlaceholder":96},[84,4906,4907],{"class":86,"line":100},[84,4908,4909],{},"for row in table:\n",[84,4911,4912],{"class":86,"line":106},[84,4913,4914],{},"    for cell in row:\n",[84,4916,4917],{"class":86,"line":112},[84,4918,4919],{},"        print(cell)\n",[84,4921,4922],{"class":86,"line":118},[84,4923,4924],{},"    print(\"一行结束\")\n",[10,4926,153],{},[75,4928,4931],{"className":4929,"code":4930,"language":159,"meta":80},[157],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[43,4932,4930],{"__ignoreMap":80},[10,4934,164],{},[14,4936,167],{"id":167},[169,4938,4939,4951],{},[40,4940,4941,4942,4944,4945,1165,4948,56],{},"外层变量 ",[43,4943,4876],{}," 先引用第一行列表，内层才依次处理 ",[43,4946,4947],{},"A1",[43,4949,4950],{},"A2",[40,4952,4953],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[338,4955,2704],{"id":2704},[10,4957,4958],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4960,4961],{},[26,4962],{"alt":4963,"src":4964},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4966,4967],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4969,182],{"id":182},[37,4971,4972,4981],{},[40,4973,4974,4975,1017,4978,4980],{},"把两层循环变量都叫 ",[43,4976,4977],{},"item",[43,4979,4883],{},"，难以确认当前层级。",[40,4982,4983],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4985,199],{"id":199},[169,4987,4988,4991],{},[40,4989,4990],{},"打印一个 2×3 数字表。",[40,4992,4993],{},"在内层增加条件，只输出大于 3 的元素。",[10,4995,214],{},[14,4997,217],{"id":217},[10,4999,5000],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,5002,224],{},{"title":80,"searchDepth":93,"depth":93,"links":5004},[5005,5006,5007,5008,5009,5012,5013,5014],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":5010},[5011],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4839,"description":4844},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[235,5022,5023],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5026,"title":5027,"body":5028,"category":235,"cover":236,"description":5032,"extension":237,"meta":5170,"navigation":96,"path":5171,"pinned":240,"publishedAt":241,"seo":5172,"slug":5173,"stem":5174,"summary":5175,"tags":5176,"updatedAt":241,"visible":96,"__hash__":5179},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5029,"toc":5160},[5030,5033,5035,5038,5040,5046,5049,5051,5062,5064,5066,5104,5106,5112,5114,5116,5128,5130,5141,5143,5151,5153,5155,5158],[10,5031,5032],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5034,16],{"id":16},[10,5036,5037],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5039,22],{"id":22},[10,5041,5042],{},[26,5043],{"alt":5044,"src":5045},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5047,5048],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5050,35],{"id":35},[37,5052,5053,5056,5059],{},[40,5054,5055],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5057,5058],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5060,5061],{},"推导式创建新列表，不修改输入列表。",[14,5063,70],{"id":70},[10,5065,73],{},[75,5067,5069],{"className":77,"code":5068,"language":79,"meta":80,"style":80},"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",[43,5070,5071,5076,5080,5085,5090,5094,5099],{"__ignoreMap":80},[84,5072,5073],{"class":86,"line":87},[84,5074,5075],{},"numbers = [1, 2, 3, 4, 5]\n",[84,5077,5078],{"class":86,"line":93},[84,5079,97],{"emptyLinePlaceholder":96},[84,5081,5082],{"class":86,"line":100},[84,5083,5084],{},"squares = [number * number for number in numbers]\n",[84,5086,5087],{"class":86,"line":106},[84,5088,5089],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[84,5091,5092],{"class":86,"line":112},[84,5093,97],{"emptyLinePlaceholder":96},[84,5095,5096],{"class":86,"line":118},[84,5097,5098],{},"print(squares)\n",[84,5100,5101],{"class":86,"line":124},[84,5102,5103],{},"print(even_squares)\n",[10,5105,153],{},[75,5107,5110],{"className":5108,"code":5109,"language":159,"meta":80},[157],"[1, 4, 9, 16, 25]\n[4, 16]\n",[43,5111,5109],{"__ignoreMap":80},[10,5113,164],{},[14,5115,167],{"id":167},[169,5117,5118,5121],{},[40,5119,5120],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5122,5123,5124,5127],{},"第二条先用 ",[43,5125,5126],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5129,182],{"id":182},[37,5131,5132,5138],{},[40,5133,5134,5135,5137],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[43,5136,4344],{}," 开始找输入。",[40,5139,5140],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5142,199],{"id":199},[169,5144,5145,5148],{},[40,5146,5147],{},"把字符串列表转换为长度列表。",[40,5149,5150],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5152,214],{},[14,5154,217],{"id":217},[10,5156,5157],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,5159,224],{},{"title":80,"searchDepth":93,"depth":93,"links":5161},[5162,5163,5164,5165,5166,5167,5168,5169],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5027,"description":5032},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[235,5177,5178],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5181,"title":5182,"body":5183,"category":235,"cover":236,"description":5187,"extension":237,"meta":5330,"navigation":96,"path":5331,"pinned":240,"publishedAt":241,"seo":5332,"slug":5333,"stem":5334,"summary":5335,"tags":5336,"updatedAt":241,"visible":96,"__hash__":5339},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5184,"toc":5320},[5185,5188,5190,5193,5195,5201,5204,5206,5217,5219,5221,5260,5262,5268,5270,5272,5287,5289,5297,5299,5311,5313,5315,5318],[10,5186,5187],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5189,16],{"id":16},[10,5191,5192],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5194,22],{"id":22},[10,5196,5197],{},[26,5198],{"alt":5199,"src":5200},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5202,5203],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5205,35],{"id":35},[37,5207,5208,5211,5214],{},[40,5209,5210],{},"函数名描述动作，使用小写字母和下划线。",[40,5212,5213],{},"函数定义要先执行，之后才能调用。",[40,5215,5216],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5218,70],{"id":70},[10,5220,73],{},[75,5222,5224],{"className":77,"code":5223,"language":79,"meta":80,"style":80},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[43,5225,5226,5231,5236,5241,5245,5250,5255],{"__ignoreMap":80},[84,5227,5228],{"class":86,"line":87},[84,5229,5230],{},"def show_progress():\n",[84,5232,5233],{"class":86,"line":93},[84,5234,5235],{},"    print(\"正在学习函数\")\n",[84,5237,5238],{"class":86,"line":100},[84,5239,5240],{},"    print(\"本节完成 50%\")\n",[84,5242,5243],{"class":86,"line":106},[84,5244,97],{"emptyLinePlaceholder":96},[84,5246,5247],{"class":86,"line":112},[84,5248,5249],{},"print(\"调用前\")\n",[84,5251,5252],{"class":86,"line":118},[84,5253,5254],{},"show_progress()\n",[84,5256,5257],{"class":86,"line":124},[84,5258,5259],{},"print(\"调用后\")\n",[10,5261,153],{},[75,5263,5266],{"className":5264,"code":5265,"language":159,"meta":80},[157],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[43,5267,5265],{"__ignoreMap":80},[10,5269,164],{},[14,5271,167],{"id":167},[169,5273,5274,5280],{},[40,5275,946,5276,5279],{},[43,5277,5278],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5281,5282,5283,5286],{},"运行到 ",[43,5284,5285],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5288,182],{"id":182},[37,5290,5291,5294],{},[40,5292,5293],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5295,5296],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5298,199],{"id":199},[169,5300,5301,5308],{},[40,5302,5303,5304,5307],{},"定义 ",[43,5305,5306],{},"show_plan()"," 输出两行学习计划。",[40,5309,5310],{},"连续调用同一个函数两次，观察执行顺序。",[10,5312,214],{},[14,5314,217],{"id":217},[10,5316,5317],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,5319,224],{},{"title":80,"searchDepth":93,"depth":93,"links":5321},[5322,5323,5324,5325,5326,5327,5328,5329],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5182,"description":5187},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[235,5337,5338],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5341,"title":5342,"body":5343,"category":235,"cover":236,"description":5347,"extension":237,"meta":5527,"navigation":96,"path":5528,"pinned":240,"publishedAt":241,"seo":5529,"slug":5530,"stem":5531,"summary":5532,"tags":5533,"updatedAt":241,"visible":96,"__hash__":5536},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5344,"toc":5515},[5345,5348,5350,5353,5355,5361,5368,5370,5387,5389,5391,5425,5427,5433,5435,5437,5458,5460,5463,5469,5479,5481,5496,5498,5506,5508,5510,5513],[10,5346,5347],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5349,16],{"id":16},[10,5351,5352],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5354,22],{"id":22},[10,5356,5357],{},[26,5358],{"alt":5359,"src":5360},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5362,5363,5364,5367],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[43,5365,5366],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5369,35],{"id":35},[37,5371,5372,5375,5378],{},[40,5373,5374],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5376,5377],{},"局部变量默认只在函数内部可见。",[40,5379,5380,5381,5383,5384,56],{},"没有显式 ",[43,5382,5366],{}," 的函数会返回 ",[43,5385,5386],{},"None",[14,5388,70],{"id":70},[10,5390,73],{},[75,5392,5394],{"className":77,"code":5393,"language":79,"meta":80,"style":80},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[43,5395,5396,5401,5406,5411,5415,5420],{"__ignoreMap":80},[84,5397,5398],{"class":86,"line":87},[84,5399,5400],{},"def calculate_total(price, count):\n",[84,5402,5403],{"class":86,"line":93},[84,5404,5405],{},"    total = price * count\n",[84,5407,5408],{"class":86,"line":100},[84,5409,5410],{},"    return total\n",[84,5412,5413],{"class":86,"line":106},[84,5414,97],{"emptyLinePlaceholder":96},[84,5416,5417],{"class":86,"line":112},[84,5418,5419],{},"result = calculate_total(25, 4)\n",[84,5421,5422],{"class":86,"line":118},[84,5423,5424],{},"print(result)\n",[10,5426,153],{},[75,5428,5431],{"className":5429,"code":5430,"language":159,"meta":80},[157],"100\n",[43,5432,5430],{"__ignoreMap":80},[10,5434,164],{},[14,5436,167],{"id":167},[169,5438,5439,5448],{},[40,5440,5441,5442,2265,5445,5447],{},"调用时 25 和 4 分别绑定到 ",[43,5443,5444],{},"price",[43,5446,4407],{},"，它们只在本次函数调用的局部范围中使用。",[40,5449,5450,5453,5454,5457],{},[43,5451,5452],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[43,5455,5456],{},"result"," 并输出。",[338,5459,2704],{"id":2704},[10,5461,5462],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5464,5465],{},[26,5466],{"alt":5467,"src":5468},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5470,5471,2265,5473,1165,5475,5478],{},[43,5472,5444],{},[43,5474,4407],{},[43,5476,5477],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5480,182],{"id":182},[37,5482,5483,5490],{},[40,5484,5485,5486,5489],{},"在函数内部只 ",[43,5487,5488],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5491,5492,5493,5495],{},"试图在函数外直接访问局部变量 ",[43,5494,5477],{},"，它的名字只在调用期间的局部作用域存在。",[14,5497,199],{"id":199},[169,5499,5500,5503],{},[40,5501,5502],{},"编写计算长方形面积的函数。",[40,5504,5505],{},"让函数返回结果后在调用方加上单位再输出。",[10,5507,214],{},[14,5509,217],{"id":217},[10,5511,5512],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,5514,224],{},{"title":80,"searchDepth":93,"depth":93,"links":5516},[5517,5518,5519,5520,5521,5524,5525,5526],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":5522},[5523],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5342,"description":5347},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[235,5534,5535],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5538,"title":5539,"body":5540,"category":235,"cover":236,"description":5544,"extension":237,"meta":5724,"navigation":96,"path":5725,"pinned":240,"publishedAt":241,"seo":5726,"slug":5727,"stem":5728,"summary":5729,"tags":5730,"updatedAt":241,"visible":96,"__hash__":5733},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5541,"toc":5712},[5542,5545,5547,5550,5552,5558,5561,5563,5580,5582,5584,5636,5638,5644,5646,5648,5666,5668,5671,5677,5680,5682,5693,5695,5703,5705,5707,5710],[10,5543,5544],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5546,16],{"id":16},[10,5548,5549],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5551,22],{"id":22},[10,5553,5554],{},[26,5555],{"alt":5556,"src":5557},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5559,5560],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5562,35],{"id":35},[37,5564,5565,5568,5574],{},[40,5566,5567],{},"必需参数应放在有默认值的参数之前。",[40,5569,5570,5573],{},[43,5571,5572],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5575,5576,5579],{},[43,5577,5578],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5581,70],{"id":70},[10,5583,73],{},[75,5585,5587],{"className":77,"code":5586,"language":79,"meta":80,"style":80},"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",[43,5588,5589,5594,5599,5603,5608,5613,5617,5622,5627,5631],{"__ignoreMap":80},[84,5590,5591],{"class":86,"line":87},[84,5592,5593],{},"def build_title(name, level=\"基础\"):\n",[84,5595,5596],{"class":86,"line":93},[84,5597,5598],{},"    return name + \"｜\" + level\n",[84,5600,5601],{"class":86,"line":100},[84,5602,97],{"emptyLinePlaceholder":96},[84,5604,5605],{"class":86,"line":106},[84,5606,5607],{},"print(build_title(\"Python\"))\n",[84,5609,5610],{"class":86,"line":112},[84,5611,5612],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[84,5614,5615],{"class":86,"line":118},[84,5616,97],{"emptyLinePlaceholder":96},[84,5618,5619],{"class":86,"line":124},[84,5620,5621],{},"def total(*numbers):\n",[84,5623,5624],{"class":86,"line":129},[84,5625,5626],{},"    return sum(numbers)\n",[84,5628,5629],{"class":86,"line":135},[84,5630,97],{"emptyLinePlaceholder":96},[84,5632,5633],{"class":86,"line":141},[84,5634,5635],{},"print(total(10, 20, 30))\n",[10,5637,153],{},[75,5639,5642],{"className":5640,"code":5641,"language":159,"meta":80},[157],"Python｜基础\n异常处理｜进阶\n60\n",[43,5643,5641],{"__ignoreMap":80},[10,5645,164],{},[14,5647,167],{"id":167},[169,5649,5650,5657],{},[40,5651,5652,5653,5656],{},"第一次调用只提供必需参数，",[43,5654,5655],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5658,5659,5662,5663,56],{},[43,5660,5661],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[43,5664,5665],{},"sum()",[338,5667,2704],{"id":2704},[10,5669,5670],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5672,5673],{},[26,5674],{"alt":5675,"src":5676},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5678,5679],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5681,182],{"id":182},[37,5683,5684,5690],{},[40,5685,5686,5687,5689],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[43,5688,5386],{}," 再在函数内创建。",[40,5691,5692],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5694,199],{"id":199},[169,5696,5697,5700],{},[40,5698,5699],{},"给问候函数增加默认称呼。",[40,5701,5702],{},"编写接收任意数量分数并返回总分的函数。",[10,5704,214],{},[14,5706,217],{"id":217},[10,5708,5709],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,5711,224],{},{"title":80,"searchDepth":93,"depth":93,"links":5713},[5714,5715,5716,5717,5718,5721,5722,5723],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":5719},[5720],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5539,"description":5544},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[235,5731,5732],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5735,"title":5736,"body":5737,"category":235,"cover":236,"description":5741,"extension":237,"meta":5937,"navigation":96,"path":5938,"pinned":240,"publishedAt":241,"seo":5939,"slug":5940,"stem":5941,"summary":5942,"tags":5943,"updatedAt":241,"visible":96,"__hash__":5946},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5738,"toc":5925},[5739,5742,5744,5747,5749,5755,5758,5760,5777,5779,5781,5843,5845,5851,5853,5855,5882,5884,5887,5893,5896,5898,5906,5908,5916,5918,5920,5923],[10,5740,5741],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5743,16],{"id":16},[10,5745,5746],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5748,22],{"id":22},[10,5750,5751],{},[26,5752],{"alt":5753,"src":5754},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5756,5757],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5759,35],{"id":35},[37,5761,5762,5765,5768],{},[40,5763,5764],{},"函数内部赋值默认创建局部变量。",[40,5766,5767],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5769,5770,2184,5773,5776],{},[43,5771,5772],{},"global",[43,5774,5775],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5778,70],{"id":70},[10,5780,73],{},[75,5782,5784],{"className":77,"code":5783,"language":79,"meta":80,"style":80},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[43,5785,5786,5791,5795,5800,5805,5809,5814,5819,5824,5828,5833,5837],{"__ignoreMap":80},[84,5787,5788],{"class":86,"line":87},[84,5789,5790],{},"course = \"Python\"\n",[84,5792,5793],{"class":86,"line":93},[84,5794,97],{"emptyLinePlaceholder":96},[84,5796,5797],{"class":86,"line":100},[84,5798,5799],{},"def outer():\n",[84,5801,5802],{"class":86,"line":106},[84,5803,5804],{},"    level = \"基础\"\n",[84,5806,5807],{"class":86,"line":112},[84,5808,97],{"emptyLinePlaceholder":96},[84,5810,5811],{"class":86,"line":118},[84,5812,5813],{},"    def show():\n",[84,5815,5816],{"class":86,"line":124},[84,5817,5818],{},"        lesson = \"作用域\"\n",[84,5820,5821],{"class":86,"line":129},[84,5822,5823],{},"        print(course, level, lesson)\n",[84,5825,5826],{"class":86,"line":135},[84,5827,97],{"emptyLinePlaceholder":96},[84,5829,5830],{"class":86,"line":141},[84,5831,5832],{},"    show()\n",[84,5834,5835],{"class":86,"line":147},[84,5836,97],{"emptyLinePlaceholder":96},[84,5838,5840],{"class":86,"line":5839},12,[84,5841,5842],{},"outer()\n",[10,5844,153],{},[75,5846,5849],{"className":5847,"code":5848,"language":159,"meta":80},[157],"Python 基础 作用域\n",[43,5850,5848],{"__ignoreMap":80},[10,5852,164],{},[14,5854,167],{"id":167},[169,5856,5857,5874],{},[40,5858,5859,5862,5863,5866,5867,5869,5870,5873],{},[43,5860,5861],{},"show()"," 中查找 ",[43,5864,5865],{},"lesson"," 时先在局部找到，查找 ",[43,5868,5655],{}," 时到外层 ",[43,5871,5872],{},"outer()"," 找到。",[40,5875,5876,5878,5879,5881],{},[43,5877,4590],{}," 在局部和外层都不存在，继续到模块全局找到；",[43,5880,2216],{}," 最后在内置作用域找到。",[338,5883,2704],{"id":2704},[10,5885,5886],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5888,5889],{},[26,5890],{"alt":5891,"src":5892},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5894,5895],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5897,182],{"id":182},[37,5899,5900,5903],{},[40,5901,5902],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5904,5905],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5907,199],{"id":199},[169,5909,5910,5913],{},[40,5911,5912],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5914,5915],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5917,214],{},[14,5919,217],{"id":217},[10,5921,5922],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,5924,224],{},{"title":80,"searchDepth":93,"depth":93,"links":5926},[5927,5928,5929,5930,5931,5934,5935,5936],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":5932},[5933],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5736,"description":5741},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[235,5944,5945],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5948,"title":5949,"body":5950,"category":235,"cover":236,"description":5954,"extension":237,"meta":6104,"navigation":96,"path":6105,"pinned":240,"publishedAt":241,"seo":6106,"slug":6107,"stem":6108,"summary":6109,"tags":6110,"updatedAt":241,"visible":96,"__hash__":6113},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5951,"toc":6094},[5952,5955,5957,5960,5962,5968,5971,5973,5992,5994,5996,6030,6032,6038,6040,6042,6057,6059,6071,6073,6085,6087,6089,6092],[10,5953,5954],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5956,16],{"id":16},[10,5958,5959],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5961,22],{"id":22},[10,5963,5964],{},[26,5965],{"alt":5966,"src":5967},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5969,5970],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5972,35],{"id":35},[37,5974,5975,5978,5981],{},[40,5976,5977],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5979,5980],{},"注解表达接口意图，不代替输入校验和测试。",[40,5982,5983,5984,2265,5986,2265,5988,5991],{},"基础注解优先使用 ",[43,5985,2268],{},[43,5987,2433],{},[43,5989,5990],{},"list[str]"," 等直接写法。",[14,5993,70],{"id":70},[10,5995,73],{},[75,5997,5999],{"className":77,"code":5998,"language":79,"meta":80,"style":80},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[43,6000,6001,6006,6011,6016,6020,6025],{"__ignoreMap":80},[84,6002,6003],{"class":86,"line":87},[84,6004,6005],{},"def format_score(name: str, score: int) -> str:\n",[84,6007,6008],{"class":86,"line":93},[84,6009,6010],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[84,6012,6013],{"class":86,"line":100},[84,6014,6015],{},"    return name + \"：\" + str(score)\n",[84,6017,6018],{"class":86,"line":106},[84,6019,97],{"emptyLinePlaceholder":96},[84,6021,6022],{"class":86,"line":112},[84,6023,6024],{},"print(format_score(\"小郑\", 95))\n",[84,6026,6027],{"class":86,"line":118},[84,6028,6029],{},"print(format_score.__doc__)\n",[10,6031,153],{},[75,6033,6036],{"className":6034,"code":6035,"language":159,"meta":80},[157],"小郑：95\n返回带姓名的分数文本。\n",[43,6037,6035],{"__ignoreMap":80},[10,6039,164],{},[14,6041,167],{"id":167},[169,6043,6044,6054],{},[40,6045,6046,6047,6050,6051,6053],{},"函数签名说明 ",[43,6048,6049],{},"name"," 预期为字符串、",[43,6052,2254],{}," 预期为整数，返回值预期为字符串。",[40,6055,6056],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6058,182],{"id":182},[37,6060,6061,6068],{},[40,6062,6063,6064,6067],{},"认为加了 ",[43,6065,6066],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6069,6070],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6072,199],{"id":199},[169,6074,6075,6078],{},[40,6076,6077],{},"为面积函数补充参数和返回值注解。",[40,6079,6080,6081,6084],{},"通过 ",[43,6082,6083],{},"函数名.__doc__"," 查看文档字符串。",[10,6086,214],{},[14,6088,217],{"id":217},[10,6090,6091],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,6093,224],{},{"title":80,"searchDepth":93,"depth":93,"links":6095},[6096,6097,6098,6099,6100,6101,6102,6103],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5949,"description":5954},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[235,6111,6112],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6115,"title":6116,"body":6117,"category":235,"cover":236,"description":6121,"extension":237,"meta":6348,"navigation":96,"path":6349,"pinned":240,"publishedAt":241,"seo":6350,"slug":6351,"stem":6352,"summary":6353,"tags":6354,"updatedAt":241,"visible":96,"__hash__":6357},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6118,"toc":6336},[6119,6122,6124,6130,6132,6138,6149,6151,6169,6171,6178,6207,6214,6233,6242,6244,6250,6252,6254,6277,6279,6282,6288,6294,6296,6312,6314,6327,6329,6331,6334],[10,6120,6121],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6123,16],{"id":16},[10,6125,6126,6127,6129],{},"本篇只处理“模块、import 与 ",[304,6128,6049],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6131,22],{"id":22},[10,6133,6134],{},[26,6135],{"alt":6136,"src":6137},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6139,6140,6141,6144,6145,6148],{},"同一个文件直接运行时 ",[43,6142,6143],{},"__name__"," 等于 ",[43,6146,6147],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6150,35],{"id":35},[37,6152,6153,6159,6162],{},[40,6154,6155,6156,6158],{},"一个 ",[43,6157,1179],{}," 文件就是一个模块。",[40,6160,6161],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6163,6164,6165,6168],{},"避免使用 ",[43,6166,6167],{},"from module import *","，它会让名字来源不清楚。",[14,6170,70],{"id":70},[10,6172,6173,6174,6177],{},"先在同一个目录中创建两个文件。把函数放进 ",[43,6175,6176],{},"calculator.py","：",[75,6179,6181],{"className":77,"code":6180,"language":79,"meta":80,"style":80},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[43,6182,6183,6188,6193,6197,6202],{"__ignoreMap":80},[84,6184,6185],{"class":86,"line":87},[84,6186,6187],{},"def add(left, right):\n",[84,6189,6190],{"class":86,"line":93},[84,6191,6192],{},"    return left + right\n",[84,6194,6195],{"class":86,"line":100},[84,6196,97],{"emptyLinePlaceholder":96},[84,6198,6199],{"class":86,"line":106},[84,6200,6201],{},"if __name__ == \"__main__\":\n",[84,6203,6204],{"class":86,"line":112},[84,6205,6206],{},"    print(add(2, 3))\n",[10,6208,6209,6210,6213],{},"再创建 ",[43,6211,6212],{},"app.py","，从模块中导入函数：",[75,6215,6217],{"className":77,"code":6216,"language":79,"meta":80,"style":80},"from calculator import add\n\nprint(add(10, 20))\n",[43,6218,6219,6224,6228],{"__ignoreMap":80},[84,6220,6221],{"class":86,"line":87},[84,6222,6223],{},"from calculator import add\n",[84,6225,6226],{"class":86,"line":93},[84,6227,97],{"emptyLinePlaceholder":96},[84,6229,6230],{"class":86,"line":100},[84,6231,6232],{},"print(add(10, 20))\n",[10,6234,6235,6236,1165,6239,56],{},"分别执行 ",[43,6237,6238],{},"python3 calculator.py",[43,6240,6241],{},"python3 app.py",[10,6243,153],{},[75,6245,6248],{"className":6246,"code":6247,"language":159,"meta":80},[157],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[43,6249,6247],{"__ignoreMap":80},[10,6251,164],{},[14,6253,167],{"id":167},[169,6255,6256,6266],{},[40,6257,6258,6259,6261,6262,6265],{},"直接运行 ",[43,6260,6176],{}," 时，模块名是 ",[43,6263,6264],{},"__main__","，入口代码输出 5。",[40,6267,6268,6270,6271,6273,6274,6276],{},[43,6269,6212],{}," 导入模块时，",[43,6272,6176],{}," 的函数定义会执行，但入口判断为假；随后 ",[43,6275,6212],{}," 调用函数输出 30。",[338,6278,2704],{"id":2704},[10,6280,6281],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6283,6284],{},[26,6285],{"alt":6286,"src":6287},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6289,6290,6291,6293],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[43,6292,6264],{}," 保护下的演示代码。",[14,6295,182],{"id":182},[37,6297,6298,6305],{},[40,6299,6300,6301,1165,6303,56],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[43,6302,6176],{},[43,6304,6212],{},[40,6306,6307,6308,6311],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[43,6309,6310],{},"json.py","，导致导入目标被遮蔽。",[14,6313,199],{"id":199},[169,6315,6316,6322],{},[40,6317,2361,6318,6321],{},[43,6319,6320],{},"text_tools.py"," 并导出一个格式化函数。",[40,6323,6324,6325,56],{},"分别直接运行模块和从另一个脚本导入，输出 ",[43,6326,6143],{},[10,6328,214],{},[14,6330,217],{"id":217},[10,6332,6333],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,6335,224],{},{"title":80,"searchDepth":93,"depth":93,"links":6337},[6338,6339,6340,6341,6342,6345,6346,6347],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":6343},[6344],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6116,"description":6121},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[235,6355,6356],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6359,"title":6360,"body":6361,"category":235,"cover":236,"description":6365,"extension":237,"meta":6530,"navigation":96,"path":6531,"pinned":240,"publishedAt":241,"seo":6532,"slug":6533,"stem":6534,"summary":6535,"tags":6536,"updatedAt":241,"visible":96,"__hash__":6538},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6362,"toc":6520},[6363,6366,6368,6371,6373,6379,6382,6384,6398,6400,6402,6448,6450,6456,6458,6460,6486,6488,6498,6500,6511,6513,6515,6518],[10,6364,6365],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6367,16],{"id":16},[10,6369,6370],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6372,22],{"id":22},[10,6374,6375],{},[26,6376],{"alt":6377,"src":6378},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6380,6381],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6383,35],{"id":35},[37,6385,6386,6392,6395],{},[40,6387,6388,6391],{},[43,6389,6390],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6393,6394],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6396,6397],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6399,70],{"id":70},[10,6401,1582],{},[75,6403,6405],{"className":599,"code":6404,"language":601,"meta":80,"style":80},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[43,6406,6407,6419,6427,6433,6443],{"__ignoreMap":80},[84,6408,6409,6411,6413,6416],{"class":86,"line":87},[84,6410,699],{"class":608},[84,6412,641],{"class":611},[84,6414,6415],{"class":644}," venv",[84,6417,6418],{"class":644}," .venv\n",[84,6420,6421,6424],{"class":86,"line":93},[84,6422,6423],{"class":611},"source",[84,6425,6426],{"class":644}," .venv\u002Fbin\u002Factivate\n",[84,6428,6429,6431],{"class":86,"line":100},[84,6430,79],{"class":608},[84,6432,612],{"class":611},[84,6434,6435,6437,6439,6441],{"class":86,"line":106},[84,6436,79],{"class":608},[84,6438,641],{"class":611},[84,6440,645],{"class":644},[84,6442,612],{"class":611},[84,6444,6445],{"class":86,"line":112},[84,6446,6447],{"class":608},"deactivate\n",[10,6449,153],{},[75,6451,6454],{"className":6452,"code":6453,"language":159,"meta":80},[157],"Python 和 pip 的路径应指向当前项目的 .venv\n",[43,6455,6453],{"__ignoreMap":80},[10,6457,164],{},[14,6459,167],{"id":167},[169,6461,6462,6471],{},[40,6463,6464,6467,6468,6470],{},[43,6465,6466],{},"venv"," 根据当前 ",[43,6469,699],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6472,6473,6474,2184,6476,6479,6480,3735,6482,6485],{},"激活后 ",[43,6475,79],{},[43,6477,6478],{},"python -m pip"," 优先指向 ",[43,6481,6390],{},[43,6483,6484],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6487,182],{"id":182},[37,6489,6490,6493],{},[40,6491,6492],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6494,3474,6495,6497],{},[43,6496,6390],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6499,199],{"id":199},[169,6501,6502,6508],{},[40,6503,6504,6505,56],{},"创建虚拟环境并记录激活前后的 ",[43,6506,6507],{},"which python",[40,6509,6510],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6512,214],{},[14,6514,217],{"id":217},[10,6516,6517],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,6519,1666],{},{"title":80,"searchDepth":93,"depth":93,"links":6521},[6522,6523,6524,6525,6526,6527,6528,6529],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6360,"description":6365},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[235,6537,270],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6540,"title":6541,"body":6542,"category":235,"cover":236,"description":6546,"extension":237,"meta":6733,"navigation":96,"path":6734,"pinned":240,"publishedAt":241,"seo":6735,"slug":6736,"stem":6737,"summary":6738,"tags":6739,"updatedAt":241,"visible":96,"__hash__":6742},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6543,"toc":6723},[6544,6547,6549,6552,6554,6560,6569,6571,6595,6597,6599,6651,6653,6659,6661,6663,6679,6681,6700,6702,6714,6716,6718,6721],[10,6545,6546],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6548,16],{"id":16},[10,6550,6551],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6553,22],{"id":22},[10,6555,6556],{},[26,6557],{"alt":6558,"src":6559},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6561,6562,6565,6566,6568],{},[43,6563,6564],{},"Path"," 使用 ",[43,6567,2443],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6570,35],{"id":35},[37,6572,6573,6576,6588],{},[40,6574,6575],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6577,6578,2265,6581,2265,6584,6587],{},[43,6579,6580],{},"exists()",[43,6582,6583],{},"is_file()",[43,6585,6586],{},"is_dir()"," 检查真实文件系统状态。",[40,6589,6590,6591,6594],{},"创建目录前明确目标；",[43,6592,6593],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6596,70],{"id":70},[10,6598,73],{},[75,6600,6602],{"className":77,"code":6601,"language":79,"meta":80,"style":80},"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",[43,6603,6604,6608,6612,6617,6622,6627,6631,6636,6641,6646],{"__ignoreMap":80},[84,6605,6606],{"class":86,"line":87},[84,6607,90],{},[84,6609,6610],{"class":86,"line":93},[84,6611,97],{"emptyLinePlaceholder":96},[84,6613,6614],{"class":86,"line":100},[84,6615,6616],{},"project = Path.cwd()\n",[84,6618,6619],{"class":86,"line":106},[84,6620,6621],{},"data_dir = project \u002F \"data\"\n",[84,6623,6624],{"class":86,"line":112},[84,6625,6626],{},"file_path = data_dir \u002F \"records.json\"\n",[84,6628,6629],{"class":86,"line":118},[84,6630,97],{"emptyLinePlaceholder":96},[84,6632,6633],{"class":86,"line":124},[84,6634,6635],{},"print(project)\n",[84,6637,6638],{"class":86,"line":129},[84,6639,6640],{},"print(file_path.name)\n",[84,6642,6643],{"class":86,"line":135},[84,6644,6645],{},"print(file_path.suffix)\n",[84,6647,6648],{"class":86,"line":141},[84,6649,6650],{},"print(file_path.exists())\n",[10,6652,153],{},[75,6654,6657],{"className":6655,"code":6656,"language":159,"meta":80},[157],"显示当前项目路径、records.json、.json 和存在状态\n",[43,6658,6656],{"__ignoreMap":80},[10,6660,164],{},[14,6662,167],{"id":167},[169,6664,6665,6671],{},[40,6666,6667,6670],{},[43,6668,6669],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6672,187,6673,6675,6676,6678],{},[43,6674,2443],{}," 组合路径片段只创建新的 ",[43,6677,6564],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6680,182],{"id":182},[37,6682,6683,6691],{},[40,6684,3474,6685,6687,6688,6690],{},[43,6686,6564],{}," 对象存在当成真实文件存在，仍需调用 ",[43,6689,6580],{}," 等方法确认。",[40,6692,6693,6694,1017,6696,6699],{},"手工拼接 ",[43,6695,2443],{},[43,6697,6698],{},"\\"," 分隔符，降低跨平台可读性。",[14,6701,199],{"id":199},[169,6703,6704,6711],{},[40,6705,6706,6707,6710],{},"组合 ",[43,6708,6709],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6712,6713],{},"输出路径的父目录、文件名和扩展名。",[10,6715,214],{},[14,6717,217],{"id":217},[10,6719,6720],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,6722,224],{},{"title":80,"searchDepth":93,"depth":93,"links":6724},[6725,6726,6727,6728,6729,6730,6731,6732],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6541,"description":6546},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[235,6740,6741],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":4,"title":5,"body":6744,"category":235,"cover":236,"description":12,"extension":237,"meta":6891,"navigation":96,"path":239,"pinned":240,"publishedAt":241,"seo":6892,"slug":243,"stem":244,"summary":245,"tags":6893,"updatedAt":241,"visible":96,"__hash__":249},{"type":7,"value":6745,"toc":6881},[6746,6748,6750,6752,6754,6758,6760,6762,6780,6782,6784,6832,6834,6839,6841,6843,6851,6853,6863,6865,6873,6875,6877,6879],[10,6747,12],{},[14,6749,16],{"id":16},[10,6751,19],{},[14,6753,22],{"id":22},[10,6755,6756],{},[26,6757],{"alt":28,"src":29},[10,6759,32],{},[14,6761,35],{"id":35},[37,6763,6764,6768,6774],{},[40,6765,6766,46],{},[43,6767,45],{},[40,6769,6770,52,6772,56],{},[43,6771,51],{},[43,6773,55],{},[40,6775,59,6776,63,6778,67],{},[43,6777,62],{},[43,6779,66],{},[14,6781,70],{"id":70},[10,6783,73],{},[75,6785,6786],{"className":77,"code":78,"language":79,"meta":80,"style":80},[43,6787,6788,6792,6796,6800,6804,6808,6812,6816,6820,6824,6828],{"__ignoreMap":80},[84,6789,6790],{"class":86,"line":87},[84,6791,90],{},[84,6793,6794],{"class":86,"line":93},[84,6795,97],{"emptyLinePlaceholder":96},[84,6797,6798],{"class":86,"line":100},[84,6799,103],{},[84,6801,6802],{"class":86,"line":106},[84,6803,109],{},[84,6805,6806],{"class":86,"line":112},[84,6807,115],{},[84,6809,6810],{"class":86,"line":118},[84,6811,121],{},[84,6813,6814],{"class":86,"line":124},[84,6815,97],{"emptyLinePlaceholder":96},[84,6817,6818],{"class":86,"line":129},[84,6819,132],{},[84,6821,6822],{"class":86,"line":135},[84,6823,138],{},[84,6825,6826],{"class":86,"line":141},[84,6827,144],{},[84,6829,6830],{"class":86,"line":147},[84,6831,150],{},[10,6833,153],{},[75,6835,6837],{"className":6836,"code":158,"language":159,"meta":80},[157],[43,6838,158],{"__ignoreMap":80},[10,6840,164],{},[14,6842,167],{"id":167},[169,6844,6845,6849],{},[40,6846,173,6847,176],{},[43,6848,62],{},[40,6850,179],{},[14,6852,182],{"id":182},[37,6854,6855,6859],{},[40,6856,187,6857,190],{},[43,6858,45],{},[40,6860,193,6861,56],{},[43,6862,196],{},[14,6864,199],{"id":199},[169,6866,6867,6869],{},[40,6868,204],{},[40,6870,207,6871,211],{},[43,6872,210],{},[10,6874,214],{},[14,6876,217],{"id":217},[10,6878,220],{},[222,6880,224],{},{"title":80,"searchDepth":93,"depth":93,"links":6882},[6883,6884,6885,6886,6887,6888,6889,6890],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5,"description":12},[235,247,248],{"id":6895,"title":6896,"body":6897,"category":235,"cover":236,"description":6901,"extension":237,"meta":7068,"navigation":96,"path":7069,"pinned":240,"publishedAt":241,"seo":7070,"slug":7071,"stem":7072,"summary":7073,"tags":7074,"updatedAt":241,"visible":96,"__hash__":7077},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6898,"toc":7058},[6899,6902,6904,6907,6909,6915,6925,6927,6941,6943,6945,7005,7007,7013,7015,7017,7029,7031,7039,7041,7049,7051,7053,7056],[10,6900,6901],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6903,16],{"id":16},[10,6905,6906],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6908,22],{"id":22},[10,6910,6911],{},[26,6912],{"alt":6913,"src":6914},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6916,6917,6920,6921,6924],{},[43,6918,6919],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[43,6922,6923],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6926,35],{"id":35},[37,6928,6929,6932,6938],{},[40,6930,6931],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6933,6934,6937],{},[43,6935,6936],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6939,6940],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6942,70],{"id":70},[10,6944,73],{},[75,6946,6948],{"className":77,"code":6947,"language":79,"meta":80,"style":80},"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",[43,6949,6950,6955,6959,6964,6968,6973,6978,6982,6986,6991,6996,7000],{"__ignoreMap":80},[84,6951,6952],{"class":86,"line":87},[84,6953,6954],{},"import json\n",[84,6956,6957],{"class":86,"line":93},[84,6958,97],{"emptyLinePlaceholder":96},[84,6960,6961],{"class":86,"line":100},[84,6962,6963],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[84,6965,6966],{"class":86,"line":106},[84,6967,97],{"emptyLinePlaceholder":96},[84,6969,6970],{"class":86,"line":112},[84,6971,6972],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[84,6974,6975],{"class":86,"line":118},[84,6976,6977],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[84,6979,6980],{"class":86,"line":124},[84,6981,121],{},[84,6983,6984],{"class":86,"line":129},[84,6985,97],{"emptyLinePlaceholder":96},[84,6987,6988],{"class":86,"line":135},[84,6989,6990],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[84,6992,6993],{"class":86,"line":141},[84,6994,6995],{},"loaded = json.load(reader)\n",[84,6997,6998],{"class":86,"line":147},[84,6999,144],{},[84,7001,7002],{"class":86,"line":5839},[84,7003,7004],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7006,153],{},[75,7008,7011],{"className":7009,"code":7010,"language":159,"meta":80},[157],"Python 60\n",[43,7012,7010],{"__ignoreMap":80},[10,7014,164],{},[14,7016,167],{"id":167},[169,7018,7019,7024],{},[40,7020,7021,7023],{},[43,7022,6919],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7025,7026,7028],{},[43,7027,6923],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7030,182],{"id":182},[37,7032,7033,7036],{},[40,7034,7035],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7037,7038],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7040,199],{"id":199},[169,7042,7043,7046],{},[40,7044,7045],{},"保存包含两条学习记录的列表。",[40,7047,7048],{},"读取后修改进度，再重新写回文件。",[10,7050,214],{},[14,7052,217],{"id":217},[10,7054,7055],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,7057,224],{},{"title":80,"searchDepth":93,"depth":93,"links":7059},[7060,7061,7062,7063,7064,7065,7066,7067],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6896,"description":6901},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[235,7075,7076],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7079,"title":7080,"body":7081,"category":235,"cover":236,"description":7085,"extension":237,"meta":7269,"navigation":96,"path":7270,"pinned":240,"publishedAt":241,"seo":7271,"slug":7272,"stem":7273,"summary":7274,"tags":7275,"updatedAt":241,"visible":96,"__hash__":7278},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7082,"toc":7259},[7083,7086,7088,7091,7093,7099,7105,7107,7129,7131,7133,7196,7198,7204,7206,7208,7224,7226,7240,7242,7250,7252,7254,7257],[10,7084,7085],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7087,16],{"id":16},[10,7089,7090],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7092,22],{"id":22},[10,7094,7095],{},[26,7096],{"alt":7097,"src":7098},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7100,7101,7104],{},[43,7102,7103],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7106,35],{"id":35},[37,7108,7109,7119,7126],{},[40,7110,187,7111,7114,7115,7118],{},[43,7112,7113],{},"newline=\"\""," 让 ",[43,7116,7117],{},"csv"," 模块正确处理换行。",[40,7120,7121,7122,7125],{},"字段顺序由 ",[43,7123,7124],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7127,7128],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7130,70],{"id":70},[10,7132,73],{},[75,7134,7136],{"className":77,"code":7135,"language":79,"meta":80,"style":80},"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",[43,7137,7138,7143,7147,7152,7157,7162,7167,7172,7176,7181,7186,7191],{"__ignoreMap":80},[84,7139,7140],{"class":86,"line":87},[84,7141,7142],{},"import csv\n",[84,7144,7145],{"class":86,"line":93},[84,7146,97],{"emptyLinePlaceholder":96},[84,7148,7149],{"class":86,"line":100},[84,7150,7151],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[84,7153,7154],{"class":86,"line":106},[84,7155,7156],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[84,7158,7159],{"class":86,"line":112},[84,7160,7161],{},"writer.writeheader()\n",[84,7163,7164],{"class":86,"line":118},[84,7165,7166],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[84,7168,7169],{"class":86,"line":124},[84,7170,7171],{},"writer_file.close()\n",[84,7173,7174],{"class":86,"line":129},[84,7175,97],{"emptyLinePlaceholder":96},[84,7177,7178],{"class":86,"line":135},[84,7179,7180],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[84,7182,7183],{"class":86,"line":141},[84,7184,7185],{},"for row in csv.DictReader(reader_file):\n",[84,7187,7188],{"class":86,"line":147},[84,7189,7190],{},"    print(row[\"name\"], row[\"score\"])\n",[84,7192,7193],{"class":86,"line":5839},[84,7194,7195],{},"reader_file.close()\n",[10,7197,153],{},[75,7199,7202],{"className":7200,"code":7201,"language":159,"meta":80},[157],"小郑 95\n",[43,7203,7201],{"__ignoreMap":80},[10,7205,164],{},[14,7207,167],{"id":167},[169,7209,7210,7219],{},[40,7211,7212,7215,7216,7218],{},[43,7213,7214],{},"DictWriter"," 按 ",[43,7217,7124],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7220,7221,7223],{},[43,7222,7103],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7225,182],{"id":182},[37,7227,7228,7231],{},[40,7229,7230],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7232,7233,7234,7236,7237,7239],{},"在 macOS 以外环境忽略 ",[43,7235,7113],{}," 可能出现额外空行；统一交给 ",[43,7238,7117],{}," 模块管理换行。",[14,7241,199],{"id":199},[169,7243,7244,7247],{},[40,7245,7246],{},"写入三名学习者的课程和分数。",[40,7248,7249],{},"读取 CSV 后把分数字符串转换为整数。",[10,7251,214],{},[14,7253,217],{"id":217},[10,7255,7256],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,7258,224],{},{"title":80,"searchDepth":93,"depth":93,"links":7260},[7261,7262,7263,7264,7265,7266,7267,7268],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7080,"description":7085},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[235,7276,7277],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7280,"title":7281,"body":7282,"category":235,"cover":236,"description":7286,"extension":237,"meta":7559,"navigation":96,"path":7560,"pinned":240,"publishedAt":241,"seo":7561,"slug":7562,"stem":7563,"summary":7564,"tags":7565,"updatedAt":241,"visible":96,"__hash__":7568},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7283,"toc":7546},[7284,7287,7289,7292,7294,7300,7311,7313,7330,7332,7334,7409,7411,7417,7419,7421,7446,7448,7457,7463,7474,7476,7482,7488,7497,7499,7514,7516,7537,7539,7541,7544],[10,7285,7286],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7288,16],{"id":16},[10,7290,7291],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7293,22],{"id":22},[10,7295,7296],{},[26,7297],{"alt":7298,"src":7299},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7301,7302,7303,7306,7307,7310],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[43,7304,7305],{},"except","；无论是否异常，",[43,7308,7309],{},"finally"," 都会在离开结构前执行。",[14,7312,35],{"id":35},[37,7314,7315,7321,7327],{},[40,7316,7317,7318,7320],{},"只捕获能够处理的具体异常，不使用空的 ",[43,7319,7305],{}," 吞掉全部错误。",[40,7322,7323,7326],{},[43,7324,7325],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7328,7329],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7331,70],{"id":70},[10,7333,73],{},[75,7335,7337],{"className":77,"code":7336,"language":79,"meta":80,"style":80},"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",[43,7338,7339,7344,7349,7354,7359,7364,7368,7373,7378,7383,7388,7392,7397,7403],{"__ignoreMap":80},[84,7340,7341],{"class":86,"line":87},[84,7342,7343],{},"def parse_age(text):\n",[84,7345,7346],{"class":86,"line":93},[84,7347,7348],{},"    age = int(text)\n",[84,7350,7351],{"class":86,"line":100},[84,7352,7353],{},"    if age \u003C 0:\n",[84,7355,7356],{"class":86,"line":106},[84,7357,7358],{},"        raise ValueError(\"年龄不能为负数\")\n",[84,7360,7361],{"class":86,"line":112},[84,7362,7363],{},"    return age\n",[84,7365,7366],{"class":86,"line":118},[84,7367,97],{"emptyLinePlaceholder":96},[84,7369,7370],{"class":86,"line":124},[84,7371,7372],{},"try:\n",[84,7374,7375],{"class":86,"line":129},[84,7376,7377],{},"    age = parse_age(\"18\")\n",[84,7379,7380],{"class":86,"line":135},[84,7381,7382],{},"except ValueError as error:\n",[84,7384,7385],{"class":86,"line":141},[84,7386,7387],{},"    print(\"输入错误：\", error)\n",[84,7389,7390],{"class":86,"line":147},[84,7391,1154],{},[84,7393,7394],{"class":86,"line":5839},[84,7395,7396],{},"    print(\"年龄：\", age)\n",[84,7398,7400],{"class":86,"line":7399},13,[84,7401,7402],{},"finally:\n",[84,7404,7406],{"class":86,"line":7405},14,[84,7407,7408],{},"    print(\"处理结束\")\n",[10,7410,153],{},[75,7412,7415],{"className":7413,"code":7414,"language":159,"meta":80},[157],"年龄： 18\n处理结束\n",[43,7416,7414],{"__ignoreMap":80},[10,7418,164],{},[14,7420,167],{"id":167},[169,7422,7423,7435],{},[40,7424,7425,7427,7428,7430,7431,7434],{},[43,7426,3043],{}," 或主动 ",[43,7429,7325],{}," 都可能产生 ",[43,7432,7433],{},"ValueError","，控制流立即离开当前正常路径。",[40,7436,7437,7438,7440,7441,7443,7444,56],{},"有异常时进入匹配的 ",[43,7439,7305],{},"；没有异常时执行 ",[43,7442,1168],{},"；两种情况最后都会执行 ",[43,7445,7309],{},[338,7447,2704],{"id":2704},[10,7449,7450,2265,7452,1165,7454,7456],{},[43,7451,7305],{},[43,7453,1168],{},[43,7455,7309],{}," 的职责不同，不能只看它们出现的顺序。",[10,7458,7459],{},[26,7460],{"alt":7461,"src":7462},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7464,7465,7467,7468,7470,7471,7473],{},[43,7466,7305],{}," 处理匹配异常，",[43,7469,1168],{}," 只在无异常时运行，",[43,7472,7309],{}," 负责两条路径都需要的清理动作。",[338,7475,2704],{"id":4225},[10,7477,7478,7481],{},[43,7479,7480],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7483,7484],{},[26,7485],{"alt":7486,"src":7487},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7489,7490,7491,7493,7494,7496],{},"只把可能产生预期异常的操作放进 ",[43,7492,7480],{},"，后续正常业务放进 ",[43,7495,1168],{},"，错误边界会更清楚。",[14,7498,182],{"id":182},[37,7500,7501,7508],{},[40,7502,7503,7504,7507],{},"使用裸 ",[43,7505,7506],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7509,7510,7511,7513],{},"把整个程序包在一个巨大 ",[43,7512,7480],{}," 中，无法判断究竟哪一步允许失败。",[14,7515,199],{"id":199},[169,7517,7518,7531],{},[40,7519,7520,7521,7524,7525,1165,7528,56],{},"让 ",[43,7522,7523],{},"parse_age"," 分别处理 ",[43,7526,7527],{},"\"abc\"",[43,7529,7530],{},"\"-1\"",[40,7532,7533,7534,7536],{},"为文件读取捕获 ",[43,7535,55],{}," 并给出清晰提示。",[10,7538,214],{},[14,7540,217],{"id":217},[10,7542,7543],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,7545,224],{},{"title":80,"searchDepth":93,"depth":93,"links":7547},[7548,7549,7550,7551,7552,7556,7557,7558],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":7553},[7554,7555],{"id":2704,"depth":100,"text":2704},{"id":4225,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7281,"description":7286},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[235,7566,7567],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7570,"title":7571,"body":7572,"category":235,"cover":236,"description":7576,"extension":237,"meta":7752,"navigation":96,"path":7753,"pinned":240,"publishedAt":241,"seo":7754,"slug":7755,"stem":7756,"summary":7757,"tags":7758,"updatedAt":241,"visible":96,"__hash__":7760},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7573,"toc":7742},[7574,7577,7579,7582,7584,7590,7596,7598,7614,7616,7618,7672,7674,7680,7682,7684,7697,7699,7712,7714,7733,7735,7737,7740],[10,7575,7576],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7578,16],{"id":16},[10,7580,7581],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7583,22],{"id":22},[10,7585,7586],{},[26,7587],{"alt":7588,"src":7589},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7591,7592,7593,7595],{},"进入 ",[43,7594,66],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7597,35],{"id":35},[37,7599,7600,7605,7611],{},[40,7601,7602,7604],{},[43,7603,66],{}," 把资源获取和释放配成一个清晰边界。",[40,7606,7607,7610],{},[43,7608,7609],{},"as file"," 得到的是上下文返回的资源对象。",[40,7612,7613],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7615,70],{"id":70},[10,7617,73],{},[75,7619,7621],{"className":77,"code":7620,"language":79,"meta":80,"style":80},"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",[43,7622,7623,7627,7631,7635,7639,7644,7649,7653,7658,7663,7667],{"__ignoreMap":80},[84,7624,7625],{"class":86,"line":87},[84,7626,90],{},[84,7628,7629],{"class":86,"line":93},[84,7630,97],{"emptyLinePlaceholder":96},[84,7632,7633],{"class":86,"line":100},[84,7634,103],{},[84,7636,7637],{"class":86,"line":106},[84,7638,97],{"emptyLinePlaceholder":96},[84,7640,7641],{"class":86,"line":112},[84,7642,7643],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[84,7645,7646],{"class":86,"line":118},[84,7647,7648],{},"    file.write(\"上下文管理器\\n\")\n",[84,7650,7651],{"class":86,"line":124},[84,7652,97],{"emptyLinePlaceholder":96},[84,7654,7655],{"class":86,"line":129},[84,7656,7657],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[84,7659,7660],{"class":86,"line":135},[84,7661,7662],{},"    print(file.read())\n",[84,7664,7665],{"class":86,"line":141},[84,7666,97],{"emptyLinePlaceholder":96},[84,7668,7669],{"class":86,"line":147},[84,7670,7671],{},"print(file.closed)\n",[10,7673,153],{},[75,7675,7678],{"className":7676,"code":7677,"language":159,"meta":80},[157],"上下文管理器\n\nTrue\n",[43,7679,7677],{"__ignoreMap":80},[10,7681,164],{},[14,7683,167],{"id":167},[169,7685,7686,7694],{},[40,7687,7592,7688,7690,7691,56],{},[43,7689,66],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[43,7692,7693],{},"file",[40,7695,7696],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7698,182],{"id":182},[37,7700,7701,7706],{},[40,7702,4793,7703,7705],{},[43,7704,66],{}," 代码块外继续读写已经关闭的文件对象。",[40,7707,7708,7709,7711],{},"误以为 ",[43,7710,66],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7713,199],{"id":199},[169,7715,7716,7725],{},[40,7717,7718,7719,7722,7723,56],{},"把第 30 篇的手动 ",[43,7720,7721],{},"open\u002Fclose"," 改写为 ",[43,7724,66],{},[40,7726,4793,7727,7729,7730,56],{},[43,7728,66],{}," 块后检查 ",[43,7731,7732],{},"file.closed",[10,7734,214],{},[14,7736,217],{"id":217},[10,7738,7739],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,7741,224],{},{"title":80,"searchDepth":93,"depth":93,"links":7743},[7744,7745,7746,7747,7748,7749,7750,7751],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7571,"description":7576},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[235,66,7759],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7762,"title":7763,"body":7764,"category":235,"cover":236,"description":7768,"extension":237,"meta":7980,"navigation":96,"path":7981,"pinned":240,"publishedAt":241,"seo":7982,"slug":7983,"stem":7984,"summary":7985,"tags":7986,"updatedAt":241,"visible":96,"__hash__":7989},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7765,"toc":7968},[7766,7769,7771,7774,7776,7782,7785,7787,7804,7806,7808,7876,7878,7884,7886,7888,7913,7915,7918,7924,7933,7935,7946,7948,7959,7961,7963,7966],[10,7767,7768],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7770,16],{"id":16},[10,7772,7773],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7775,22],{"id":22},[10,7777,7778],{},[26,7779],{"alt":7780,"src":7781},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7783,7784],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7786,35],{"id":35},[37,7788,7789,7795,7801],{},[40,7790,7791,7794],{},[43,7792,7793],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7796,7797,7800],{},[43,7798,7799],{},"__init__"," 在实例创建过程中初始化属性。",[40,7802,7803],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7805,70],{"id":70},[10,7807,73],{},[75,7809,7811],{"className":77,"code":7810,"language":79,"meta":80,"style":80},"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",[43,7812,7813,7818,7823,7828,7833,7837,7842,7847,7852,7857,7861,7866,7871],{"__ignoreMap":80},[84,7814,7815],{"class":86,"line":87},[84,7816,7817],{},"class LearningRecord:\n",[84,7819,7820],{"class":86,"line":93},[84,7821,7822],{},"    def __init__(self, course, progress=0):\n",[84,7824,7825],{"class":86,"line":100},[84,7826,7827],{},"        self.course = course\n",[84,7829,7830],{"class":86,"line":106},[84,7831,7832],{},"        self.progress = progress\n",[84,7834,7835],{"class":86,"line":112},[84,7836,97],{"emptyLinePlaceholder":96},[84,7838,7839],{"class":86,"line":118},[84,7840,7841],{},"    def advance(self, amount):\n",[84,7843,7844],{"class":86,"line":124},[84,7845,7846],{},"        self.progress = self.progress + amount\n",[84,7848,7849],{"class":86,"line":129},[84,7850,7851],{},"        if self.progress > 100:\n",[84,7853,7854],{"class":86,"line":135},[84,7855,7856],{},"            self.progress = 100\n",[84,7858,7859],{"class":86,"line":141},[84,7860,97],{"emptyLinePlaceholder":96},[84,7862,7863],{"class":86,"line":147},[84,7864,7865],{},"record = LearningRecord(\"Python\", 40)\n",[84,7867,7868],{"class":86,"line":5839},[84,7869,7870],{},"record.advance(15)\n",[84,7872,7873],{"class":86,"line":7399},[84,7874,7875],{},"print(record.course, record.progress)\n",[10,7877,153],{},[75,7879,7882],{"className":7880,"code":7881,"language":159,"meta":80},[157],"Python 55\n",[43,7883,7881],{"__ignoreMap":80},[10,7885,164],{},[14,7887,167],{"id":167},[169,7889,7890,7900],{},[40,7891,7892,7893,7896,7897,7899],{},"调用 ",[43,7894,7895],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[43,7898,7799],{}," 把课程和进度保存在该实例属性中。",[40,7901,7902,7905,7906,7909,7910,7912],{},[43,7903,7904],{},"record.advance(15)"," 自动把 ",[43,7907,7908],{},"record"," 作为 ",[43,7911,7793],{},"，方法更新同一实例的进度并限制上限。",[338,7914,2704],{"id":2704},[10,7916,7917],{},"类是共同定义，实例则各自保存状态。",[10,7919,7920],{},[26,7921],{"alt":7922,"src":7923},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7925,7926,7927,1165,7929,7932],{},"两个实例共享同一套方法定义，但 ",[43,7928,4590],{},[43,7930,7931],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7934,182],{"id":182},[37,7936,7937,7943],{},[40,7938,7939,7940,7942],{},"调用实例方法时手工再传一次 ",[43,7941,7793],{},"。通过实例调用时 Python 会自动绑定。",[40,7944,7945],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7947,199],{"id":199},[169,7949,7950,7956],{},[40,7951,5303,7952,7955],{},[43,7953,7954],{},"Book"," 类，保存标题和阅读页数。",[40,7957,7958],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7960,214],{},[14,7962,217],{"id":217},[10,7964,7965],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,7967,224],{},{"title":80,"searchDepth":93,"depth":93,"links":7969},[7970,7971,7972,7973,7974,7977,7978,7979],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":7975},[7976],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7763,"description":7768},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[235,7987,7988],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7991,"title":7992,"body":7993,"category":235,"cover":236,"description":7997,"extension":237,"meta":8175,"navigation":96,"path":8176,"pinned":240,"publishedAt":241,"seo":8177,"slug":8178,"stem":8179,"summary":8180,"tags":8181,"updatedAt":241,"visible":96,"__hash__":8184},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7994,"toc":8165},[7995,7998,8000,8003,8005,8011,8014,8016,8027,8029,8031,8098,8100,8106,8108,8110,8129,8131,8139,8141,8156,8158,8160,8163],[10,7996,7997],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7999,16],{"id":16},[10,8001,8002],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8004,22],{"id":22},[10,8006,8007],{},[26,8008],{"alt":8009,"src":8010},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8012,8013],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8015,35],{"id":35},[37,8017,8018,8021,8024],{},[40,8019,8020],{},"封装让对象通过方法维护自己的有效状态。",[40,8022,8023],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8025,8026],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8028,70],{"id":70},[10,8030,73],{},[75,8032,8034],{"className":77,"code":8033,"language":79,"meta":80,"style":80},"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",[43,8035,8036,8041,8046,8051,8055,8060,8065,8070,8074,8079,8084,8088,8093],{"__ignoreMap":80},[84,8037,8038],{"class":86,"line":87},[84,8039,8040],{},"class Storage:\n",[84,8042,8043],{"class":86,"line":93},[84,8044,8045],{},"    def save(self, text):\n",[84,8047,8048],{"class":86,"line":100},[84,8049,8050],{},"        print(\"保存：\", text)\n",[84,8052,8053],{"class":86,"line":106},[84,8054,97],{"emptyLinePlaceholder":96},[84,8056,8057],{"class":86,"line":112},[84,8058,8059],{},"class LearningService:\n",[84,8061,8062],{"class":86,"line":118},[84,8063,8064],{},"    def __init__(self, storage):\n",[84,8066,8067],{"class":86,"line":124},[84,8068,8069],{},"        self.storage = storage\n",[84,8071,8072],{"class":86,"line":129},[84,8073,97],{"emptyLinePlaceholder":96},[84,8075,8076],{"class":86,"line":135},[84,8077,8078],{},"    def finish_lesson(self, title):\n",[84,8080,8081],{"class":86,"line":141},[84,8082,8083],{},"        self.storage.save(title)\n",[84,8085,8086],{"class":86,"line":147},[84,8087,97],{"emptyLinePlaceholder":96},[84,8089,8090],{"class":86,"line":5839},[84,8091,8092],{},"service = LearningService(Storage())\n",[84,8094,8095],{"class":86,"line":7399},[84,8096,8097],{},"service.finish_lesson(\"异常处理\")\n",[10,8099,153],{},[75,8101,8104],{"className":8102,"code":8103,"language":159,"meta":80},[157],"保存： 异常处理\n",[43,8105,8103],{"__ignoreMap":80},[10,8107,164],{},[14,8109,167],{"id":167},[169,8111,8112,8122],{},[40,8113,8114,8117,8118,8121],{},[43,8115,8116],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[43,8119,8120],{},"save()"," 的协作对象。",[40,8123,8124,8125,8128],{},"调用业务方法时，服务把保存动作委托给 ",[43,8126,8127],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8130,182],{"id":182},[37,8132,8133,8136],{},[40,8134,8135],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8137,8138],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8140,199],{"id":199},[169,8142,8143,8153],{},[40,8144,8145,8146,8149,8150,56],{},"用组合让 ",[43,8147,8148],{},"OrderService"," 使用一个 ",[43,8151,8152],{},"Notifier",[40,8154,8155],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8157,214],{},[14,8159,217],{"id":217},[10,8161,8162],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,8164,224],{},{"title":80,"searchDepth":93,"depth":93,"links":8166},[8167,8168,8169,8170,8171,8172,8173,8174],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7992,"description":7997},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[235,8182,8183],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8186,"title":8187,"body":8188,"category":235,"cover":236,"description":8192,"extension":237,"meta":8395,"navigation":96,"path":8396,"pinned":240,"publishedAt":241,"seo":8397,"slug":8398,"stem":8399,"summary":8400,"tags":8401,"updatedAt":241,"visible":96,"__hash__":8404},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8189,"toc":8383},[8190,8193,8195,8198,8200,8206,8213,8215,8240,8242,8244,8296,8298,8304,8306,8308,8329,8331,8337,8343,8349,8351,8359,8361,8374,8376,8378,8381],[10,8191,8192],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8194,16],{"id":16},[10,8196,8197],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8199,22],{"id":22},[10,8201,8202],{},[26,8203],{"alt":8204,"src":8205},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8207,8208,8209,8212],{},"生成器运行到 ",[43,8210,8211],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8214,35],{"id":35},[37,8216,8217,8227,8237],{},[40,8218,8219,8222,8223,8226],{},[43,8220,8221],{},"iter()"," 从可迭代对象取得迭代器，",[43,8224,8225],{},"next()"," 请求下一个值。",[40,8228,8229,8230,8233,8234,8236],{},"没有更多值时迭代器抛出 ",[43,8231,8232],{},"StopIteration","，",[43,8235,4344],{}," 会自动处理。",[40,8238,8239],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8241,70],{"id":70},[10,8243,73],{},[75,8245,8247],{"className":77,"code":8246,"language":79,"meta":80,"style":80},"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",[43,8248,8249,8254,8259,8264,8269,8274,8278,8283,8288,8292],{"__ignoreMap":80},[84,8250,8251],{"class":86,"line":87},[84,8252,8253],{},"def countdown(start):\n",[84,8255,8256],{"class":86,"line":93},[84,8257,8258],{},"    current = start\n",[84,8260,8261],{"class":86,"line":100},[84,8262,8263],{},"    while current > 0:\n",[84,8265,8266],{"class":86,"line":106},[84,8267,8268],{},"        yield current\n",[84,8270,8271],{"class":86,"line":112},[84,8272,8273],{},"        current = current - 1\n",[84,8275,8276],{"class":86,"line":118},[84,8277,97],{"emptyLinePlaceholder":96},[84,8279,8280],{"class":86,"line":124},[84,8281,8282],{},"iterator = countdown(3)\n",[84,8284,8285],{"class":86,"line":129},[84,8286,8287],{},"print(next(iterator))\n",[84,8289,8290],{"class":86,"line":135},[84,8291,8287],{},[84,8293,8294],{"class":86,"line":141},[84,8295,8287],{},[10,8297,153],{},[75,8299,8302],{"className":8300,"code":8301,"language":159,"meta":80},[157],"3\n2\n1\n",[43,8303,8301],{"__ignoreMap":80},[10,8305,164],{},[14,8307,167],{"id":167},[169,8309,8310,8316],{},[40,8311,7892,8312,8315],{},[43,8313,8314],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8317,8318,8319,8321,8322,8324,8325,8328],{},"每次 ",[43,8320,8225],{}," 运行到下一个 ",[43,8323,8211],{}," 并暂停，局部变量 ",[43,8326,8327],{},"current"," 和执行位置被保留。",[338,8330,2704],{"id":2704},[10,8332,8333,8334,8336],{},"生成器的暂停位置可以展开成多次 ",[43,8335,8225],{}," 的时间线。",[10,8338,8339],{},[26,8340],{"alt":8341,"src":8342},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8344,8345,8346,8348],{},"每次请求只推进到下一个 ",[43,8347,8211],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8350,182],{"id":182},[37,8352,8353,8356],{},[40,8354,8355],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8357,8358],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8360,199],{"id":199},[169,8362,8363,8366],{},[40,8364,8365],{},"编写产生 1 到指定上限偶数的生成器。",[40,8367,4017,8368,8370,8371,8373],{},[43,8369,4344],{}," 遍历生成器，比较手动 ",[43,8372,8225],{}," 的差异。",[10,8375,214],{},[14,8377,217],{"id":217},[10,8379,8380],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,8382,224],{},{"title":80,"searchDepth":93,"depth":93,"links":8384},[8385,8386,8387,8388,8389,8392,8393,8394],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":8390},[8391],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8187,"description":8192},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[235,8402,8403],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8406,"title":8407,"body":8408,"category":235,"cover":236,"description":8412,"extension":237,"meta":8636,"navigation":96,"path":8637,"pinned":240,"publishedAt":241,"seo":8638,"slug":8639,"stem":8640,"summary":8641,"tags":8642,"updatedAt":241,"visible":96,"__hash__":8644},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8409,"toc":8624},[8410,8413,8415,8418,8420,8426,8429,8431,8451,8453,8455,8537,8539,8545,8547,8549,8571,8573,8576,8582,8589,8591,8601,8603,8615,8617,8619,8622],[10,8411,8412],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8414,16],{"id":16},[10,8416,8417],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8419,22],{"id":22},[10,8421,8422],{},[26,8423],{"alt":8424,"src":8425},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8427,8428],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8430,35],{"id":35},[37,8432,8433,8442,8445],{},[40,8434,8435,8438,8439,56],{},[43,8436,8437],{},"@trace"," 等价于 ",[43,8440,8441],{},"add = trace(add)",[40,8443,8444],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8446,8447,8450],{},[43,8448,8449],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8452,70],{"id":70},[10,8454,73],{},[75,8456,8458],{"className":77,"code":8457,"language":79,"meta":80,"style":80},"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",[43,8459,8460,8465,8469,8474,8479,8484,8489,8494,8499,8504,8509,8513,8518,8522,8526,8531],{"__ignoreMap":80},[84,8461,8462],{"class":86,"line":87},[84,8463,8464],{},"from functools import wraps\n",[84,8466,8467],{"class":86,"line":93},[84,8468,97],{"emptyLinePlaceholder":96},[84,8470,8471],{"class":86,"line":100},[84,8472,8473],{},"def trace(function):\n",[84,8475,8476],{"class":86,"line":106},[84,8477,8478],{},"    @wraps(function)\n",[84,8480,8481],{"class":86,"line":112},[84,8482,8483],{},"    def wrapper(*args, **kwargs):\n",[84,8485,8486],{"class":86,"line":118},[84,8487,8488],{},"        print(\"开始：\", function.__name__)\n",[84,8490,8491],{"class":86,"line":124},[84,8492,8493],{},"        result = function(*args, **kwargs)\n",[84,8495,8496],{"class":86,"line":129},[84,8497,8498],{},"        print(\"结束：\", function.__name__)\n",[84,8500,8501],{"class":86,"line":135},[84,8502,8503],{},"        return result\n",[84,8505,8506],{"class":86,"line":141},[84,8507,8508],{},"    return wrapper\n",[84,8510,8511],{"class":86,"line":147},[84,8512,97],{"emptyLinePlaceholder":96},[84,8514,8515],{"class":86,"line":5839},[84,8516,8517],{},"@trace\n",[84,8519,8520],{"class":86,"line":7399},[84,8521,6187],{},[84,8523,8524],{"class":86,"line":7405},[84,8525,6192],{},[84,8527,8529],{"class":86,"line":8528},15,[84,8530,97],{"emptyLinePlaceholder":96},[84,8532,8534],{"class":86,"line":8533},16,[84,8535,8536],{},"print(add(2, 3))\n",[10,8538,153],{},[75,8540,8543],{"className":8541,"code":8542,"language":159,"meta":80},[157],"开始： add\n结束： add\n5\n",[43,8544,8542],{"__ignoreMap":80},[10,8546,164],{},[14,8548,167],{"id":167},[169,8550,8551,8568],{},[40,8552,8553,8554,8557,8558,8561,8562,8565,8566,56],{},"解释器执行定义时，把原 ",[43,8555,8556],{},"add"," 函数交给 ",[43,8559,8560],{},"trace","，返回的 ",[43,8563,8564],{},"wrapper"," 重新绑定到名字 ",[43,8567,8556],{},[40,8569,8570],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[338,8572,2704],{"id":2704},[10,8574,8575],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8577,8578],{},[26,8579],{"alt":8580,"src":8581},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8583,8584,8586,8587,56],{},[43,8585,8437],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[43,8588,8441],{},[14,8590,182],{"id":182},[37,8592,8593,8598],{},[40,8594,8595,8596,56],{},"包装函数忘记返回原函数结果，调用方得到 ",[43,8597,5386],{},[40,8599,8600],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8602,199],{"id":199},[169,8604,8605,8608],{},[40,8606,8607],{},"编写只记录调用次数的简单装饰器。",[40,8609,8610,8611,8614],{},"删除包装函数的 ",[43,8612,8613],{},"return result","，观察调用方得到什么。",[10,8616,214],{},[14,8618,217],{"id":217},[10,8620,8621],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,8623,224],{},{"title":80,"searchDepth":93,"depth":93,"links":8625},[8626,8627,8628,8629,8630,8633,8634,8635],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":8631},[8632],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8407,"description":8412},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[235,8643,5337],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8646,"title":8647,"body":8648,"category":235,"cover":236,"description":8652,"extension":237,"meta":8839,"navigation":96,"path":8840,"pinned":240,"publishedAt":241,"seo":8841,"slug":8842,"stem":8843,"summary":8844,"tags":8845,"updatedAt":241,"visible":96,"__hash__":8848},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8649,"toc":8827},[8650,8653,8655,8658,8660,8666,8669,8671,8682,8684,8686,8761,8763,8769,8771,8773,8784,8786,8789,8795,8798,8800,8808,8810,8818,8820,8822,8825],[10,8651,8652],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8654,16],{"id":16},[10,8656,8657],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8659,22],{"id":22},[10,8661,8662],{},[26,8663],{"alt":8664,"src":8665},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8667,8668],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8670,35],{"id":35},[37,8672,8673,8676,8679],{},[40,8674,8675],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8677,8678],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8680,8681],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8683,70],{"id":70},[10,8685,73],{},[75,8687,8689],{"className":77,"code":8688,"language":79,"meta":80,"style":80},"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",[43,8690,8691,8696,8701,8705,8710,8714,8719,8724,8729,8733,8738,8743,8748,8752,8756],{"__ignoreMap":80},[84,8692,8693],{"class":86,"line":87},[84,8694,8695],{},"import logging\n",[84,8697,8698],{"class":86,"line":93},[84,8699,8700],{},"import unittest\n",[84,8702,8703],{"class":86,"line":100},[84,8704,97],{"emptyLinePlaceholder":96},[84,8706,8707],{"class":86,"line":106},[84,8708,8709],{},"logging.basicConfig(level=logging.INFO)\n",[84,8711,8712],{"class":86,"line":112},[84,8713,97],{"emptyLinePlaceholder":96},[84,8715,8716],{"class":86,"line":118},[84,8717,8718],{},"def clamp_progress(value):\n",[84,8720,8721],{"class":86,"line":124},[84,8722,8723],{},"    logging.info(\"检查进度：%s\", value)\n",[84,8725,8726],{"class":86,"line":129},[84,8727,8728],{},"    return max(0, min(100, value))\n",[84,8730,8731],{"class":86,"line":135},[84,8732,97],{"emptyLinePlaceholder":96},[84,8734,8735],{"class":86,"line":141},[84,8736,8737],{},"class ProgressTest(unittest.TestCase):\n",[84,8739,8740],{"class":86,"line":147},[84,8741,8742],{},"    def test_upper_limit(self):\n",[84,8744,8745],{"class":86,"line":5839},[84,8746,8747],{},"        self.assertEqual(clamp_progress(120), 100)\n",[84,8749,8750],{"class":86,"line":7399},[84,8751,97],{"emptyLinePlaceholder":96},[84,8753,8754],{"class":86,"line":7405},[84,8755,6201],{},[84,8757,8758],{"class":86,"line":8528},[84,8759,8760],{},"    unittest.main()\n",[10,8762,153],{},[75,8764,8767],{"className":8765,"code":8766,"language":159,"meta":80},[157],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[43,8768,8766],{"__ignoreMap":80},[10,8770,164],{},[14,8772,167],{"id":167},[169,8774,8775,8781],{},[40,8776,8777,8780],{},[43,8778,8779],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8782,8783],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[338,8785,2704],{"id":2704},[10,8787,8788],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8790,8791],{},[26,8792],{"alt":8793,"src":8794},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8796,8797],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8799,182],{"id":182},[37,8801,8802,8805],{},[40,8803,8804],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8806,8807],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8809,199],{"id":199},[169,8811,8812,8815],{},[40,8813,8814],{},"为负数进度增加测试。",[40,8816,8817],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8819,214],{},[14,8821,217],{"id":217},[10,8823,8824],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,8826,224],{},{"title":80,"searchDepth":93,"depth":93,"links":8828},[8829,8830,8831,8832,8833,8836,8837,8838],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":8834},[8835],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8647,"description":8652},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[235,8846,8847],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8850,"title":8851,"body":8852,"category":235,"cover":236,"description":8856,"extension":237,"meta":9156,"navigation":96,"path":9157,"pinned":240,"publishedAt":241,"seo":9158,"slug":9159,"stem":9160,"summary":9161,"tags":9162,"updatedAt":241,"visible":96,"__hash__":9165},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8853,"toc":9143},[8854,8857,8859,8862,8864,8870,8873,8875,8890,8892,8894,9041,9043,9049,9051,9053,9066,9068,9071,9077,9080,9082,9085,9091,9098,9100,9111,9113,9134,9136,9138,9141],[10,8855,8856],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8858,16],{"id":16},[10,8860,8861],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8863,22],{"id":22},[10,8865,8866],{},[26,8867],{"alt":8868,"src":8869},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8871,8872],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8874,35],{"id":35},[37,8876,8877,8880,8883],{},[40,8878,8879],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8881,8882],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8884,8885,8886,8889],{},"实际扩展前先为 ",[43,8887,8888],{},"add()"," 和存储边界补充测试。",[14,8891,70],{"id":70},[10,8893,73],{},[75,8895,8897],{"className":77,"code":8896,"language":79,"meta":80,"style":80},"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",[43,8898,8899,8903,8907,8911,8916,8921,8926,8931,8935,8940,8945,8950,8955,8960,8964,8969,8974,8980,8985,8991,8996,9001,9007,9013,9019,9024,9030,9035],{"__ignoreMap":80},[84,8900,8901],{"class":86,"line":87},[84,8902,6954],{},[84,8904,8905],{"class":86,"line":93},[84,8906,90],{},[84,8908,8909],{"class":86,"line":100},[84,8910,97],{"emptyLinePlaceholder":96},[84,8912,8913],{"class":86,"line":106},[84,8914,8915],{},"class LearningRecords:\n",[84,8917,8918],{"class":86,"line":112},[84,8919,8920],{},"    def __init__(self, file_path):\n",[84,8922,8923],{"class":86,"line":118},[84,8924,8925],{},"        self.file_path = Path(file_path)\n",[84,8927,8928],{"class":86,"line":124},[84,8929,8930],{},"        self.items = []\n",[84,8932,8933],{"class":86,"line":129},[84,8934,97],{"emptyLinePlaceholder":96},[84,8936,8937],{"class":86,"line":135},[84,8938,8939],{},"    def add(self, title):\n",[84,8941,8942],{"class":86,"line":141},[84,8943,8944],{},"        title = title.strip()\n",[84,8946,8947],{"class":86,"line":147},[84,8948,8949],{},"        if not title:\n",[84,8951,8952],{"class":86,"line":5839},[84,8953,8954],{},"            raise ValueError(\"课程名称不能为空\")\n",[84,8956,8957],{"class":86,"line":7399},[84,8958,8959],{},"        self.items.append({\"title\": title, \"done\": False})\n",[84,8961,8962],{"class":86,"line":7405},[84,8963,97],{"emptyLinePlaceholder":96},[84,8965,8966],{"class":86,"line":8528},[84,8967,8968],{},"    def save(self):\n",[84,8970,8971],{"class":86,"line":8533},[84,8972,8973],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[84,8975,8977],{"class":86,"line":8976},17,[84,8978,8979],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[84,8981,8983],{"class":86,"line":8982},18,[84,8984,97],{"emptyLinePlaceholder":96},[84,8986,8988],{"class":86,"line":8987},19,[84,8989,8990],{},"records = LearningRecords(\"learning-records.json\")\n",[84,8992,8994],{"class":86,"line":8993},20,[84,8995,97],{"emptyLinePlaceholder":96},[84,8997,8999],{"class":86,"line":8998},21,[84,9000,7372],{},[84,9002,9004],{"class":86,"line":9003},22,[84,9005,9006],{},"    title = input(\"输入已学习课程：\")\n",[84,9008,9010],{"class":86,"line":9009},23,[84,9011,9012],{},"    records.add(title)\n",[84,9014,9016],{"class":86,"line":9015},24,[84,9017,9018],{},"    records.save()\n",[84,9020,9022],{"class":86,"line":9021},25,[84,9023,7382],{},[84,9025,9027],{"class":86,"line":9026},26,[84,9028,9029],{},"    print(\"无法保存：\", error)\n",[84,9031,9033],{"class":86,"line":9032},27,[84,9034,1154],{},[84,9036,9038],{"class":86,"line":9037},28,[84,9039,9040],{},"    print(\"已保存 1 条学习记录\")\n",[10,9042,153],{},[75,9044,9047],{"className":9045,"code":9046,"language":159,"meta":80},[157],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[43,9048,9046],{"__ignoreMap":80},[10,9050,164],{},[14,9052,167],{"id":167},[169,9054,9055,9061],{},[40,9056,9057,9058,9060],{},"输入层取得课程名后，",[43,9059,8888],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9062,9063,9065],{},[43,9064,8120],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[338,9067,2704],{"id":2704},[10,9069,9070],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9072,9073],{},[26,9074],{"alt":9075,"src":9076},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9078,9079],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[338,9081,2704],{"id":4225},[10,9083,9084],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9086,9087],{},[26,9088],{"alt":9089,"src":9090},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9092,9093,9094,9097],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[43,9095,9096],{},"load()"," 把文件状态恢复到内存。",[14,9099,182],{"id":182},[37,9101,9102,9105],{},[40,9103,9104],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9106,9107,9108,9110],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[43,9109,9096],{}," 是下一项必要扩展。",[14,9112,199],{"id":199},[169,9114,9115,9121,9124],{},[40,9116,9117,9118,9120],{},"增加 ",[43,9119,9096],{},"，文件不存在时从空列表开始。",[40,9122,9123],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9125,9126,9127,9130,9131,9133],{},"把输入循环放进 ",[43,9128,9129],{},"main()","，通过 ",[43,9132,6143],{}," 控制程序入口。",[10,9135,214],{},[14,9137,217],{"id":217},[10,9139,9140],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[222,9142,224],{},{"title":80,"searchDepth":93,"depth":93,"links":9144},[9145,9146,9147,9148,9149,9153,9154,9155],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":9150},[9151,9152],{"id":2704,"depth":100,"text":2704},{"id":4225,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8851,"description":8856},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[235,9163,9164],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9167,9270,9389,9520,9663,9788,9925,10062,10203,10372,10509,10642,10765,10894,11021,11184,11360,11501,11630,11779,11922,12043,12166,12315,12468,12633,12760,12941,13084,13241,13392,13539,13694,13912,14067,14242,14393,14560,14747,14910,15152,15392],{"id":1401,"title":1402,"body":9168,"category":235,"cover":236,"description":1407,"extension":237,"meta":9267,"navigation":96,"path":1526,"pinned":240,"publishedAt":241,"seo":9268,"slug":1528,"stem":1529,"summary":1530,"tags":9269,"updatedAt":241,"visible":96,"__hash__":1533},{"type":7,"value":9169,"toc":9257},[9170,9172,9174,9176,9178,9182,9186,9188,9198,9200,9202,9210,9212,9217,9219,9221,9231,9233,9241,9243,9249,9251,9253,9255],[10,9171,1407],{},[14,9173,16],{"id":16},[10,9175,1412],{},[14,9177,22],{"id":22},[10,9179,9180],{},[26,9181],{"alt":1419,"src":1420},[10,9183,9184,1425],{},[43,9185,1179],{},[14,9187,35],{"id":35},[37,9189,9190,9194,9196],{},[40,9191,1432,9192,1435],{},[43,9193,1179],{},[40,9195,1438],{},[40,9197,1441],{},[14,9199,70],{"id":70},[10,9201,73],{},[75,9203,9204],{"className":77,"code":1448,"language":79,"meta":80,"style":80},[43,9205,9206],{"__ignoreMap":80},[84,9207,9208],{"class":86,"line":87},[84,9209,1448],{},[10,9211,153],{},[75,9213,9215],{"className":9214,"code":1460,"language":159,"meta":80},[157],[43,9216,1460],{"__ignoreMap":80},[10,9218,164],{},[14,9220,167],{"id":167},[169,9222,9223,9227],{},[40,9224,1471,9225,1475],{},[43,9226,1474],{},[40,9228,1478,9229,1482],{},[43,9230,1481],{},[14,9232,182],{"id":182},[37,9234,9235,9237],{},[40,9236,1489],{},[40,9238,1492,9239,1495],{},[43,9240,1179],{},[14,9242,199],{"id":199},[169,9244,9245,9247],{},[40,9246,1502],{},[40,9248,1505],{},[10,9250,214],{},[14,9252,217],{"id":217},[10,9254,1512],{},[222,9256,224],{},{"title":80,"searchDepth":93,"depth":93,"links":9258},[9259,9260,9261,9262,9263,9264,9265,9266],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":1402,"description":1407},[235,1397,1532],{"id":1535,"title":1536,"body":9271,"category":235,"cover":236,"description":1541,"extension":237,"meta":9386,"navigation":96,"path":1678,"pinned":240,"publishedAt":241,"seo":9387,"slug":1680,"stem":1681,"summary":1682,"tags":9388,"updatedAt":241,"visible":96,"__hash__":1685},{"type":7,"value":9272,"toc":9376},[9273,9275,9277,9279,9281,9285,9289,9291,9301,9303,9305,9325,9327,9332,9334,9336,9346,9348,9358,9360,9368,9370,9372,9374],[10,9274,1541],{},[14,9276,16],{"id":16},[10,9278,1546],{},[14,9280,22],{"id":22},[10,9282,9283],{},[26,9284],{"alt":1553,"src":1554},[10,9286,1557,9287,1560],{},[43,9288,699],{},[14,9290,35],{"id":35},[37,9292,9293,9295,9297],{},[40,9294,1567],{},[40,9296,1570],{},[40,9298,1573,9299,1577],{},[43,9300,1576],{},[14,9302,70],{"id":70},[10,9304,1582],{},[75,9306,9307],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,9308,9309,9315],{"__ignoreMap":80},[84,9310,9311,9313],{"class":86,"line":87},[84,9312,699],{"class":608},[84,9314,612],{"class":611},[84,9316,9317,9319,9321,9323],{"class":86,"line":93},[84,9318,699],{"class":608},[84,9320,641],{"class":611},[84,9322,645],{"class":644},[84,9324,612],{"class":611},[10,9326,153],{},[75,9328,9330],{"className":9329,"code":1608,"language":159,"meta":80},[157],[43,9331,1608],{"__ignoreMap":80},[10,9333,164],{},[14,9335,167],{"id":167},[169,9337,9338,9342],{},[40,9339,9340,1622],{},[43,9341,1621],{},[40,9343,9344,1627],{},[43,9345,707],{},[14,9347,182],{"id":182},[37,9349,9350,9354],{},[40,9351,1634,9352,1637],{},[43,9353,699],{},[40,9355,1640,9356,1643],{},[43,9357,699],{},[14,9359,199],{"id":199},[169,9361,9362,9366],{},[40,9363,946,9364,1653],{},[43,9365,1652],{},[40,9367,1656],{},[10,9369,214],{},[14,9371,217],{"id":217},[10,9373,1663],{},[222,9375,1666],{},{"title":80,"searchDepth":93,"depth":93,"links":9377},[9378,9379,9380,9381,9382,9383,9384,9385],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":1536,"description":1541},[235,1684,1060],{"id":1687,"title":1688,"body":9390,"category":235,"cover":236,"description":1854,"extension":237,"meta":9517,"navigation":96,"path":1856,"pinned":240,"publishedAt":241,"seo":9518,"slug":1858,"stem":1859,"summary":1860,"tags":9519,"updatedAt":241,"visible":96,"__hash__":1864},{"type":7,"value":9391,"toc":9507},[9392,9396,9398,9400,9402,9406,9408,9410,9426,9428,9430,9450,9452,9457,9459,9461,9473,9475,9485,9487,9497,9499,9501,9505],[10,9393,1693,9394,1696],{},[43,9395,1179],{},[14,9397,16],{"id":16},[10,9399,1701],{},[14,9401,22],{"id":22},[10,9403,9404],{},[26,9405],{"alt":1708,"src":1709},[10,9407,1712],{},[14,9409,35],{"id":35},[37,9411,9412,9418,9422],{},[40,9413,1719,9414,1722,9416,56],{},[43,9415,699],{},[43,9417,1725],{},[40,9419,1728,9420,1732],{},[43,9421,1731],{},[40,9423,1735,9424,1738],{},[43,9425,1179],{},[14,9427,70],{"id":70},[10,9429,73],{},[75,9431,9432],{"className":1745,"code":1746,"language":1747,"meta":80,"style":80},[43,9433,9434,9438,9442,9446],{"__ignoreMap":80},[84,9435,9436],{"class":86,"line":87},[84,9437,1754],{},[84,9439,9440],{"class":86,"line":93},[84,9441,1759],{},[84,9443,9444],{"class":86,"line":100},[84,9445,1764],{},[84,9447,9448],{"class":86,"line":106},[84,9449,1769],{},[10,9451,153],{},[75,9453,9455],{"className":9454,"code":1775,"language":159,"meta":80},[157],[43,9456,1775],{"__ignoreMap":80},[10,9458,164],{},[14,9460,167],{"id":167},[169,9462,9463,9469],{},[40,9464,1786,9465,1790,9467,56],{},[43,9466,1789],{},[43,9468,1793],{},[40,9470,1796,9471,1799],{},[43,9472,1481],{},[14,9474,182],{"id":182},[37,9476,9477,9483],{},[40,9478,1806,9479,1809,9481,1812],{},[43,9480,1725],{},[43,9482,1179],{},[40,9484,1815],{},[14,9486,199],{"id":199},[169,9488,9489,9493],{},[40,9490,1822,9491,56],{},[43,9492,1825],{},[40,9494,1828,9495,1831],{},[43,9496,1481],{},[10,9498,214],{},[14,9500,217],{"id":217},[10,9502,1838,9503,1841],{},[43,9504,1179],{},[222,9506,224],{},{"title":80,"searchDepth":93,"depth":93,"links":9508},[9509,9510,9511,9512,9513,9514,9515,9516],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":1688,"description":1854},[235,1862,1863],{"id":1866,"title":1867,"body":9521,"category":235,"cover":236,"description":1872,"extension":237,"meta":9660,"navigation":96,"path":2044,"pinned":240,"publishedAt":241,"seo":9661,"slug":2046,"stem":2047,"summary":2048,"tags":9662,"updatedAt":241,"visible":96,"__hash__":2052},{"type":7,"value":9522,"toc":9650},[9523,9525,9527,9529,9531,9535,9539,9541,9553,9555,9557,9593,9595,9600,9602,9604,9620,9622,9632,9634,9642,9644,9646,9648],[10,9524,1872],{},[14,9526,16],{"id":16},[10,9528,1877],{},[14,9530,22],{"id":22},[10,9532,9533],{},[26,9534],{"alt":1884,"src":1885},[10,9536,9537,1891],{},[43,9538,1890],{},[14,9540,35],{"id":35},[37,9542,9543,9545,9551],{},[40,9544,1898],{},[40,9546,9547,1904,9549,1908],{},[43,9548,1903],{},[43,9550,1907],{},[40,9552,1911],{},[14,9554,70],{"id":70},[10,9556,1582],{},[75,9558,9559],{"className":599,"code":1918,"language":601,"meta":80,"style":80},[43,9560,9561,9567,9573,9577,9587],{"__ignoreMap":80},[84,9562,9563,9565],{"class":86,"line":87},[84,9564,1925],{"class":608},[84,9566,1928],{"class":644},[84,9568,9569,9571],{"class":86,"line":93},[84,9570,1933],{"class":611},[84,9572,1928],{"class":644},[84,9574,9575],{"class":86,"line":100},[84,9576,1940],{"class":611},[84,9578,9579,9581,9583,9585],{"class":86,"line":106},[84,9580,1945],{"class":611},[84,9582,1948],{"class":644},[84,9584,1952],{"class":1951},[84,9586,1223],{"class":644},[84,9588,9589,9591],{"class":86,"line":112},[84,9590,699],{"class":608},[84,9592,1223],{"class":644},[10,9594,153],{},[75,9596,9598],{"className":9597,"code":1966,"language":159,"meta":80},[157],[43,9599,1966],{"__ignoreMap":80},[10,9601,164],{},[14,9603,167],{"id":167},[169,9605,9606,9614],{},[40,9607,9608,1979,9610,1982,9612,1985],{},[43,9609,1925],{},[43,9611,1933],{},[43,9613,1903],{},[40,9615,9616,1990,9618,1994],{},[43,9617,1890],{},[43,9619,1993],{},[14,9621,182],{"id":182},[37,9623,9624,9630],{},[40,9625,2001,9626,1165,9628,56],{},[43,9627,1903],{},[43,9629,1907],{},[40,9631,2008],{},[14,9633,199],{"id":199},[169,9635,9636,9640],{},[40,9637,2015,9638,2019],{},[43,9639,2018],{},[40,9641,2022],{},[10,9643,214],{},[14,9645,217],{"id":217},[10,9647,2029],{},[222,9649,2032],{},{"title":80,"searchDepth":93,"depth":93,"links":9651},[9652,9653,9654,9655,9656,9657,9658,9659],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":1867,"description":1872},[235,2050,2051],{"id":2054,"title":2055,"body":9664,"category":235,"cover":236,"description":2060,"extension":237,"meta":9785,"navigation":96,"path":2209,"pinned":240,"publishedAt":241,"seo":9786,"slug":2211,"stem":2212,"summary":2213,"tags":9787,"updatedAt":241,"visible":96,"__hash__":2217},{"type":7,"value":9665,"toc":9775},[9666,9668,9670,9672,9674,9678,9686,9688,9702,9704,9706,9722,9724,9729,9731,9733,9747,9749,9755,9757,9767,9769,9771,9773],[10,9667,2060],{},[14,9669,16],{"id":16},[10,9671,2065],{},[14,9673,22],{"id":22},[10,9675,9676],{},[26,9677],{"alt":2072,"src":2073},[10,9679,2076,9680,56,9682,2082,9684,56],{},[43,9681,1481],{},[43,9683,2081],{},[43,9685,1789],{},[14,9687,35],{"id":35},[37,9689,9690,9694,9700],{},[40,9691,9692,2094],{},[43,9693,2093],{},[40,9695,9696,2100,9698,56],{},[43,9697,2099],{},[43,9699,2103],{},[40,9701,2106],{},[14,9703,70],{"id":70},[10,9705,73],{},[75,9707,9708],{"className":77,"code":2113,"language":79,"meta":80,"style":80},[43,9709,9710,9714,9718],{"__ignoreMap":80},[84,9711,9712],{"class":86,"line":87},[84,9713,2120],{},[84,9715,9716],{"class":86,"line":93},[84,9717,2125],{},[84,9719,9720],{"class":86,"line":100},[84,9721,2130],{},[10,9723,153],{},[75,9725,9727],{"className":9726,"code":2136,"language":159,"meta":80},[157],[43,9728,2136],{"__ignoreMap":80},[10,9730,164],{},[14,9732,167],{"id":167},[169,9734,9735,9741],{},[40,9736,9737,2150,9739,56],{},[43,9738,2149],{},[43,9740,2103],{},[40,9742,9743,2157,9745,2161],{},[43,9744,1481],{},[43,9746,2160],{},[14,9748,182],{"id":182},[37,9750,9751,9753],{},[40,9752,2168],{},[40,9754,2171],{},[14,9756,199],{"id":199},[169,9758,9759,9761],{},[40,9760,2178],{},[40,9762,2181,9763,2184,9765,2188],{},[43,9764,2081],{},[43,9766,2187],{},[10,9768,214],{},[14,9770,217],{"id":217},[10,9772,2195],{},[222,9774,224],{},{"title":80,"searchDepth":93,"depth":93,"links":9776},[9777,9778,9779,9780,9781,9782,9783,9784],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":2055,"description":2060},[235,2215,2216],{"id":2219,"title":2220,"body":9789,"category":235,"cover":236,"description":2225,"extension":237,"meta":9922,"navigation":96,"path":2392,"pinned":240,"publishedAt":241,"seo":9923,"slug":2394,"stem":2395,"summary":2396,"tags":9924,"updatedAt":241,"visible":96,"__hash__":2400},{"type":7,"value":9790,"toc":9912},[9791,9793,9795,9797,9799,9803,9805,9807,9823,9825,9827,9851,9853,9858,9860,9862,9878,9880,9892,9894,9904,9906,9908,9910],[10,9792,2225],{},[14,9794,16],{"id":16},[10,9796,2230],{},[14,9798,22],{"id":22},[10,9800,9801],{},[26,9802],{"alt":2237,"src":2238},[10,9804,2241],{},[14,9806,35],{"id":35},[37,9808,9809,9811,9817],{},[40,9810,2248],{},[40,9812,2251,9813,2184,9815,2258],{},[43,9814,2254],{},[43,9816,2257],{},[40,9818,2261,9819,2265,9821,2269],{},[43,9820,2264],{},[43,9822,2268],{},[14,9824,70],{"id":70},[10,9826,73],{},[75,9828,9829],{"className":77,"code":2276,"language":79,"meta":80,"style":80},[43,9830,9831,9835,9839,9843,9847],{"__ignoreMap":80},[84,9832,9833],{"class":86,"line":87},[84,9834,2283],{},[84,9836,9837],{"class":86,"line":93},[84,9838,2288],{},[84,9840,9841],{"class":86,"line":100},[84,9842,97],{"emptyLinePlaceholder":96},[84,9844,9845],{"class":86,"line":106},[84,9846,2297],{},[84,9848,9849],{"class":86,"line":112},[84,9850,2288],{},[10,9852,153],{},[75,9854,9856],{"className":9855,"code":2307,"language":159,"meta":80},[157],[43,9857,2307],{"__ignoreMap":80},[10,9859,164],{},[14,9861,167],{"id":167},[169,9863,9864,9870],{},[40,9865,946,9866,2321,9868,2324],{},[43,9867,2320],{},[43,9869,2254],{},[40,9871,946,9872,2330,9874,2334,9876,56],{},[43,9873,2329],{},[43,9875,2333],{},[43,9877,2337],{},[14,9879,182],{"id":182},[37,9881,9882,9884],{},[40,9883,2344],{},[40,9885,187,9886,2265,9888,2265,9890,2354],{},[43,9887,2264],{},[43,9889,2268],{},[43,9891,2353],{},[14,9893,199],{"id":199},[169,9895,9896,9902],{},[40,9897,2361,9898,1165,9900,2368],{},[43,9899,2364],{},[43,9901,2367],{},[40,9903,2371],{},[10,9905,214],{},[14,9907,217],{"id":217},[10,9909,2378],{},[222,9911,224],{},{"title":80,"searchDepth":93,"depth":93,"links":9913},[9914,9915,9916,9917,9918,9919,9920,9921],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":2220,"description":2225},[235,2398,2399],{"id":2402,"title":2403,"body":9926,"category":235,"cover":236,"description":2408,"extension":237,"meta":10059,"navigation":96,"path":2573,"pinned":240,"publishedAt":241,"seo":10060,"slug":2575,"stem":2576,"summary":2577,"tags":10061,"updatedAt":241,"visible":96,"__hash__":2581},{"type":7,"value":9927,"toc":10049},[9928,9930,9932,9934,9936,9940,9942,9944,9962,9964,9966,10002,10004,10009,10011,10013,10023,10025,10033,10035,10041,10043,10045,10047],[10,9929,2408],{},[14,9931,16],{"id":16},[10,9933,2413],{},[14,9935,22],{"id":22},[10,9937,9938],{},[26,9939],{"alt":2420,"src":2421},[10,9941,2424],{},[14,9943,35],{"id":35},[37,9945,9946,9952,9960],{},[40,9947,9948,2434,9950,2438],{},[43,9949,2433],{},[43,9951,2437],{},[40,9953,9954,2444,9956,2448,9958,2452],{},[43,9955,2443],{},[43,9957,2447],{},[43,9959,2451],{},[40,9961,2455],{},[14,9963,70],{"id":70},[10,9965,73],{},[75,9967,9968],{"className":77,"code":2462,"language":79,"meta":80,"style":80},[43,9969,9970,9974,9978,9982,9986,9990,9994,9998],{"__ignoreMap":80},[84,9971,9972],{"class":86,"line":87},[84,9973,2469],{},[84,9975,9976],{"class":86,"line":93},[84,9977,2474],{},[84,9979,9980],{"class":86,"line":100},[84,9981,2479],{},[84,9983,9984],{"class":86,"line":106},[84,9985,97],{"emptyLinePlaceholder":96},[84,9987,9988],{"class":86,"line":112},[84,9989,2488],{},[84,9991,9992],{"class":86,"line":118},[84,9993,2493],{},[84,9995,9996],{"class":86,"line":124},[84,9997,2498],{},[84,9999,10000],{"class":86,"line":129},[84,10001,2503],{},[10,10003,153],{},[75,10005,10007],{"className":10006,"code":2509,"language":159,"meta":80},[157],[43,10008,2509],{"__ignoreMap":80},[10,10010,164],{},[14,10012,167],{"id":167},[169,10014,10015,10019],{},[40,10016,10017,2523],{},[43,10018,2522],{},[40,10020,10021,2529],{},[43,10022,2528],{},[14,10024,182],{"id":182},[37,10026,10027,10031],{},[40,10028,2536,10029,56],{},[43,10030,2539],{},[40,10032,2542],{},[14,10034,199],{"id":199},[169,10036,10037,10039],{},[40,10038,2549],{},[40,10040,2552],{},[10,10042,214],{},[14,10044,217],{"id":217},[10,10046,2559],{},[222,10048,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10050},[10051,10052,10053,10054,10055,10056,10057,10058],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":2403,"description":2408},[235,2579,2580],{"id":2583,"title":2584,"body":10063,"category":235,"cover":236,"description":2589,"extension":237,"meta":10200,"navigation":96,"path":2766,"pinned":240,"publishedAt":241,"seo":10201,"slug":2768,"stem":2769,"summary":2770,"tags":10202,"updatedAt":241,"visible":96,"__hash__":2774},{"type":7,"value":10064,"toc":10188},[10065,10067,10069,10071,10073,10077,10083,10085,10093,10095,10097,10121,10123,10128,10130,10132,10150,10152,10154,10158,10160,10162,10168,10170,10180,10182,10184,10186],[10,10066,2589],{},[14,10068,16],{"id":16},[10,10070,2594],{},[14,10072,22],{"id":22},[10,10074,10075],{},[26,10076],{"alt":2601,"src":2602},[10,10078,2605,10079,2609,10081,56],{},[43,10080,2608],{},[43,10082,2612],{},[14,10084,35],{"id":35},[37,10086,10087,10089,10091],{},[40,10088,2619],{},[40,10090,2622],{},[40,10092,2625],{},[14,10094,70],{"id":70},[10,10096,73],{},[75,10098,10099],{"className":77,"code":2632,"language":79,"meta":80,"style":80},[43,10100,10101,10105,10109,10113,10117],{"__ignoreMap":80},[84,10102,10103],{"class":86,"line":87},[84,10104,2639],{},[84,10106,10107],{"class":86,"line":93},[84,10108,2644],{},[84,10110,10111],{"class":86,"line":100},[84,10112,2649],{},[84,10114,10115],{"class":86,"line":106},[84,10116,2654],{},[84,10118,10119],{"class":86,"line":112},[84,10120,2659],{},[10,10122,153],{},[75,10124,10126],{"className":10125,"code":2665,"language":159,"meta":80},[157],[43,10127,2665],{"__ignoreMap":80},[10,10129,164],{},[14,10131,167],{"id":167},[169,10133,10134,10142],{},[40,10135,2676,10136,2679,10138,2683,10140,2687],{},[43,10137,235],{},[43,10139,2682],{},[43,10141,2686],{},[40,10143,10144,2693,10146,2697,10148,2701],{},[43,10145,2692],{},[43,10147,2696],{},[43,10149,2700],{},[338,10151,2704],{"id":2704},[10,10153,2707],{},[10,10155,10156],{},[26,10157],{"alt":2712,"src":2713},[10,10159,2716],{},[14,10161,182],{"id":182},[37,10163,10164,10166],{},[40,10165,2723],{},[40,10167,2726],{},[14,10169,199],{"id":199},[169,10171,10172,10178],{},[40,10173,2733,10174,2737,10176,56],{},[43,10175,2736],{},[43,10177,2740],{},[40,10179,2743],{},[10,10181,214],{},[14,10183,217],{"id":217},[10,10185,2750],{},[222,10187,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10189},[10190,10191,10192,10193,10194,10197,10198,10199],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":10195},[10196],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":2584,"description":2589},[235,2772,2773],{"id":2776,"title":2777,"body":10204,"category":235,"cover":236,"description":2782,"extension":237,"meta":10369,"navigation":96,"path":2997,"pinned":240,"publishedAt":241,"seo":10370,"slug":2999,"stem":3000,"summary":3001,"tags":10371,"updatedAt":241,"visible":96,"__hash__":3005},{"type":7,"value":10205,"toc":10357},[10206,10208,10210,10212,10214,10218,10224,10226,10246,10248,10250,10286,10288,10293,10295,10297,10311,10313,10315,10319,10325,10327,10337,10339,10349,10351,10353,10355],[10,10207,2782],{},[14,10209,16],{"id":16},[10,10211,2787],{},[14,10213,22],{"id":22},[10,10215,10216],{},[26,10217],{"alt":2794,"src":2795},[10,10219,2798,10220,1017,10222,2805],{},[43,10221,2801],{},[43,10223,2804],{},[14,10225,35],{"id":35},[37,10227,10228,10236,10244],{},[40,10229,10230,2815,10232,2819,10234,2823],{},[43,10231,2814],{},[43,10233,2818],{},[43,10235,2822],{},[40,10237,10238,2829,10240,2833,10242,2837],{},[43,10239,2828],{},[43,10241,2832],{},[43,10243,2836],{},[40,10245,2840],{},[14,10247,70],{"id":70},[10,10249,73],{},[75,10251,10252],{"className":77,"code":2847,"language":79,"meta":80,"style":80},[43,10253,10254,10258,10262,10266,10270,10274,10278,10282],{"__ignoreMap":80},[84,10255,10256],{"class":86,"line":87},[84,10257,2854],{},[84,10259,10260],{"class":86,"line":93},[84,10261,2859],{},[84,10263,10264],{"class":86,"line":100},[84,10265,97],{"emptyLinePlaceholder":96},[84,10267,10268],{"class":86,"line":106},[84,10269,2868],{},[84,10271,10272],{"class":86,"line":112},[84,10273,2873],{},[84,10275,10276],{"class":86,"line":118},[84,10277,2878],{},[84,10279,10280],{"class":86,"line":124},[84,10281,2883],{},[84,10283,10284],{"class":86,"line":129},[84,10285,2888],{},[10,10287,153],{},[75,10289,10291],{"className":10290,"code":2894,"language":159,"meta":80},[157],[43,10292,2894],{"__ignoreMap":80},[10,10294,164],{},[14,10296,167],{"id":167},[169,10298,10299,10305],{},[40,10300,10301,2908,10303,2912],{},[43,10302,2907],{},[43,10304,2911],{},[40,10306,10307,2918,10309,2921],{},[43,10308,2917],{},[43,10310,2836],{},[338,10312,2704],{"id":2704},[10,10314,2926],{},[10,10316,10317],{},[26,10318],{"alt":2931,"src":2932},[10,10320,10321,2937,10323,2940],{},[43,10322,2828],{},[43,10324,2832],{},[14,10326,182],{"id":182},[37,10328,10329,10335],{},[40,10330,2947,10331,2950,10333,2953],{},[43,10332,2822],{},[43,10334,2814],{},[40,10336,2956],{},[14,10338,199],{"id":199},[169,10340,10341,10345],{},[40,10342,2963,10343,2967],{},[43,10344,2966],{},[40,10346,2970,10347,2974],{},[43,10348,2973],{},[10,10350,214],{},[14,10352,217],{"id":217},[10,10354,2981],{},[222,10356,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10358},[10359,10360,10361,10362,10363,10366,10367,10368],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":10364},[10365],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":2777,"description":2782},[235,3003,3004],{"id":3007,"title":3008,"body":10373,"category":235,"cover":236,"description":3013,"extension":237,"meta":10506,"navigation":96,"path":3182,"pinned":240,"publishedAt":241,"seo":10507,"slug":3184,"stem":3185,"summary":3186,"tags":10508,"updatedAt":241,"visible":96,"__hash__":3189},{"type":7,"value":10374,"toc":10496},[10375,10377,10379,10381,10383,10387,10397,10399,10409,10411,10413,10441,10443,10448,10450,10452,10466,10468,10476,10478,10488,10490,10492,10494],[10,10376,3013],{},[14,10378,16],{"id":16},[10,10380,3018],{},[14,10382,22],{"id":22},[10,10384,10385],{},[26,10386],{"alt":3025,"src":3026},[10,10388,10389,3032,10391,3036,10393,3040,10395,3044],{},[43,10390,3031],{},[43,10392,3035],{},[43,10394,3039],{},[43,10396,3043],{},[14,10398,35],{"id":35},[37,10400,10401,10403,10407],{},[40,10402,3051],{},[40,10404,10405,3056],{},[43,10406,3043],{},[40,10408,3059],{},[14,10410,70],{"id":70},[10,10412,73],{},[75,10414,10415],{"className":77,"code":3066,"language":79,"meta":80,"style":80},[43,10416,10417,10421,10425,10429,10433,10437],{"__ignoreMap":80},[84,10418,10419],{"class":86,"line":87},[84,10420,3073],{},[84,10422,10423],{"class":86,"line":93},[84,10424,3078],{},[84,10426,10427],{"class":86,"line":100},[84,10428,3083],{},[84,10430,10431],{"class":86,"line":106},[84,10432,97],{"emptyLinePlaceholder":96},[84,10434,10435],{"class":86,"line":112},[84,10436,3092],{},[84,10438,10439],{"class":86,"line":118},[84,10440,3097],{},[10,10442,153],{},[75,10444,10446],{"className":10445,"code":3103,"language":159,"meta":80},[157],[43,10447,3103],{"__ignoreMap":80},[10,10449,164],{},[14,10451,167],{"id":167},[169,10453,10454,10460],{},[40,10455,3114,10456,3117,10458,3121],{},[43,10457,3031],{},[43,10459,3120],{},[40,10461,10462,3127,10464,3131],{},[43,10463,3126],{},[43,10465,3130],{},[14,10467,182],{"id":182},[37,10469,10470,10474],{},[40,10471,3138,10472,3142],{},[43,10473,3141],{},[40,10475,3145],{},[14,10477,199],{"id":199},[169,10479,10480,10482],{},[40,10481,3152],{},[40,10483,1728,10484,3158,10486,3161],{},[43,10485,3157],{},[43,10487,3043],{},[10,10489,214],{},[14,10491,217],{"id":217},[10,10493,3168],{},[222,10495,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10497},[10498,10499,10500,10501,10502,10503,10504,10505],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":3008,"description":3013},[235,2353,3188],{"id":3191,"title":3192,"body":10510,"category":235,"cover":236,"description":3197,"extension":237,"meta":10639,"navigation":96,"path":3358,"pinned":240,"publishedAt":241,"seo":10640,"slug":3360,"stem":3361,"summary":3362,"tags":10641,"updatedAt":241,"visible":96,"__hash__":3366},{"type":7,"value":10511,"toc":10629},[10512,10514,10516,10518,10520,10524,10528,10530,10540,10542,10544,10576,10578,10583,10585,10587,10599,10601,10611,10613,10621,10623,10625,10627],[10,10513,3197],{},[14,10515,16],{"id":16},[10,10517,3202],{},[14,10519,22],{"id":22},[10,10521,10522],{},[26,10523],{"alt":3209,"src":3210},[10,10525,3213,10526,3217],{},[43,10527,3216],{},[14,10529,35],{"id":35},[37,10531,10532,10534,10536],{},[40,10533,3224],{},[40,10535,3227],{},[40,10537,3230,10538,56],{},[43,10539,3233],{},[14,10541,70],{"id":70},[10,10543,73],{},[75,10545,10546],{"className":77,"code":3240,"language":79,"meta":80,"style":80},[43,10547,10548,10552,10556,10560,10564,10568,10572],{"__ignoreMap":80},[84,10549,10550],{"class":86,"line":87},[84,10551,3247],{},[84,10553,10554],{"class":86,"line":93},[84,10555,3252],{},[84,10557,10558],{"class":86,"line":100},[84,10559,97],{"emptyLinePlaceholder":96},[84,10561,10562],{"class":86,"line":106},[84,10563,3261],{},[84,10565,10566],{"class":86,"line":112},[84,10567,3266],{},[84,10569,10570],{"class":86,"line":118},[84,10571,3271],{},[84,10573,10574],{"class":86,"line":124},[84,10575,3276],{},[10,10577,153],{},[75,10579,10581],{"className":10580,"code":3282,"language":159,"meta":80},[157],[43,10582,3282],{"__ignoreMap":80},[10,10584,164],{},[14,10586,167],{"id":167},[169,10588,10589,10591],{},[40,10590,3293],{},[40,10592,10593,3299,10595,3303,10597,3307],{},[43,10594,3298],{},[43,10596,3302],{},[43,10598,3306],{},[14,10600,182],{"id":182},[37,10602,10603,10609],{},[40,10604,3314,10605,3318,10607,56],{},[43,10606,3317],{},[43,10608,3321],{},[40,10610,3324],{},[14,10612,199],{"id":199},[169,10614,10615,10617],{},[40,10616,3331],{},[40,10618,3334,10619,3337],{},[43,10620,3306],{},[10,10622,214],{},[14,10624,217],{"id":217},[10,10626,3344],{},[222,10628,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10630},[10631,10632,10633,10634,10635,10636,10637,10638],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":3192,"description":3197},[235,3364,3365],{"id":3368,"title":3369,"body":10643,"category":235,"cover":236,"description":3374,"extension":237,"meta":10762,"navigation":96,"path":3516,"pinned":240,"publishedAt":241,"seo":10763,"slug":3518,"stem":3519,"summary":3520,"tags":10764,"updatedAt":241,"visible":96,"__hash__":3523},{"type":7,"value":10644,"toc":10752},[10645,10647,10649,10651,10653,10657,10659,10661,10669,10671,10673,10701,10703,10708,10710,10712,10722,10724,10732,10734,10744,10746,10748,10750],[10,10646,3374],{},[14,10648,16],{"id":16},[10,10650,3379],{},[14,10652,22],{"id":22},[10,10654,10655],{},[26,10656],{"alt":3386,"src":3387},[10,10658,3390],{},[14,10660,35],{"id":35},[37,10662,10663,10665,10667],{},[40,10664,3397],{},[40,10666,3400],{},[40,10668,3403],{},[14,10670,70],{"id":70},[10,10672,73],{},[75,10674,10675],{"className":77,"code":3410,"language":79,"meta":80,"style":80},[43,10676,10677,10681,10685,10689,10693,10697],{"__ignoreMap":80},[84,10678,10679],{"class":86,"line":87},[84,10680,3417],{},[84,10682,10683],{"class":86,"line":93},[84,10684,3422],{},[84,10686,10687],{"class":86,"line":100},[84,10688,3427],{},[84,10690,10691],{"class":86,"line":106},[84,10692,97],{"emptyLinePlaceholder":96},[84,10694,10695],{"class":86,"line":112},[84,10696,3436],{},[84,10698,10699],{"class":86,"line":118},[84,10700,3441],{},[10,10702,153],{},[75,10704,10706],{"className":10705,"code":3447,"language":159,"meta":80},[157],[43,10707,3447],{"__ignoreMap":80},[10,10709,164],{},[14,10711,167],{"id":167},[169,10713,10714,10718],{},[40,10715,10716,3461],{},[43,10717,3460],{},[40,10719,10720,3467],{},[43,10721,3466],{},[14,10723,182],{"id":182},[37,10725,10726,10730],{},[40,10727,3474,10728,3478],{},[43,10729,3477],{},[40,10731,3481],{},[14,10733,199],{"id":199},[169,10735,10736,10738],{},[40,10737,3488],{},[40,10739,2181,10740,2184,10742,3495],{},[43,10741,3477],{},[43,10743,3466],{},[10,10745,214],{},[14,10747,217],{"id":217},[10,10749,3502],{},[222,10751,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10753},[10754,10755,10756,10757,10758,10759,10760,10761],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":3369,"description":3374},[235,3522,3365],{"id":3525,"title":3526,"body":10766,"category":235,"cover":236,"description":3531,"extension":237,"meta":10891,"navigation":96,"path":3687,"pinned":240,"publishedAt":241,"seo":10892,"slug":3689,"stem":3690,"summary":3691,"tags":10893,"updatedAt":241,"visible":96,"__hash__":3694},{"type":7,"value":10767,"toc":10881},[10768,10770,10772,10774,10776,10780,10786,10788,10798,10800,10802,10830,10832,10837,10839,10841,10851,10853,10865,10867,10873,10875,10877,10879],[10,10769,3531],{},[14,10771,16],{"id":16},[10,10773,3536],{},[14,10775,22],{"id":22},[10,10777,10778],{},[26,10779],{"alt":3543,"src":3544},[10,10781,3547,10782,3551,10784,3554],{},[43,10783,3550],{},[43,10785,2254],{},[14,10787,35],{"id":35},[37,10789,10790,10792,10796],{},[40,10791,3561],{},[40,10793,187,10794,3567],{},[43,10795,3566],{},[40,10797,3570],{},[14,10799,70],{"id":70},[10,10801,73],{},[75,10803,10804],{"className":77,"code":3577,"language":79,"meta":80,"style":80},[43,10805,10806,10810,10814,10818,10822,10826],{"__ignoreMap":80},[84,10807,10808],{"class":86,"line":87},[84,10809,3584],{},[84,10811,10812],{"class":86,"line":93},[84,10813,3589],{},[84,10815,10816],{"class":86,"line":100},[84,10817,97],{"emptyLinePlaceholder":96},[84,10819,10820],{"class":86,"line":106},[84,10821,3598],{},[84,10823,10824],{"class":86,"line":112},[84,10825,3603],{},[84,10827,10828],{"class":86,"line":118},[84,10829,3608],{},[10,10831,153],{},[75,10833,10835],{"className":10834,"code":3614,"language":159,"meta":80},[157],[43,10836,3614],{"__ignoreMap":80},[10,10838,164],{},[14,10840,167],{"id":167},[169,10842,10843,10845],{},[40,10844,3625],{},[40,10846,3628,10847,3631,10849,3635],{},[43,10848,2254],{},[43,10850,3634],{},[14,10852,182],{"id":182},[37,10854,10855,10859],{},[40,10856,3642,10857,3646],{},[43,10858,3645],{},[40,10860,3649,10861,3653,10863,56],{},[43,10862,3652],{},[43,10864,3656],{},[14,10866,199],{"id":199},[169,10868,10869,10871],{},[40,10870,3663],{},[40,10872,3666],{},[10,10874,214],{},[14,10876,217],{"id":217},[10,10878,3673],{},[222,10880,224],{},{"title":80,"searchDepth":93,"depth":93,"links":10882},[10883,10884,10885,10886,10887,10888,10889,10890],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":3526,"description":3531},[235,3693,3365],{"id":3696,"title":3697,"body":10895,"category":235,"cover":236,"description":3702,"extension":237,"meta":11018,"navigation":96,"path":3852,"pinned":240,"publishedAt":241,"seo":11019,"slug":3854,"stem":3855,"summary":3856,"tags":11020,"updatedAt":241,"visible":96,"__hash__":3859},{"type":7,"value":10896,"toc":11008},[10897,10899,10901,10903,10905,10909,10911,10913,10925,10927,10929,10957,10959,10964,10966,10968,10978,10980,10990,10992,11000,11002,11004,11006],[10,10898,3702],{},[14,10900,16],{"id":16},[10,10902,3707],{},[14,10904,22],{"id":22},[10,10906,10907],{},[26,10908],{"alt":3714,"src":3715},[10,10910,3718],{},[14,10912,35],{"id":35},[37,10914,10915,10917,10919],{},[40,10916,3725],{},[40,10918,3728],{},[40,10920,3731,10921,3735,10923,3739],{},[43,10922,3734],{},[43,10924,3738],{},[14,10926,70],{"id":70},[10,10928,73],{},[75,10930,10931],{"className":77,"code":3746,"language":79,"meta":80,"style":80},[43,10932,10933,10937,10941,10945,10949,10953],{"__ignoreMap":80},[84,10934,10935],{"class":86,"line":87},[84,10936,3753],{},[84,10938,10939],{"class":86,"line":93},[84,10940,3758],{},[84,10942,10943],{"class":86,"line":100},[84,10944,97],{"emptyLinePlaceholder":96},[84,10946,10947],{"class":86,"line":106},[84,10948,3767],{},[84,10950,10951],{"class":86,"line":112},[84,10952,3772],{},[84,10954,10955],{"class":86,"line":118},[84,10956,3777],{},[10,10958,153],{},[75,10960,10962],{"className":10961,"code":3783,"language":159,"meta":80},[157],[43,10963,3783],{"__ignoreMap":80},[10,10965,164],{},[14,10967,167],{"id":167},[169,10969,10970,10972],{},[40,10971,3794],{},[40,10973,10974,3800,10976,3804],{},[43,10975,3799],{},[43,10977,3803],{},[14,10979,182],{"id":182},[37,10981,10982,10988],{},[40,10983,187,10984,3813,10986,56],{},[43,10985,3738],{},[43,10987,3734],{},[40,10989,3818],{},[14,10991,199],{"id":199},[169,10993,10994,10998],{},[40,10995,3825,10996,3828],{},[43,10997,3734],{},[40,10999,3831],{},[10,11001,214],{},[14,11003,217],{"id":217},[10,11005,3838],{},[222,11007,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11009},[11010,11011,11012,11013,11014,11015,11016,11017],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":3697,"description":3702},[235,3858,3365],{"id":3861,"title":3862,"body":11022,"category":235,"cover":236,"description":3867,"extension":237,"meta":11181,"navigation":96,"path":4065,"pinned":240,"publishedAt":241,"seo":11182,"slug":4067,"stem":4068,"summary":4069,"tags":11183,"updatedAt":241,"visible":96,"__hash__":4073},{"type":7,"value":11023,"toc":11169},[11024,11026,11028,11030,11032,11036,11042,11044,11056,11058,11060,11100,11102,11107,11109,11111,11125,11127,11129,11133,11135,11137,11147,11149,11161,11163,11165,11167],[10,11025,3867],{},[14,11027,16],{"id":16},[10,11029,3872],{},[14,11031,22],{"id":22},[10,11033,11034],{},[26,11035],{"alt":3879,"src":3880},[10,11037,11038,3886,11040,3890],{},[43,11039,3885],{},[43,11041,3889],{},[14,11043,35],{"id":35},[37,11045,11046,11052,11054],{},[40,11047,11048,3899,11050,3903],{},[43,11049,2814],{},[43,11051,3902],{},[40,11053,3906],{},[40,11055,3909],{},[14,11057,70],{"id":70},[10,11059,73],{},[75,11061,11062],{"className":77,"code":3916,"language":79,"meta":80,"style":80},[43,11063,11064,11068,11072,11076,11080,11084,11088,11092,11096],{"__ignoreMap":80},[84,11065,11066],{"class":86,"line":87},[84,11067,3923],{},[84,11069,11070],{"class":86,"line":93},[84,11071,3928],{},[84,11073,11074],{"class":86,"line":100},[84,11075,3933],{},[84,11077,11078],{"class":86,"line":106},[84,11079,97],{"emptyLinePlaceholder":96},[84,11081,11082],{"class":86,"line":112},[84,11083,3942],{},[84,11085,11086],{"class":86,"line":118},[84,11087,3947],{},[84,11089,11090],{"class":86,"line":124},[84,11091,3952],{},[84,11093,11094],{"class":86,"line":129},[84,11095,3957],{},[84,11097,11098],{"class":86,"line":135},[84,11099,3962],{},[10,11101,153],{},[75,11103,11105],{"className":11104,"code":3968,"language":159,"meta":80},[157],[43,11106,3968],{"__ignoreMap":80},[10,11108,164],{},[14,11110,167],{"id":167},[169,11112,11113,11117],{},[40,11114,11115,3982],{},[43,11116,3981],{},[40,11118,11119,3988,11121,3992,11123,3996],{},[43,11120,3987],{},[43,11122,3991],{},[43,11124,3995],{},[338,11126,2704],{"id":2704},[10,11128,4001],{},[10,11130,11131],{},[26,11132],{"alt":4006,"src":4007},[10,11134,4010],{},[14,11136,182],{"id":182},[37,11138,11139,11145],{},[40,11140,4017,11141,4020,11143,56],{},[43,11142,2814],{},[43,11144,3902],{},[40,11146,4025],{},[14,11148,199],{"id":199},[169,11150,11151,11153],{},[40,11152,4032],{},[40,11154,187,11155,4038,11157,1165,11159,56],{},[43,11156,4037],{},[43,11158,3902],{},[43,11160,2814],{},[10,11162,214],{},[14,11164,217],{"id":217},[10,11166,4049],{},[222,11168,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11170},[11171,11172,11173,11174,11175,11178,11179,11180],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":11176},[11177],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":3862,"description":3867},[235,4071,4072],{"id":4075,"title":4076,"body":11185,"category":235,"cover":236,"description":4081,"extension":237,"meta":11357,"navigation":96,"path":4294,"pinned":240,"publishedAt":241,"seo":11358,"slug":4296,"stem":4297,"summary":4298,"tags":11359,"updatedAt":241,"visible":96,"__hash__":4301},{"type":7,"value":11186,"toc":11344},[11187,11189,11191,11193,11195,11199,11207,11209,11217,11219,11221,11265,11267,11272,11274,11276,11288,11290,11292,11296,11302,11304,11306,11310,11314,11316,11328,11330,11336,11338,11340,11342],[10,11188,4081],{},[14,11190,16],{"id":16},[10,11192,4086],{},[14,11194,22],{"id":22},[10,11196,11197],{},[26,11198],{"alt":4093,"src":4094},[10,11200,11201,2265,11203,2265,11205,4104],{},[43,11202,1164],{},[43,11204,4101],{},[43,11206,1168],{},[14,11208,35],{"id":35},[37,11210,11211,11213,11215],{},[40,11212,4111],{},[40,11214,4114],{},[40,11216,4117],{},[14,11218,70],{"id":70},[10,11220,73],{},[75,11222,11223],{"className":77,"code":4124,"language":79,"meta":80,"style":80},[43,11224,11225,11229,11233,11237,11241,11245,11249,11253,11257,11261],{"__ignoreMap":80},[84,11226,11227],{"class":86,"line":87},[84,11228,4131],{},[84,11230,11231],{"class":86,"line":93},[84,11232,97],{"emptyLinePlaceholder":96},[84,11234,11235],{"class":86,"line":100},[84,11236,4140],{},[84,11238,11239],{"class":86,"line":106},[84,11240,4145],{},[84,11242,11243],{"class":86,"line":112},[84,11244,4150],{},[84,11246,11247],{"class":86,"line":118},[84,11248,4155],{},[84,11250,11251],{"class":86,"line":124},[84,11252,1154],{},[84,11254,11255],{"class":86,"line":129},[84,11256,4164],{},[84,11258,11259],{"class":86,"line":135},[84,11260,97],{"emptyLinePlaceholder":96},[84,11262,11263],{"class":86,"line":141},[84,11264,4173],{},[10,11266,153],{},[75,11268,11270],{"className":11269,"code":4179,"language":159,"meta":80},[157],[43,11271,4179],{"__ignoreMap":80},[10,11273,164],{},[14,11275,167],{"id":167},[169,11277,11278,11282],{},[40,11279,4190,11280,4194],{},[43,11281,4193],{},[40,11283,11284,4200,11286,4203],{},[43,11285,4199],{},[43,11287,1168],{},[338,11289,2704],{"id":2704},[10,11291,4208],{},[10,11293,11294],{},[26,11295],{"alt":4213,"src":4214},[10,11297,11298,4219,11300,4222],{},[43,11299,4193],{},[43,11301,4199],{},[338,11303,2704],{"id":4225},[10,11305,4228],{},[10,11307,11308],{},[26,11309],{"alt":4233,"src":4234},[10,11311,4237,11312,4240],{},[43,11313,1164],{},[14,11315,182],{"id":182},[37,11317,11318,11322],{},[40,11319,4247,11320,4250],{},[43,11321,4199],{},[40,11323,4253,11324,4256,11326,4260],{},[43,11325,1164],{},[43,11327,4259],{},[14,11329,199],{"id":199},[169,11331,11332,11334],{},[40,11333,4267],{},[40,11335,4270],{},[10,11337,214],{},[14,11339,217],{"id":217},[10,11341,4277],{},[222,11343,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11345},[11346,11347,11348,11349,11350,11354,11355,11356],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":11351},[11352,11353],{"id":2704,"depth":100,"text":2704},{"id":4225,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":4076,"description":4081},[235,1164,4300],{"id":4303,"title":4304,"body":11361,"category":235,"cover":236,"description":4309,"extension":237,"meta":11498,"navigation":96,"path":4476,"pinned":240,"publishedAt":241,"seo":11499,"slug":4478,"stem":4479,"summary":4480,"tags":11500,"updatedAt":241,"visible":96,"__hash__":4483},{"type":7,"value":11362,"toc":11486},[11363,11365,11367,11369,11371,11375,11379,11381,11391,11393,11395,11427,11429,11434,11436,11438,11448,11450,11452,11456,11460,11462,11468,11470,11478,11480,11482,11484],[10,11364,4309],{},[14,11366,16],{"id":16},[10,11368,4314],{},[14,11370,22],{"id":22},[10,11372,11373],{},[26,11374],{"alt":4321,"src":4322},[10,11376,11377,4328],{},[43,11378,4327],{},[14,11380,35],{"id":35},[37,11382,11383,11385,11387],{},[40,11384,4335],{},[40,11386,4338],{},[40,11388,4341,11389,4345],{},[43,11390,4344],{},[14,11392,70],{"id":70},[10,11394,73],{},[75,11396,11397],{"className":77,"code":4352,"language":79,"meta":80,"style":80},[43,11398,11399,11403,11407,11411,11415,11419,11423],{"__ignoreMap":80},[84,11400,11401],{"class":86,"line":87},[84,11402,4359],{},[84,11404,11405],{"class":86,"line":93},[84,11406,97],{"emptyLinePlaceholder":96},[84,11408,11409],{"class":86,"line":100},[84,11410,4368],{},[84,11412,11413],{"class":86,"line":106},[84,11414,4373],{},[84,11416,11417],{"class":86,"line":112},[84,11418,4378],{},[84,11420,11421],{"class":86,"line":118},[84,11422,97],{"emptyLinePlaceholder":96},[84,11424,11425],{"class":86,"line":124},[84,11426,4387],{},[10,11428,153],{},[75,11430,11432],{"className":11431,"code":4393,"language":159,"meta":80},[157],[43,11433,4393],{"__ignoreMap":80},[10,11435,164],{},[14,11437,167],{"id":167},[169,11439,11440,11444],{},[40,11441,4404,11442,4408],{},[43,11443,4407],{},[40,11445,4411,11446,4414],{},[43,11447,4407],{},[338,11449,2704],{"id":2704},[10,11451,4419],{},[10,11453,11454],{},[26,11455],{"alt":4424,"src":4425},[10,11457,4428,11458,4431],{},[43,11459,4407],{},[14,11461,182],{"id":182},[37,11463,11464,11466],{},[40,11465,4438],{},[40,11467,4441],{},[14,11469,199],{"id":199},[169,11471,11472,11476],{},[40,11473,187,11474,4450],{},[43,11475,4327],{},[40,11477,4453],{},[10,11479,214],{},[14,11481,217],{"id":217},[10,11483,4460],{},[222,11485,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11487},[11488,11489,11490,11491,11492,11495,11496,11497],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":11493},[11494],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":4304,"description":4309},[235,4327,4482],{"id":4485,"title":4486,"body":11502,"category":235,"cover":236,"description":4491,"extension":237,"meta":11627,"navigation":96,"path":4640,"pinned":240,"publishedAt":241,"seo":11628,"slug":4642,"stem":4643,"summary":4644,"tags":11629,"updatedAt":241,"visible":96,"__hash__":4647},{"type":7,"value":11503,"toc":11617},[11504,11506,11508,11510,11512,11516,11520,11522,11532,11534,11536,11568,11570,11575,11577,11579,11591,11593,11599,11601,11609,11611,11613,11615],[10,11505,4491],{},[14,11507,16],{"id":16},[10,11509,4496],{},[14,11511,22],{"id":22},[10,11513,11514],{},[26,11515],{"alt":4503,"src":4504},[10,11517,11518,4509],{},[43,11519,4344],{},[14,11521,35],{"id":35},[37,11523,11524,11528,11530],{},[40,11525,11526,4519],{},[43,11527,4518],{},[40,11529,4522],{},[40,11531,4525],{},[14,11533,70],{"id":70},[10,11535,73],{},[75,11537,11538],{"className":77,"code":4532,"language":79,"meta":80,"style":80},[43,11539,11540,11544,11548,11552,11556,11560,11564],{"__ignoreMap":80},[84,11541,11542],{"class":86,"line":87},[84,11543,4539],{},[84,11545,11546],{"class":86,"line":93},[84,11547,97],{"emptyLinePlaceholder":96},[84,11549,11550],{"class":86,"line":100},[84,11551,4548],{},[84,11553,11554],{"class":86,"line":106},[84,11555,4553],{},[84,11557,11558],{"class":86,"line":112},[84,11559,97],{"emptyLinePlaceholder":96},[84,11561,11562],{"class":86,"line":118},[84,11563,4562],{},[84,11565,11566],{"class":86,"line":124},[84,11567,4567],{},[10,11569,153],{},[75,11571,11573],{"className":11572,"code":4573,"language":159,"meta":80},[157],[43,11574,4573],{"__ignoreMap":80},[10,11576,164],{},[14,11578,167],{"id":167},[169,11580,11581,11587],{},[40,11582,4584,11583,4587,11585,4591],{},[43,11584,4344],{},[43,11586,4590],{},[40,11588,11589,4596],{},[43,11590,4518],{},[14,11592,182],{"id":182},[37,11594,11595,11597],{},[40,11596,4603],{},[40,11598,4606],{},[14,11600,199],{"id":199},[169,11602,11603,11605],{},[40,11604,4613],{},[40,11606,187,11607,4619],{},[43,11608,4618],{},[10,11610,214],{},[14,11612,217],{"id":217},[10,11614,4626],{},[222,11616,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11618},[11619,11620,11621,11622,11623,11624,11625,11626],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":4486,"description":4491},[235,4344,4646],{"id":4649,"title":4650,"body":11631,"category":235,"cover":236,"description":4655,"extension":237,"meta":11776,"navigation":96,"path":4830,"pinned":240,"publishedAt":241,"seo":11777,"slug":4832,"stem":4833,"summary":4834,"tags":11778,"updatedAt":241,"visible":96,"__hash__":4836},{"type":7,"value":11632,"toc":11766},[11633,11635,11637,11639,11641,11645,11651,11653,11667,11669,11671,11715,11717,11722,11724,11726,11736,11738,11750,11752,11758,11760,11762,11764],[10,11634,4655],{},[14,11636,16],{"id":16},[10,11638,4660],{},[14,11640,22],{"id":22},[10,11642,11643],{},[26,11644],{"alt":4667,"src":4668},[10,11646,11647,4674,11649,4678],{},[43,11648,4673],{},[43,11650,4677],{},[14,11652,35],{"id":35},[37,11654,11655,11657,11663],{},[40,11656,4685],{},[40,11658,11659,4690,11661,4693],{},[43,11660,4673],{},[43,11662,4327],{},[40,11664,4696,11665,4699],{},[43,11666,4677],{},[14,11668,70],{"id":70},[10,11670,73],{},[75,11672,11673],{"className":77,"code":4706,"language":79,"meta":80,"style":80},[43,11674,11675,11679,11683,11687,11691,11695,11699,11703,11707,11711],{"__ignoreMap":80},[84,11676,11677],{"class":86,"line":87},[84,11678,4713],{},[84,11680,11681],{"class":86,"line":93},[84,11682,97],{"emptyLinePlaceholder":96},[84,11684,11685],{"class":86,"line":100},[84,11686,4722],{},[84,11688,11689],{"class":86,"line":106},[84,11690,4727],{},[84,11692,11693],{"class":86,"line":112},[84,11694,4732],{},[84,11696,11697],{"class":86,"line":118},[84,11698,4737],{},[84,11700,11701],{"class":86,"line":124},[84,11702,4742],{},[84,11704,11705],{"class":86,"line":129},[84,11706,4567],{},[84,11708,11709],{"class":86,"line":135},[84,11710,97],{"emptyLinePlaceholder":96},[84,11712,11713],{"class":86,"line":141},[84,11714,4755],{},[10,11716,153],{},[75,11718,11720],{"className":11719,"code":4761,"language":159,"meta":80},[157],[43,11721,4761],{"__ignoreMap":80},[10,11723,164],{},[14,11725,167],{"id":167},[169,11727,11728,11732],{},[40,11729,4772,11730,4775],{},[43,11731,4673],{},[40,11733,4778,11734,4781],{},[43,11735,4677],{},[14,11737,182],{"id":182},[37,11739,11740,11744],{},[40,11741,3474,11742,4790],{},[43,11743,4673],{},[40,11745,4793,11746,4796,11748,4799],{},[43,11747,4327],{},[43,11749,4673],{},[14,11751,199],{"id":199},[169,11753,11754,11756],{},[40,11755,4806],{},[40,11757,4809],{},[10,11759,214],{},[14,11761,217],{"id":217},[10,11763,4816],{},[222,11765,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11767},[11768,11769,11770,11771,11772,11773,11774,11775],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":4650,"description":4655},[235,4677,4673],{"id":4838,"title":4839,"body":11780,"category":235,"cover":236,"description":4844,"extension":237,"meta":11919,"navigation":96,"path":5016,"pinned":240,"publishedAt":241,"seo":11920,"slug":5018,"stem":5019,"summary":5020,"tags":11921,"updatedAt":241,"visible":96,"__hash__":5024},{"type":7,"value":11781,"toc":11907},[11782,11784,11786,11788,11790,11794,11796,11798,11814,11816,11818,11846,11848,11853,11855,11857,11869,11871,11873,11877,11879,11881,11891,11893,11899,11901,11903,11905],[10,11783,4844],{},[14,11785,16],{"id":16},[10,11787,4849],{},[14,11789,22],{"id":22},[10,11791,11792],{},[26,11793],{"alt":4856,"src":4857},[10,11795,4860],{},[14,11797,35],{"id":35},[37,11799,11800,11802,11804],{},[40,11801,4867],{},[40,11803,4870],{},[40,11805,4873,11806,2265,11808,4880,11810,2265,11812,56],{},[43,11807,4876],{},[43,11809,4879],{},[43,11811,4883],{},[43,11813,4886],{},[14,11815,70],{"id":70},[10,11817,73],{},[75,11819,11820],{"className":77,"code":4893,"language":79,"meta":80,"style":80},[43,11821,11822,11826,11830,11834,11838,11842],{"__ignoreMap":80},[84,11823,11824],{"class":86,"line":87},[84,11825,4900],{},[84,11827,11828],{"class":86,"line":93},[84,11829,97],{"emptyLinePlaceholder":96},[84,11831,11832],{"class":86,"line":100},[84,11833,4909],{},[84,11835,11836],{"class":86,"line":106},[84,11837,4914],{},[84,11839,11840],{"class":86,"line":112},[84,11841,4919],{},[84,11843,11844],{"class":86,"line":118},[84,11845,4924],{},[10,11847,153],{},[75,11849,11851],{"className":11850,"code":4930,"language":159,"meta":80},[157],[43,11852,4930],{"__ignoreMap":80},[10,11854,164],{},[14,11856,167],{"id":167},[169,11858,11859,11867],{},[40,11860,4941,11861,4944,11863,1165,11865,56],{},[43,11862,4876],{},[43,11864,4947],{},[43,11866,4950],{},[40,11868,4953],{},[338,11870,2704],{"id":2704},[10,11872,4958],{},[10,11874,11875],{},[26,11876],{"alt":4963,"src":4964},[10,11878,4967],{},[14,11880,182],{"id":182},[37,11882,11883,11889],{},[40,11884,4974,11885,1017,11887,4980],{},[43,11886,4977],{},[43,11888,4883],{},[40,11890,4983],{},[14,11892,199],{"id":199},[169,11894,11895,11897],{},[40,11896,4990],{},[40,11898,4993],{},[10,11900,214],{},[14,11902,217],{"id":217},[10,11904,5000],{},[222,11906,224],{},{"title":80,"searchDepth":93,"depth":93,"links":11908},[11909,11910,11911,11912,11913,11916,11917,11918],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":11914},[11915],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":4839,"description":4844},[235,5022,5023],{"id":5026,"title":5027,"body":11923,"category":235,"cover":236,"description":5032,"extension":237,"meta":12040,"navigation":96,"path":5171,"pinned":240,"publishedAt":241,"seo":12041,"slug":5173,"stem":5174,"summary":5175,"tags":12042,"updatedAt":241,"visible":96,"__hash__":5179},{"type":7,"value":11924,"toc":12030},[11925,11927,11929,11931,11933,11937,11939,11941,11949,11951,11953,11985,11987,11992,11994,11996,12004,12006,12014,12016,12022,12024,12026,12028],[10,11926,5032],{},[14,11928,16],{"id":16},[10,11930,5037],{},[14,11932,22],{"id":22},[10,11934,11935],{},[26,11936],{"alt":5044,"src":5045},[10,11938,5048],{},[14,11940,35],{"id":35},[37,11942,11943,11945,11947],{},[40,11944,5055],{},[40,11946,5058],{},[40,11948,5061],{},[14,11950,70],{"id":70},[10,11952,73],{},[75,11954,11955],{"className":77,"code":5068,"language":79,"meta":80,"style":80},[43,11956,11957,11961,11965,11969,11973,11977,11981],{"__ignoreMap":80},[84,11958,11959],{"class":86,"line":87},[84,11960,5075],{},[84,11962,11963],{"class":86,"line":93},[84,11964,97],{"emptyLinePlaceholder":96},[84,11966,11967],{"class":86,"line":100},[84,11968,5084],{},[84,11970,11971],{"class":86,"line":106},[84,11972,5089],{},[84,11974,11975],{"class":86,"line":112},[84,11976,97],{"emptyLinePlaceholder":96},[84,11978,11979],{"class":86,"line":118},[84,11980,5098],{},[84,11982,11983],{"class":86,"line":124},[84,11984,5103],{},[10,11986,153],{},[75,11988,11990],{"className":11989,"code":5109,"language":159,"meta":80},[157],[43,11991,5109],{"__ignoreMap":80},[10,11993,164],{},[14,11995,167],{"id":167},[169,11997,11998,12000],{},[40,11999,5120],{},[40,12001,5123,12002,5127],{},[43,12003,5126],{},[14,12005,182],{"id":182},[37,12007,12008,12012],{},[40,12009,5134,12010,5137],{},[43,12011,4344],{},[40,12013,5140],{},[14,12015,199],{"id":199},[169,12017,12018,12020],{},[40,12019,5147],{},[40,12021,5150],{},[10,12023,214],{},[14,12025,217],{"id":217},[10,12027,5157],{},[222,12029,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12031},[12032,12033,12034,12035,12036,12037,12038,12039],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5027,"description":5032},[235,5177,5178],{"id":5181,"title":5182,"body":12044,"category":235,"cover":236,"description":5187,"extension":237,"meta":12163,"navigation":96,"path":5331,"pinned":240,"publishedAt":241,"seo":12164,"slug":5333,"stem":5334,"summary":5335,"tags":12165,"updatedAt":241,"visible":96,"__hash__":5339},{"type":7,"value":12045,"toc":12153},[12046,12048,12050,12052,12054,12058,12060,12062,12070,12072,12074,12106,12108,12113,12115,12117,12127,12129,12135,12137,12145,12147,12149,12151],[10,12047,5187],{},[14,12049,16],{"id":16},[10,12051,5192],{},[14,12053,22],{"id":22},[10,12055,12056],{},[26,12057],{"alt":5199,"src":5200},[10,12059,5203],{},[14,12061,35],{"id":35},[37,12063,12064,12066,12068],{},[40,12065,5210],{},[40,12067,5213],{},[40,12069,5216],{},[14,12071,70],{"id":70},[10,12073,73],{},[75,12075,12076],{"className":77,"code":5223,"language":79,"meta":80,"style":80},[43,12077,12078,12082,12086,12090,12094,12098,12102],{"__ignoreMap":80},[84,12079,12080],{"class":86,"line":87},[84,12081,5230],{},[84,12083,12084],{"class":86,"line":93},[84,12085,5235],{},[84,12087,12088],{"class":86,"line":100},[84,12089,5240],{},[84,12091,12092],{"class":86,"line":106},[84,12093,97],{"emptyLinePlaceholder":96},[84,12095,12096],{"class":86,"line":112},[84,12097,5249],{},[84,12099,12100],{"class":86,"line":118},[84,12101,5254],{},[84,12103,12104],{"class":86,"line":124},[84,12105,5259],{},[10,12107,153],{},[75,12109,12111],{"className":12110,"code":5265,"language":159,"meta":80},[157],[43,12112,5265],{"__ignoreMap":80},[10,12114,164],{},[14,12116,167],{"id":167},[169,12118,12119,12123],{},[40,12120,946,12121,5279],{},[43,12122,5278],{},[40,12124,5282,12125,5286],{},[43,12126,5285],{},[14,12128,182],{"id":182},[37,12130,12131,12133],{},[40,12132,5293],{},[40,12134,5296],{},[14,12136,199],{"id":199},[169,12138,12139,12143],{},[40,12140,5303,12141,5307],{},[43,12142,5306],{},[40,12144,5310],{},[10,12146,214],{},[14,12148,217],{"id":217},[10,12150,5317],{},[222,12152,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12154},[12155,12156,12157,12158,12159,12160,12161,12162],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5182,"description":5187},[235,5337,5338],{"id":5341,"title":5342,"body":12167,"category":235,"cover":236,"description":5347,"extension":237,"meta":12312,"navigation":96,"path":5528,"pinned":240,"publishedAt":241,"seo":12313,"slug":5530,"stem":5531,"summary":5532,"tags":12314,"updatedAt":241,"visible":96,"__hash__":5536},{"type":7,"value":12168,"toc":12300},[12169,12171,12173,12175,12177,12181,12185,12187,12199,12201,12203,12231,12233,12238,12240,12242,12256,12258,12260,12264,12272,12274,12284,12286,12292,12294,12296,12298],[10,12170,5347],{},[14,12172,16],{"id":16},[10,12174,5352],{},[14,12176,22],{"id":22},[10,12178,12179],{},[26,12180],{"alt":5359,"src":5360},[10,12182,5363,12183,5367],{},[43,12184,5366],{},[14,12186,35],{"id":35},[37,12188,12189,12191,12193],{},[40,12190,5374],{},[40,12192,5377],{},[40,12194,5380,12195,5383,12197,56],{},[43,12196,5366],{},[43,12198,5386],{},[14,12200,70],{"id":70},[10,12202,73],{},[75,12204,12205],{"className":77,"code":5393,"language":79,"meta":80,"style":80},[43,12206,12207,12211,12215,12219,12223,12227],{"__ignoreMap":80},[84,12208,12209],{"class":86,"line":87},[84,12210,5400],{},[84,12212,12213],{"class":86,"line":93},[84,12214,5405],{},[84,12216,12217],{"class":86,"line":100},[84,12218,5410],{},[84,12220,12221],{"class":86,"line":106},[84,12222,97],{"emptyLinePlaceholder":96},[84,12224,12225],{"class":86,"line":112},[84,12226,5419],{},[84,12228,12229],{"class":86,"line":118},[84,12230,5424],{},[10,12232,153],{},[75,12234,12236],{"className":12235,"code":5430,"language":159,"meta":80},[157],[43,12237,5430],{"__ignoreMap":80},[10,12239,164],{},[14,12241,167],{"id":167},[169,12243,12244,12250],{},[40,12245,5441,12246,2265,12248,5447],{},[43,12247,5444],{},[43,12249,4407],{},[40,12251,12252,5453,12254,5457],{},[43,12253,5452],{},[43,12255,5456],{},[338,12257,2704],{"id":2704},[10,12259,5462],{},[10,12261,12262],{},[26,12263],{"alt":5467,"src":5468},[10,12265,12266,2265,12268,1165,12270,5478],{},[43,12267,5444],{},[43,12269,4407],{},[43,12271,5477],{},[14,12273,182],{"id":182},[37,12275,12276,12280],{},[40,12277,5485,12278,5489],{},[43,12279,5488],{},[40,12281,5492,12282,5495],{},[43,12283,5477],{},[14,12285,199],{"id":199},[169,12287,12288,12290],{},[40,12289,5502],{},[40,12291,5505],{},[10,12293,214],{},[14,12295,217],{"id":217},[10,12297,5512],{},[222,12299,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12301},[12302,12303,12304,12305,12306,12309,12310,12311],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":12307},[12308],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5342,"description":5347},[235,5534,5535],{"id":5538,"title":5539,"body":12316,"category":235,"cover":236,"description":5544,"extension":237,"meta":12465,"navigation":96,"path":5725,"pinned":240,"publishedAt":241,"seo":12466,"slug":5727,"stem":5728,"summary":5729,"tags":12467,"updatedAt":241,"visible":96,"__hash__":5733},{"type":7,"value":12317,"toc":12453},[12318,12320,12322,12324,12326,12330,12332,12334,12346,12348,12350,12394,12396,12401,12403,12405,12417,12419,12421,12425,12427,12429,12437,12439,12445,12447,12449,12451],[10,12319,5544],{},[14,12321,16],{"id":16},[10,12323,5549],{},[14,12325,22],{"id":22},[10,12327,12328],{},[26,12329],{"alt":5556,"src":5557},[10,12331,5560],{},[14,12333,35],{"id":35},[37,12335,12336,12338,12342],{},[40,12337,5567],{},[40,12339,12340,5573],{},[43,12341,5572],{},[40,12343,12344,5579],{},[43,12345,5578],{},[14,12347,70],{"id":70},[10,12349,73],{},[75,12351,12352],{"className":77,"code":5586,"language":79,"meta":80,"style":80},[43,12353,12354,12358,12362,12366,12370,12374,12378,12382,12386,12390],{"__ignoreMap":80},[84,12355,12356],{"class":86,"line":87},[84,12357,5593],{},[84,12359,12360],{"class":86,"line":93},[84,12361,5598],{},[84,12363,12364],{"class":86,"line":100},[84,12365,97],{"emptyLinePlaceholder":96},[84,12367,12368],{"class":86,"line":106},[84,12369,5607],{},[84,12371,12372],{"class":86,"line":112},[84,12373,5612],{},[84,12375,12376],{"class":86,"line":118},[84,12377,97],{"emptyLinePlaceholder":96},[84,12379,12380],{"class":86,"line":124},[84,12381,5621],{},[84,12383,12384],{"class":86,"line":129},[84,12385,5626],{},[84,12387,12388],{"class":86,"line":135},[84,12389,97],{"emptyLinePlaceholder":96},[84,12391,12392],{"class":86,"line":141},[84,12393,5635],{},[10,12395,153],{},[75,12397,12399],{"className":12398,"code":5641,"language":159,"meta":80},[157],[43,12400,5641],{"__ignoreMap":80},[10,12402,164],{},[14,12404,167],{"id":167},[169,12406,12407,12411],{},[40,12408,5652,12409,5656],{},[43,12410,5655],{},[40,12412,12413,5662,12415,56],{},[43,12414,5661],{},[43,12416,5665],{},[338,12418,2704],{"id":2704},[10,12420,5670],{},[10,12422,12423],{},[26,12424],{"alt":5675,"src":5676},[10,12426,5679],{},[14,12428,182],{"id":182},[37,12430,12431,12435],{},[40,12432,5686,12433,5689],{},[43,12434,5386],{},[40,12436,5692],{},[14,12438,199],{"id":199},[169,12440,12441,12443],{},[40,12442,5699],{},[40,12444,5702],{},[10,12446,214],{},[14,12448,217],{"id":217},[10,12450,5709],{},[222,12452,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12454},[12455,12456,12457,12458,12459,12462,12463,12464],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":12460},[12461],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5539,"description":5544},[235,5731,5732],{"id":5735,"title":5736,"body":12469,"category":235,"cover":236,"description":5741,"extension":237,"meta":12630,"navigation":96,"path":5938,"pinned":240,"publishedAt":241,"seo":12631,"slug":5940,"stem":5941,"summary":5942,"tags":12632,"updatedAt":241,"visible":96,"__hash__":5946},{"type":7,"value":12470,"toc":12618},[12471,12473,12475,12477,12479,12483,12485,12487,12499,12501,12503,12555,12557,12562,12564,12566,12584,12586,12588,12592,12594,12596,12602,12604,12610,12612,12614,12616],[10,12472,5741],{},[14,12474,16],{"id":16},[10,12476,5746],{},[14,12478,22],{"id":22},[10,12480,12481],{},[26,12482],{"alt":5753,"src":5754},[10,12484,5757],{},[14,12486,35],{"id":35},[37,12488,12489,12491,12493],{},[40,12490,5764],{},[40,12492,5767],{},[40,12494,12495,2184,12497,5776],{},[43,12496,5772],{},[43,12498,5775],{},[14,12500,70],{"id":70},[10,12502,73],{},[75,12504,12505],{"className":77,"code":5783,"language":79,"meta":80,"style":80},[43,12506,12507,12511,12515,12519,12523,12527,12531,12535,12539,12543,12547,12551],{"__ignoreMap":80},[84,12508,12509],{"class":86,"line":87},[84,12510,5790],{},[84,12512,12513],{"class":86,"line":93},[84,12514,97],{"emptyLinePlaceholder":96},[84,12516,12517],{"class":86,"line":100},[84,12518,5799],{},[84,12520,12521],{"class":86,"line":106},[84,12522,5804],{},[84,12524,12525],{"class":86,"line":112},[84,12526,97],{"emptyLinePlaceholder":96},[84,12528,12529],{"class":86,"line":118},[84,12530,5813],{},[84,12532,12533],{"class":86,"line":124},[84,12534,5818],{},[84,12536,12537],{"class":86,"line":129},[84,12538,5823],{},[84,12540,12541],{"class":86,"line":135},[84,12542,97],{"emptyLinePlaceholder":96},[84,12544,12545],{"class":86,"line":141},[84,12546,5832],{},[84,12548,12549],{"class":86,"line":147},[84,12550,97],{"emptyLinePlaceholder":96},[84,12552,12553],{"class":86,"line":5839},[84,12554,5842],{},[10,12556,153],{},[75,12558,12560],{"className":12559,"code":5848,"language":159,"meta":80},[157],[43,12561,5848],{"__ignoreMap":80},[10,12563,164],{},[14,12565,167],{"id":167},[169,12567,12568,12578],{},[40,12569,12570,5862,12572,5866,12574,5869,12576,5873],{},[43,12571,5861],{},[43,12573,5865],{},[43,12575,5655],{},[43,12577,5872],{},[40,12579,12580,5878,12582,5881],{},[43,12581,4590],{},[43,12583,2216],{},[338,12585,2704],{"id":2704},[10,12587,5886],{},[10,12589,12590],{},[26,12591],{"alt":5891,"src":5892},[10,12593,5895],{},[14,12595,182],{"id":182},[37,12597,12598,12600],{},[40,12599,5902],{},[40,12601,5905],{},[14,12603,199],{"id":199},[169,12605,12606,12608],{},[40,12607,5912],{},[40,12609,5915],{},[10,12611,214],{},[14,12613,217],{"id":217},[10,12615,5922],{},[222,12617,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12619},[12620,12621,12622,12623,12624,12627,12628,12629],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":12625},[12626],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5736,"description":5741},[235,5944,5945],{"id":5948,"title":5949,"body":12634,"category":235,"cover":236,"description":5954,"extension":237,"meta":12757,"navigation":96,"path":6105,"pinned":240,"publishedAt":241,"seo":12758,"slug":6107,"stem":6108,"summary":6109,"tags":12759,"updatedAt":241,"visible":96,"__hash__":6113},{"type":7,"value":12635,"toc":12747},[12636,12638,12640,12642,12644,12648,12650,12652,12666,12668,12670,12698,12700,12705,12707,12709,12719,12721,12729,12731,12739,12741,12743,12745],[10,12637,5954],{},[14,12639,16],{"id":16},[10,12641,5959],{},[14,12643,22],{"id":22},[10,12645,12646],{},[26,12647],{"alt":5966,"src":5967},[10,12649,5970],{},[14,12651,35],{"id":35},[37,12653,12654,12656,12658],{},[40,12655,5977],{},[40,12657,5980],{},[40,12659,5983,12660,2265,12662,2265,12664,5991],{},[43,12661,2268],{},[43,12663,2433],{},[43,12665,5990],{},[14,12667,70],{"id":70},[10,12669,73],{},[75,12671,12672],{"className":77,"code":5998,"language":79,"meta":80,"style":80},[43,12673,12674,12678,12682,12686,12690,12694],{"__ignoreMap":80},[84,12675,12676],{"class":86,"line":87},[84,12677,6005],{},[84,12679,12680],{"class":86,"line":93},[84,12681,6010],{},[84,12683,12684],{"class":86,"line":100},[84,12685,6015],{},[84,12687,12688],{"class":86,"line":106},[84,12689,97],{"emptyLinePlaceholder":96},[84,12691,12692],{"class":86,"line":112},[84,12693,6024],{},[84,12695,12696],{"class":86,"line":118},[84,12697,6029],{},[10,12699,153],{},[75,12701,12703],{"className":12702,"code":6035,"language":159,"meta":80},[157],[43,12704,6035],{"__ignoreMap":80},[10,12706,164],{},[14,12708,167],{"id":167},[169,12710,12711,12717],{},[40,12712,6046,12713,6050,12715,6053],{},[43,12714,6049],{},[43,12716,2254],{},[40,12718,6056],{},[14,12720,182],{"id":182},[37,12722,12723,12727],{},[40,12724,6063,12725,6067],{},[43,12726,6066],{},[40,12728,6070],{},[14,12730,199],{"id":199},[169,12732,12733,12735],{},[40,12734,6077],{},[40,12736,6080,12737,6084],{},[43,12738,6083],{},[10,12740,214],{},[14,12742,217],{"id":217},[10,12744,6091],{},[222,12746,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12748},[12749,12750,12751,12752,12753,12754,12755,12756],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5949,"description":5954},[235,6111,6112],{"id":6115,"title":6116,"body":12761,"category":235,"cover":236,"description":6121,"extension":237,"meta":12938,"navigation":96,"path":6349,"pinned":240,"publishedAt":241,"seo":12939,"slug":6351,"stem":6352,"summary":6353,"tags":12940,"updatedAt":241,"visible":96,"__hash__":6357},{"type":7,"value":12762,"toc":12926},[12763,12765,12767,12771,12773,12777,12783,12785,12797,12799,12803,12827,12831,12847,12853,12855,12860,12862,12864,12880,12882,12884,12888,12892,12894,12906,12908,12918,12920,12922,12924],[10,12764,6121],{},[14,12766,16],{"id":16},[10,12768,6126,12769,6129],{},[304,12770,6049],{},[14,12772,22],{"id":22},[10,12774,12775],{},[26,12776],{"alt":6136,"src":6137},[10,12778,6140,12779,6144,12781,6148],{},[43,12780,6143],{},[43,12782,6147],{},[14,12784,35],{"id":35},[37,12786,12787,12791,12793],{},[40,12788,6155,12789,6158],{},[43,12790,1179],{},[40,12792,6161],{},[40,12794,6164,12795,6168],{},[43,12796,6167],{},[14,12798,70],{"id":70},[10,12800,6173,12801,6177],{},[43,12802,6176],{},[75,12804,12805],{"className":77,"code":6180,"language":79,"meta":80,"style":80},[43,12806,12807,12811,12815,12819,12823],{"__ignoreMap":80},[84,12808,12809],{"class":86,"line":87},[84,12810,6187],{},[84,12812,12813],{"class":86,"line":93},[84,12814,6192],{},[84,12816,12817],{"class":86,"line":100},[84,12818,97],{"emptyLinePlaceholder":96},[84,12820,12821],{"class":86,"line":106},[84,12822,6201],{},[84,12824,12825],{"class":86,"line":112},[84,12826,6206],{},[10,12828,6209,12829,6213],{},[43,12830,6212],{},[75,12832,12833],{"className":77,"code":6216,"language":79,"meta":80,"style":80},[43,12834,12835,12839,12843],{"__ignoreMap":80},[84,12836,12837],{"class":86,"line":87},[84,12838,6223],{},[84,12840,12841],{"class":86,"line":93},[84,12842,97],{"emptyLinePlaceholder":96},[84,12844,12845],{"class":86,"line":100},[84,12846,6232],{},[10,12848,6235,12849,1165,12851,56],{},[43,12850,6238],{},[43,12852,6241],{},[10,12854,153],{},[75,12856,12858],{"className":12857,"code":6247,"language":159,"meta":80},[157],[43,12859,6247],{"__ignoreMap":80},[10,12861,164],{},[14,12863,167],{"id":167},[169,12865,12866,12872],{},[40,12867,6258,12868,6261,12870,6265],{},[43,12869,6176],{},[43,12871,6264],{},[40,12873,12874,6270,12876,6273,12878,6276],{},[43,12875,6212],{},[43,12877,6176],{},[43,12879,6212],{},[338,12881,2704],{"id":2704},[10,12883,6281],{},[10,12885,12886],{},[26,12887],{"alt":6286,"src":6287},[10,12889,6290,12890,6293],{},[43,12891,6264],{},[14,12893,182],{"id":182},[37,12895,12896,12902],{},[40,12897,6300,12898,1165,12900,56],{},[43,12899,6176],{},[43,12901,6212],{},[40,12903,6307,12904,6311],{},[43,12905,6310],{},[14,12907,199],{"id":199},[169,12909,12910,12914],{},[40,12911,2361,12912,6321],{},[43,12913,6320],{},[40,12915,6324,12916,56],{},[43,12917,6143],{},[10,12919,214],{},[14,12921,217],{"id":217},[10,12923,6333],{},[222,12925,224],{},{"title":80,"searchDepth":93,"depth":93,"links":12927},[12928,12929,12930,12931,12932,12935,12936,12937],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":12933},[12934],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":6116,"description":6121},[235,6355,6356],{"id":6359,"title":6360,"body":12942,"category":235,"cover":236,"description":6365,"extension":237,"meta":13081,"navigation":96,"path":6531,"pinned":240,"publishedAt":241,"seo":13082,"slug":6533,"stem":6534,"summary":6535,"tags":13083,"updatedAt":241,"visible":96,"__hash__":6538},{"type":7,"value":12943,"toc":13071},[12944,12946,12948,12950,12952,12956,12958,12960,12970,12972,12974,13014,13016,13021,13023,13025,13043,13045,13053,13055,13063,13065,13067,13069],[10,12945,6365],{},[14,12947,16],{"id":16},[10,12949,6370],{},[14,12951,22],{"id":22},[10,12953,12954],{},[26,12955],{"alt":6377,"src":6378},[10,12957,6381],{},[14,12959,35],{"id":35},[37,12961,12962,12966,12968],{},[40,12963,12964,6391],{},[43,12965,6390],{},[40,12967,6394],{},[40,12969,6397],{},[14,12971,70],{"id":70},[10,12973,1582],{},[75,12975,12976],{"className":599,"code":6404,"language":601,"meta":80,"style":80},[43,12977,12978,12988,12994,13000,13010],{"__ignoreMap":80},[84,12979,12980,12982,12984,12986],{"class":86,"line":87},[84,12981,699],{"class":608},[84,12983,641],{"class":611},[84,12985,6415],{"class":644},[84,12987,6418],{"class":644},[84,12989,12990,12992],{"class":86,"line":93},[84,12991,6423],{"class":611},[84,12993,6426],{"class":644},[84,12995,12996,12998],{"class":86,"line":100},[84,12997,79],{"class":608},[84,12999,612],{"class":611},[84,13001,13002,13004,13006,13008],{"class":86,"line":106},[84,13003,79],{"class":608},[84,13005,641],{"class":611},[84,13007,645],{"class":644},[84,13009,612],{"class":611},[84,13011,13012],{"class":86,"line":112},[84,13013,6447],{"class":608},[10,13015,153],{},[75,13017,13019],{"className":13018,"code":6453,"language":159,"meta":80},[157],[43,13020,6453],{"__ignoreMap":80},[10,13022,164],{},[14,13024,167],{"id":167},[169,13026,13027,13033],{},[40,13028,13029,6467,13031,6470],{},[43,13030,6466],{},[43,13032,699],{},[40,13034,6473,13035,2184,13037,6479,13039,3735,13041,6485],{},[43,13036,79],{},[43,13038,6478],{},[43,13040,6390],{},[43,13042,6484],{},[14,13044,182],{"id":182},[37,13046,13047,13049],{},[40,13048,6492],{},[40,13050,3474,13051,6497],{},[43,13052,6390],{},[14,13054,199],{"id":199},[169,13056,13057,13061],{},[40,13058,6504,13059,56],{},[43,13060,6507],{},[40,13062,6510],{},[10,13064,214],{},[14,13066,217],{"id":217},[10,13068,6517],{},[222,13070,1666],{},{"title":80,"searchDepth":93,"depth":93,"links":13072},[13073,13074,13075,13076,13077,13078,13079,13080],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":6360,"description":6365},[235,6537,270],{"id":6540,"title":6541,"body":13085,"category":235,"cover":236,"description":6546,"extension":237,"meta":13238,"navigation":96,"path":6734,"pinned":240,"publishedAt":241,"seo":13239,"slug":6736,"stem":6737,"summary":6738,"tags":13240,"updatedAt":241,"visible":96,"__hash__":6742},{"type":7,"value":13086,"toc":13228},[13087,13089,13091,13093,13095,13099,13105,13107,13123,13125,13127,13171,13173,13178,13180,13182,13194,13196,13210,13212,13220,13222,13224,13226],[10,13088,6546],{},[14,13090,16],{"id":16},[10,13092,6551],{},[14,13094,22],{"id":22},[10,13096,13097],{},[26,13098],{"alt":6558,"src":6559},[10,13100,13101,6565,13103,6568],{},[43,13102,6564],{},[43,13104,2443],{},[14,13106,35],{"id":35},[37,13108,13109,13111,13119],{},[40,13110,6575],{},[40,13112,13113,2265,13115,2265,13117,6587],{},[43,13114,6580],{},[43,13116,6583],{},[43,13118,6586],{},[40,13120,6590,13121,6594],{},[43,13122,6593],{},[14,13124,70],{"id":70},[10,13126,73],{},[75,13128,13129],{"className":77,"code":6601,"language":79,"meta":80,"style":80},[43,13130,13131,13135,13139,13143,13147,13151,13155,13159,13163,13167],{"__ignoreMap":80},[84,13132,13133],{"class":86,"line":87},[84,13134,90],{},[84,13136,13137],{"class":86,"line":93},[84,13138,97],{"emptyLinePlaceholder":96},[84,13140,13141],{"class":86,"line":100},[84,13142,6616],{},[84,13144,13145],{"class":86,"line":106},[84,13146,6621],{},[84,13148,13149],{"class":86,"line":112},[84,13150,6626],{},[84,13152,13153],{"class":86,"line":118},[84,13154,97],{"emptyLinePlaceholder":96},[84,13156,13157],{"class":86,"line":124},[84,13158,6635],{},[84,13160,13161],{"class":86,"line":129},[84,13162,6640],{},[84,13164,13165],{"class":86,"line":135},[84,13166,6645],{},[84,13168,13169],{"class":86,"line":141},[84,13170,6650],{},[10,13172,153],{},[75,13174,13176],{"className":13175,"code":6656,"language":159,"meta":80},[157],[43,13177,6656],{"__ignoreMap":80},[10,13179,164],{},[14,13181,167],{"id":167},[169,13183,13184,13188],{},[40,13185,13186,6670],{},[43,13187,6669],{},[40,13189,187,13190,6675,13192,6678],{},[43,13191,2443],{},[43,13193,6564],{},[14,13195,182],{"id":182},[37,13197,13198,13204],{},[40,13199,3474,13200,6687,13202,6690],{},[43,13201,6564],{},[43,13203,6580],{},[40,13205,6693,13206,1017,13208,6699],{},[43,13207,2443],{},[43,13209,6698],{},[14,13211,199],{"id":199},[169,13213,13214,13218],{},[40,13215,6706,13216,6710],{},[43,13217,6709],{},[40,13219,6713],{},[10,13221,214],{},[14,13223,217],{"id":217},[10,13225,6720],{},[222,13227,224],{},{"title":80,"searchDepth":93,"depth":93,"links":13229},[13230,13231,13232,13233,13234,13235,13236,13237],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":6541,"description":6546},[235,6740,6741],{"id":4,"title":5,"body":13242,"category":235,"cover":236,"description":12,"extension":237,"meta":13389,"navigation":96,"path":239,"pinned":240,"publishedAt":241,"seo":13390,"slug":243,"stem":244,"summary":245,"tags":13391,"updatedAt":241,"visible":96,"__hash__":249},{"type":7,"value":13243,"toc":13379},[13244,13246,13248,13250,13252,13256,13258,13260,13278,13280,13282,13330,13332,13337,13339,13341,13349,13351,13361,13363,13371,13373,13375,13377],[10,13245,12],{},[14,13247,16],{"id":16},[10,13249,19],{},[14,13251,22],{"id":22},[10,13253,13254],{},[26,13255],{"alt":28,"src":29},[10,13257,32],{},[14,13259,35],{"id":35},[37,13261,13262,13266,13272],{},[40,13263,13264,46],{},[43,13265,45],{},[40,13267,13268,52,13270,56],{},[43,13269,51],{},[43,13271,55],{},[40,13273,59,13274,63,13276,67],{},[43,13275,62],{},[43,13277,66],{},[14,13279,70],{"id":70},[10,13281,73],{},[75,13283,13284],{"className":77,"code":78,"language":79,"meta":80,"style":80},[43,13285,13286,13290,13294,13298,13302,13306,13310,13314,13318,13322,13326],{"__ignoreMap":80},[84,13287,13288],{"class":86,"line":87},[84,13289,90],{},[84,13291,13292],{"class":86,"line":93},[84,13293,97],{"emptyLinePlaceholder":96},[84,13295,13296],{"class":86,"line":100},[84,13297,103],{},[84,13299,13300],{"class":86,"line":106},[84,13301,109],{},[84,13303,13304],{"class":86,"line":112},[84,13305,115],{},[84,13307,13308],{"class":86,"line":118},[84,13309,121],{},[84,13311,13312],{"class":86,"line":124},[84,13313,97],{"emptyLinePlaceholder":96},[84,13315,13316],{"class":86,"line":129},[84,13317,132],{},[84,13319,13320],{"class":86,"line":135},[84,13321,138],{},[84,13323,13324],{"class":86,"line":141},[84,13325,144],{},[84,13327,13328],{"class":86,"line":147},[84,13329,150],{},[10,13331,153],{},[75,13333,13335],{"className":13334,"code":158,"language":159,"meta":80},[157],[43,13336,158],{"__ignoreMap":80},[10,13338,164],{},[14,13340,167],{"id":167},[169,13342,13343,13347],{},[40,13344,173,13345,176],{},[43,13346,62],{},[40,13348,179],{},[14,13350,182],{"id":182},[37,13352,13353,13357],{},[40,13354,187,13355,190],{},[43,13356,45],{},[40,13358,193,13359,56],{},[43,13360,196],{},[14,13362,199],{"id":199},[169,13364,13365,13367],{},[40,13366,204],{},[40,13368,207,13369,211],{},[43,13370,210],{},[10,13372,214],{},[14,13374,217],{"id":217},[10,13376,220],{},[222,13378,224],{},{"title":80,"searchDepth":93,"depth":93,"links":13380},[13381,13382,13383,13384,13385,13386,13387,13388],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":5,"description":12},[235,247,248],{"id":6895,"title":6896,"body":13393,"category":235,"cover":236,"description":6901,"extension":237,"meta":13536,"navigation":96,"path":7069,"pinned":240,"publishedAt":241,"seo":13537,"slug":7071,"stem":7072,"summary":7073,"tags":13538,"updatedAt":241,"visible":96,"__hash__":7077},{"type":7,"value":13394,"toc":13526},[13395,13397,13399,13401,13403,13407,13413,13415,13425,13427,13429,13481,13483,13488,13490,13492,13502,13504,13510,13512,13518,13520,13522,13524],[10,13396,6901],{},[14,13398,16],{"id":16},[10,13400,6906],{},[14,13402,22],{"id":22},[10,13404,13405],{},[26,13406],{"alt":6913,"src":6914},[10,13408,13409,6920,13411,6924],{},[43,13410,6919],{},[43,13412,6923],{},[14,13414,35],{"id":35},[37,13416,13417,13419,13423],{},[40,13418,6931],{},[40,13420,13421,6937],{},[43,13422,6936],{},[40,13424,6940],{},[14,13426,70],{"id":70},[10,13428,73],{},[75,13430,13431],{"className":77,"code":6947,"language":79,"meta":80,"style":80},[43,13432,13433,13437,13441,13445,13449,13453,13457,13461,13465,13469,13473,13477],{"__ignoreMap":80},[84,13434,13435],{"class":86,"line":87},[84,13436,6954],{},[84,13438,13439],{"class":86,"line":93},[84,13440,97],{"emptyLinePlaceholder":96},[84,13442,13443],{"class":86,"line":100},[84,13444,6963],{},[84,13446,13447],{"class":86,"line":106},[84,13448,97],{"emptyLinePlaceholder":96},[84,13450,13451],{"class":86,"line":112},[84,13452,6972],{},[84,13454,13455],{"class":86,"line":118},[84,13456,6977],{},[84,13458,13459],{"class":86,"line":124},[84,13460,121],{},[84,13462,13463],{"class":86,"line":129},[84,13464,97],{"emptyLinePlaceholder":96},[84,13466,13467],{"class":86,"line":135},[84,13468,6990],{},[84,13470,13471],{"class":86,"line":141},[84,13472,6995],{},[84,13474,13475],{"class":86,"line":147},[84,13476,144],{},[84,13478,13479],{"class":86,"line":5839},[84,13480,7004],{},[10,13482,153],{},[75,13484,13486],{"className":13485,"code":7010,"language":159,"meta":80},[157],[43,13487,7010],{"__ignoreMap":80},[10,13489,164],{},[14,13491,167],{"id":167},[169,13493,13494,13498],{},[40,13495,13496,7023],{},[43,13497,6919],{},[40,13499,13500,7028],{},[43,13501,6923],{},[14,13503,182],{"id":182},[37,13505,13506,13508],{},[40,13507,7035],{},[40,13509,7038],{},[14,13511,199],{"id":199},[169,13513,13514,13516],{},[40,13515,7045],{},[40,13517,7048],{},[10,13519,214],{},[14,13521,217],{"id":217},[10,13523,7055],{},[222,13525,224],{},{"title":80,"searchDepth":93,"depth":93,"links":13527},[13528,13529,13530,13531,13532,13533,13534,13535],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":6896,"description":6901},[235,7075,7076],{"id":7079,"title":7080,"body":13540,"category":235,"cover":236,"description":7085,"extension":237,"meta":13691,"navigation":96,"path":7270,"pinned":240,"publishedAt":241,"seo":13692,"slug":7272,"stem":7273,"summary":7274,"tags":13693,"updatedAt":241,"visible":96,"__hash__":7278},{"type":7,"value":13541,"toc":13681},[13542,13544,13546,13548,13550,13554,13558,13560,13574,13576,13578,13630,13632,13637,13639,13641,13653,13655,13665,13667,13673,13675,13677,13679],[10,13543,7085],{},[14,13545,16],{"id":16},[10,13547,7090],{},[14,13549,22],{"id":22},[10,13551,13552],{},[26,13553],{"alt":7097,"src":7098},[10,13555,13556,7104],{},[43,13557,7103],{},[14,13559,35],{"id":35},[37,13561,13562,13568,13572],{},[40,13563,187,13564,7114,13566,7118],{},[43,13565,7113],{},[43,13567,7117],{},[40,13569,7121,13570,7125],{},[43,13571,7124],{},[40,13573,7128],{},[14,13575,70],{"id":70},[10,13577,73],{},[75,13579,13580],{"className":77,"code":7135,"language":79,"meta":80,"style":80},[43,13581,13582,13586,13590,13594,13598,13602,13606,13610,13614,13618,13622,13626],{"__ignoreMap":80},[84,13583,13584],{"class":86,"line":87},[84,13585,7142],{},[84,13587,13588],{"class":86,"line":93},[84,13589,97],{"emptyLinePlaceholder":96},[84,13591,13592],{"class":86,"line":100},[84,13593,7151],{},[84,13595,13596],{"class":86,"line":106},[84,13597,7156],{},[84,13599,13600],{"class":86,"line":112},[84,13601,7161],{},[84,13603,13604],{"class":86,"line":118},[84,13605,7166],{},[84,13607,13608],{"class":86,"line":124},[84,13609,7171],{},[84,13611,13612],{"class":86,"line":129},[84,13613,97],{"emptyLinePlaceholder":96},[84,13615,13616],{"class":86,"line":135},[84,13617,7180],{},[84,13619,13620],{"class":86,"line":141},[84,13621,7185],{},[84,13623,13624],{"class":86,"line":147},[84,13625,7190],{},[84,13627,13628],{"class":86,"line":5839},[84,13629,7195],{},[10,13631,153],{},[75,13633,13635],{"className":13634,"code":7201,"language":159,"meta":80},[157],[43,13636,7201],{"__ignoreMap":80},[10,13638,164],{},[14,13640,167],{"id":167},[169,13642,13643,13649],{},[40,13644,13645,7215,13647,7218],{},[43,13646,7214],{},[43,13648,7124],{},[40,13650,13651,7223],{},[43,13652,7103],{},[14,13654,182],{"id":182},[37,13656,13657,13659],{},[40,13658,7230],{},[40,13660,7233,13661,7236,13663,7239],{},[43,13662,7113],{},[43,13664,7117],{},[14,13666,199],{"id":199},[169,13668,13669,13671],{},[40,13670,7246],{},[40,13672,7249],{},[10,13674,214],{},[14,13676,217],{"id":217},[10,13678,7256],{},[222,13680,224],{},{"title":80,"searchDepth":93,"depth":93,"links":13682},[13683,13684,13685,13686,13687,13688,13689,13690],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":7080,"description":7085},[235,7276,7277],{"id":7280,"title":7281,"body":13695,"category":235,"cover":236,"description":7286,"extension":237,"meta":13909,"navigation":96,"path":7560,"pinned":240,"publishedAt":241,"seo":13910,"slug":7562,"stem":7563,"summary":7564,"tags":13911,"updatedAt":241,"visible":96,"__hash__":7568},{"type":7,"value":13696,"toc":13896},[13697,13699,13701,13703,13705,13709,13715,13717,13729,13731,13733,13793,13795,13800,13802,13804,13822,13824,13832,13836,13844,13846,13850,13854,13860,13862,13872,13874,13888,13890,13892,13894],[10,13698,7286],{},[14,13700,16],{"id":16},[10,13702,7291],{},[14,13704,22],{"id":22},[10,13706,13707],{},[26,13708],{"alt":7298,"src":7299},[10,13710,7302,13711,7306,13713,7310],{},[43,13712,7305],{},[43,13714,7309],{},[14,13716,35],{"id":35},[37,13718,13719,13723,13727],{},[40,13720,7317,13721,7320],{},[43,13722,7305],{},[40,13724,13725,7326],{},[43,13726,7325],{},[40,13728,7329],{},[14,13730,70],{"id":70},[10,13732,73],{},[75,13734,13735],{"className":77,"code":7336,"language":79,"meta":80,"style":80},[43,13736,13737,13741,13745,13749,13753,13757,13761,13765,13769,13773,13777,13781,13785,13789],{"__ignoreMap":80},[84,13738,13739],{"class":86,"line":87},[84,13740,7343],{},[84,13742,13743],{"class":86,"line":93},[84,13744,7348],{},[84,13746,13747],{"class":86,"line":100},[84,13748,7353],{},[84,13750,13751],{"class":86,"line":106},[84,13752,7358],{},[84,13754,13755],{"class":86,"line":112},[84,13756,7363],{},[84,13758,13759],{"class":86,"line":118},[84,13760,97],{"emptyLinePlaceholder":96},[84,13762,13763],{"class":86,"line":124},[84,13764,7372],{},[84,13766,13767],{"class":86,"line":129},[84,13768,7377],{},[84,13770,13771],{"class":86,"line":135},[84,13772,7382],{},[84,13774,13775],{"class":86,"line":141},[84,13776,7387],{},[84,13778,13779],{"class":86,"line":147},[84,13780,1154],{},[84,13782,13783],{"class":86,"line":5839},[84,13784,7396],{},[84,13786,13787],{"class":86,"line":7399},[84,13788,7402],{},[84,13790,13791],{"class":86,"line":7405},[84,13792,7408],{},[10,13794,153],{},[75,13796,13798],{"className":13797,"code":7414,"language":159,"meta":80},[157],[43,13799,7414],{"__ignoreMap":80},[10,13801,164],{},[14,13803,167],{"id":167},[169,13805,13806,13814],{},[40,13807,13808,7427,13810,7430,13812,7434],{},[43,13809,3043],{},[43,13811,7325],{},[43,13813,7433],{},[40,13815,7437,13816,7440,13818,7443,13820,56],{},[43,13817,7305],{},[43,13819,1168],{},[43,13821,7309],{},[338,13823,2704],{"id":2704},[10,13825,13826,2265,13828,1165,13830,7456],{},[43,13827,7305],{},[43,13829,1168],{},[43,13831,7309],{},[10,13833,13834],{},[26,13835],{"alt":7461,"src":7462},[10,13837,13838,7467,13840,7470,13842,7473],{},[43,13839,7305],{},[43,13841,1168],{},[43,13843,7309],{},[338,13845,2704],{"id":4225},[10,13847,13848,7481],{},[43,13849,7480],{},[10,13851,13852],{},[26,13853],{"alt":7486,"src":7487},[10,13855,7490,13856,7493,13858,7496],{},[43,13857,7480],{},[43,13859,1168],{},[14,13861,182],{"id":182},[37,13863,13864,13868],{},[40,13865,7503,13866,7507],{},[43,13867,7506],{},[40,13869,7510,13870,7513],{},[43,13871,7480],{},[14,13873,199],{"id":199},[169,13875,13876,13884],{},[40,13877,7520,13878,7524,13880,1165,13882,56],{},[43,13879,7523],{},[43,13881,7527],{},[43,13883,7530],{},[40,13885,7533,13886,7536],{},[43,13887,55],{},[10,13889,214],{},[14,13891,217],{"id":217},[10,13893,7543],{},[222,13895,224],{},{"title":80,"searchDepth":93,"depth":93,"links":13897},[13898,13899,13900,13901,13902,13906,13907,13908],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":13903},[13904,13905],{"id":2704,"depth":100,"text":2704},{"id":4225,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":7281,"description":7286},[235,7566,7567],{"id":7570,"title":7571,"body":13913,"category":235,"cover":236,"description":7576,"extension":237,"meta":14064,"navigation":96,"path":7753,"pinned":240,"publishedAt":241,"seo":14065,"slug":7755,"stem":7756,"summary":7757,"tags":14066,"updatedAt":241,"visible":96,"__hash__":7760},{"type":7,"value":13914,"toc":14054},[13915,13917,13919,13921,13923,13927,13931,13933,13945,13947,13949,13997,13999,14004,14006,14008,14018,14020,14030,14032,14046,14048,14050,14052],[10,13916,7576],{},[14,13918,16],{"id":16},[10,13920,7581],{},[14,13922,22],{"id":22},[10,13924,13925],{},[26,13926],{"alt":7588,"src":7589},[10,13928,7592,13929,7595],{},[43,13930,66],{},[14,13932,35],{"id":35},[37,13934,13935,13939,13943],{},[40,13936,13937,7604],{},[43,13938,66],{},[40,13940,13941,7610],{},[43,13942,7609],{},[40,13944,7613],{},[14,13946,70],{"id":70},[10,13948,73],{},[75,13950,13951],{"className":77,"code":7620,"language":79,"meta":80,"style":80},[43,13952,13953,13957,13961,13965,13969,13973,13977,13981,13985,13989,13993],{"__ignoreMap":80},[84,13954,13955],{"class":86,"line":87},[84,13956,90],{},[84,13958,13959],{"class":86,"line":93},[84,13960,97],{"emptyLinePlaceholder":96},[84,13962,13963],{"class":86,"line":100},[84,13964,103],{},[84,13966,13967],{"class":86,"line":106},[84,13968,97],{"emptyLinePlaceholder":96},[84,13970,13971],{"class":86,"line":112},[84,13972,7643],{},[84,13974,13975],{"class":86,"line":118},[84,13976,7648],{},[84,13978,13979],{"class":86,"line":124},[84,13980,97],{"emptyLinePlaceholder":96},[84,13982,13983],{"class":86,"line":129},[84,13984,7657],{},[84,13986,13987],{"class":86,"line":135},[84,13988,7662],{},[84,13990,13991],{"class":86,"line":141},[84,13992,97],{"emptyLinePlaceholder":96},[84,13994,13995],{"class":86,"line":147},[84,13996,7671],{},[10,13998,153],{},[75,14000,14002],{"className":14001,"code":7677,"language":159,"meta":80},[157],[43,14003,7677],{"__ignoreMap":80},[10,14005,164],{},[14,14007,167],{"id":167},[169,14009,14010,14016],{},[40,14011,7592,14012,7690,14014,56],{},[43,14013,66],{},[43,14015,7693],{},[40,14017,7696],{},[14,14019,182],{"id":182},[37,14021,14022,14026],{},[40,14023,4793,14024,7705],{},[43,14025,66],{},[40,14027,7708,14028,7711],{},[43,14029,66],{},[14,14031,199],{"id":199},[169,14033,14034,14040],{},[40,14035,7718,14036,7722,14038,56],{},[43,14037,7721],{},[43,14039,66],{},[40,14041,4793,14042,7729,14044,56],{},[43,14043,66],{},[43,14045,7732],{},[10,14047,214],{},[14,14049,217],{"id":217},[10,14051,7739],{},[222,14053,224],{},{"title":80,"searchDepth":93,"depth":93,"links":14055},[14056,14057,14058,14059,14060,14061,14062,14063],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":7571,"description":7576},[235,66,7759],{"id":7762,"title":7763,"body":14068,"category":235,"cover":236,"description":7768,"extension":237,"meta":14239,"navigation":96,"path":7981,"pinned":240,"publishedAt":241,"seo":14240,"slug":7983,"stem":7984,"summary":7985,"tags":14241,"updatedAt":241,"visible":96,"__hash__":7989},{"type":7,"value":14069,"toc":14227},[14070,14072,14074,14076,14078,14082,14084,14086,14098,14100,14102,14158,14160,14165,14167,14169,14185,14187,14189,14193,14199,14201,14209,14211,14219,14221,14223,14225],[10,14071,7768],{},[14,14073,16],{"id":16},[10,14075,7773],{},[14,14077,22],{"id":22},[10,14079,14080],{},[26,14081],{"alt":7780,"src":7781},[10,14083,7784],{},[14,14085,35],{"id":35},[37,14087,14088,14092,14096],{},[40,14089,14090,7794],{},[43,14091,7793],{},[40,14093,14094,7800],{},[43,14095,7799],{},[40,14097,7803],{},[14,14099,70],{"id":70},[10,14101,73],{},[75,14103,14104],{"className":77,"code":7810,"language":79,"meta":80,"style":80},[43,14105,14106,14110,14114,14118,14122,14126,14130,14134,14138,14142,14146,14150,14154],{"__ignoreMap":80},[84,14107,14108],{"class":86,"line":87},[84,14109,7817],{},[84,14111,14112],{"class":86,"line":93},[84,14113,7822],{},[84,14115,14116],{"class":86,"line":100},[84,14117,7827],{},[84,14119,14120],{"class":86,"line":106},[84,14121,7832],{},[84,14123,14124],{"class":86,"line":112},[84,14125,97],{"emptyLinePlaceholder":96},[84,14127,14128],{"class":86,"line":118},[84,14129,7841],{},[84,14131,14132],{"class":86,"line":124},[84,14133,7846],{},[84,14135,14136],{"class":86,"line":129},[84,14137,7851],{},[84,14139,14140],{"class":86,"line":135},[84,14141,7856],{},[84,14143,14144],{"class":86,"line":141},[84,14145,97],{"emptyLinePlaceholder":96},[84,14147,14148],{"class":86,"line":147},[84,14149,7865],{},[84,14151,14152],{"class":86,"line":5839},[84,14153,7870],{},[84,14155,14156],{"class":86,"line":7399},[84,14157,7875],{},[10,14159,153],{},[75,14161,14163],{"className":14162,"code":7881,"language":159,"meta":80},[157],[43,14164,7881],{"__ignoreMap":80},[10,14166,164],{},[14,14168,167],{"id":167},[169,14170,14171,14177],{},[40,14172,7892,14173,7896,14175,7899],{},[43,14174,7895],{},[43,14176,7799],{},[40,14178,14179,7905,14181,7909,14183,7912],{},[43,14180,7904],{},[43,14182,7908],{},[43,14184,7793],{},[338,14186,2704],{"id":2704},[10,14188,7917],{},[10,14190,14191],{},[26,14192],{"alt":7922,"src":7923},[10,14194,7926,14195,1165,14197,7932],{},[43,14196,4590],{},[43,14198,7931],{},[14,14200,182],{"id":182},[37,14202,14203,14207],{},[40,14204,7939,14205,7942],{},[43,14206,7793],{},[40,14208,7945],{},[14,14210,199],{"id":199},[169,14212,14213,14217],{},[40,14214,5303,14215,7955],{},[43,14216,7954],{},[40,14218,7958],{},[10,14220,214],{},[14,14222,217],{"id":217},[10,14224,7965],{},[222,14226,224],{},{"title":80,"searchDepth":93,"depth":93,"links":14228},[14229,14230,14231,14232,14233,14236,14237,14238],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":14234},[14235],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":7763,"description":7768},[235,7987,7988],{"id":7991,"title":7992,"body":14243,"category":235,"cover":236,"description":7997,"extension":237,"meta":14390,"navigation":96,"path":8176,"pinned":240,"publishedAt":241,"seo":14391,"slug":8178,"stem":8179,"summary":8180,"tags":14392,"updatedAt":241,"visible":96,"__hash__":8184},{"type":7,"value":14244,"toc":14380},[14245,14247,14249,14251,14253,14257,14259,14261,14269,14271,14273,14329,14331,14336,14338,14340,14352,14354,14360,14362,14372,14374,14376,14378],[10,14246,7997],{},[14,14248,16],{"id":16},[10,14250,8002],{},[14,14252,22],{"id":22},[10,14254,14255],{},[26,14256],{"alt":8009,"src":8010},[10,14258,8013],{},[14,14260,35],{"id":35},[37,14262,14263,14265,14267],{},[40,14264,8020],{},[40,14266,8023],{},[40,14268,8026],{},[14,14270,70],{"id":70},[10,14272,73],{},[75,14274,14275],{"className":77,"code":8033,"language":79,"meta":80,"style":80},[43,14276,14277,14281,14285,14289,14293,14297,14301,14305,14309,14313,14317,14321,14325],{"__ignoreMap":80},[84,14278,14279],{"class":86,"line":87},[84,14280,8040],{},[84,14282,14283],{"class":86,"line":93},[84,14284,8045],{},[84,14286,14287],{"class":86,"line":100},[84,14288,8050],{},[84,14290,14291],{"class":86,"line":106},[84,14292,97],{"emptyLinePlaceholder":96},[84,14294,14295],{"class":86,"line":112},[84,14296,8059],{},[84,14298,14299],{"class":86,"line":118},[84,14300,8064],{},[84,14302,14303],{"class":86,"line":124},[84,14304,8069],{},[84,14306,14307],{"class":86,"line":129},[84,14308,97],{"emptyLinePlaceholder":96},[84,14310,14311],{"class":86,"line":135},[84,14312,8078],{},[84,14314,14315],{"class":86,"line":141},[84,14316,8083],{},[84,14318,14319],{"class":86,"line":147},[84,14320,97],{"emptyLinePlaceholder":96},[84,14322,14323],{"class":86,"line":5839},[84,14324,8092],{},[84,14326,14327],{"class":86,"line":7399},[84,14328,8097],{},[10,14330,153],{},[75,14332,14334],{"className":14333,"code":8103,"language":159,"meta":80},[157],[43,14335,8103],{"__ignoreMap":80},[10,14337,164],{},[14,14339,167],{"id":167},[169,14341,14342,14348],{},[40,14343,14344,8117,14346,8121],{},[43,14345,8116],{},[43,14347,8120],{},[40,14349,8124,14350,8128],{},[43,14351,8127],{},[14,14353,182],{"id":182},[37,14355,14356,14358],{},[40,14357,8135],{},[40,14359,8138],{},[14,14361,199],{"id":199},[169,14363,14364,14370],{},[40,14365,8145,14366,8149,14368,56],{},[43,14367,8148],{},[43,14369,8152],{},[40,14371,8155],{},[10,14373,214],{},[14,14375,217],{"id":217},[10,14377,8162],{},[222,14379,224],{},{"title":80,"searchDepth":93,"depth":93,"links":14381},[14382,14383,14384,14385,14386,14387,14388,14389],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":7992,"description":7997},[235,8182,8183],{"id":8186,"title":8187,"body":14394,"category":235,"cover":236,"description":8192,"extension":237,"meta":14557,"navigation":96,"path":8396,"pinned":240,"publishedAt":241,"seo":14558,"slug":8398,"stem":8399,"summary":8400,"tags":14559,"updatedAt":241,"visible":96,"__hash__":8404},{"type":7,"value":14395,"toc":14545},[14396,14398,14400,14402,14404,14408,14412,14414,14430,14432,14434,14478,14480,14485,14487,14489,14503,14505,14509,14513,14517,14519,14525,14527,14537,14539,14541,14543],[10,14397,8192],{},[14,14399,16],{"id":16},[10,14401,8197],{},[14,14403,22],{"id":22},[10,14405,14406],{},[26,14407],{"alt":8204,"src":8205},[10,14409,8208,14410,8212],{},[43,14411,8211],{},[14,14413,35],{"id":35},[37,14415,14416,14422,14428],{},[40,14417,14418,8222,14420,8226],{},[43,14419,8221],{},[43,14421,8225],{},[40,14423,8229,14424,8233,14426,8236],{},[43,14425,8232],{},[43,14427,4344],{},[40,14429,8239],{},[14,14431,70],{"id":70},[10,14433,73],{},[75,14435,14436],{"className":77,"code":8246,"language":79,"meta":80,"style":80},[43,14437,14438,14442,14446,14450,14454,14458,14462,14466,14470,14474],{"__ignoreMap":80},[84,14439,14440],{"class":86,"line":87},[84,14441,8253],{},[84,14443,14444],{"class":86,"line":93},[84,14445,8258],{},[84,14447,14448],{"class":86,"line":100},[84,14449,8263],{},[84,14451,14452],{"class":86,"line":106},[84,14453,8268],{},[84,14455,14456],{"class":86,"line":112},[84,14457,8273],{},[84,14459,14460],{"class":86,"line":118},[84,14461,97],{"emptyLinePlaceholder":96},[84,14463,14464],{"class":86,"line":124},[84,14465,8282],{},[84,14467,14468],{"class":86,"line":129},[84,14469,8287],{},[84,14471,14472],{"class":86,"line":135},[84,14473,8287],{},[84,14475,14476],{"class":86,"line":141},[84,14477,8287],{},[10,14479,153],{},[75,14481,14483],{"className":14482,"code":8301,"language":159,"meta":80},[157],[43,14484,8301],{"__ignoreMap":80},[10,14486,164],{},[14,14488,167],{"id":167},[169,14490,14491,14495],{},[40,14492,7892,14493,8315],{},[43,14494,8314],{},[40,14496,8318,14497,8321,14499,8324,14501,8328],{},[43,14498,8225],{},[43,14500,8211],{},[43,14502,8327],{},[338,14504,2704],{"id":2704},[10,14506,8333,14507,8336],{},[43,14508,8225],{},[10,14510,14511],{},[26,14512],{"alt":8341,"src":8342},[10,14514,8345,14515,8348],{},[43,14516,8211],{},[14,14518,182],{"id":182},[37,14520,14521,14523],{},[40,14522,8355],{},[40,14524,8358],{},[14,14526,199],{"id":199},[169,14528,14529,14531],{},[40,14530,8365],{},[40,14532,4017,14533,8370,14535,8373],{},[43,14534,4344],{},[43,14536,8225],{},[10,14538,214],{},[14,14540,217],{"id":217},[10,14542,8380],{},[222,14544,224],{},{"title":80,"searchDepth":93,"depth":93,"links":14546},[14547,14548,14549,14550,14551,14554,14555,14556],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":14552},[14553],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":8187,"description":8192},[235,8402,8403],{"id":8406,"title":8407,"body":14561,"category":235,"cover":236,"description":8412,"extension":237,"meta":14744,"navigation":96,"path":8637,"pinned":240,"publishedAt":241,"seo":14745,"slug":8639,"stem":8640,"summary":8641,"tags":14746,"updatedAt":241,"visible":96,"__hash__":8644},{"type":7,"value":14562,"toc":14732},[14563,14565,14567,14569,14571,14575,14577,14579,14593,14595,14597,14665,14667,14672,14674,14676,14690,14692,14694,14698,14704,14706,14714,14716,14724,14726,14728,14730],[10,14564,8412],{},[14,14566,16],{"id":16},[10,14568,8417],{},[14,14570,22],{"id":22},[10,14572,14573],{},[26,14574],{"alt":8424,"src":8425},[10,14576,8428],{},[14,14578,35],{"id":35},[37,14580,14581,14587,14589],{},[40,14582,14583,8438,14585,56],{},[43,14584,8437],{},[43,14586,8441],{},[40,14588,8444],{},[40,14590,14591,8450],{},[43,14592,8449],{},[14,14594,70],{"id":70},[10,14596,73],{},[75,14598,14599],{"className":77,"code":8457,"language":79,"meta":80,"style":80},[43,14600,14601,14605,14609,14613,14617,14621,14625,14629,14633,14637,14641,14645,14649,14653,14657,14661],{"__ignoreMap":80},[84,14602,14603],{"class":86,"line":87},[84,14604,8464],{},[84,14606,14607],{"class":86,"line":93},[84,14608,97],{"emptyLinePlaceholder":96},[84,14610,14611],{"class":86,"line":100},[84,14612,8473],{},[84,14614,14615],{"class":86,"line":106},[84,14616,8478],{},[84,14618,14619],{"class":86,"line":112},[84,14620,8483],{},[84,14622,14623],{"class":86,"line":118},[84,14624,8488],{},[84,14626,14627],{"class":86,"line":124},[84,14628,8493],{},[84,14630,14631],{"class":86,"line":129},[84,14632,8498],{},[84,14634,14635],{"class":86,"line":135},[84,14636,8503],{},[84,14638,14639],{"class":86,"line":141},[84,14640,8508],{},[84,14642,14643],{"class":86,"line":147},[84,14644,97],{"emptyLinePlaceholder":96},[84,14646,14647],{"class":86,"line":5839},[84,14648,8517],{},[84,14650,14651],{"class":86,"line":7399},[84,14652,6187],{},[84,14654,14655],{"class":86,"line":7405},[84,14656,6192],{},[84,14658,14659],{"class":86,"line":8528},[84,14660,97],{"emptyLinePlaceholder":96},[84,14662,14663],{"class":86,"line":8533},[84,14664,8536],{},[10,14666,153],{},[75,14668,14670],{"className":14669,"code":8542,"language":159,"meta":80},[157],[43,14671,8542],{"__ignoreMap":80},[10,14673,164],{},[14,14675,167],{"id":167},[169,14677,14678,14688],{},[40,14679,8553,14680,8557,14682,8561,14684,8565,14686,56],{},[43,14681,8556],{},[43,14683,8560],{},[43,14685,8564],{},[43,14687,8556],{},[40,14689,8570],{},[338,14691,2704],{"id":2704},[10,14693,8575],{},[10,14695,14696],{},[26,14697],{"alt":8580,"src":8581},[10,14699,14700,8586,14702,56],{},[43,14701,8437],{},[43,14703,8441],{},[14,14705,182],{"id":182},[37,14707,14708,14712],{},[40,14709,8595,14710,56],{},[43,14711,5386],{},[40,14713,8600],{},[14,14715,199],{"id":199},[169,14717,14718,14720],{},[40,14719,8607],{},[40,14721,8610,14722,8614],{},[43,14723,8613],{},[10,14725,214],{},[14,14727,217],{"id":217},[10,14729,8621],{},[222,14731,224],{},{"title":80,"searchDepth":93,"depth":93,"links":14733},[14734,14735,14736,14737,14738,14741,14742,14743],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":14739},[14740],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":8407,"description":8412},[235,8643,5337],{"id":8646,"title":8647,"body":14748,"category":235,"cover":236,"description":8652,"extension":237,"meta":14907,"navigation":96,"path":8840,"pinned":240,"publishedAt":241,"seo":14908,"slug":8842,"stem":8843,"summary":8844,"tags":14909,"updatedAt":241,"visible":96,"__hash__":8848},{"type":7,"value":14749,"toc":14895},[14750,14752,14754,14756,14758,14762,14764,14766,14774,14776,14778,14842,14844,14849,14851,14853,14861,14863,14865,14869,14871,14873,14879,14881,14887,14889,14891,14893],[10,14751,8652],{},[14,14753,16],{"id":16},[10,14755,8657],{},[14,14757,22],{"id":22},[10,14759,14760],{},[26,14761],{"alt":8664,"src":8665},[10,14763,8668],{},[14,14765,35],{"id":35},[37,14767,14768,14770,14772],{},[40,14769,8675],{},[40,14771,8678],{},[40,14773,8681],{},[14,14775,70],{"id":70},[10,14777,73],{},[75,14779,14780],{"className":77,"code":8688,"language":79,"meta":80,"style":80},[43,14781,14782,14786,14790,14794,14798,14802,14806,14810,14814,14818,14822,14826,14830,14834,14838],{"__ignoreMap":80},[84,14783,14784],{"class":86,"line":87},[84,14785,8695],{},[84,14787,14788],{"class":86,"line":93},[84,14789,8700],{},[84,14791,14792],{"class":86,"line":100},[84,14793,97],{"emptyLinePlaceholder":96},[84,14795,14796],{"class":86,"line":106},[84,14797,8709],{},[84,14799,14800],{"class":86,"line":112},[84,14801,97],{"emptyLinePlaceholder":96},[84,14803,14804],{"class":86,"line":118},[84,14805,8718],{},[84,14807,14808],{"class":86,"line":124},[84,14809,8723],{},[84,14811,14812],{"class":86,"line":129},[84,14813,8728],{},[84,14815,14816],{"class":86,"line":135},[84,14817,97],{"emptyLinePlaceholder":96},[84,14819,14820],{"class":86,"line":141},[84,14821,8737],{},[84,14823,14824],{"class":86,"line":147},[84,14825,8742],{},[84,14827,14828],{"class":86,"line":5839},[84,14829,8747],{},[84,14831,14832],{"class":86,"line":7399},[84,14833,97],{"emptyLinePlaceholder":96},[84,14835,14836],{"class":86,"line":7405},[84,14837,6201],{},[84,14839,14840],{"class":86,"line":8528},[84,14841,8760],{},[10,14843,153],{},[75,14845,14847],{"className":14846,"code":8766,"language":159,"meta":80},[157],[43,14848,8766],{"__ignoreMap":80},[10,14850,164],{},[14,14852,167],{"id":167},[169,14854,14855,14859],{},[40,14856,14857,8780],{},[43,14858,8779],{},[40,14860,8783],{},[338,14862,2704],{"id":2704},[10,14864,8788],{},[10,14866,14867],{},[26,14868],{"alt":8793,"src":8794},[10,14870,8797],{},[14,14872,182],{"id":182},[37,14874,14875,14877],{},[40,14876,8804],{},[40,14878,8807],{},[14,14880,199],{"id":199},[169,14882,14883,14885],{},[40,14884,8814],{},[40,14886,8817],{},[10,14888,214],{},[14,14890,217],{"id":217},[10,14892,8824],{},[222,14894,224],{},{"title":80,"searchDepth":93,"depth":93,"links":14896},[14897,14898,14899,14900,14901,14904,14905,14906],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":14902},[14903],{"id":2704,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":8647,"description":8652},[235,8846,8847],{"id":8850,"title":8851,"body":14911,"category":235,"cover":236,"description":8856,"extension":237,"meta":15149,"navigation":96,"path":9157,"pinned":240,"publishedAt":241,"seo":15150,"slug":9159,"stem":9160,"summary":9161,"tags":15151,"updatedAt":241,"visible":96,"__hash__":9165},{"type":7,"value":14912,"toc":15136},[14913,14915,14917,14919,14921,14925,14927,14929,14939,14941,14943,15059,15061,15066,15068,15070,15080,15082,15084,15088,15090,15092,15094,15098,15102,15104,15112,15114,15128,15130,15132,15134],[10,14914,8856],{},[14,14916,16],{"id":16},[10,14918,8861],{},[14,14920,22],{"id":22},[10,14922,14923],{},[26,14924],{"alt":8868,"src":8869},[10,14926,8872],{},[14,14928,35],{"id":35},[37,14930,14931,14933,14935],{},[40,14932,8879],{},[40,14934,8882],{},[40,14936,8885,14937,8889],{},[43,14938,8888],{},[14,14940,70],{"id":70},[10,14942,73],{},[75,14944,14945],{"className":77,"code":8896,"language":79,"meta":80,"style":80},[43,14946,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035,15039,15043,15047,15051,15055],{"__ignoreMap":80},[84,14948,14949],{"class":86,"line":87},[84,14950,6954],{},[84,14952,14953],{"class":86,"line":93},[84,14954,90],{},[84,14956,14957],{"class":86,"line":100},[84,14958,97],{"emptyLinePlaceholder":96},[84,14960,14961],{"class":86,"line":106},[84,14962,8915],{},[84,14964,14965],{"class":86,"line":112},[84,14966,8920],{},[84,14968,14969],{"class":86,"line":118},[84,14970,8925],{},[84,14972,14973],{"class":86,"line":124},[84,14974,8930],{},[84,14976,14977],{"class":86,"line":129},[84,14978,97],{"emptyLinePlaceholder":96},[84,14980,14981],{"class":86,"line":135},[84,14982,8939],{},[84,14984,14985],{"class":86,"line":141},[84,14986,8944],{},[84,14988,14989],{"class":86,"line":147},[84,14990,8949],{},[84,14992,14993],{"class":86,"line":5839},[84,14994,8954],{},[84,14996,14997],{"class":86,"line":7399},[84,14998,8959],{},[84,15000,15001],{"class":86,"line":7405},[84,15002,97],{"emptyLinePlaceholder":96},[84,15004,15005],{"class":86,"line":8528},[84,15006,8968],{},[84,15008,15009],{"class":86,"line":8533},[84,15010,8973],{},[84,15012,15013],{"class":86,"line":8976},[84,15014,8979],{},[84,15016,15017],{"class":86,"line":8982},[84,15018,97],{"emptyLinePlaceholder":96},[84,15020,15021],{"class":86,"line":8987},[84,15022,8990],{},[84,15024,15025],{"class":86,"line":8993},[84,15026,97],{"emptyLinePlaceholder":96},[84,15028,15029],{"class":86,"line":8998},[84,15030,7372],{},[84,15032,15033],{"class":86,"line":9003},[84,15034,9006],{},[84,15036,15037],{"class":86,"line":9009},[84,15038,9012],{},[84,15040,15041],{"class":86,"line":9015},[84,15042,9018],{},[84,15044,15045],{"class":86,"line":9021},[84,15046,7382],{},[84,15048,15049],{"class":86,"line":9026},[84,15050,9029],{},[84,15052,15053],{"class":86,"line":9032},[84,15054,1154],{},[84,15056,15057],{"class":86,"line":9037},[84,15058,9040],{},[10,15060,153],{},[75,15062,15064],{"className":15063,"code":9046,"language":159,"meta":80},[157],[43,15065,9046],{"__ignoreMap":80},[10,15067,164],{},[14,15069,167],{"id":167},[169,15071,15072,15076],{},[40,15073,9057,15074,9060],{},[43,15075,8888],{},[40,15077,15078,9065],{},[43,15079,8120],{},[338,15081,2704],{"id":2704},[10,15083,9070],{},[10,15085,15086],{},[26,15087],{"alt":9075,"src":9076},[10,15089,9079],{},[338,15091,2704],{"id":4225},[10,15093,9084],{},[10,15095,15096],{},[26,15097],{"alt":9089,"src":9090},[10,15099,9093,15100,9097],{},[43,15101,9096],{},[14,15103,182],{"id":182},[37,15105,15106,15108],{},[40,15107,9104],{},[40,15109,9107,15110,9110],{},[43,15111,9096],{},[14,15113,199],{"id":199},[169,15115,15116,15120,15122],{},[40,15117,9117,15118,9120],{},[43,15119,9096],{},[40,15121,9123],{},[40,15123,9126,15124,9130,15126,9133],{},[43,15125,9129],{},[43,15127,6143],{},[10,15129,214],{},[14,15131,217],{"id":217},[10,15133,9140],{},[222,15135,224],{},{"title":80,"searchDepth":93,"depth":93,"links":15137},[15138,15139,15140,15141,15142,15146,15147,15148],{"id":16,"depth":93,"text":16},{"id":22,"depth":93,"text":22},{"id":35,"depth":93,"text":35},{"id":70,"depth":93,"text":70},{"id":167,"depth":93,"text":167,"children":15143},[15144,15145],{"id":2704,"depth":100,"text":2704},{"id":4225,"depth":100,"text":2704},{"id":182,"depth":93,"text":182},{"id":199,"depth":93,"text":199},{"id":217,"depth":93,"text":217},{},{"title":8851,"description":8856},[235,9163,9164],{"id":1064,"title":1065,"body":15153,"category":235,"cover":1073,"description":80,"extension":237,"meta":15389,"navigation":96,"path":1390,"pinned":240,"publishedAt":1391,"seo":15390,"slug":1393,"stem":1394,"summary":1395,"tags":15391,"updatedAt":1391,"visible":96,"__hash__":1399},{"type":7,"value":15154,"toc":15374},[15155,15159,15161,15163,15165,15167,15187,15189,15194,15196,15198,15226,15232,15234,15238,15240,15260,15262,15272,15274,15276,15278,15280,15282,15284,15286,15288,15290,15310,15312,15314,15318,15320,15322,15324,15326,15330,15332,15350,15352,15354,15356,15358,15360,15362,15364,15366,15368,15370,15372],[10,15156,15157],{},[26,15158],{"alt":1072,"src":1073},[10,15160,1076],{},[10,15162,1079],{},[14,15164,1083],{"id":1082},[10,15166,1086],{},[75,15168,15169],{"className":77,"code":1089,"language":79,"meta":80,"style":80},[43,15170,15171,15175,15179,15183],{"__ignoreMap":80},[84,15172,15173],{"class":86,"line":87},[84,15174,1096],{},[84,15176,15177],{"class":86,"line":93},[84,15178,1101],{},[84,15180,15181],{"class":86,"line":100},[84,15182,97],{"emptyLinePlaceholder":96},[84,15184,15185],{"class":86,"line":106},[84,15186,1110],{},[10,15188,1113],{},[75,15190,15192],{"className":15191,"code":1117,"language":159,"meta":80},[157],[43,15193,1117],{"__ignoreMap":80},[10,15195,1122],{},[10,15197,1125],{},[75,15199,15200],{"className":77,"code":1128,"language":79,"meta":80,"style":80},[43,15201,15202,15206,15210,15214,15218,15222],{"__ignoreMap":80},[84,15203,15204],{"class":86,"line":87},[84,15205,1135],{},[84,15207,15208],{"class":86,"line":93},[84,15209,97],{"emptyLinePlaceholder":96},[84,15211,15212],{"class":86,"line":100},[84,15213,1144],{},[84,15215,15216],{"class":86,"line":106},[84,15217,1149],{},[84,15219,15220],{"class":86,"line":112},[84,15221,1154],{},[84,15223,15224],{"class":86,"line":118},[84,15225,1159],{},[10,15227,15228,1165,15230,1169],{},[43,15229,1164],{},[43,15231,1168],{},[14,15233,1173],{"id":1172},[10,15235,1176,15236,1180],{},[43,15237,1179],{},[10,15239,1183],{},[75,15241,15242],{"className":77,"code":1186,"language":79,"meta":80,"style":80},[43,15243,15244,15248,15252,15256],{"__ignoreMap":80},[84,15245,15246],{"class":86,"line":87},[84,15247,1193],{},[84,15249,15250],{"class":86,"line":93},[84,15251,1198],{},[84,15253,15254],{"class":86,"line":100},[84,15255,1203],{},[84,15257,15258],{"class":86,"line":106},[84,15259,1208],{},[10,15261,1211],{},[75,15263,15264],{"className":599,"code":1214,"language":601,"meta":80,"style":80},[43,15265,15266],{"__ignoreMap":80},[84,15267,15268,15270],{"class":86,"line":87},[84,15269,699],{"class":608},[84,15271,1223],{"class":644},[10,15273,1226],{},[14,15275,1230],{"id":1229},[338,15277,1233],{"id":1233},[10,15279,1236],{},[338,15281,1239],{"id":1239},[10,15283,1242],{},[338,15285,1245],{"id":1245},[10,15287,1248],{},[10,15289,1251],{},[75,15291,15292],{"className":77,"code":1254,"language":79,"meta":80,"style":80},[43,15293,15294,15298,15302,15306],{"__ignoreMap":80},[84,15295,15296],{"class":86,"line":87},[84,15297,1261],{},[84,15299,15300],{"class":86,"line":93},[84,15301,97],{"emptyLinePlaceholder":96},[84,15303,15304],{"class":86,"line":100},[84,15305,1270],{},[84,15307,15308],{"class":86,"line":106},[84,15309,1275],{},[10,15311,1278],{},[338,15313,1281],{"id":1281},[10,15315,1284,15316,1287],{},[43,15317,270],{},[10,15319,1290],{},[338,15321,1293],{"id":1293},[10,15323,1296],{},[14,15325,1300],{"id":1299},[10,15327,15328],{},[26,15329],{"alt":1305,"src":1306},[10,15331,1309],{},[37,15333,15334,15336,15338,15340,15342,15344,15346,15348],{},[40,15335,1314],{},[40,15337,1317],{},[40,15339,1320],{},[40,15341,1323],{},[40,15343,1326],{},[40,15345,1329],{},[40,15347,1332],{},[40,15349,1335],{},[10,15351,1338],{},[14,15353,1342],{"id":1341},[10,15355,1345],{},[10,15357,1348],{},[14,15359,1352],{"id":1351},[10,15361,1355],{},[10,15363,1358],{},[10,15365,1361],{},[14,15367,1364],{"id":1364},[10,15369,1367],{},[10,15371,1370],{},[222,15373,1373],{},{"title":80,"searchDepth":93,"depth":93,"links":15375},[15376,15377,15378,15385,15386,15387,15388],{"id":1082,"depth":93,"text":1083},{"id":1172,"depth":93,"text":1173},{"id":1229,"depth":93,"text":1230,"children":15379},[15380,15381,15382,15383,15384],{"id":1233,"depth":100,"text":1233},{"id":1239,"depth":100,"text":1239},{"id":1245,"depth":100,"text":1245},{"id":1281,"depth":100,"text":1281},{"id":1293,"depth":100,"text":1293},{"id":1299,"depth":93,"text":1300},{"id":1341,"depth":93,"text":1342},{"id":1351,"depth":93,"text":1352},{"id":1364,"depth":93,"text":1364},{},{"title":1065,"description":80},[235,1397,1398],{"id":252,"title":253,"body":15393,"category":235,"cover":236,"description":80,"extension":237,"meta":15972,"navigation":96,"path":1053,"pinned":240,"publishedAt":1054,"seo":15973,"slug":1056,"stem":1057,"summary":1058,"tags":15974,"updatedAt":1054,"visible":96,"__hash__":1062},{"type":7,"value":15394,"toc":15948},[15395,15397,15399,15401,15405,15407,15409,15433,15445,15447,15449,15454,15458,15462,15474,15478,15482,15486,15488,15522,15524,15528,15532,15534,15556,15586,15598,15608,15616,15618,15624,15634,15636,15641,15645,15647,15661,15667,15687,15689,15691,15693,15703,15707,15709,15718,15722,15724,15726,15746,15750,15752,15754,15756,15758,15778,15780,15782,15784,15810,15812,15828,15830,15846,15850,15852,15854,15874,15876,15878,15880,15884,15894,15896,15898,15900,15910,15918,15920,15922,15936,15946],[14,15396,258],{"id":258},[10,15398,261],{},[10,15400,264],{},[10,15402,267,15403,271],{},[43,15404,270],{},[14,15406,274],{"id":274},[10,15408,277],{},[279,15410,15411,15413],{},[10,15412,283],{},[279,15414,15415,15421,15423,15427,15429],{},[10,15416,288,15417,292,15419,296],{},[43,15418,291],{},[43,15420,295],{},[10,15422,299],{},[10,15424,302,15425,307],{},[304,15426,306],{},[10,15428,310],{},[10,15430,15431],{},[26,15432],{"alt":315,"src":316},[279,15434,15435,15437],{},[10,15436,321],{},[279,15438,15439,15441],{},[10,15440,326],{},[10,15442,15443],{},[26,15444],{"alt":331,"src":332},[14,15446,336],{"id":335},[338,15448,341],{"id":340},[10,15450,344,15451,351],{},[210,15452,350],{"href":347,"rel":15453},[349],[279,15455,15456],{},[10,15457,356],{},[10,15459,15460],{},[26,15461],{"alt":361,"src":362},[37,15463,15464,15468,15472],{},[40,15465,367,15466,56],{},[304,15467,370],{},[40,15469,373,15470,56],{},[304,15471,376],{},[40,15473,379],{},[10,15475,15476],{},[26,15477],{"alt":384,"src":385},[279,15479,15480],{},[10,15481,390],{},[10,15483,15484],{},[26,15485],{"alt":395,"src":396},[338,15487,400],{"id":399},[279,15489,15490,15494,15498,15518],{},[279,15491,15492],{},[10,15493,407],{},[10,15495,410,15496,414],{},[304,15497,413],{},[75,15499,15500],{"className":77,"code":417,"language":79,"meta":80,"style":80},[43,15501,15502,15506,15510,15514],{"__ignoreMap":80},[84,15503,15504],{"class":86,"line":87},[84,15505,424],{},[84,15507,15508],{"class":86,"line":93},[84,15509,429],{},[84,15511,15512],{"class":86,"line":100},[84,15513,434],{},[84,15515,15516],{"class":86,"line":106},[84,15517,439],{},[10,15519,442,15520,446],{},[304,15521,445],{},[10,15523,449],{},[10,15525,452,15526,455],{},[43,15527,79],{},[10,15529,15530],{},[26,15531],{"alt":460,"src":461},[10,15533,464],{},[279,15535,15536,15538,15542],{},[10,15537,469],{},[10,15539,15540],{},[304,15541,474],{},[279,15543,15544,15548,15552],{},[10,15545,479,15546,482],{},[43,15547,79],{},[10,15549,485,15550,488],{},[43,15551,79],{},[10,15553,491,15554,495],{},[304,15555,494],{},[279,15557,15558,15560,15564],{},[10,15559,500],{},[10,15561,15562],{},[304,15563,505],{},[279,15565,15566,15572,15580,15582],{},[10,15567,15568,513,15570,517],{},[43,15569,512],{},[43,15571,516],{},[10,15573,520,15574,523,15576,527,15578,531],{},[43,15575,512],{},[304,15577,526],{},[304,15579,530],{},[10,15581,534],{},[10,15583,15584,540],{},[304,15585,539],{},[279,15587,15588,15590],{},[10,15589,545],{},[279,15591,15592,15596],{},[10,15593,550,15594,554],{},[304,15595,553],{},[10,15597,557],{},[279,15599,15600,15604],{},[10,15601,562,15602],{},[304,15603,565],{},[10,15605,15606],{},[26,15607],{"alt":570,"src":571},[279,15609,15610,15612],{},[10,15611,576],{},[10,15613,15614],{},[26,15615],{"alt":570,"src":581},[338,15617,585],{"id":584},[10,15619,588,15620,592,15622,596],{},[43,15621,591],{},[43,15623,595],{},[75,15625,15626],{"className":599,"code":600,"language":601,"meta":80,"style":80},[43,15627,15628],{"__ignoreMap":80},[84,15629,15630,15632],{"class":86,"line":87},[84,15631,79],{"class":608},[84,15633,612],{"class":611},[10,15635,615],{},[75,15637,15639],{"className":15638,"code":619,"language":159,"meta":80},[157],[43,15640,619],{"__ignoreMap":80},[10,15642,15643],{},[26,15644],{"alt":570,"src":626},[10,15646,629],{},[75,15648,15649],{"className":599,"code":632,"language":601,"meta":80,"style":80},[43,15650,15651],{"__ignoreMap":80},[84,15652,15653,15655,15657,15659],{"class":86,"line":87},[84,15654,79],{"class":608},[84,15656,641],{"class":611},[84,15658,645],{"class":644},[84,15660,612],{"class":611},[10,15662,650,15663,653,15665,657],{},[43,15664,79],{},[43,15666,656],{},[75,15668,15669],{"className":599,"code":660,"language":601,"meta":80,"style":80},[43,15670,15671,15677],{"__ignoreMap":80},[84,15672,15673,15675],{"class":86,"line":87},[84,15674,516],{"class":608},[84,15676,612],{"class":611},[84,15678,15679,15681,15683,15685],{"class":86,"line":93},[84,15680,516],{"class":608},[84,15682,641],{"class":611},[84,15684,645],{"class":644},[84,15686,612],{"class":611},[14,15688,682],{"id":681},[338,15690,686],{"id":685},[10,15692,689],{},[75,15694,15695],{"className":599,"code":692,"language":601,"meta":80,"style":80},[43,15696,15697],{"__ignoreMap":80},[84,15698,15699,15701],{"class":86,"line":87},[84,15700,699],{"class":608},[84,15702,612],{"class":611},[10,15704,704,15705,708],{},[43,15706,707],{},[338,15708,712],{"id":711},[10,15710,344,15711,720,15714,56,15716,727],{},[210,15712,719],{"href":717,"rel":15713},[349],[304,15715,723],{},[43,15717,726],{},[10,15719,730,15720,734],{},[43,15721,733],{},[338,15723,738],{"id":737},[10,15725,741],{},[75,15727,15728],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,15729,15730,15736],{"__ignoreMap":80},[84,15731,15732,15734],{"class":86,"line":87},[84,15733,699],{"class":608},[84,15735,612],{"class":611},[84,15737,15738,15740,15742,15744],{"class":86,"line":93},[84,15739,699],{"class":608},[84,15741,641],{"class":611},[84,15743,645],{"class":644},[84,15745,612],{"class":611},[10,15747,765,15748,768],{},[43,15749,699],{},[14,15751,772],{"id":771},[10,15753,775],{},[338,15755,779],{"id":778},[10,15757,782],{},[75,15759,15760],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,15761,15762,15768],{"__ignoreMap":80},[84,15763,15764,15766],{"class":86,"line":87},[84,15765,699],{"class":608},[84,15767,612],{"class":611},[84,15769,15770,15772,15774,15776],{"class":86,"line":93},[84,15771,699],{"class":608},[84,15773,641],{"class":611},[84,15775,645],{"class":644},[84,15777,612],{"class":611},[10,15779,805],{},[338,15781,809],{"id":808},[10,15783,812],{},[75,15785,15786],{"className":599,"code":815,"language":601,"meta":80,"style":80},[43,15787,15788,15796],{"__ignoreMap":80},[84,15789,15790,15792,15794],{"class":86,"line":87},[84,15791,822],{"class":608},[84,15793,825],{"class":644},[84,15795,828],{"class":644},[84,15797,15798,15800,15802,15804,15806,15808],{"class":86,"line":93},[84,15799,822],{"class":608},[84,15801,825],{"class":644},[84,15803,837],{"class":644},[84,15805,840],{"class":644},[84,15807,843],{"class":644},[84,15809,846],{"class":644},[10,15811,849],{},[75,15813,15814],{"className":599,"code":852,"language":601,"meta":80,"style":80},[43,15815,15816],{"__ignoreMap":80},[84,15817,15818,15820,15822,15824,15826],{"class":86,"line":87},[84,15819,822],{"class":608},[84,15821,861],{"class":644},[84,15823,837],{"class":644},[84,15825,840],{"class":644},[84,15827,868],{"class":644},[10,15829,871],{},[75,15831,15832],{"className":599,"code":874,"language":601,"meta":80,"style":80},[43,15833,15834],{"__ignoreMap":80},[84,15835,15836,15838,15840,15842,15844],{"class":86,"line":87},[84,15837,822],{"class":608},[84,15839,883],{"class":644},[84,15841,886],{"class":611},[84,15843,889],{"class":644},[84,15845,892],{"class":644},[10,15847,15848,897],{},[43,15849,822],{},[338,15851,901],{"id":900},[10,15853,904],{},[75,15855,15856],{"className":599,"code":744,"language":601,"meta":80,"style":80},[43,15857,15858,15864],{"__ignoreMap":80},[84,15859,15860,15862],{"class":86,"line":87},[84,15861,699],{"class":608},[84,15863,612],{"class":611},[84,15865,15866,15868,15870,15872],{"class":86,"line":93},[84,15867,699],{"class":608},[84,15869,641],{"class":611},[84,15871,645],{"class":644},[84,15873,612],{"class":611},[10,15875,927],{},[14,15877,930],{"id":930},[338,15879,934],{"id":933},[10,15881,937,15882,941],{},[43,15883,940],{},[169,15885,15886,15890,15892],{},[40,15887,946,15888,949],{},[43,15889,656],{},[40,15891,952],{},[40,15893,955],{},[10,15895,958],{},[338,15897,962],{"id":961},[10,15899,965],{},[75,15901,15902],{"className":599,"code":692,"language":601,"meta":80,"style":80},[43,15903,15904],{"__ignoreMap":80},[84,15905,15906,15908],{"class":86,"line":87},[84,15907,699],{"class":608},[84,15909,612],{"class":611},[10,15911,978,15912,981,15914,984,15916,56],{},[43,15913,699],{},[43,15915,79],{},[43,15917,699],{},[338,15919,990],{"id":989},[10,15921,993],{},[75,15923,15924],{"className":599,"code":996,"language":601,"meta":80,"style":80},[43,15925,15926],{"__ignoreMap":80},[84,15927,15928,15930,15932,15934],{"class":86,"line":87},[84,15929,699],{"class":608},[84,15931,641],{"class":611},[84,15933,645],{"class":644},[84,15935,612],{"class":611},[10,15937,1011,15938,1014,15940,1017,15942,1020,15944,1024],{},[43,15939,699],{},[43,15941,79],{},[43,15943,516],{},[43,15945,1023],{},[222,15947,1027],{},{"title":80,"searchDepth":93,"depth":93,"links":15949},[15950,15951,15952,15957,15962,15967],{"id":258,"depth":93,"text":258},{"id":274,"depth":93,"text":274},{"id":335,"depth":93,"text":336,"children":15953},[15954,15955,15956],{"id":340,"depth":100,"text":341},{"id":399,"depth":100,"text":400},{"id":584,"depth":100,"text":585},{"id":681,"depth":93,"text":682,"children":15958},[15959,15960,15961],{"id":685,"depth":100,"text":686},{"id":711,"depth":100,"text":712},{"id":737,"depth":100,"text":738},{"id":771,"depth":93,"text":772,"children":15963},[15964,15965,15966],{"id":778,"depth":100,"text":779},{"id":808,"depth":100,"text":809},{"id":900,"depth":100,"text":901},{"id":930,"depth":93,"text":930,"children":15968},[15969,15970,15971],{"id":933,"depth":100,"text":934},{"id":961,"depth":100,"text":962},{"id":989,"depth":100,"text":990},{},{"title":253,"description":80},[235,1060,1061],1786973365473]