[{"data":1,"prerenderedAt":15947},["ShallowReactive",2],{"post-python-tuple-basics":3,"sidebar-posts":206,"post-related-source":9138},{"id":4,"title":5,"body":6,"category":191,"cover":192,"description":12,"extension":193,"meta":194,"navigation":90,"path":195,"pinned":196,"publishedAt":197,"seo":198,"slug":199,"stem":200,"summary":201,"tags":202,"updatedAt":197,"visible":90,"__hash__":205},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":8,"toc":181},"minimark",[9,13,17,20,23,30,33,36,49,52,55,104,107,115,118,121,136,139,151,154,168,171,174,177],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[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\u002F12-list-tuple.svg",[10,31,32],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"元组常用来表达固定数量、固定含义的一组值。",[40,44,45],{},"只有一个元素的元组必须保留尾随逗号。",[40,47,48],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,50,51],{"id":51},"跟着示例运行",[10,53,54],{},"把下面代码保存到本课脚本并运行：",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-python shiki shiki-themes github-dark","point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n","python","",[63,64,65,73,79,85,92,98],"code",{"__ignoreMap":61},[66,67,70],"span",{"class":68,"line":69},"line",1,[66,71,72],{},"point = (120, 80)\n",[66,74,76],{"class":68,"line":75},2,[66,77,78],{},"print(point[0])\n",[66,80,82],{"class":68,"line":81},3,[66,83,84],{},"print(point[1])\n",[66,86,88],{"class":68,"line":87},4,[66,89,91],{"emptyLinePlaceholder":90},true,"\n",[66,93,95],{"class":68,"line":94},5,[66,96,97],{},"single = (5,)\n",[66,99,101],{"class":68,"line":100},6,[66,102,103],{},"print(single)\n",[10,105,106],{},"预期结果：",[56,108,113],{"className":109,"code":111,"language":112,"meta":61},[110],"language-text","120\n80\n(5,)\n","text",[63,114,111],{"__ignoreMap":61},[10,116,117],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,119,120],{"id":120},"按执行顺序拆开看",[122,123,124,130],"ol",{},[40,125,126,129],{},[63,127,128],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,131,132,135],{},[63,133,134],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,137,138],{"id":138},"初学者容易混淆的地方",[37,140,141,148],{},[40,142,143,144,147],{},"把 ",[63,145,146],{},"(5)"," 当作元组，实际它仍是整数。",[40,149,150],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,152,153],{"id":153},"练习",[122,155,156,159],{},[40,157,158],{},"用元组表示宽度和高度。",[40,160,161,162,164,165,167],{},"比较 ",[63,163,146],{}," 与 ",[63,166,134],{}," 的类型。",[10,169,170],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,172,173],{"id":173},"本篇边界",[10,175,176],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,179,180],"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":61,"searchDepth":75,"depth":75,"links":182},[183,184,185,186,187,188,189,190],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",false,"2026-08-17",{"title":5,"description":12},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[191,203,204],"元组","数据结构","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",[207,1021,1358,1492,1644,1823,2011,2174,2358,2541,2734,2965,3149,3325,3448,3619,3784,3999,4228,4410,4574,4763,4951,5106,5266,5463,5660,5874,6041,6285,6466,6671,6866,7050,7251,7541,7733,7962,8157,8377,8617,8821],{"id":208,"title":209,"body":210,"category":191,"cover":192,"description":61,"extension":193,"meta":1010,"navigation":90,"path":1011,"pinned":196,"publishedAt":1012,"seo":1013,"slug":1014,"stem":1015,"summary":1016,"tags":1017,"updatedAt":1012,"visible":90,"__hash__":1020},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":211,"toc":986},[212,215,218,221,228,231,234,273,289,293,298,309,314,320,338,344,349,355,359,405,408,414,420,423,454,499,516,530,540,544,555,571,574,580,585,588,606,616,637,641,645,648,660,667,671,686,693,697,700,721,727,731,734,738,741,761,764,768,771,805,808,827,830,851,856,860,863,883,886,889,893,900,914,917,921,924,934,945,949,952,967,983],[14,213,214],{"id":214},"引言",[10,216,217],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,219,220],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,222,223,224,227],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[63,225,226],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,229,230],{"id":230},"扫盲",[10,232,233],{},"那么这里有几个概念：",[235,236,237,240],"blockquote",{},[10,238,239],{},"为什么需要安装python解释器？",[235,241,242,253,256,264,267],{},[10,243,244,245,248,249,252],{},"我们写的代码，电脑其实看不懂，电脑只认识",[63,246,247],{},"0","和",[63,250,251],{},"1","组成的机器指令。",[10,254,255],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,257,258,259,263],{},"这样，我们就能用",[260,261,262],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,265,266],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,268,269],{},[26,270],{"alt":271,"src":272},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[235,274,275,278],{},[10,276,277],{},"pip又是什么？",[235,279,280,283],{},[10,281,282],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,284,285],{},[26,286],{"alt":287,"src":288},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,290,292],{"id":291},"windows-安装","Windows 安装",[294,295,297],"h3",{"id":296},"_1-下载官方安装程序","1. 下载官方安装程序",[10,299,300,301,308],{},"打开 ",[302,303,307],"a",{"href":304,"rel":305},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[306],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[235,310,311],{},[10,312,313],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,315,316],{},[26,317],{"alt":318,"src":319},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,321,322,329,335],{},[40,323,324,325,328],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[260,326,327],{},"Windows installer (64-bit)","。",[40,330,331,332,328],{},"搭载 ARM 处理器的 Windows 设备选择 ",[260,333,334],{},"Windows installer (ARM64)",[40,336,337],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,339,340],{},[26,341],{"alt":342,"src":343},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[235,345,346],{},[10,347,348],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,350,351],{},[26,352],{"alt":353,"src":354},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[294,356,358],{"id":357},"_2-安装并加入-path","2. 安装并加入 PATH",[235,360,361,366,373,398],{},[235,362,363],{},[10,364,365],{},"PATH 环境变量",[10,367,368,369,372],{},"Windows 有一个特殊的变量叫 ",[260,370,371],{},"PATH","，它里面存了一串文件夹路径，比如：",[56,374,376],{"className":58,"code":375,"language":60,"meta":61,"style":61},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[63,377,378,383,388,393],{"__ignoreMap":61},[66,379,380],{"class":68,"line":69},[66,381,382],{},"D:\\Python313\\\n",[66,384,385],{"class":68,"line":75},[66,386,387],{},"D:\\Python313\\Scripts\\\n",[66,389,390],{"class":68,"line":81},[66,391,392],{},"C:\\Windows\\System32\\\n",[66,394,395],{"class":68,"line":87},[66,396,397],{},"...\n",[10,399,400,401,404],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[260,402,403],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,406,407],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,409,410,411,413],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[63,412,60],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,415,416],{},[26,417],{"alt":418,"src":419},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,421,422],{},"对安装界面最底部的两个勾选项分别解释 :",[235,424,425,428,433],{},[10,426,427],{},"Add python.exe to PATH",[10,429,430],{},[260,431,432],{},"把 Python 添加到系统环境变量",[235,434,435,441,447],{},[10,436,437,438,440],{},"勾选后，你可以在命令行任意位置直接输入 ",[63,439,60],{}," 就能运行",[10,442,443,444,446],{},"不勾选的话，命令行输入 ",[63,445,60],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,448,449,450,453],{},"必须",[260,451,452],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[235,455,456,459,464],{},[10,457,458],{},"Use admin privileges when installing py.exe",[10,460,461],{},[260,462,463],{},"使用管理员权限安装 py.exe（Python 启动器）",[235,465,466,476,490,493],{},[10,467,468,471,472,475],{},[63,469,470],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[63,473,474],{},"py"," 来启动 Python。",[10,477,478,479,481,482,485,486,489],{},"勾选后，",[63,480,470],{}," 会安装到",[260,483,484],{},"系统级目录","，电脑上",[260,487,488],{},"所有用户账户","都能用",[10,491,492],{},"不勾选，只有当前用户能用",[10,494,495,498],{},[260,496,497],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[235,500,501,504],{},[10,502,503],{},"操作建议",[235,505,506,513],{},[10,507,508,509,512],{},"两个都勾上之后，再点 ",[260,510,511],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,514,515],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[235,517,518,524],{},[10,519,520,521],{},"Python 安装的",[260,522,523],{},"可选功能页",[10,525,526],{},[26,527],{"alt":528,"src":529},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[235,531,532,535],{},[10,533,534],{},"高级选项页",[10,536,537],{},[26,538],{"alt":528,"src":539},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[294,541,543],{"id":542},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,545,546,547,550,551,554],{},"按 ",[63,548,549],{},"Win + R","，输入 ",[63,552,553],{},"cmd"," 并回车，然后执行：",[56,556,560],{"className":557,"code":558,"language":559,"meta":61,"style":61},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[63,561,562],{"__ignoreMap":61},[66,563,564,567],{"class":68,"line":69},[66,565,60],{"class":566},"svObZ",[66,568,570],{"class":569},"sDLfK"," --version\n",[10,572,573],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[56,575,578],{"className":576,"code":577,"language":112,"meta":61},[110],"Python 3.x.x\n",[63,579,577],{"__ignoreMap":61},[10,581,582],{},[26,583],{"alt":528,"src":584},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,586,587],{},"继续检查 pip：",[56,589,591],{"className":557,"code":590,"language":559,"meta":61,"style":61},"python -m pip --version\n",[63,592,593],{"__ignoreMap":61},[66,594,595,597,600,604],{"class":68,"line":69},[66,596,60],{"class":566},[66,598,599],{"class":569}," -m",[66,601,603],{"class":602},"sU2Wk"," pip",[66,605,570],{"class":569},[10,607,608,609,611,612,615],{},"如果 ",[63,610,60],{}," 无法识别，但 ",[63,613,614],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[56,617,619],{"className":557,"code":618,"language":559,"meta":61,"style":61},"py --version\npy -m pip --version\n",[63,620,621,627],{"__ignoreMap":61},[66,622,623,625],{"class":68,"line":69},[66,624,474],{"class":566},[66,626,570],{"class":569},[66,628,629,631,633,635],{"class":68,"line":75},[66,630,474],{"class":566},[66,632,599],{"class":569},[66,634,603],{"class":602},[66,636,570],{"class":569},[14,638,640],{"id":639},"macos-安装","macOS 安装",[294,642,644],{"id":643},"_1-先检查现有环境","1. 先检查现有环境",[10,646,647],{},"打开“终端”应用，执行：",[56,649,651],{"className":557,"code":650,"language":559,"meta":61,"style":61},"python3 --version\n",[63,652,653],{"__ignoreMap":61},[66,654,655,658],{"class":68,"line":69},[66,656,657],{"class":566},"python3",[66,659,570],{"class":569},[10,661,662,663,666],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[63,664,665],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[294,668,670],{"id":669},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,672,300,673,678,679,328,682,685],{},[302,674,677],{"href":675,"rel":676},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[306],"Python macOS 下载页","，下载当前稳定版的 ",[260,680,681],{},"macOS 64-bit universal2 installer",[63,683,684],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,687,688,689,692],{},"下载完成后打开 ",[63,690,691],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[294,694,696],{"id":695},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,698,699],{},"安装完成后重新打开终端，执行：",[56,701,703],{"className":557,"code":702,"language":559,"meta":61,"style":61},"python3 --version\npython3 -m pip --version\n",[63,704,705,711],{"__ignoreMap":61},[66,706,707,709],{"class":68,"line":69},[66,708,657],{"class":566},[66,710,570],{"class":569},[66,712,713,715,717,719],{"class":68,"line":75},[66,714,657],{"class":566},[66,716,599],{"class":569},[66,718,603],{"class":602},[66,720,570],{"class":569},[10,722,723,724,726],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[63,725,657],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,728,730],{"id":729},"linux-安装","Linux 安装",[10,732,733],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[294,735,737],{"id":736},"_1-检查是否已经安装","1. 检查是否已经安装",[10,739,740],{},"打开终端，执行：",[56,742,743],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,744,745,751],{"__ignoreMap":61},[66,746,747,749],{"class":68,"line":69},[66,748,657],{"class":566},[66,750,570],{"class":569},[66,752,753,755,757,759],{"class":68,"line":75},[66,754,657],{"class":566},[66,756,599],{"class":569},[66,758,603],{"class":602},[66,760,570],{"class":569},[10,762,763],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[294,765,767],{"id":766},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,769,770],{},"Ubuntu 或 Debian：",[56,772,774],{"className":557,"code":773,"language":559,"meta":61,"style":61},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[63,775,776,787],{"__ignoreMap":61},[66,777,778,781,784],{"class":68,"line":69},[66,779,780],{"class":566},"sudo",[66,782,783],{"class":602}," apt",[66,785,786],{"class":602}," update\n",[66,788,789,791,793,796,799,802],{"class":68,"line":75},[66,790,780],{"class":566},[66,792,783],{"class":602},[66,794,795],{"class":602}," install",[66,797,798],{"class":602}," python3",[66,800,801],{"class":602}," python3-pip",[66,803,804],{"class":602}," python3-venv\n",[10,806,807],{},"Fedora：",[56,809,811],{"className":557,"code":810,"language":559,"meta":61,"style":61},"sudo dnf install python3 python3-pip\n",[63,812,813],{"__ignoreMap":61},[66,814,815,817,820,822,824],{"class":68,"line":69},[66,816,780],{"class":566},[66,818,819],{"class":602}," dnf",[66,821,795],{"class":602},[66,823,798],{"class":602},[66,825,826],{"class":602}," python3-pip\n",[10,828,829],{},"Arch Linux：",[56,831,833],{"className":557,"code":832,"language":559,"meta":61,"style":61},"sudo pacman -S python python-pip\n",[63,834,835],{"__ignoreMap":61},[66,836,837,839,842,845,848],{"class":68,"line":69},[66,838,780],{"class":566},[66,840,841],{"class":602}," pacman",[66,843,844],{"class":569}," -S",[66,846,847],{"class":602}," python",[66,849,850],{"class":602}," python-pip\n",[10,852,853,855],{},[63,854,780],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[294,857,859],{"id":858},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,861,862],{},"安装结束后执行：",[56,864,865],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,866,867,873],{"__ignoreMap":61},[66,868,869,871],{"class":68,"line":69},[66,870,657],{"class":566},[66,872,570],{"class":569},[66,874,875,877,879,881],{"class":68,"line":75},[66,876,657],{"class":566},[66,878,599],{"class":569},[66,880,603],{"class":602},[66,882,570],{"class":569},[10,884,885],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,887,888],{"id":888},"常见问题",[294,890,892],{"id":891},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,894,895,896,899],{},"先关闭当前命令提示符并重新打开，再执行 ",[63,897,898],{},"python --version","。如果仍然失败，按下面的顺序检查：",[122,901,902,908,911],{},[40,903,904,905,907],{},"执行 ",[63,906,614],{},"，确认 Python Launcher 是否可用。",[40,909,910],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,912,913],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,915,916],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[294,918,920],{"id":919},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,922,923],{},"先尝试：",[56,925,926],{"className":557,"code":650,"language":559,"meta":61,"style":61},[63,927,928],{"__ignoreMap":61},[66,929,930,932],{"class":68,"line":69},[66,931,657],{"class":566},[66,933,570],{"class":569},[10,935,936,937,939,940,942,943,328],{},"在这两个系统中，只有 ",[63,938,657],{}," 命令而没有 ",[63,941,60],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[63,944,657],{},[294,946,948],{"id":947},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,950,951],{},"先使用模块方式检查：",[56,953,955],{"className":557,"code":954,"language":559,"meta":61,"style":61},"python3 -m pip --version\n",[63,956,957],{"__ignoreMap":61},[66,958,959,961,963,965],{"class":68,"line":69},[66,960,657],{"class":566},[66,962,599],{"class":569},[66,964,603],{"class":602},[66,966,570],{"class":569},[10,968,969,970,972,973,975,976,978,979,982],{},"Windows 用户将命令中的 ",[63,971,657],{}," 换成 ",[63,974,60],{}," 或 ",[63,977,474],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[63,980,981],{},"python3-pip","；不要直接使用其他系统的安装命令。",[178,984,985],{},"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":61,"searchDepth":75,"depth":75,"links":987},[988,989,990,995,1000,1005],{"id":214,"depth":75,"text":214},{"id":230,"depth":75,"text":230},{"id":291,"depth":75,"text":292,"children":991},[992,993,994],{"id":296,"depth":81,"text":297},{"id":357,"depth":81,"text":358},{"id":542,"depth":81,"text":543},{"id":639,"depth":75,"text":640,"children":996},[997,998,999],{"id":643,"depth":81,"text":644},{"id":669,"depth":81,"text":670},{"id":695,"depth":81,"text":696},{"id":729,"depth":75,"text":730,"children":1001},[1002,1003,1004],{"id":736,"depth":81,"text":737},{"id":766,"depth":81,"text":767},{"id":858,"depth":81,"text":859},{"id":888,"depth":75,"text":888,"children":1006},[1007,1008,1009],{"id":891,"depth":81,"text":892},{"id":919,"depth":81,"text":920},{"id":947,"depth":81,"text":948},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":209,"description":61},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[191,1018,1019],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1022,"title":1023,"body":1024,"category":191,"cover":1031,"description":61,"extension":193,"meta":1347,"navigation":90,"path":1348,"pinned":196,"publishedAt":1349,"seo":1350,"slug":1351,"stem":1352,"summary":1353,"tags":1354,"updatedAt":1349,"visible":90,"__hash__":1357},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1025,"toc":1332},[1026,1032,1035,1038,1042,1045,1069,1072,1078,1081,1084,1118,1128,1132,1139,1142,1167,1170,1182,1185,1189,1192,1195,1198,1201,1204,1207,1210,1234,1237,1240,1246,1249,1252,1255,1259,1265,1268,1294,1297,1301,1304,1307,1311,1314,1317,1320,1323,1326,1329],[10,1027,1028],{},[26,1029],{"alt":1030,"src":1031},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1033,1034],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1036,1037],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1039,1041],{"id":1040},"python-代码是什么样的","Python 代码是什么样的",[10,1043,1044],{},"下面是一段简单的 Python 代码：",[56,1046,1048],{"className":58,"code":1047,"language":60,"meta":61,"style":61},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[63,1049,1050,1055,1060,1064],{"__ignoreMap":61},[66,1051,1052],{"class":68,"line":69},[66,1053,1054],{},"name = \"Python\"\n",[66,1056,1057],{"class":68,"line":75},[66,1058,1059],{},"year = 2026\n",[66,1061,1062],{"class":68,"line":81},[66,1063,91],{"emptyLinePlaceholder":90},[66,1065,1066],{"class":68,"line":87},[66,1067,1068],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1070,1071],{},"运行结果：",[56,1073,1076],{"className":1074,"code":1075,"language":112,"meta":61},[110],"正在学习 Python，当前年份是 2026\n",[63,1077,1075],{"__ignoreMap":61},[10,1079,1080],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1082,1083],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[56,1085,1087],{"className":58,"code":1086,"language":60,"meta":61,"style":61},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[63,1088,1089,1094,1098,1103,1108,1113],{"__ignoreMap":61},[66,1090,1091],{"class":68,"line":69},[66,1092,1093],{},"score = 85\n",[66,1095,1096],{"class":68,"line":75},[66,1097,91],{"emptyLinePlaceholder":90},[66,1099,1100],{"class":68,"line":81},[66,1101,1102],{},"if score >= 60:\n",[66,1104,1105],{"class":68,"line":87},[66,1106,1107],{},"    print(\"成绩合格\")\n",[66,1109,1110],{"class":68,"line":94},[66,1111,1112],{},"else:\n",[66,1114,1115],{"class":68,"line":100},[66,1116,1117],{},"    print(\"需要继续学习\")\n",[10,1119,1120,1123,1124,1127],{},[63,1121,1122],{},"if"," 和 ",[63,1125,1126],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1129,1131],{"id":1130},"python-如何运行代码","Python 如何运行代码",[10,1133,1134,1135,1138],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[63,1136,1137],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1140,1141],{},"交互式环境适合快速验证一个表达式：",[56,1143,1145],{"className":58,"code":1144,"language":60,"meta":61,"style":61},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[63,1146,1147,1152,1157,1162],{"__ignoreMap":61},[66,1148,1149],{"class":68,"line":69},[66,1150,1151],{},">>> 10 + 20\n",[66,1153,1154],{"class":68,"line":75},[66,1155,1156],{},"30\n",[66,1158,1159],{"class":68,"line":81},[66,1160,1161],{},">>> \"Python\".lower()\n",[66,1163,1164],{"class":68,"line":87},[66,1165,1166],{},"'python'\n",[10,1168,1169],{},"需要保存和重复运行的程序，则可以写入文件：",[56,1171,1173],{"className":557,"code":1172,"language":559,"meta":61,"style":61},"python3 hello.py\n",[63,1174,1175],{"__ignoreMap":61},[66,1176,1177,1179],{"class":68,"line":69},[66,1178,657],{"class":566},[66,1180,1181],{"class":602}," hello.py\n",[10,1183,1184],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1186,1188],{"id":1187},"python-的特点","Python 的特点",[294,1190,1191],{"id":1191},"语法相对简洁",[10,1193,1194],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[294,1196,1197],{"id":1197},"支持多种编程方式",[10,1199,1200],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[294,1202,1203],{"id":1203},"标准库比较完整",[10,1205,1206],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1208,1209],{},"例如，获取当前时间：",[56,1211,1213],{"className":58,"code":1212,"language":60,"meta":61,"style":61},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[63,1214,1215,1220,1224,1229],{"__ignoreMap":61},[66,1216,1217],{"class":68,"line":69},[66,1218,1219],{},"from datetime import datetime\n",[66,1221,1222],{"class":68,"line":75},[66,1223,91],{"emptyLinePlaceholder":90},[66,1225,1226],{"class":68,"line":81},[66,1227,1228],{},"now = datetime.now()\n",[66,1230,1231],{"class":68,"line":87},[66,1232,1233],{},"print(now)\n",[10,1235,1236],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[294,1238,1239],{"id":1239},"第三方工具丰富",[10,1241,1242,1243,1245],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[63,1244,226],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1247,1248],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[294,1250,1251],{"id":1251},"支持多个操作系统",[10,1253,1254],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1256,1258],{"id":1257},"python-可以做什么","Python 可以做什么",[10,1260,1261],{},[26,1262],{"alt":1263,"src":1264},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1266,1267],{},"Python 的应用范围比较广，常见方向包括：",[37,1269,1270,1273,1276,1279,1282,1285,1288,1291],{},[40,1271,1272],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1274,1275],{},"开发网站后端和 API 服务；",[40,1277,1278],{},"进行数据清洗、统计分析和图表展示；",[40,1280,1281],{},"编写网络爬虫和信息采集工具；",[40,1283,1284],{},"开发自动化测试程序；",[40,1286,1287],{},"进行机器学习和人工智能开发；",[40,1289,1290],{},"编写运维、监控和辅助开发工具；",[40,1292,1293],{},"开发部分桌面应用和插件。",[10,1295,1296],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1298,1300],{"id":1299},"python-的发展","Python 的发展",[10,1302,1303],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1305,1306],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1308,1310],{"id":1309},"python-也有局限","Python 也有局限",[10,1312,1313],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1315,1316],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1318,1319],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1321,1322],{"id":1322},"写在最后",[10,1324,1325],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1327,1328],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[178,1330,1331],{},"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":61,"searchDepth":75,"depth":75,"links":1333},[1334,1335,1336,1343,1344,1345,1346],{"id":1040,"depth":75,"text":1041},{"id":1130,"depth":75,"text":1131},{"id":1187,"depth":75,"text":1188,"children":1337},[1338,1339,1340,1341,1342],{"id":1191,"depth":81,"text":1191},{"id":1197,"depth":81,"text":1197},{"id":1203,"depth":81,"text":1203},{"id":1239,"depth":81,"text":1239},{"id":1251,"depth":81,"text":1251},{"id":1257,"depth":75,"text":1258},{"id":1299,"depth":75,"text":1300},{"id":1309,"depth":75,"text":1310},{"id":1322,"depth":75,"text":1322},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1023,"description":61},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[191,1355,1356],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1359,"title":1360,"body":1361,"category":191,"cover":192,"description":1365,"extension":193,"meta":1483,"navigation":90,"path":1484,"pinned":196,"publishedAt":197,"seo":1485,"slug":1486,"stem":1487,"summary":1488,"tags":1489,"updatedAt":197,"visible":90,"__hash__":1491},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1362,"toc":1473},[1363,1366,1368,1371,1373,1379,1384,1386,1400,1402,1404,1413,1415,1421,1423,1425,1441,1443,1454,1456,1464,1466,1468,1471],[10,1364,1365],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1367,16],{"id":16},[10,1369,1370],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1372,22],{"id":22},[10,1374,1375],{},[26,1376],{"alt":1377,"src":1378},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1380,1381,1383],{},[63,1382,1137],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1385,35],{"id":35},[37,1387,1388,1394,1397],{},[40,1389,1390,1391,1393],{},"源代码是人编写的文本，通常保存在 ",[63,1392,1137],{}," 文件中。",[40,1395,1396],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1398,1399],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1401,51],{"id":51},[10,1403,54],{},[56,1405,1407],{"className":58,"code":1406,"language":60,"meta":61,"style":61},"print(\"你好，Python\")\n",[63,1408,1409],{"__ignoreMap":61},[66,1410,1411],{"class":68,"line":69},[66,1412,1406],{},[10,1414,106],{},[56,1416,1419],{"className":1417,"code":1418,"language":112,"meta":61},[110],"你好，Python\n",[63,1420,1418],{"__ignoreMap":61},[10,1422,117],{},[14,1424,120],{"id":120},[122,1426,1427,1434],{},[40,1428,1429,1430,1433],{},"终端启动解释器后，解释器读取 ",[63,1431,1432],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1435,1436,1437,1440],{},"字符串对象先准备好，再交给 ",[63,1438,1439],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1442,138],{"id":138},[37,1444,1445,1448],{},[40,1446,1447],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1449,1450,1451,1453],{},"认为 ",[63,1452,1137],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1455,153],{"id":153},[122,1457,1458,1461],{},[40,1459,1460],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1462,1463],{},"把示例文字改成自己的学习目标并重新运行。",[10,1465,170],{},[14,1467,173],{"id":173},[10,1469,1470],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,1472,180],{},{"title":61,"searchDepth":75,"depth":75,"links":1474},[1475,1476,1477,1478,1479,1480,1481,1482],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1360,"description":1365},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[191,1355,1490],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1493,"title":1494,"body":1495,"category":191,"cover":192,"description":1499,"extension":193,"meta":1635,"navigation":90,"path":1636,"pinned":196,"publishedAt":197,"seo":1637,"slug":1638,"stem":1639,"summary":1640,"tags":1641,"updatedAt":197,"visible":90,"__hash__":1643},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1496,"toc":1625},[1497,1500,1502,1505,1507,1513,1519,1521,1536,1538,1541,1561,1563,1569,1571,1573,1586,1588,1602,1604,1615,1617,1619,1622],[10,1498,1499],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1501,16],{"id":16},[10,1503,1504],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1506,22],{"id":22},[10,1508,1509],{},[26,1510],{"alt":1511,"src":1512},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1514,1515,1516,1518],{},"终端收到 ",[63,1517,657],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1520,35],{"id":35},[37,1522,1523,1526,1529],{},[40,1524,1525],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1527,1528],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1530,1531,1532,1535],{},"检查 pip 时使用 ",[63,1533,1534],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1537,51],{"id":51},[10,1539,1540],{},"在 macOS 终端执行：",[56,1542,1543],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,1544,1545,1551],{"__ignoreMap":61},[66,1546,1547,1549],{"class":68,"line":69},[66,1548,657],{"class":566},[66,1550,570],{"class":569},[66,1552,1553,1555,1557,1559],{"class":68,"line":75},[66,1554,657],{"class":566},[66,1556,599],{"class":569},[66,1558,603],{"class":602},[66,1560,570],{"class":569},[10,1562,106],{},[56,1564,1567],{"className":1565,"code":1566,"language":112,"meta":61},[110],"Python 3.14.x\npip 版本信息与安装路径\n",[63,1568,1566],{"__ignoreMap":61},[10,1570,117],{},[14,1572,120],{"id":120},[122,1574,1575,1581],{},[40,1576,1577,1580],{},[63,1578,1579],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1582,1583,1585],{},[63,1584,665],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1587,138],{"id":138},[37,1589,1590,1596],{},[40,1591,1592,1593,1595],{},"看到系统已有 ",[63,1594,657],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1597,1598,1599,1601],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[63,1600,657],{},"，不修改系统自带工具。",[14,1603,153],{"id":153},[122,1605,1606,1612],{},[40,1607,904,1608,1611],{},[63,1609,1610],{},"which python3","，记录当前解释器路径。",[40,1613,1614],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1616,170],{},[14,1618,173],{"id":173},[10,1620,1621],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,1623,1624],{},"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":61,"searchDepth":75,"depth":75,"links":1626},[1627,1628,1629,1630,1631,1632,1633,1634],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1494,"description":1499},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[191,1642,1018],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1645,"title":1646,"body":1647,"category":191,"cover":192,"description":1812,"extension":193,"meta":1813,"navigation":90,"path":1814,"pinned":196,"publishedAt":197,"seo":1815,"slug":1816,"stem":1817,"summary":1818,"tags":1819,"updatedAt":197,"visible":90,"__hash__":1822},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1648,"toc":1802},[1649,1655,1657,1660,1662,1668,1671,1673,1697,1699,1701,1728,1730,1736,1738,1740,1758,1760,1774,1776,1790,1792,1794,1800],[10,1650,1651,1652,1654],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[63,1653,1137],{}," 脚本。",[14,1656,16],{"id":16},[10,1658,1659],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1661,22],{"id":22},[10,1663,1664],{},[26,1665],{"alt":1666,"src":1667},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1669,1670],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1672,35],{"id":35},[37,1674,1675,1684,1691],{},[40,1676,1677,1678,1680,1681,328],{},"在终端输入 ",[63,1679,657],{}," 进入 REPL，提示符通常是 ",[63,1682,1683],{},">>>",[40,1685,1686,1687,1690],{},"输入 ",[63,1688,1689],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1692,1693,1694,1696],{},"需要保存、复查或多次运行的代码应写入 ",[63,1695,1137],{}," 文件。",[14,1698,51],{"id":51},[10,1700,54],{},[56,1702,1706],{"className":1703,"code":1704,"language":1705,"meta":61,"style":61},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[63,1707,1708,1713,1718,1723],{"__ignoreMap":61},[66,1709,1710],{"class":68,"line":69},[66,1711,1712],{},">>> 2 + 3\n",[66,1714,1715],{"class":68,"line":75},[66,1716,1717],{},"5\n",[66,1719,1720],{"class":68,"line":81},[66,1721,1722],{},">>> \"python\".upper()\n",[66,1724,1725],{"class":68,"line":87},[66,1726,1727],{},"'PYTHON'\n",[10,1729,106],{},[56,1731,1734],{"className":1732,"code":1733,"language":112,"meta":61},[110],"REPL 会直接显示表达式结果\n",[63,1735,1733],{"__ignoreMap":61},[10,1737,117],{},[14,1739,120],{"id":120},[122,1741,1742,1752],{},[40,1743,1744,1745,1748,1749,328],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[63,1746,1747],{},"2 + 3"," 能直接看到 ",[63,1750,1751],{},"5",[40,1753,1754,1755,1757],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[63,1756,1439],{}," 才会写到标准输出。",[14,1759,138],{"id":138},[37,1761,1762,1771],{},[40,1763,1764,1765,1767,1768,1770],{},"把提示符 ",[63,1766,1683],{}," 复制进 ",[63,1769,1137],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1772,1773],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1775,153],{"id":153},[122,1777,1778,1784],{},[40,1779,1780,1781,328],{},"在 REPL 计算 ",[63,1782,1783],{},"12 * 8",[40,1785,1786,1787,1789],{},"把同一表达式写入脚本；观察脚本中不调用 ",[63,1788,1439],{}," 时是否显示结果。",[10,1791,170],{},[14,1793,173],{"id":173},[10,1795,1796,1797,1799],{},"本篇目标是根据任务选择 REPL 或 ",[63,1798,1137],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,1801,180],{},{"title":61,"searchDepth":75,"depth":75,"links":1803},[1804,1805,1806,1807,1808,1809,1810,1811],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1646,"description":1812},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[191,1820,1821],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1824,"title":1825,"body":1826,"category":191,"cover":192,"description":1830,"extension":193,"meta":2001,"navigation":90,"path":2002,"pinned":196,"publishedAt":197,"seo":2003,"slug":2004,"stem":2005,"summary":2006,"tags":2007,"updatedAt":197,"visible":90,"__hash__":2010},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1827,"toc":1991},[1828,1831,1833,1836,1838,1844,1850,1852,1870,1872,1874,1919,1921,1927,1929,1931,1953,1955,1967,1969,1981,1983,1985,1988],[10,1829,1830],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1832,16],{"id":16},[10,1834,1835],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1837,22],{"id":22},[10,1839,1840],{},[26,1841],{"alt":1842,"src":1843},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1845,1846,1849],{},[63,1847,1848],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1851,35],{"id":35},[37,1853,1854,1857,1867],{},[40,1855,1856],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1858,1859,1862,1863,1866],{},[63,1860,1861],{},"pwd"," 显示当前目录，",[63,1864,1865],{},"ls"," 显示目录里的文件。",[40,1868,1869],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1871,51],{"id":51},[10,1873,1540],{},[56,1875,1877],{"className":557,"code":1876,"language":559,"meta":61,"style":61},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[63,1878,1879,1887,1894,1899,1913],{"__ignoreMap":61},[66,1880,1881,1884],{"class":68,"line":69},[66,1882,1883],{"class":566},"mkdir",[66,1885,1886],{"class":602}," python-study\n",[66,1888,1889,1892],{"class":68,"line":75},[66,1890,1891],{"class":569},"cd",[66,1893,1886],{"class":602},[66,1895,1896],{"class":68,"line":81},[66,1897,1898],{"class":569},"pwd\n",[66,1900,1901,1904,1907,1911],{"class":68,"line":87},[66,1902,1903],{"class":569},"printf",[66,1905,1906],{"class":602}," 'print(\"项目已经运行\")\\n'",[66,1908,1910],{"class":1909},"snl16"," >",[66,1912,1181],{"class":602},[66,1914,1915,1917],{"class":68,"line":94},[66,1916,657],{"class":566},[66,1918,1181],{"class":602},[10,1920,106],{},[56,1922,1925],{"className":1923,"code":1924,"language":112,"meta":61},[110],"项目已经运行\n",[63,1926,1924],{"__ignoreMap":61},[10,1928,117],{},[14,1930,120],{"id":120},[122,1932,1933,1944],{},[40,1934,1935,1937,1938,1940,1941,1943],{},[63,1936,1883],{}," 创建目录，",[63,1939,1891],{}," 改变终端当前目录，",[63,1942,1861],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1945,1946,1948,1949,1952],{},[63,1947,1848],{}," 会在当前目录寻找 ",[63,1950,1951],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1954,138],{"id":138},[37,1956,1957,1964],{},[40,1958,1959,1960,1123,1962,328],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[63,1961,1861],{},[63,1963,1865],{},[40,1965,1966],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1968,153],{"id":153},[122,1970,1971,1978],{},[40,1972,1973,1974,1977],{},"新建 ",[63,1975,1976],{},"lesson01.py"," 并输出课程编号。",[40,1979,1980],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1982,170],{},[14,1984,173],{"id":173},[10,1986,1987],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,1989,1990],{},"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":61,"searchDepth":75,"depth":75,"links":1992},[1993,1994,1995,1996,1997,1998,1999,2000],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1825,"description":1830},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[191,2008,2009],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2012,"title":2013,"body":2014,"category":191,"cover":192,"description":2018,"extension":193,"meta":2164,"navigation":90,"path":2165,"pinned":196,"publishedAt":197,"seo":2166,"slug":2167,"stem":2168,"summary":2169,"tags":2170,"updatedAt":197,"visible":90,"__hash__":2173},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2015,"toc":2154},[2016,2019,2021,2024,2026,2032,2043,2045,2065,2067,2069,2089,2091,2097,2099,2101,2120,2122,2130,2132,2145,2147,2149,2152],[10,2017,2018],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2020,16],{"id":16},[10,2022,2023],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2025,22],{"id":22},[10,2027,2028],{},[26,2029],{"alt":2030,"src":2031},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2033,2034,2035,328,2037,2040,2041,328],{},"Python 先计算表达式，再把得到的对象交给 ",[63,2036,1439],{},[63,2038,2039],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[63,2042,1747],{},[14,2044,35],{"id":35},[37,2046,2047,2053,2062],{},[40,2048,2049,2052],{},[63,2050,2051],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2054,2055,2058,2059,328],{},[63,2056,2057],{},"7 + 5"," 是表达式，运行时先求值得到 ",[63,2060,2061],{},"12",[40,2063,2064],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2066,51],{"id":51},[10,2068,54],{},[56,2070,2072],{"className":58,"code":2071,"language":60,"meta":61,"style":61},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[63,2073,2074,2079,2084],{"__ignoreMap":61},[66,2075,2076],{"class":68,"line":69},[66,2077,2078],{},"print(42)\n",[66,2080,2081],{"class":68,"line":75},[66,2082,2083],{},"print(7 + 5)\n",[66,2085,2086],{"class":68,"line":81},[66,2087,2088],{},"print(\"Python 基础课\")\n",[10,2090,106],{},[56,2092,2095],{"className":2093,"code":2094,"language":112,"meta":61},[110],"42\n12\nPython 基础课\n",[63,2096,2094],{"__ignoreMap":61},[10,2098,117],{},[14,2100,120],{"id":120},[122,2102,2103,2111],{},[40,2104,2105,2108,2109,328],{},[63,2106,2107],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[63,2110,2061],{},[40,2112,2113,2115,2116,2119],{},[63,2114,1439],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[63,2117,2118],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2121,138],{"id":138},[37,2123,2124,2127],{},[40,2125,2126],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2128,2129],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2131,153],{"id":153},[122,2133,2134,2137],{},[40,2135,2136],{},"分别输出一个整数、一个小数和一段文本。",[40,2138,161,2139,164,2141,2144],{},[63,2140,2039],{},[63,2142,2143],{},"print(\"2 + 3\")"," 的结果。",[10,2146,170],{},[14,2148,173],{"id":173},[10,2150,2151],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,2153,180],{},{"title":61,"searchDepth":75,"depth":75,"links":2155},[2156,2157,2158,2159,2160,2161,2162,2163],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2013,"description":2018},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[191,2171,2172],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2175,"title":2176,"body":2177,"category":191,"cover":192,"description":2181,"extension":193,"meta":2348,"navigation":90,"path":2349,"pinned":196,"publishedAt":197,"seo":2350,"slug":2351,"stem":2352,"summary":2353,"tags":2354,"updatedAt":197,"visible":90,"__hash__":2357},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2178,"toc":2338},[2179,2182,2184,2187,2189,2195,2198,2200,2226,2228,2230,2258,2260,2266,2268,2270,2294,2296,2312,2314,2329,2331,2333,2336],[10,2180,2181],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2183,16],{"id":16},[10,2185,2186],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2188,22],{"id":22},[10,2190,2191],{},[26,2192],{"alt":2193,"src":2194},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2196,2197],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2199,35],{"id":35},[37,2201,2202,2205,2215],{},[40,2203,2204],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2206,2207,2208,164,2211,2214],{},"变量名区分大小写，",[63,2209,2210],{},"score",[63,2212,2213],{},"Score"," 是两个名字。",[40,2216,2217,2218,2221,2222,2225],{},"使用能表达含义的名称；不要用 ",[63,2219,2220],{},"list","、",[63,2223,2224],{},"str"," 等内置名称作为普通变量名。",[14,2227,51],{"id":51},[10,2229,54],{},[56,2231,2233],{"className":58,"code":2232,"language":60,"meta":61,"style":61},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[63,2234,2235,2240,2245,2249,2254],{"__ignoreMap":61},[66,2236,2237],{"class":68,"line":69},[66,2238,2239],{},"score = 90\n",[66,2241,2242],{"class":68,"line":75},[66,2243,2244],{},"print(score)\n",[66,2246,2247],{"class":68,"line":81},[66,2248,91],{"emptyLinePlaceholder":90},[66,2250,2251],{"class":68,"line":87},[66,2252,2253],{},"score = 95\n",[66,2255,2256],{"class":68,"line":94},[66,2257,2244],{},[10,2259,106],{},[56,2261,2264],{"className":2262,"code":2263,"language":112,"meta":61},[110],"90\n95\n",[63,2265,2263],{"__ignoreMap":61},[10,2267,117],{},[14,2269,120],{"id":120},[122,2271,2272,2281],{},[40,2273,904,2274,2277,2278,2280],{},[63,2275,2276],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[63,2279,2210],{}," 再绑定到它。",[40,2282,904,2283,2286,2287,2290,2291,328],{},[63,2284,2285],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[63,2288,2289],{},"90"," 没有被改造成 ",[63,2292,2293],{},"95",[14,2295,138],{"id":138},[37,2297,2298,2301],{},[40,2299,2300],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2302,2303,2304,2221,2306,2221,2308,2311],{},"使用 ",[63,2305,2220],{},[63,2307,2224],{},[63,2309,2310],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2313,153],{"id":153},[122,2315,2316,2326],{},[40,2317,2318,2319,1123,2322,2325],{},"创建 ",[63,2320,2321],{},"course_name",[63,2323,2324],{},"lesson_count"," 两个变量并输出。",[40,2327,2328],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2330,170],{},[14,2332,173],{"id":173},[10,2334,2335],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,2337,180],{},{"title":61,"searchDepth":75,"depth":75,"links":2339},[2340,2341,2342,2343,2344,2345,2346,2347],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2176,"description":2181},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[191,2355,2356],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2359,"title":2360,"body":2361,"category":191,"cover":192,"description":2365,"extension":193,"meta":2531,"navigation":90,"path":2532,"pinned":196,"publishedAt":197,"seo":2533,"slug":2534,"stem":2535,"summary":2536,"tags":2537,"updatedAt":197,"visible":90,"__hash__":2540},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2362,"toc":2521},[2363,2366,2368,2371,2373,2379,2382,2384,2413,2415,2417,2463,2465,2471,2473,2475,2489,2491,2502,2504,2512,2514,2516,2519],[10,2364,2365],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2367,16],{"id":16},[10,2369,2370],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2372,22],{"id":22},[10,2374,2375],{},[26,2376],{"alt":2377,"src":2378},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2380,2381],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2383,35],{"id":35},[37,2385,2386,2396,2410],{},[40,2387,2388,2391,2392,2395],{},[63,2389,2390],{},"int"," 表示整数，",[63,2393,2394],{},"float"," 表示浮点数。",[40,2397,2398,2401,2402,2405,2406,2409],{},[63,2399,2400],{},"\u002F"," 总是进行真除法；",[63,2403,2404],{},"\u002F\u002F"," 是向下取整除法，",[63,2407,2408],{},"%"," 得到余数。",[40,2411,2412],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2414,51],{"id":51},[10,2416,54],{},[56,2418,2420],{"className":58,"code":2419,"language":60,"meta":61,"style":61},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[63,2421,2422,2427,2432,2437,2441,2446,2451,2457],{"__ignoreMap":61},[66,2423,2424],{"class":68,"line":69},[66,2425,2426],{},"price = 25\n",[66,2428,2429],{"class":68,"line":75},[66,2430,2431],{},"count = 4\n",[66,2433,2434],{"class":68,"line":81},[66,2435,2436],{},"discount = 0.9\n",[66,2438,2439],{"class":68,"line":87},[66,2440,91],{"emptyLinePlaceholder":90},[66,2442,2443],{"class":68,"line":94},[66,2444,2445],{},"total = price * count * discount\n",[66,2447,2448],{"class":68,"line":100},[66,2449,2450],{},"average = total \u002F count\n",[66,2452,2454],{"class":68,"line":2453},7,[66,2455,2456],{},"print(total)\n",[66,2458,2460],{"class":68,"line":2459},8,[66,2461,2462],{},"print(average)\n",[10,2464,106],{},[56,2466,2469],{"className":2467,"code":2468,"language":112,"meta":61},[110],"90.0\n22.5\n",[63,2470,2468],{"__ignoreMap":61},[10,2472,117],{},[14,2474,120],{"id":120},[122,2476,2477,2483],{},[40,2478,2479,2482],{},[63,2480,2481],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2484,2485,2488],{},[63,2486,2487],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2490,138],{"id":138},[37,2492,2493,2499],{},[40,2494,2495,2496,328],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[63,2497,2498],{},"decimal.Decimal",[40,2500,2501],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2503,153],{"id":153},[122,2505,2506,2509],{},[40,2507,2508],{},"计算 137 除以 10 的商和余数。",[40,2510,2511],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2513,170],{},[14,2515,173],{"id":173},[10,2517,2518],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,2520,180],{},{"title":61,"searchDepth":75,"depth":75,"links":2522},[2523,2524,2525,2526,2527,2528,2529,2530],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2360,"description":2365},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[191,2538,2539],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2542,"title":2543,"body":2544,"category":191,"cover":192,"description":2548,"extension":193,"meta":2724,"navigation":90,"path":2725,"pinned":196,"publishedAt":197,"seo":2726,"slug":2727,"stem":2728,"summary":2729,"tags":2730,"updatedAt":197,"visible":90,"__hash__":2733},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2545,"toc":2712},[2546,2549,2551,2554,2556,2562,2572,2574,2585,2587,2589,2619,2621,2627,2629,2631,2661,2664,2667,2673,2676,2678,2686,2688,2703,2705,2707,2710],[10,2547,2548],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2550,16],{"id":16},[10,2552,2553],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2555,22],{"id":22},[10,2557,2558],{},[26,2559],{"alt":2560,"src":2561},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2563,2564,2565,2568,2569,328],{},"切片 ",[63,2566,2567],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[63,2570,2571],{},"stop - start",[14,2573,35],{"id":35},[37,2575,2576,2579,2582],{},[40,2577,2578],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2580,2581],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2583,2584],{},"切片会创建新的字符串，不会修改原字符串。",[14,2586,51],{"id":51},[10,2588,54],{},[56,2590,2592],{"className":58,"code":2591,"language":60,"meta":61,"style":61},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[63,2593,2594,2599,2604,2609,2614],{"__ignoreMap":61},[66,2595,2596],{"class":68,"line":69},[66,2597,2598],{},"language = \"Python\"\n",[66,2600,2601],{"class":68,"line":75},[66,2602,2603],{},"print(language[0])\n",[66,2605,2606],{"class":68,"line":81},[66,2607,2608],{},"print(language[-1])\n",[66,2610,2611],{"class":68,"line":87},[66,2612,2613],{},"print(language[0:3])\n",[66,2615,2616],{"class":68,"line":94},[66,2617,2618],{},"print(language + \" 3.14\")\n",[10,2620,106],{},[56,2622,2625],{"className":2623,"code":2624,"language":112,"meta":61},[110],"P\nn\nPyt\nPython 3.14\n",[63,2626,2624],{"__ignoreMap":61},[10,2628,117],{},[14,2630,120],{"id":120},[122,2632,2633,2647],{},[40,2634,2635,2636,2638,2639,2642,2643,2646],{},"字符串 ",[63,2637,191],{}," 的正索引从 ",[63,2640,2641],{},"P"," 的 0 开始，负索引从末尾 ",[63,2644,2645],{},"n"," 的 -1 开始。",[40,2648,2649,2652,2653,2656,2657,2660],{},[63,2650,2651],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[63,2654,2655],{},"Pyt","；索引 3 的 ",[63,2658,2659],{},"h"," 不在结果中。",[294,2662,2663],{"id":2663},"再看一个具体细节",[10,2665,2666],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2668,2669],{},[26,2670],{"alt":2671,"src":2672},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2674,2675],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2677,138],{"id":138},[37,2679,2680,2683],{},[40,2681,2682],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2684,2685],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2687,153],{"id":153},[122,2689,2690,2700],{},[40,2691,2692,2693,2696,2697,328],{},"从 ",[63,2694,2695],{},"\"programming\""," 中切出 ",[63,2698,2699],{},"\"gram\"",[40,2701,2702],{},"使用负索引取得字符串倒数第二个字符。",[10,2704,170],{},[14,2706,173],{"id":173},[10,2708,2709],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,2711,180],{},{"title":61,"searchDepth":75,"depth":75,"links":2713},[2714,2715,2716,2717,2718,2721,2722,2723],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":2719},[2720],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2543,"description":2548},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[191,2731,2732],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2735,"title":2736,"body":2737,"category":191,"cover":192,"description":2741,"extension":193,"meta":2955,"navigation":90,"path":2956,"pinned":196,"publishedAt":197,"seo":2957,"slug":2958,"stem":2959,"summary":2960,"tags":2961,"updatedAt":197,"visible":90,"__hash__":2964},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2738,"toc":2943},[2739,2742,2744,2747,2749,2755,2765,2767,2800,2802,2804,2848,2850,2856,2858,2860,2881,2883,2886,2892,2900,2902,2916,2918,2934,2936,2938,2941],[10,2740,2741],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2743,16],{"id":16},[10,2745,2746],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2748,22],{"id":22},[10,2750,2751],{},[26,2752],{"alt":2753,"src":2754},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2756,2757,2758,975,2761,2764],{},"比较表达式先产生 ",[63,2759,2760],{},"True",[63,2762,2763],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2766,35],{"id":35},[37,2768,2769,2783,2797],{},[40,2770,2771,2774,2775,2778,2779,2782],{},[63,2772,2773],{},"=="," 判断是否相等，",[63,2776,2777],{},"!="," 判断是否不等；单个 ",[63,2780,2781],{},"="," 是赋值。",[40,2784,2785,2788,2789,2792,2793,2796],{},[63,2786,2787],{},"and"," 要求两侧都为真，",[63,2790,2791],{},"or"," 只需一侧为真，",[63,2794,2795],{},"not"," 取反。",[40,2798,2799],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2801,51],{"id":51},[10,2803,54],{},[56,2805,2807],{"className":58,"code":2806,"language":60,"meta":61,"style":61},"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",[63,2808,2809,2814,2819,2823,2828,2833,2838,2843],{"__ignoreMap":61},[66,2810,2811],{"class":68,"line":69},[66,2812,2813],{},"age = 20\n",[66,2815,2816],{"class":68,"line":75},[66,2817,2818],{},"has_ticket = True\n",[66,2820,2821],{"class":68,"line":81},[66,2822,91],{"emptyLinePlaceholder":90},[66,2824,2825],{"class":68,"line":87},[66,2826,2827],{},"is_adult = age >= 18\n",[66,2829,2830],{"class":68,"line":94},[66,2831,2832],{},"can_enter = is_adult and has_ticket\n",[66,2834,2835],{"class":68,"line":100},[66,2836,2837],{},"print(is_adult)\n",[66,2839,2840],{"class":68,"line":2453},[66,2841,2842],{},"print(can_enter)\n",[66,2844,2845],{"class":68,"line":2459},[66,2846,2847],{},"print(not has_ticket)\n",[10,2849,106],{},[56,2851,2854],{"className":2852,"code":2853,"language":112,"meta":61},[110],"True\nTrue\nFalse\n",[63,2855,2853],{"__ignoreMap":61},[10,2857,117],{},[14,2859,120],{"id":120},[122,2861,2862,2872],{},[40,2863,2864,2867,2868,2871],{},[63,2865,2866],{},"age >= 18"," 先产生布尔值并绑定给 ",[63,2869,2870],{},"is_adult","，这一步没有任何分支跳转。",[40,2873,2874,2877,2878,2880],{},[63,2875,2876],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[63,2879,2795],{}," 只对紧随其后的值取反。",[294,2882,2663],{"id":2663},[10,2884,2885],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2887,2888],{},[26,2889],{"alt":2890,"src":2891},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2893,2894,2896,2897,2899],{},[63,2895,2787],{}," 只有“真、真”得到真；",[63,2898,2791],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2901,138],{"id":138},[37,2903,2904,2913],{},[40,2905,2906,2907,2909,2910,2912],{},"用单个等号判断相等。",[63,2908,2781],{}," 是赋值，",[63,2911,2773],{}," 才是相等比较。",[40,2914,2915],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2917,153],{"id":153},[122,2919,2920,2927],{},[40,2921,2922,2923,2926],{},"判断数字 ",[63,2924,2925],{},"15"," 是否同时大于 10 且小于 20。",[40,2928,2929,2930,2933],{},"分别修改年龄和票据状态，记录 ",[63,2931,2932],{},"can_enter"," 的四种组合结果。",[10,2935,170],{},[14,2937,173],{"id":173},[10,2939,2940],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,2942,180],{},{"title":61,"searchDepth":75,"depth":75,"links":2944},[2945,2946,2947,2948,2949,2952,2953,2954],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":2950},[2951],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2736,"description":2741},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[191,2962,2963],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2966,"title":2967,"body":2968,"category":191,"cover":192,"description":2972,"extension":193,"meta":3140,"navigation":90,"path":3141,"pinned":196,"publishedAt":197,"seo":3142,"slug":3143,"stem":3144,"summary":3145,"tags":3146,"updatedAt":197,"visible":90,"__hash__":3148},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2969,"toc":3130},[2970,2973,2975,2978,2980,2986,3004,3006,3019,3021,3023,3057,3059,3065,3067,3069,3091,3093,3105,3107,3121,3123,3125,3128],[10,2971,2972],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2974,16],{"id":16},[10,2976,2977],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2979,22],{"id":22},[10,2981,2982],{},[26,2983],{"alt":2984,"src":2985},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2987,2988,2991,2992,2995,2996,2999,3000,3003],{},[63,2989,2990],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[63,2993,2994],{},"18","，程序首先得到的也是 ",[63,2997,2998],{},"\"18\"","，需要 ",[63,3001,3002],{},"int()"," 后才能按整数参与计算。",[14,3005,35],{"id":35},[37,3007,3008,3011,3016],{},[40,3009,3010],{},"提示文字应告诉用户需要输入什么。",[40,3012,3013,3015],{},[63,3014,3002],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3017,3018],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3020,51],{"id":51},[10,3022,54],{},[56,3024,3026],{"className":58,"code":3025,"language":60,"meta":61,"style":61},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[63,3027,3028,3033,3038,3043,3047,3052],{"__ignoreMap":61},[66,3029,3030],{"class":68,"line":69},[66,3031,3032],{},"name = input(\"请输入姓名：\")\n",[66,3034,3035],{"class":68,"line":75},[66,3036,3037],{},"age_text = input(\"请输入年龄：\")\n",[66,3039,3040],{"class":68,"line":81},[66,3041,3042],{},"age = int(age_text)\n",[66,3044,3045],{"class":68,"line":87},[66,3046,91],{"emptyLinePlaceholder":90},[66,3048,3049],{"class":68,"line":94},[66,3050,3051],{},"print(\"你好，\" + name)\n",[66,3053,3054],{"class":68,"line":100},[66,3055,3056],{},"print(age + 1)\n",[10,3058,106],{},[56,3060,3063],{"className":3061,"code":3062,"language":112,"meta":61},[110],"根据输入显示姓名，并输出下一年的年龄\n",[63,3064,3062],{"__ignoreMap":61},[10,3066,117],{},[14,3068,120],{"id":120},[122,3070,3071,3081],{},[40,3072,3073,3074,3076,3077,3080],{},"两次 ",[63,3075,2990],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[63,3078,3079],{},"age_text"," 用来提醒这仍是文本。",[40,3082,3083,3086,3087,3090],{},[63,3084,3085],{},"int(age_text)"," 创建整数对象，后面的 ",[63,3088,3089],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3092,138],{"id":138},[37,3094,3095,3102],{},[40,3096,3097,3098,3101],{},"直接计算 ",[63,3099,3100],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3103,3104],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3106,153],{"id":153},[122,3108,3109,3112],{},[40,3110,3111],{},"接收两个整数并输出它们的和。",[40,3113,1686,3114,3117,3118,3120],{},[63,3115,3116],{},"18.5"," 给 ",[63,3119,3002],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3122,170],{},[14,3124,173],{"id":173},[10,3126,3127],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,3129,180],{},{"title":61,"searchDepth":75,"depth":75,"links":3131},[3132,3133,3134,3135,3136,3137,3138,3139],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2967,"description":2972},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[191,2310,3147],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3150,"title":3151,"body":3152,"category":191,"cover":192,"description":3156,"extension":193,"meta":3316,"navigation":90,"path":3317,"pinned":196,"publishedAt":197,"seo":3318,"slug":3319,"stem":3320,"summary":3321,"tags":3322,"updatedAt":197,"visible":90,"__hash__":3324},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3153,"toc":3306},[3154,3157,3159,3162,3164,3170,3177,3179,3193,3195,3197,3236,3238,3244,3246,3248,3267,3269,3284,3286,3297,3299,3301,3304],[10,3155,3156],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3158,16],{"id":16},[10,3160,3161],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3163,22],{"id":22},[10,3165,3166],{},[26,3167],{"alt":3168,"src":3169},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3171,3172,3173,3176],{},"列表为元素维护从 0 开始的位置索引。修改 ",[63,3174,3175],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3178,35],{"id":35},[37,3180,3181,3184,3187],{},[40,3182,3183],{},"列表使用方括号，元素之间用逗号分隔。",[40,3185,3186],{},"列表可变，可以替换、追加和删除元素。",[40,3188,3189,3190,328],{},"访问不存在的索引会产生 ",[63,3191,3192],{},"IndexError",[14,3194,51],{"id":51},[10,3196,54],{},[56,3198,3200],{"className":58,"code":3199,"language":60,"meta":61,"style":61},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[63,3201,3202,3207,3212,3216,3221,3226,3231],{"__ignoreMap":61},[66,3203,3204],{"class":68,"line":69},[66,3205,3206],{},"scores = [82, 90, 76]\n",[66,3208,3209],{"class":68,"line":75},[66,3210,3211],{},"print(scores[0])\n",[66,3213,3214],{"class":68,"line":81},[66,3215,91],{"emptyLinePlaceholder":90},[66,3217,3218],{"class":68,"line":87},[66,3219,3220],{},"scores[1] = 95\n",[66,3222,3223],{"class":68,"line":94},[66,3224,3225],{},"scores.append(88)\n",[66,3227,3228],{"class":68,"line":100},[66,3229,3230],{},"print(scores)\n",[66,3232,3233],{"class":68,"line":2453},[66,3234,3235],{},"print(len(scores))\n",[10,3237,106],{},[56,3239,3242],{"className":3240,"code":3241,"language":112,"meta":61},[110],"82\n[82, 95, 76, 88]\n4\n",[63,3243,3241],{"__ignoreMap":61},[10,3245,117],{},[14,3247,120],{"id":120},[122,3249,3250,3253],{},[40,3251,3252],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3254,3255,3258,3259,3262,3263,3266],{},[63,3256,3257],{},"scores[1] = 95"," 替换第二个位置，",[63,3260,3261],{},"append(88)"," 在末尾增加新位置，",[63,3264,3265],{},"len()"," 因而从 3 变为 4。",[14,3268,138],{"id":138},[37,3270,3271,3281],{},[40,3272,3273,3274,3277,3278,328],{},"访问 ",[63,3275,3276],{},"scores[len(scores)]","。最后一个合法正索引是 ",[63,3279,3280],{},"len(scores) - 1",[40,3282,3283],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3285,153],{"id":153},[122,3287,3288,3291],{},[40,3289,3290],{},"建立三项学习任务列表，再追加第四项。",[40,3292,3293,3294,3296],{},"修改第二项，并用 ",[63,3295,3265],{}," 检查元素数量。",[10,3298,170],{},[14,3300,173],{"id":173},[10,3302,3303],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,3305,180],{},{"title":61,"searchDepth":75,"depth":75,"links":3307},[3308,3309,3310,3311,3312,3313,3314,3315],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3151,"description":3156},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[191,3323,204],"列表","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":4,"title":5,"body":3326,"category":191,"cover":192,"description":12,"extension":193,"meta":3445,"navigation":90,"path":195,"pinned":196,"publishedAt":197,"seo":3446,"slug":199,"stem":200,"summary":201,"tags":3447,"updatedAt":197,"visible":90,"__hash__":205},{"type":7,"value":3327,"toc":3435},[3328,3330,3332,3334,3336,3340,3342,3344,3352,3354,3356,3384,3386,3391,3393,3395,3405,3407,3415,3417,3427,3429,3431,3433],[10,3329,12],{},[14,3331,16],{"id":16},[10,3333,19],{},[14,3335,22],{"id":22},[10,3337,3338],{},[26,3339],{"alt":28,"src":29},[10,3341,32],{},[14,3343,35],{"id":35},[37,3345,3346,3348,3350],{},[40,3347,42],{},[40,3349,45],{},[40,3351,48],{},[14,3353,51],{"id":51},[10,3355,54],{},[56,3357,3358],{"className":58,"code":59,"language":60,"meta":61,"style":61},[63,3359,3360,3364,3368,3372,3376,3380],{"__ignoreMap":61},[66,3361,3362],{"class":68,"line":69},[66,3363,72],{},[66,3365,3366],{"class":68,"line":75},[66,3367,78],{},[66,3369,3370],{"class":68,"line":81},[66,3371,84],{},[66,3373,3374],{"class":68,"line":87},[66,3375,91],{"emptyLinePlaceholder":90},[66,3377,3378],{"class":68,"line":94},[66,3379,97],{},[66,3381,3382],{"class":68,"line":100},[66,3383,103],{},[10,3385,106],{},[56,3387,3389],{"className":3388,"code":111,"language":112,"meta":61},[110],[63,3390,111],{"__ignoreMap":61},[10,3392,117],{},[14,3394,120],{"id":120},[122,3396,3397,3401],{},[40,3398,3399,129],{},[63,3400,128],{},[40,3402,3403,135],{},[63,3404,134],{},[14,3406,138],{"id":138},[37,3408,3409,3413],{},[40,3410,143,3411,147],{},[63,3412,146],{},[40,3414,150],{},[14,3416,153],{"id":153},[122,3418,3419,3421],{},[40,3420,158],{},[40,3422,161,3423,164,3425,167],{},[63,3424,146],{},[63,3426,134],{},[10,3428,170],{},[14,3430,173],{"id":173},[10,3432,176],{},[178,3434,180],{},{"title":61,"searchDepth":75,"depth":75,"links":3436},[3437,3438,3439,3440,3441,3442,3443,3444],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5,"description":12},[191,203,204],{"id":3449,"title":3450,"body":3451,"category":191,"cover":192,"description":3455,"extension":193,"meta":3610,"navigation":90,"path":3611,"pinned":196,"publishedAt":197,"seo":3612,"slug":3613,"stem":3614,"summary":3615,"tags":3616,"updatedAt":197,"visible":90,"__hash__":3618},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3452,"toc":3600},[3453,3456,3458,3461,3463,3469,3479,3481,3495,3497,3499,3533,3535,3541,3543,3545,3560,3562,3581,3583,3591,3593,3595,3598],[10,3454,3455],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3457,16],{"id":16},[10,3459,3460],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3462,22],{"id":22},[10,3464,3465],{},[26,3466],{"alt":3467,"src":3468},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3470,3471,3472,3475,3476,3478],{},"字典通过键定位值，不使用连续位置表达含义。",[63,3473,3474],{},"student[\"score\"]"," 读取的是键 ",[63,3477,2210],{}," 对应的值，而不是“第几个元素”。",[14,3480,35],{"id":35},[37,3482,3483,3486,3492],{},[40,3484,3485],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3487,2303,3488,3491],{},[63,3489,3490],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3493,3494],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3496,51],{"id":51},[10,3498,54],{},[56,3500,3502],{"className":58,"code":3501,"language":60,"meta":61,"style":61},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[63,3503,3504,3509,3514,3518,3523,3528],{"__ignoreMap":61},[66,3505,3506],{"class":68,"line":69},[66,3507,3508],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[66,3510,3511],{"class":68,"line":75},[66,3512,3513],{},"print(student[\"name\"])\n",[66,3515,3516],{"class":68,"line":81},[66,3517,91],{"emptyLinePlaceholder":90},[66,3519,3520],{"class":68,"line":87},[66,3521,3522],{},"student[\"score\"] = 95\n",[66,3524,3525],{"class":68,"line":94},[66,3526,3527],{},"student[\"city\"] = \"郑州\"\n",[66,3529,3530],{"class":68,"line":100},[66,3531,3532],{},"print(student)\n",[10,3534,106],{},[56,3536,3539],{"className":3537,"code":3538,"language":112,"meta":61},[110],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[63,3540,3538],{"__ignoreMap":61},[10,3542,117],{},[14,3544,120],{"id":120},[122,3546,3547,3550],{},[40,3548,3549],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3551,3552,3553,3555,3556,3559],{},"给已有键 ",[63,3554,2210],{}," 赋值会更新映射，给新键 ",[63,3557,3558],{},"city"," 赋值会增加映射。",[14,3561,138],{"id":138},[37,3563,3564,3571],{},[40,3565,3566,3567,3570],{},"按位置理解字典并尝试 ",[63,3568,3569],{},"student[0]","，而实际键是字符串。",[40,3572,3573,3574,3577,3578,328],{},"直接读取不确定存在的键并忽略 ",[63,3575,3576],{},"KeyError","；后续可根据场景使用成员检查或 ",[63,3579,3580],{},"get()",[14,3582,153],{"id":153},[122,3584,3585,3588],{},[40,3586,3587],{},"建立一本书的标题、作者和页数字典。",[40,3589,3590],{},"添加分类键，再修改页数。",[10,3592,170],{},[14,3594,173],{"id":173},[10,3596,3597],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,3599,180],{},{"title":61,"searchDepth":75,"depth":75,"links":3601},[3602,3603,3604,3605,3606,3607,3608,3609],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3450,"description":3455},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[191,3617,204],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3620,"title":3621,"body":3622,"category":191,"cover":192,"description":3626,"extension":193,"meta":3775,"navigation":90,"path":3776,"pinned":196,"publishedAt":197,"seo":3777,"slug":3778,"stem":3779,"summary":3780,"tags":3781,"updatedAt":197,"visible":90,"__hash__":3783},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3623,"toc":3765},[3624,3627,3629,3632,3634,3640,3643,3645,3664,3666,3668,3702,3704,3710,3712,3714,3729,3731,3743,3745,3756,3758,3760,3763],[10,3625,3626],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3628,16],{"id":16},[10,3630,3631],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3633,22],{"id":22},[10,3635,3636],{},[26,3637],{"alt":3638,"src":3639},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3641,3642],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3644,35],{"id":35},[37,3646,3647,3650,3653],{},[40,3648,3649],{},"集合中的元素不重复。",[40,3651,3652],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3654,3655,3656,3659,3660,3663],{},"创建空集合必须写 ",[63,3657,3658],{},"set()","；",[63,3661,3662],{},"{}"," 创建的是空字典。",[14,3665,51],{"id":51},[10,3667,54],{},[56,3669,3671],{"className":58,"code":3670,"language":60,"meta":61,"style":61},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[63,3672,3673,3678,3683,3687,3692,3697],{"__ignoreMap":61},[66,3674,3675],{"class":68,"line":69},[66,3676,3677],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[66,3679,3680],{"class":68,"line":75},[66,3681,3682],{},"right = {\"Python\", \"Docker\"}\n",[66,3684,3685],{"class":68,"line":81},[66,3686,91],{"emptyLinePlaceholder":90},[66,3688,3689],{"class":68,"line":87},[66,3690,3691],{},"print(left & right)\n",[66,3693,3694],{"class":68,"line":94},[66,3695,3696],{},"print(left | right)\n",[66,3698,3699],{"class":68,"line":100},[66,3700,3701],{},"print(\"Git\" in left)\n",[10,3703,106],{},[56,3705,3708],{"className":3706,"code":3707,"language":112,"meta":61},[110],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[63,3709,3707],{"__ignoreMap":61},[10,3711,117],{},[14,3713,120],{"id":120},[122,3715,3716,3719],{},[40,3717,3718],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3720,3721,3724,3725,3728],{},[63,3722,3723],{},"&"," 计算交集，",[63,3726,3727],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3730,138],{"id":138},[37,3732,3733,3740],{},[40,3734,2303,3735,3737,3738,328],{},[63,3736,3662],{}," 创建空集合，实际得到空字典；空集合应写 ",[63,3739,3658],{},[40,3741,3742],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3744,153],{"id":153},[122,3746,3747,3753],{},[40,3748,3749,3750,3752],{},"把包含重复标签的列表交给 ",[63,3751,3658],{}," 去重。",[40,3754,3755],{},"计算两组课程标签的交集和差集。",[10,3757,170],{},[14,3759,173],{"id":173},[10,3761,3762],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,3764,180],{},{"title":61,"searchDepth":75,"depth":75,"links":3766},[3767,3768,3769,3770,3771,3772,3773,3774],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3621,"description":3626},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[191,3782,204],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3785,"title":3786,"body":3787,"category":191,"cover":192,"description":3791,"extension":193,"meta":3989,"navigation":90,"path":3990,"pinned":196,"publishedAt":197,"seo":3991,"slug":3992,"stem":3993,"summary":3994,"tags":3995,"updatedAt":197,"visible":90,"__hash__":3998},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3788,"toc":3977},[3789,3792,3794,3797,3799,3805,3815,3817,3834,3836,3838,3888,3890,3896,3898,3900,3922,3924,3927,3933,3936,3938,3951,3953,3968,3970,3972,3975],[10,3790,3791],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3793,16],{"id":16},[10,3795,3796],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3798,22],{"id":22},[10,3800,3801],{},[26,3802],{"alt":3803,"src":3804},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3806,3807,3810,3811,3814],{},[63,3808,3809],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[63,3812,3813],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3816,35],{"id":35},[37,3818,3819,3828,3831],{},[40,3820,3821,3823,3824,3827],{},[63,3822,2773],{}," 比较内容是否相等，",[63,3825,3826],{},"is"," 比较是否为同一个对象。",[40,3829,3830],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3832,3833],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3835,51],{"id":51},[10,3837,54],{},[56,3839,3841],{"className":58,"code":3840,"language":60,"meta":61,"style":61},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[63,3842,3843,3848,3853,3858,3862,3867,3872,3877,3882],{"__ignoreMap":61},[66,3844,3845],{"class":68,"line":69},[66,3846,3847],{},"tasks = [\"变量\", \"字符串\"]\n",[66,3849,3850],{"class":68,"line":75},[66,3851,3852],{},"shared = tasks\n",[66,3854,3855],{"class":68,"line":81},[66,3856,3857],{},"backup = tasks.copy()\n",[66,3859,3860],{"class":68,"line":87},[66,3861,91],{"emptyLinePlaceholder":90},[66,3863,3864],{"class":68,"line":94},[66,3865,3866],{},"tasks.append(\"列表\")\n",[66,3868,3869],{"class":68,"line":100},[66,3870,3871],{},"print(shared)\n",[66,3873,3874],{"class":68,"line":2453},[66,3875,3876],{},"print(backup)\n",[66,3878,3879],{"class":68,"line":2459},[66,3880,3881],{},"print(tasks is shared)\n",[66,3883,3885],{"class":68,"line":3884},9,[66,3886,3887],{},"print(tasks is backup)\n",[10,3889,106],{},[56,3891,3894],{"className":3892,"code":3893,"language":112,"meta":61},[110],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[63,3895,3893],{"__ignoreMap":61},[10,3897,117],{},[14,3899,120],{"id":120},[122,3901,3902,3908],{},[40,3903,3904,3907],{},[63,3905,3906],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3909,3910,3913,3914,3917,3918,3921],{},[63,3911,3912],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[63,3915,3916],{},"shared"," 能观察到变化，",[63,3919,3920],{},"backup"," 不会。",[294,3923,2663],{"id":2663},[10,3925,3926],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3928,3929],{},[26,3930],{"alt":3931,"src":3932},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3934,3935],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3937,138],{"id":138},[37,3939,3940,3948],{},[40,3941,3942,3943,3945,3946,328],{},"用 ",[63,3944,2773],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[63,3947,3826],{},[40,3949,3950],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3952,153],{"id":153},[122,3954,3955,3958],{},[40,3956,3957],{},"让两个变量引用同一个字典并修改其中一个。",[40,3959,2303,3960,3963,3964,1123,3966,328],{},[63,3961,3962],{},"copy()"," 创建外层副本，再比较 ",[63,3965,3826],{},[63,3967,2773],{},[10,3969,170],{},[14,3971,173],{"id":173},[10,3973,3974],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,3976,180],{},{"title":61,"searchDepth":75,"depth":75,"links":3978},[3979,3980,3981,3982,3983,3986,3987,3988],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":3984},[3985],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3786,"description":3791},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[191,3996,3997],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4000,"title":4001,"body":4002,"category":191,"cover":192,"description":4006,"extension":193,"meta":4219,"navigation":90,"path":4220,"pinned":196,"publishedAt":197,"seo":4221,"slug":4222,"stem":4223,"summary":4224,"tags":4225,"updatedAt":197,"visible":90,"__hash__":4227},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4003,"toc":4206},[4004,4007,4009,4012,4014,4020,4030,4032,4043,4045,4047,4100,4102,4108,4110,4112,4130,4132,4135,4141,4149,4152,4155,4161,4167,4169,4187,4189,4197,4199,4201,4204],[10,4005,4006],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4008,16],{"id":16},[10,4010,4011],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4013,22],{"id":22},[10,4015,4016],{},[26,4017],{"alt":4018,"src":4019},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4021,4022,2221,4024,2221,4027,4029],{},[63,4023,1122],{},[63,4025,4026],{},"elif",[63,4028,1126],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4031,35],{"id":35},[37,4033,4034,4037,4040],{},[40,4035,4036],{},"冒号表示接下来开始一个代码块。",[40,4038,4039],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4041,4042],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4044,51],{"id":51},[10,4046,54],{},[56,4048,4050],{"className":58,"code":4049,"language":60,"meta":61,"style":61},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[63,4051,4052,4057,4061,4066,4071,4076,4081,4085,4090,4094],{"__ignoreMap":61},[66,4053,4054],{"class":68,"line":69},[66,4055,4056],{},"score = int(input(\"请输入分数：\"))\n",[66,4058,4059],{"class":68,"line":75},[66,4060,91],{"emptyLinePlaceholder":90},[66,4062,4063],{"class":68,"line":81},[66,4064,4065],{},"if score >= 90:\n",[66,4067,4068],{"class":68,"line":87},[66,4069,4070],{},"    level = \"优秀\"\n",[66,4072,4073],{"class":68,"line":94},[66,4074,4075],{},"elif score >= 60:\n",[66,4077,4078],{"class":68,"line":100},[66,4079,4080],{},"    level = \"合格\"\n",[66,4082,4083],{"class":68,"line":2453},[66,4084,1112],{},[66,4086,4087],{"class":68,"line":2459},[66,4088,4089],{},"    level = \"需要继续学习\"\n",[66,4091,4092],{"class":68,"line":3884},[66,4093,91],{"emptyLinePlaceholder":90},[66,4095,4097],{"class":68,"line":4096},10,[66,4098,4099],{},"print(level)\n",[10,4101,106],{},[56,4103,4106],{"className":4104,"code":4105,"language":112,"meta":61},[110],"输入 85 时输出：合格\n",[63,4107,4105],{"__ignoreMap":61},[10,4109,117],{},[14,4111,120],{"id":120},[122,4113,4114,4121],{},[40,4115,4116,4117,4120],{},"输入先转换为整数，程序从 ",[63,4118,4119],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4122,4123,4126,4127,4129],{},[63,4124,4125],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[63,4128,1126],{}," 被跳过；最终三个分支只会选择一个。",[294,4131,2663],{"id":2663},[10,4133,4134],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4136,4137],{},[26,4138],{"alt":4139,"src":4140},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4142,4143,4145,4146,4148],{},[63,4144,4119],{}," 必须放在 ",[63,4147,4125],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[294,4150,2663],{"id":4151},"再看一个具体细节-1",[10,4153,4154],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4156,4157],{},[26,4158],{"alt":4159,"src":4160},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4162,4163,4164,4166],{},"同一缩进层级属于同一个代码块；回到 ",[63,4165,1122],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4168,138],{"id":138},[37,4170,4171,4177],{},[40,4172,4173,4174,4176],{},"先写 ",[63,4175,4125],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4178,4179,4180,4182,4183,4186],{},"混用多个独立 ",[63,4181,1122],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[63,4184,4185],{},"if\u002Felif\u002Felse"," 链。",[14,4188,153],{"id":153},[122,4190,4191,4194],{},[40,4192,4193],{},"根据温度输出“冷、适中、热”三个等级。",[40,4195,4196],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4198,170],{},[14,4200,173],{"id":173},[10,4202,4203],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,4205,180],{},{"title":61,"searchDepth":75,"depth":75,"links":4207},[4208,4209,4210,4211,4212,4216,4217,4218],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":4213},[4214,4215],{"id":2663,"depth":81,"text":2663},{"id":4151,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4001,"description":4006},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[191,1122,4226],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4229,"title":4230,"body":4231,"category":191,"cover":192,"description":4235,"extension":193,"meta":4401,"navigation":90,"path":4402,"pinned":196,"publishedAt":197,"seo":4403,"slug":4404,"stem":4405,"summary":4406,"tags":4407,"updatedAt":197,"visible":90,"__hash__":4409},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4232,"toc":4389},[4233,4236,4238,4241,4243,4249,4255,4257,4272,4274,4276,4314,4316,4322,4324,4326,4341,4343,4346,4352,4358,4360,4368,4370,4380,4382,4384,4387],[10,4234,4235],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4237,16],{"id":16},[10,4239,4240],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4242,22],{"id":22},[10,4244,4245],{},[26,4246],{"alt":4247,"src":4248},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4250,4251,4254],{},[63,4252,4253],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4256,35],{"id":35},[37,4258,4259,4262,4265],{},[40,4260,4261],{},"进入循环前先准备参与条件判断的状态。",[40,4263,4264],{},"循环体中必须有机会让条件变为假。",[40,4266,4267,4268,4271],{},"能够预先确定遍历对象时，后续介绍的 ",[63,4269,4270],{},"for"," 通常更直接。",[14,4273,51],{"id":51},[10,4275,54],{},[56,4277,4279],{"className":58,"code":4278,"language":60,"meta":61,"style":61},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[63,4280,4281,4286,4290,4295,4300,4305,4309],{"__ignoreMap":61},[66,4282,4283],{"class":68,"line":69},[66,4284,4285],{},"count = 1\n",[66,4287,4288],{"class":68,"line":75},[66,4289,91],{"emptyLinePlaceholder":90},[66,4291,4292],{"class":68,"line":81},[66,4293,4294],{},"while count \u003C= 3:\n",[66,4296,4297],{"class":68,"line":87},[66,4298,4299],{},"    print(\"第\", count, \"次练习\")\n",[66,4301,4302],{"class":68,"line":94},[66,4303,4304],{},"    count = count + 1\n",[66,4306,4307],{"class":68,"line":100},[66,4308,91],{"emptyLinePlaceholder":90},[66,4310,4311],{"class":68,"line":2453},[66,4312,4313],{},"print(\"练习结束\")\n",[10,4315,106],{},[56,4317,4320],{"className":4318,"code":4319,"language":112,"meta":61},[110],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[63,4321,4319],{"__ignoreMap":61},[10,4323,117],{},[14,4325,120],{"id":120},[122,4327,4328,4335],{},[40,4329,4330,4331,4334],{},"进入循环前 ",[63,4332,4333],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4336,4337,4338,4340],{},"循环体末尾把 ",[63,4339,4333],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[294,4342,2663],{"id":2663},[10,4344,4345],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4347,4348],{},[26,4349],{"alt":4350,"src":4351},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4353,4354,4355,4357],{},"第4次检查时 ",[63,4356,4333],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4359,138],{"id":138},[37,4361,4362,4365],{},[40,4363,4364],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4366,4367],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4369,153],{"id":153},[122,4371,4372,4377],{},[40,4373,2303,4374,4376],{},[63,4375,4253],{}," 输出 1 到 5。",[40,4378,4379],{},"计算 1 到 10 的累加和。",[10,4381,170],{},[14,4383,173],{"id":173},[10,4385,4386],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,4388,180],{},{"title":61,"searchDepth":75,"depth":75,"links":4390},[4391,4392,4393,4394,4395,4398,4399,4400],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":4396},[4397],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4230,"description":4235},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[191,4253,4408],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4411,"title":4412,"body":4413,"category":191,"cover":192,"description":4417,"extension":193,"meta":4565,"navigation":90,"path":4566,"pinned":196,"publishedAt":197,"seo":4567,"slug":4568,"stem":4569,"summary":4570,"tags":4571,"updatedAt":197,"visible":90,"__hash__":4573},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4414,"toc":4555},[4415,4418,4420,4423,4425,4431,4436,4438,4452,4454,4456,4494,4496,4502,4504,4506,4523,4525,4533,4535,4546,4548,4550,4553],[10,4416,4417],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4419,16],{"id":16},[10,4421,4422],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4424,22],{"id":22},[10,4426,4427],{},[26,4428],{"alt":4429,"src":4430},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4432,4433,4435],{},[63,4434,4270],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4437,35],{"id":35},[37,4439,4440,4446,4449],{},[40,4441,4442,4445],{},[63,4443,4444],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4447,4448],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4450,4451],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4453,51],{"id":51},[10,4455,54],{},[56,4457,4459],{"className":58,"code":4458,"language":60,"meta":61,"style":61},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[63,4460,4461,4466,4470,4475,4480,4484,4489],{"__ignoreMap":61},[66,4462,4463],{"class":68,"line":69},[66,4464,4465],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[66,4467,4468],{"class":68,"line":75},[66,4469,91],{"emptyLinePlaceholder":90},[66,4471,4472],{"class":68,"line":81},[66,4473,4474],{},"for course in courses:\n",[66,4476,4477],{"class":68,"line":87},[66,4478,4479],{},"    print(course)\n",[66,4481,4482],{"class":68,"line":94},[66,4483,91],{"emptyLinePlaceholder":90},[66,4485,4486],{"class":68,"line":100},[66,4487,4488],{},"for number in range(1, 4):\n",[66,4490,4491],{"class":68,"line":2453},[66,4492,4493],{},"    print(number)\n",[10,4495,106],{},[56,4497,4500],{"className":4498,"code":4499,"language":112,"meta":61},[110],"变量\n字符串\n列表\n1\n2\n3\n",[63,4501,4499],{"__ignoreMap":61},[10,4503,117],{},[14,4505,120],{"id":120},[122,4507,4508,4518],{},[40,4509,4510,4511,4513,4514,4517],{},"第一个 ",[63,4512,4270],{}," 依次从列表取得字符串，循环变量 ",[63,4515,4516],{},"course"," 每轮重新绑定。",[40,4519,4520,4522],{},[63,4521,4444],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4524,138],{"id":138},[37,4526,4527,4530],{},[40,4528,4529],{},"只需要元素却手工维护索引，增加越界风险。",[40,4531,4532],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4534,153],{"id":153},[122,4536,4537,4540],{},[40,4538,4539],{},"逐项输出一个字符串中的字符。",[40,4541,2303,4542,4545],{},[63,4543,4544],{},"range()"," 输出 2、4、6、8。",[10,4547,170],{},[14,4549,173],{"id":173},[10,4551,4552],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,4554,180],{},{"title":61,"searchDepth":75,"depth":75,"links":4556},[4557,4558,4559,4560,4561,4562,4563,4564],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4412,"description":4417},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[191,4270,4572],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4575,"title":4576,"body":4577,"category":191,"cover":192,"description":4581,"extension":193,"meta":4755,"navigation":90,"path":4756,"pinned":196,"publishedAt":197,"seo":4757,"slug":4758,"stem":4759,"summary":4760,"tags":4761,"updatedAt":197,"visible":90,"__hash__":4762},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4578,"toc":4745},[4579,4582,4584,4587,4589,4595,4605,4607,4626,4628,4630,4682,4684,4690,4692,4694,4708,4710,4726,4728,4736,4738,4740,4743],[10,4580,4581],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4583,16],{"id":16},[10,4585,4586],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4588,22],{"id":22},[10,4590,4591],{},[26,4592],{"alt":4593,"src":4594},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4596,4597,4600,4601,4604],{},[63,4598,4599],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[63,4602,4603],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4606,35],{"id":35},[37,4608,4609,4612,4620],{},[40,4610,4611],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4613,4614,4616,4617,4619],{},[63,4615,4599],{}," 前要确认不会跳过 ",[63,4618,4253],{}," 循环中的状态更新。",[40,4621,4622,4623,4625],{},"多层嵌套中 ",[63,4624,4603],{}," 只结束它所在的最内层循环。",[14,4627,51],{"id":51},[10,4629,54],{},[56,4631,4633],{"className":58,"code":4632,"language":60,"meta":61,"style":61},"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",[63,4634,4635,4640,4644,4649,4654,4659,4664,4669,4673,4677],{"__ignoreMap":61},[66,4636,4637],{"class":68,"line":69},[66,4638,4639],{},"numbers = [3, -1, 0, 8, 12]\n",[66,4641,4642],{"class":68,"line":75},[66,4643,91],{"emptyLinePlaceholder":90},[66,4645,4646],{"class":68,"line":81},[66,4647,4648],{},"for number in numbers:\n",[66,4650,4651],{"class":68,"line":87},[66,4652,4653],{},"    if number \u003C 0:\n",[66,4655,4656],{"class":68,"line":94},[66,4657,4658],{},"        continue\n",[66,4660,4661],{"class":68,"line":100},[66,4662,4663],{},"    if number == 0:\n",[66,4665,4666],{"class":68,"line":2453},[66,4667,4668],{},"        break\n",[66,4670,4671],{"class":68,"line":2459},[66,4672,4493],{},[66,4674,4675],{"class":68,"line":3884},[66,4676,91],{"emptyLinePlaceholder":90},[66,4678,4679],{"class":68,"line":4096},[66,4680,4681],{},"print(\"循环结束\")\n",[10,4683,106],{},[56,4685,4688],{"className":4686,"code":4687,"language":112,"meta":61},[110],"3\n循环结束\n",[63,4689,4687],{"__ignoreMap":61},[10,4691,117],{},[14,4693,120],{"id":120},[122,4695,4696,4702],{},[40,4697,4698,4699,4701],{},"遇到 -1 时 ",[63,4700,4599],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4703,4704,4705,4707],{},"遇到 0 时 ",[63,4706,4603],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4709,138],{"id":138},[37,4711,4712,4717],{},[40,4713,143,4714,4716],{},[63,4715,4599],{}," 当作结束循环，实际它只跳到下一轮。",[40,4718,4719,4720,4722,4723,4725],{},"在 ",[63,4721,4253],{}," 中把状态更新放在可能被 ",[63,4724,4599],{}," 跳过的位置，造成无限循环。",[14,4727,153],{"id":153},[122,4729,4730,4733],{},[40,4731,4732],{},"跳过列表中的空字符串并输出其他内容。",[40,4734,4735],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4737,170],{},[14,4739,173],{"id":173},[10,4741,4742],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,4744,180],{},{"title":61,"searchDepth":75,"depth":75,"links":4746},[4747,4748,4749,4750,4751,4752,4753,4754],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4576,"description":4581},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[191,4603,4599],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4764,"title":4765,"body":4766,"category":191,"cover":192,"description":4770,"extension":193,"meta":4941,"navigation":90,"path":4942,"pinned":196,"publishedAt":197,"seo":4943,"slug":4944,"stem":4945,"summary":4946,"tags":4947,"updatedAt":197,"visible":90,"__hash__":4950},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4767,"toc":4929},[4768,4771,4773,4776,4778,4784,4787,4789,4813,4815,4817,4851,4853,4859,4861,4863,4880,4882,4885,4891,4894,4896,4910,4912,4920,4922,4924,4927],[10,4769,4770],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4772,16],{"id":16},[10,4774,4775],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4777,22],{"id":22},[10,4779,4780],{},[26,4781],{"alt":4782,"src":4783},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4785,4786],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4788,35],{"id":35},[37,4790,4791,4794,4797],{},[40,4792,4793],{},"每增加一层嵌套，阅读成本都会上升。",[40,4795,4796],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4798,4799,4800,2221,4803,4806,4807,2221,4810,328],{},"变量名使用 ",[63,4801,4802],{},"row",[63,4804,4805],{},"cell"," 等层级含义，避免全部写成 ",[63,4808,4809],{},"i",[63,4811,4812],{},"j",[14,4814,51],{"id":51},[10,4816,54],{},[56,4818,4820],{"className":58,"code":4819,"language":60,"meta":61,"style":61},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[63,4821,4822,4827,4831,4836,4841,4846],{"__ignoreMap":61},[66,4823,4824],{"class":68,"line":69},[66,4825,4826],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[66,4828,4829],{"class":68,"line":75},[66,4830,91],{"emptyLinePlaceholder":90},[66,4832,4833],{"class":68,"line":81},[66,4834,4835],{},"for row in table:\n",[66,4837,4838],{"class":68,"line":87},[66,4839,4840],{},"    for cell in row:\n",[66,4842,4843],{"class":68,"line":94},[66,4844,4845],{},"        print(cell)\n",[66,4847,4848],{"class":68,"line":100},[66,4849,4850],{},"    print(\"一行结束\")\n",[10,4852,106],{},[56,4854,4857],{"className":4855,"code":4856,"language":112,"meta":61},[110],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[63,4858,4856],{"__ignoreMap":61},[10,4860,117],{},[14,4862,120],{"id":120},[122,4864,4865,4877],{},[40,4866,4867,4868,4870,4871,1123,4874,328],{},"外层变量 ",[63,4869,4802],{}," 先引用第一行列表，内层才依次处理 ",[63,4872,4873],{},"A1",[63,4875,4876],{},"A2",[40,4878,4879],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[294,4881,2663],{"id":2663},[10,4883,4884],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4886,4887],{},[26,4888],{"alt":4889,"src":4890},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4892,4893],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4895,138],{"id":138},[37,4897,4898,4907],{},[40,4899,4900,4901,975,4904,4906],{},"把两层循环变量都叫 ",[63,4902,4903],{},"item",[63,4905,4809],{},"，难以确认当前层级。",[40,4908,4909],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4911,153],{"id":153},[122,4913,4914,4917],{},[40,4915,4916],{},"打印一个 2×3 数字表。",[40,4918,4919],{},"在内层增加条件，只输出大于 3 的元素。",[10,4921,170],{},[14,4923,173],{"id":173},[10,4925,4926],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,4928,180],{},{"title":61,"searchDepth":75,"depth":75,"links":4930},[4931,4932,4933,4934,4935,4938,4939,4940],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":4936},[4937],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4765,"description":4770},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[191,4948,4949],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4952,"title":4953,"body":4954,"category":191,"cover":192,"description":4958,"extension":193,"meta":5096,"navigation":90,"path":5097,"pinned":196,"publishedAt":197,"seo":5098,"slug":5099,"stem":5100,"summary":5101,"tags":5102,"updatedAt":197,"visible":90,"__hash__":5105},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4955,"toc":5086},[4956,4959,4961,4964,4966,4972,4975,4977,4988,4990,4992,5030,5032,5038,5040,5042,5054,5056,5067,5069,5077,5079,5081,5084],[10,4957,4958],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4960,16],{"id":16},[10,4962,4963],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4965,22],{"id":22},[10,4967,4968],{},[26,4969],{"alt":4970,"src":4971},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4973,4974],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4976,35],{"id":35},[37,4978,4979,4982,4985],{},[40,4980,4981],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,4983,4984],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,4986,4987],{},"推导式创建新列表，不修改输入列表。",[14,4989,51],{"id":51},[10,4991,54],{},[56,4993,4995],{"className":58,"code":4994,"language":60,"meta":61,"style":61},"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",[63,4996,4997,5002,5006,5011,5016,5020,5025],{"__ignoreMap":61},[66,4998,4999],{"class":68,"line":69},[66,5000,5001],{},"numbers = [1, 2, 3, 4, 5]\n",[66,5003,5004],{"class":68,"line":75},[66,5005,91],{"emptyLinePlaceholder":90},[66,5007,5008],{"class":68,"line":81},[66,5009,5010],{},"squares = [number * number for number in numbers]\n",[66,5012,5013],{"class":68,"line":87},[66,5014,5015],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[66,5017,5018],{"class":68,"line":94},[66,5019,91],{"emptyLinePlaceholder":90},[66,5021,5022],{"class":68,"line":100},[66,5023,5024],{},"print(squares)\n",[66,5026,5027],{"class":68,"line":2453},[66,5028,5029],{},"print(even_squares)\n",[10,5031,106],{},[56,5033,5036],{"className":5034,"code":5035,"language":112,"meta":61},[110],"[1, 4, 9, 16, 25]\n[4, 16]\n",[63,5037,5035],{"__ignoreMap":61},[10,5039,117],{},[14,5041,120],{"id":120},[122,5043,5044,5047],{},[40,5045,5046],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5048,5049,5050,5053],{},"第二条先用 ",[63,5051,5052],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5055,138],{"id":138},[37,5057,5058,5064],{},[40,5059,5060,5061,5063],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[63,5062,4270],{}," 开始找输入。",[40,5065,5066],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5068,153],{"id":153},[122,5070,5071,5074],{},[40,5072,5073],{},"把字符串列表转换为长度列表。",[40,5075,5076],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5078,170],{},[14,5080,173],{"id":173},[10,5082,5083],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,5085,180],{},{"title":61,"searchDepth":75,"depth":75,"links":5087},[5088,5089,5090,5091,5092,5093,5094,5095],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4953,"description":4958},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[191,5103,5104],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5107,"title":5108,"body":5109,"category":191,"cover":192,"description":5113,"extension":193,"meta":5256,"navigation":90,"path":5257,"pinned":196,"publishedAt":197,"seo":5258,"slug":5259,"stem":5260,"summary":5261,"tags":5262,"updatedAt":197,"visible":90,"__hash__":5265},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5110,"toc":5246},[5111,5114,5116,5119,5121,5127,5130,5132,5143,5145,5147,5186,5188,5194,5196,5198,5213,5215,5223,5225,5237,5239,5241,5244],[10,5112,5113],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5115,16],{"id":16},[10,5117,5118],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5120,22],{"id":22},[10,5122,5123],{},[26,5124],{"alt":5125,"src":5126},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5128,5129],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5131,35],{"id":35},[37,5133,5134,5137,5140],{},[40,5135,5136],{},"函数名描述动作，使用小写字母和下划线。",[40,5138,5139],{},"函数定义要先执行，之后才能调用。",[40,5141,5142],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5144,51],{"id":51},[10,5146,54],{},[56,5148,5150],{"className":58,"code":5149,"language":60,"meta":61,"style":61},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[63,5151,5152,5157,5162,5167,5171,5176,5181],{"__ignoreMap":61},[66,5153,5154],{"class":68,"line":69},[66,5155,5156],{},"def show_progress():\n",[66,5158,5159],{"class":68,"line":75},[66,5160,5161],{},"    print(\"正在学习函数\")\n",[66,5163,5164],{"class":68,"line":81},[66,5165,5166],{},"    print(\"本节完成 50%\")\n",[66,5168,5169],{"class":68,"line":87},[66,5170,91],{"emptyLinePlaceholder":90},[66,5172,5173],{"class":68,"line":94},[66,5174,5175],{},"print(\"调用前\")\n",[66,5177,5178],{"class":68,"line":100},[66,5179,5180],{},"show_progress()\n",[66,5182,5183],{"class":68,"line":2453},[66,5184,5185],{},"print(\"调用后\")\n",[10,5187,106],{},[56,5189,5192],{"className":5190,"code":5191,"language":112,"meta":61},[110],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[63,5193,5191],{"__ignoreMap":61},[10,5195,117],{},[14,5197,120],{"id":120},[122,5199,5200,5206],{},[40,5201,904,5202,5205],{},[63,5203,5204],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5207,5208,5209,5212],{},"运行到 ",[63,5210,5211],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5214,138],{"id":138},[37,5216,5217,5220],{},[40,5218,5219],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5221,5222],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5224,153],{"id":153},[122,5226,5227,5234],{},[40,5228,5229,5230,5233],{},"定义 ",[63,5231,5232],{},"show_plan()"," 输出两行学习计划。",[40,5235,5236],{},"连续调用同一个函数两次，观察执行顺序。",[10,5238,170],{},[14,5240,173],{"id":173},[10,5242,5243],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,5245,180],{},{"title":61,"searchDepth":75,"depth":75,"links":5247},[5248,5249,5250,5251,5252,5253,5254,5255],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5108,"description":5113},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[191,5263,5264],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5267,"title":5268,"body":5269,"category":191,"cover":192,"description":5273,"extension":193,"meta":5453,"navigation":90,"path":5454,"pinned":196,"publishedAt":197,"seo":5455,"slug":5456,"stem":5457,"summary":5458,"tags":5459,"updatedAt":197,"visible":90,"__hash__":5462},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5270,"toc":5441},[5271,5274,5276,5279,5281,5287,5294,5296,5313,5315,5317,5351,5353,5359,5361,5363,5384,5386,5389,5395,5405,5407,5422,5424,5432,5434,5436,5439],[10,5272,5273],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5275,16],{"id":16},[10,5277,5278],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5280,22],{"id":22},[10,5282,5283],{},[26,5284],{"alt":5285,"src":5286},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5288,5289,5290,5293],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[63,5291,5292],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5295,35],{"id":35},[37,5297,5298,5301,5304],{},[40,5299,5300],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5302,5303],{},"局部变量默认只在函数内部可见。",[40,5305,5306,5307,5309,5310,328],{},"没有显式 ",[63,5308,5292],{}," 的函数会返回 ",[63,5311,5312],{},"None",[14,5314,51],{"id":51},[10,5316,54],{},[56,5318,5320],{"className":58,"code":5319,"language":60,"meta":61,"style":61},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[63,5321,5322,5327,5332,5337,5341,5346],{"__ignoreMap":61},[66,5323,5324],{"class":68,"line":69},[66,5325,5326],{},"def calculate_total(price, count):\n",[66,5328,5329],{"class":68,"line":75},[66,5330,5331],{},"    total = price * count\n",[66,5333,5334],{"class":68,"line":81},[66,5335,5336],{},"    return total\n",[66,5338,5339],{"class":68,"line":87},[66,5340,91],{"emptyLinePlaceholder":90},[66,5342,5343],{"class":68,"line":94},[66,5344,5345],{},"result = calculate_total(25, 4)\n",[66,5347,5348],{"class":68,"line":100},[66,5349,5350],{},"print(result)\n",[10,5352,106],{},[56,5354,5357],{"className":5355,"code":5356,"language":112,"meta":61},[110],"100\n",[63,5358,5356],{"__ignoreMap":61},[10,5360,117],{},[14,5362,120],{"id":120},[122,5364,5365,5374],{},[40,5366,5367,5368,2221,5371,5373],{},"调用时 25 和 4 分别绑定到 ",[63,5369,5370],{},"price",[63,5372,4333],{},"，它们只在本次函数调用的局部范围中使用。",[40,5375,5376,5379,5380,5383],{},[63,5377,5378],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[63,5381,5382],{},"result"," 并输出。",[294,5385,2663],{"id":2663},[10,5387,5388],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5390,5391],{},[26,5392],{"alt":5393,"src":5394},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5396,5397,2221,5399,1123,5401,5404],{},[63,5398,5370],{},[63,5400,4333],{},[63,5402,5403],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5406,138],{"id":138},[37,5408,5409,5416],{},[40,5410,5411,5412,5415],{},"在函数内部只 ",[63,5413,5414],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5417,5418,5419,5421],{},"试图在函数外直接访问局部变量 ",[63,5420,5403],{},"，它的名字只在调用期间的局部作用域存在。",[14,5423,153],{"id":153},[122,5425,5426,5429],{},[40,5427,5428],{},"编写计算长方形面积的函数。",[40,5430,5431],{},"让函数返回结果后在调用方加上单位再输出。",[10,5433,170],{},[14,5435,173],{"id":173},[10,5437,5438],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,5440,180],{},{"title":61,"searchDepth":75,"depth":75,"links":5442},[5443,5444,5445,5446,5447,5450,5451,5452],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":5448},[5449],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5268,"description":5273},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[191,5460,5461],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5464,"title":5465,"body":5466,"category":191,"cover":192,"description":5470,"extension":193,"meta":5650,"navigation":90,"path":5651,"pinned":196,"publishedAt":197,"seo":5652,"slug":5653,"stem":5654,"summary":5655,"tags":5656,"updatedAt":197,"visible":90,"__hash__":5659},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5467,"toc":5638},[5468,5471,5473,5476,5478,5484,5487,5489,5506,5508,5510,5562,5564,5570,5572,5574,5592,5594,5597,5603,5606,5608,5619,5621,5629,5631,5633,5636],[10,5469,5470],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5472,16],{"id":16},[10,5474,5475],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5477,22],{"id":22},[10,5479,5480],{},[26,5481],{"alt":5482,"src":5483},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5485,5486],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5488,35],{"id":35},[37,5490,5491,5494,5500],{},[40,5492,5493],{},"必需参数应放在有默认值的参数之前。",[40,5495,5496,5499],{},[63,5497,5498],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5501,5502,5505],{},[63,5503,5504],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5507,51],{"id":51},[10,5509,54],{},[56,5511,5513],{"className":58,"code":5512,"language":60,"meta":61,"style":61},"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",[63,5514,5515,5520,5525,5529,5534,5539,5543,5548,5553,5557],{"__ignoreMap":61},[66,5516,5517],{"class":68,"line":69},[66,5518,5519],{},"def build_title(name, level=\"基础\"):\n",[66,5521,5522],{"class":68,"line":75},[66,5523,5524],{},"    return name + \"｜\" + level\n",[66,5526,5527],{"class":68,"line":81},[66,5528,91],{"emptyLinePlaceholder":90},[66,5530,5531],{"class":68,"line":87},[66,5532,5533],{},"print(build_title(\"Python\"))\n",[66,5535,5536],{"class":68,"line":94},[66,5537,5538],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[66,5540,5541],{"class":68,"line":100},[66,5542,91],{"emptyLinePlaceholder":90},[66,5544,5545],{"class":68,"line":2453},[66,5546,5547],{},"def total(*numbers):\n",[66,5549,5550],{"class":68,"line":2459},[66,5551,5552],{},"    return sum(numbers)\n",[66,5554,5555],{"class":68,"line":3884},[66,5556,91],{"emptyLinePlaceholder":90},[66,5558,5559],{"class":68,"line":4096},[66,5560,5561],{},"print(total(10, 20, 30))\n",[10,5563,106],{},[56,5565,5568],{"className":5566,"code":5567,"language":112,"meta":61},[110],"Python｜基础\n异常处理｜进阶\n60\n",[63,5569,5567],{"__ignoreMap":61},[10,5571,117],{},[14,5573,120],{"id":120},[122,5575,5576,5583],{},[40,5577,5578,5579,5582],{},"第一次调用只提供必需参数，",[63,5580,5581],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5584,5585,5588,5589,328],{},[63,5586,5587],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[63,5590,5591],{},"sum()",[294,5593,2663],{"id":2663},[10,5595,5596],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5598,5599],{},[26,5600],{"alt":5601,"src":5602},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5604,5605],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5607,138],{"id":138},[37,5609,5610,5616],{},[40,5611,5612,5613,5615],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[63,5614,5312],{}," 再在函数内创建。",[40,5617,5618],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5620,153],{"id":153},[122,5622,5623,5626],{},[40,5624,5625],{},"给问候函数增加默认称呼。",[40,5627,5628],{},"编写接收任意数量分数并返回总分的函数。",[10,5630,170],{},[14,5632,173],{"id":173},[10,5634,5635],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,5637,180],{},{"title":61,"searchDepth":75,"depth":75,"links":5639},[5640,5641,5642,5643,5644,5647,5648,5649],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":5645},[5646],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5465,"description":5470},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[191,5657,5658],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5661,"title":5662,"body":5663,"category":191,"cover":192,"description":5667,"extension":193,"meta":5864,"navigation":90,"path":5865,"pinned":196,"publishedAt":197,"seo":5866,"slug":5867,"stem":5868,"summary":5869,"tags":5870,"updatedAt":197,"visible":90,"__hash__":5873},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5664,"toc":5852},[5665,5668,5670,5673,5675,5681,5684,5686,5703,5705,5707,5770,5772,5778,5780,5782,5809,5811,5814,5820,5823,5825,5833,5835,5843,5845,5847,5850],[10,5666,5667],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5669,16],{"id":16},[10,5671,5672],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5674,22],{"id":22},[10,5676,5677],{},[26,5678],{"alt":5679,"src":5680},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5682,5683],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5685,35],{"id":35},[37,5687,5688,5691,5694],{},[40,5689,5690],{},"函数内部赋值默认创建局部变量。",[40,5692,5693],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5695,5696,164,5699,5702],{},[63,5697,5698],{},"global",[63,5700,5701],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5704,51],{"id":51},[10,5706,54],{},[56,5708,5710],{"className":58,"code":5709,"language":60,"meta":61,"style":61},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[63,5711,5712,5717,5721,5726,5731,5735,5740,5745,5750,5754,5759,5764],{"__ignoreMap":61},[66,5713,5714],{"class":68,"line":69},[66,5715,5716],{},"course = \"Python\"\n",[66,5718,5719],{"class":68,"line":75},[66,5720,91],{"emptyLinePlaceholder":90},[66,5722,5723],{"class":68,"line":81},[66,5724,5725],{},"def outer():\n",[66,5727,5728],{"class":68,"line":87},[66,5729,5730],{},"    level = \"基础\"\n",[66,5732,5733],{"class":68,"line":94},[66,5734,91],{"emptyLinePlaceholder":90},[66,5736,5737],{"class":68,"line":100},[66,5738,5739],{},"    def show():\n",[66,5741,5742],{"class":68,"line":2453},[66,5743,5744],{},"        lesson = \"作用域\"\n",[66,5746,5747],{"class":68,"line":2459},[66,5748,5749],{},"        print(course, level, lesson)\n",[66,5751,5752],{"class":68,"line":3884},[66,5753,91],{"emptyLinePlaceholder":90},[66,5755,5756],{"class":68,"line":4096},[66,5757,5758],{},"    show()\n",[66,5760,5762],{"class":68,"line":5761},11,[66,5763,91],{"emptyLinePlaceholder":90},[66,5765,5767],{"class":68,"line":5766},12,[66,5768,5769],{},"outer()\n",[10,5771,106],{},[56,5773,5776],{"className":5774,"code":5775,"language":112,"meta":61},[110],"Python 基础 作用域\n",[63,5777,5775],{"__ignoreMap":61},[10,5779,117],{},[14,5781,120],{"id":120},[122,5783,5784,5801],{},[40,5785,5786,5789,5790,5793,5794,5796,5797,5800],{},[63,5787,5788],{},"show()"," 中查找 ",[63,5791,5792],{},"lesson"," 时先在局部找到，查找 ",[63,5795,5581],{}," 时到外层 ",[63,5798,5799],{},"outer()"," 找到。",[40,5802,5803,5805,5806,5808],{},[63,5804,4516],{}," 在局部和外层都不存在，继续到模块全局找到；",[63,5807,2172],{}," 最后在内置作用域找到。",[294,5810,2663],{"id":2663},[10,5812,5813],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5815,5816],{},[26,5817],{"alt":5818,"src":5819},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5821,5822],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5824,138],{"id":138},[37,5826,5827,5830],{},[40,5828,5829],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5831,5832],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5834,153],{"id":153},[122,5836,5837,5840],{},[40,5838,5839],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5841,5842],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5844,170],{},[14,5846,173],{"id":173},[10,5848,5849],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,5851,180],{},{"title":61,"searchDepth":75,"depth":75,"links":5853},[5854,5855,5856,5857,5858,5861,5862,5863],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":5859},[5860],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5662,"description":5667},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[191,5871,5872],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5875,"title":5876,"body":5877,"category":191,"cover":192,"description":5881,"extension":193,"meta":6031,"navigation":90,"path":6032,"pinned":196,"publishedAt":197,"seo":6033,"slug":6034,"stem":6035,"summary":6036,"tags":6037,"updatedAt":197,"visible":90,"__hash__":6040},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5878,"toc":6021},[5879,5882,5884,5887,5889,5895,5898,5900,5919,5921,5923,5957,5959,5965,5967,5969,5984,5986,5998,6000,6012,6014,6016,6019],[10,5880,5881],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5883,16],{"id":16},[10,5885,5886],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5888,22],{"id":22},[10,5890,5891],{},[26,5892],{"alt":5893,"src":5894},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5896,5897],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5899,35],{"id":35},[37,5901,5902,5905,5908],{},[40,5903,5904],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5906,5907],{},"注解表达接口意图，不代替输入校验和测试。",[40,5909,5910,5911,2221,5913,2221,5915,5918],{},"基础注解优先使用 ",[63,5912,2224],{},[63,5914,2390],{},[63,5916,5917],{},"list[str]"," 等直接写法。",[14,5920,51],{"id":51},[10,5922,54],{},[56,5924,5926],{"className":58,"code":5925,"language":60,"meta":61,"style":61},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[63,5927,5928,5933,5938,5943,5947,5952],{"__ignoreMap":61},[66,5929,5930],{"class":68,"line":69},[66,5931,5932],{},"def format_score(name: str, score: int) -> str:\n",[66,5934,5935],{"class":68,"line":75},[66,5936,5937],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[66,5939,5940],{"class":68,"line":81},[66,5941,5942],{},"    return name + \"：\" + str(score)\n",[66,5944,5945],{"class":68,"line":87},[66,5946,91],{"emptyLinePlaceholder":90},[66,5948,5949],{"class":68,"line":94},[66,5950,5951],{},"print(format_score(\"小郑\", 95))\n",[66,5953,5954],{"class":68,"line":100},[66,5955,5956],{},"print(format_score.__doc__)\n",[10,5958,106],{},[56,5960,5963],{"className":5961,"code":5962,"language":112,"meta":61},[110],"小郑：95\n返回带姓名的分数文本。\n",[63,5964,5962],{"__ignoreMap":61},[10,5966,117],{},[14,5968,120],{"id":120},[122,5970,5971,5981],{},[40,5972,5973,5974,5977,5978,5980],{},"函数签名说明 ",[63,5975,5976],{},"name"," 预期为字符串、",[63,5979,2210],{}," 预期为整数，返回值预期为字符串。",[40,5982,5983],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5985,138],{"id":138},[37,5987,5988,5995],{},[40,5989,5990,5991,5994],{},"认为加了 ",[63,5992,5993],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,5996,5997],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,5999,153],{"id":153},[122,6001,6002,6005],{},[40,6003,6004],{},"为面积函数补充参数和返回值注解。",[40,6006,6007,6008,6011],{},"通过 ",[63,6009,6010],{},"函数名.__doc__"," 查看文档字符串。",[10,6013,170],{},[14,6015,173],{"id":173},[10,6017,6018],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,6020,180],{},{"title":61,"searchDepth":75,"depth":75,"links":6022},[6023,6024,6025,6026,6027,6028,6029,6030],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5876,"description":5881},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[191,6038,6039],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6042,"title":6043,"body":6044,"category":191,"cover":192,"description":6048,"extension":193,"meta":6275,"navigation":90,"path":6276,"pinned":196,"publishedAt":197,"seo":6277,"slug":6278,"stem":6279,"summary":6280,"tags":6281,"updatedAt":197,"visible":90,"__hash__":6284},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6045,"toc":6263},[6046,6049,6051,6057,6059,6065,6076,6078,6096,6098,6105,6134,6141,6160,6169,6171,6177,6179,6181,6204,6206,6209,6215,6221,6223,6239,6241,6254,6256,6258,6261],[10,6047,6048],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6050,16],{"id":16},[10,6052,6053,6054,6056],{},"本篇只处理“模块、import 与 ",[260,6055,5976],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6058,22],{"id":22},[10,6060,6061],{},[26,6062],{"alt":6063,"src":6064},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6066,6067,6068,6071,6072,6075],{},"同一个文件直接运行时 ",[63,6069,6070],{},"__name__"," 等于 ",[63,6073,6074],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6077,35],{"id":35},[37,6079,6080,6086,6089],{},[40,6081,6082,6083,6085],{},"一个 ",[63,6084,1137],{}," 文件就是一个模块。",[40,6087,6088],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6090,6091,6092,6095],{},"避免使用 ",[63,6093,6094],{},"from module import *","，它会让名字来源不清楚。",[14,6097,51],{"id":51},[10,6099,6100,6101,6104],{},"先在同一个目录中创建两个文件。把函数放进 ",[63,6102,6103],{},"calculator.py","：",[56,6106,6108],{"className":58,"code":6107,"language":60,"meta":61,"style":61},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[63,6109,6110,6115,6120,6124,6129],{"__ignoreMap":61},[66,6111,6112],{"class":68,"line":69},[66,6113,6114],{},"def add(left, right):\n",[66,6116,6117],{"class":68,"line":75},[66,6118,6119],{},"    return left + right\n",[66,6121,6122],{"class":68,"line":81},[66,6123,91],{"emptyLinePlaceholder":90},[66,6125,6126],{"class":68,"line":87},[66,6127,6128],{},"if __name__ == \"__main__\":\n",[66,6130,6131],{"class":68,"line":94},[66,6132,6133],{},"    print(add(2, 3))\n",[10,6135,6136,6137,6140],{},"再创建 ",[63,6138,6139],{},"app.py","，从模块中导入函数：",[56,6142,6144],{"className":58,"code":6143,"language":60,"meta":61,"style":61},"from calculator import add\n\nprint(add(10, 20))\n",[63,6145,6146,6151,6155],{"__ignoreMap":61},[66,6147,6148],{"class":68,"line":69},[66,6149,6150],{},"from calculator import add\n",[66,6152,6153],{"class":68,"line":75},[66,6154,91],{"emptyLinePlaceholder":90},[66,6156,6157],{"class":68,"line":81},[66,6158,6159],{},"print(add(10, 20))\n",[10,6161,6162,6163,1123,6166,328],{},"分别执行 ",[63,6164,6165],{},"python3 calculator.py",[63,6167,6168],{},"python3 app.py",[10,6170,106],{},[56,6172,6175],{"className":6173,"code":6174,"language":112,"meta":61},[110],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[63,6176,6174],{"__ignoreMap":61},[10,6178,117],{},[14,6180,120],{"id":120},[122,6182,6183,6193],{},[40,6184,6185,6186,6188,6189,6192],{},"直接运行 ",[63,6187,6103],{}," 时，模块名是 ",[63,6190,6191],{},"__main__","，入口代码输出 5。",[40,6194,6195,6197,6198,6200,6201,6203],{},[63,6196,6139],{}," 导入模块时，",[63,6199,6103],{}," 的函数定义会执行，但入口判断为假；随后 ",[63,6202,6139],{}," 调用函数输出 30。",[294,6205,2663],{"id":2663},[10,6207,6208],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6210,6211],{},[26,6212],{"alt":6213,"src":6214},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6216,6217,6218,6220],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[63,6219,6191],{}," 保护下的演示代码。",[14,6222,138],{"id":138},[37,6224,6225,6232],{},[40,6226,6227,6228,1123,6230,328],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[63,6229,6103],{},[63,6231,6139],{},[40,6233,6234,6235,6238],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[63,6236,6237],{},"json.py","，导致导入目标被遮蔽。",[14,6240,153],{"id":153},[122,6242,6243,6249],{},[40,6244,2318,6245,6248],{},[63,6246,6247],{},"text_tools.py"," 并导出一个格式化函数。",[40,6250,6251,6252,328],{},"分别直接运行模块和从另一个脚本导入，输出 ",[63,6253,6070],{},[10,6255,170],{},[14,6257,173],{"id":173},[10,6259,6260],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,6262,180],{},{"title":61,"searchDepth":75,"depth":75,"links":6264},[6265,6266,6267,6268,6269,6272,6273,6274],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":6270},[6271],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6043,"description":6048},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[191,6282,6283],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6286,"title":6287,"body":6288,"category":191,"cover":192,"description":6292,"extension":193,"meta":6457,"navigation":90,"path":6458,"pinned":196,"publishedAt":197,"seo":6459,"slug":6460,"stem":6461,"summary":6462,"tags":6463,"updatedAt":197,"visible":90,"__hash__":6465},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6289,"toc":6447},[6290,6293,6295,6298,6300,6306,6309,6311,6325,6327,6329,6375,6377,6383,6385,6387,6413,6415,6425,6427,6438,6440,6442,6445],[10,6291,6292],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6294,16],{"id":16},[10,6296,6297],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6299,22],{"id":22},[10,6301,6302],{},[26,6303],{"alt":6304,"src":6305},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6307,6308],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6310,35],{"id":35},[37,6312,6313,6319,6322],{},[40,6314,6315,6318],{},[63,6316,6317],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6320,6321],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6323,6324],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6326,51],{"id":51},[10,6328,1540],{},[56,6330,6332],{"className":557,"code":6331,"language":559,"meta":61,"style":61},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[63,6333,6334,6346,6354,6360,6370],{"__ignoreMap":61},[66,6335,6336,6338,6340,6343],{"class":68,"line":69},[66,6337,657],{"class":566},[66,6339,599],{"class":569},[66,6341,6342],{"class":602}," venv",[66,6344,6345],{"class":602}," .venv\n",[66,6347,6348,6351],{"class":68,"line":75},[66,6349,6350],{"class":569},"source",[66,6352,6353],{"class":602}," .venv\u002Fbin\u002Factivate\n",[66,6355,6356,6358],{"class":68,"line":81},[66,6357,60],{"class":566},[66,6359,570],{"class":569},[66,6361,6362,6364,6366,6368],{"class":68,"line":87},[66,6363,60],{"class":566},[66,6365,599],{"class":569},[66,6367,603],{"class":602},[66,6369,570],{"class":569},[66,6371,6372],{"class":68,"line":94},[66,6373,6374],{"class":566},"deactivate\n",[10,6376,106],{},[56,6378,6381],{"className":6379,"code":6380,"language":112,"meta":61},[110],"Python 和 pip 的路径应指向当前项目的 .venv\n",[63,6382,6380],{"__ignoreMap":61},[10,6384,117],{},[14,6386,120],{"id":120},[122,6388,6389,6398],{},[40,6390,6391,6394,6395,6397],{},[63,6392,6393],{},"venv"," 根据当前 ",[63,6396,657],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6399,6400,6401,164,6403,6406,6407,3659,6409,6412],{},"激活后 ",[63,6402,60],{},[63,6404,6405],{},"python -m pip"," 优先指向 ",[63,6408,6317],{},[63,6410,6411],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6414,138],{"id":138},[37,6416,6417,6420],{},[40,6418,6419],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6421,143,6422,6424],{},[63,6423,6317],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6426,153],{"id":153},[122,6428,6429,6435],{},[40,6430,6431,6432,328],{},"创建虚拟环境并记录激活前后的 ",[63,6433,6434],{},"which python",[40,6436,6437],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6439,170],{},[14,6441,173],{"id":173},[10,6443,6444],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,6446,1624],{},{"title":61,"searchDepth":75,"depth":75,"links":6448},[6449,6450,6451,6452,6453,6454,6455,6456],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6287,"description":6292},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[191,6464,226],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6467,"title":6468,"body":6469,"category":191,"cover":192,"description":6473,"extension":193,"meta":6661,"navigation":90,"path":6662,"pinned":196,"publishedAt":197,"seo":6663,"slug":6664,"stem":6665,"summary":6666,"tags":6667,"updatedAt":197,"visible":90,"__hash__":6670},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6470,"toc":6651},[6471,6474,6476,6479,6481,6487,6496,6498,6522,6524,6526,6579,6581,6587,6589,6591,6607,6609,6628,6630,6642,6644,6646,6649],[10,6472,6473],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6475,16],{"id":16},[10,6477,6478],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6480,22],{"id":22},[10,6482,6483],{},[26,6484],{"alt":6485,"src":6486},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6488,6489,6492,6493,6495],{},[63,6490,6491],{},"Path"," 使用 ",[63,6494,2400],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6497,35],{"id":35},[37,6499,6500,6503,6515],{},[40,6501,6502],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6504,6505,2221,6508,2221,6511,6514],{},[63,6506,6507],{},"exists()",[63,6509,6510],{},"is_file()",[63,6512,6513],{},"is_dir()"," 检查真实文件系统状态。",[40,6516,6517,6518,6521],{},"创建目录前明确目标；",[63,6519,6520],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6523,51],{"id":51},[10,6525,54],{},[56,6527,6529],{"className":58,"code":6528,"language":60,"meta":61,"style":61},"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",[63,6530,6531,6536,6540,6545,6550,6555,6559,6564,6569,6574],{"__ignoreMap":61},[66,6532,6533],{"class":68,"line":69},[66,6534,6535],{},"from pathlib import Path\n",[66,6537,6538],{"class":68,"line":75},[66,6539,91],{"emptyLinePlaceholder":90},[66,6541,6542],{"class":68,"line":81},[66,6543,6544],{},"project = Path.cwd()\n",[66,6546,6547],{"class":68,"line":87},[66,6548,6549],{},"data_dir = project \u002F \"data\"\n",[66,6551,6552],{"class":68,"line":94},[66,6553,6554],{},"file_path = data_dir \u002F \"records.json\"\n",[66,6556,6557],{"class":68,"line":100},[66,6558,91],{"emptyLinePlaceholder":90},[66,6560,6561],{"class":68,"line":2453},[66,6562,6563],{},"print(project)\n",[66,6565,6566],{"class":68,"line":2459},[66,6567,6568],{},"print(file_path.name)\n",[66,6570,6571],{"class":68,"line":3884},[66,6572,6573],{},"print(file_path.suffix)\n",[66,6575,6576],{"class":68,"line":4096},[66,6577,6578],{},"print(file_path.exists())\n",[10,6580,106],{},[56,6582,6585],{"className":6583,"code":6584,"language":112,"meta":61},[110],"显示当前项目路径、records.json、.json 和存在状态\n",[63,6586,6584],{"__ignoreMap":61},[10,6588,117],{},[14,6590,120],{"id":120},[122,6592,6593,6599],{},[40,6594,6595,6598],{},[63,6596,6597],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6600,2303,6601,6603,6604,6606],{},[63,6602,2400],{}," 组合路径片段只创建新的 ",[63,6605,6491],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6608,138],{"id":138},[37,6610,6611,6619],{},[40,6612,143,6613,6615,6616,6618],{},[63,6614,6491],{}," 对象存在当成真实文件存在，仍需调用 ",[63,6617,6507],{}," 等方法确认。",[40,6620,6621,6622,975,6624,6627],{},"手工拼接 ",[63,6623,2400],{},[63,6625,6626],{},"\\"," 分隔符，降低跨平台可读性。",[14,6629,153],{"id":153},[122,6631,6632,6639],{},[40,6633,6634,6635,6638],{},"组合 ",[63,6636,6637],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6640,6641],{},"输出路径的父目录、文件名和扩展名。",[10,6643,170],{},[14,6645,173],{"id":173},[10,6647,6648],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,6650,180],{},{"title":61,"searchDepth":75,"depth":75,"links":6652},[6653,6654,6655,6656,6657,6658,6659,6660],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6468,"description":6473},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[191,6668,6669],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6672,"title":6673,"body":6674,"category":191,"cover":192,"description":6678,"extension":193,"meta":6856,"navigation":90,"path":6857,"pinned":196,"publishedAt":197,"seo":6858,"slug":6859,"stem":6860,"summary":6861,"tags":6862,"updatedAt":197,"visible":90,"__hash__":6865},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6675,"toc":6846},[6676,6679,6681,6684,6686,6692,6695,6697,6725,6727,6729,6786,6788,6794,6796,6798,6809,6811,6824,6826,6837,6839,6841,6844],[10,6677,6678],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6680,16],{"id":16},[10,6682,6683],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6685,22],{"id":22},[10,6687,6688],{},[26,6689],{"alt":6690,"src":6691},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6693,6694],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6696,35],{"id":35},[37,6698,6699,6705,6714],{},[40,6700,6701,6704],{},[63,6702,6703],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6706,6707,6710,6711,328],{},[63,6708,6709],{},"r"," 模式读取不存在文件会产生 ",[63,6712,6713],{},"FileNotFoundError",[40,6715,6716,6717,6720,6721,6724],{},"本篇显式调用 ",[63,6718,6719],{},"close()","；第 34 篇会用 ",[63,6722,6723],{},"with"," 更可靠地管理关闭动作。",[14,6726,51],{"id":51},[10,6728,54],{},[56,6730,6732],{"className":58,"code":6731,"language":60,"meta":61,"style":61},"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",[63,6733,6734,6738,6742,6747,6752,6757,6762,6766,6771,6776,6781],{"__ignoreMap":61},[66,6735,6736],{"class":68,"line":69},[66,6737,6535],{},[66,6739,6740],{"class":68,"line":75},[66,6741,91],{"emptyLinePlaceholder":90},[66,6743,6744],{"class":68,"line":81},[66,6745,6746],{},"file_path = Path(\"notes.txt\")\n",[66,6748,6749],{"class":68,"line":87},[66,6750,6751],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[66,6753,6754],{"class":68,"line":94},[66,6755,6756],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[66,6758,6759],{"class":68,"line":100},[66,6760,6761],{},"writer.close()\n",[66,6763,6764],{"class":68,"line":2453},[66,6765,91],{"emptyLinePlaceholder":90},[66,6767,6768],{"class":68,"line":2459},[66,6769,6770],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[66,6772,6773],{"class":68,"line":3884},[66,6774,6775],{},"content = reader.read()\n",[66,6777,6778],{"class":68,"line":4096},[66,6779,6780],{},"reader.close()\n",[66,6782,6783],{"class":68,"line":5761},[66,6784,6785],{},"print(content)\n",[10,6787,106],{},[56,6789,6792],{"className":6790,"code":6791,"language":112,"meta":61},[110],"变量\n循环\n函数\n",[63,6793,6791],{"__ignoreMap":61},[10,6795,117],{},[14,6797,120],{"id":120},[122,6799,6800,6806],{},[40,6801,6802,6803,6805],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[63,6804,6719],{}," 确保缓冲内容交给文件系统。",[40,6807,6808],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6810,138],{"id":138},[37,6812,6813,6818],{},[40,6814,2303,6815,6817],{},[63,6816,6703],{}," 模式打开重要文件却未确认覆盖风险。",[40,6819,6820,6821,328],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[63,6822,6823],{},"encoding=\"utf-8\"",[14,6825,153],{"id":153},[122,6827,6828,6831],{},[40,6829,6830],{},"写入三行学习记录并读取。",[40,6832,6833,6834,6836],{},"改用 ",[63,6835,302],{}," 模式追加一行，确认原内容仍保留。",[10,6838,170],{},[14,6840,173],{"id":173},[10,6842,6843],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,6845,180],{},{"title":61,"searchDepth":75,"depth":75,"links":6847},[6848,6849,6850,6851,6852,6853,6854,6855],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6673,"description":6678},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[191,6863,6864],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6867,"title":6868,"body":6869,"category":191,"cover":192,"description":6873,"extension":193,"meta":7040,"navigation":90,"path":7041,"pinned":196,"publishedAt":197,"seo":7042,"slug":7043,"stem":7044,"summary":7045,"tags":7046,"updatedAt":197,"visible":90,"__hash__":7049},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6870,"toc":7030},[6871,6874,6876,6879,6881,6887,6897,6899,6913,6915,6917,6977,6979,6985,6987,6989,7001,7003,7011,7013,7021,7023,7025,7028],[10,6872,6873],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6875,16],{"id":16},[10,6877,6878],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6880,22],{"id":22},[10,6882,6883],{},[26,6884],{"alt":6885,"src":6886},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6888,6889,6892,6893,6896],{},[63,6890,6891],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[63,6894,6895],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6898,35],{"id":35},[37,6900,6901,6904,6910],{},[40,6902,6903],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6905,6906,6909],{},[63,6907,6908],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6911,6912],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6914,51],{"id":51},[10,6916,54],{},[56,6918,6920],{"className":58,"code":6919,"language":60,"meta":61,"style":61},"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",[63,6921,6922,6927,6931,6936,6940,6945,6950,6954,6958,6963,6968,6972],{"__ignoreMap":61},[66,6923,6924],{"class":68,"line":69},[66,6925,6926],{},"import json\n",[66,6928,6929],{"class":68,"line":75},[66,6930,91],{"emptyLinePlaceholder":90},[66,6932,6933],{"class":68,"line":81},[66,6934,6935],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[66,6937,6938],{"class":68,"line":87},[66,6939,91],{"emptyLinePlaceholder":90},[66,6941,6942],{"class":68,"line":94},[66,6943,6944],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[66,6946,6947],{"class":68,"line":100},[66,6948,6949],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[66,6951,6952],{"class":68,"line":2453},[66,6953,6761],{},[66,6955,6956],{"class":68,"line":2459},[66,6957,91],{"emptyLinePlaceholder":90},[66,6959,6960],{"class":68,"line":3884},[66,6961,6962],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[66,6964,6965],{"class":68,"line":4096},[66,6966,6967],{},"loaded = json.load(reader)\n",[66,6969,6970],{"class":68,"line":5761},[66,6971,6780],{},[66,6973,6974],{"class":68,"line":5766},[66,6975,6976],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6978,106],{},[56,6980,6983],{"className":6981,"code":6982,"language":112,"meta":61},[110],"Python 60\n",[63,6984,6982],{"__ignoreMap":61},[10,6986,117],{},[14,6988,120],{"id":120},[122,6990,6991,6996],{},[40,6992,6993,6995],{},[63,6994,6891],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,6997,6998,7000],{},[63,6999,6895],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7002,138],{"id":138},[37,7004,7005,7008],{},[40,7006,7007],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7009,7010],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7012,153],{"id":153},[122,7014,7015,7018],{},[40,7016,7017],{},"保存包含两条学习记录的列表。",[40,7019,7020],{},"读取后修改进度，再重新写回文件。",[10,7022,170],{},[14,7024,173],{"id":173},[10,7026,7027],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,7029,180],{},{"title":61,"searchDepth":75,"depth":75,"links":7031},[7032,7033,7034,7035,7036,7037,7038,7039],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6868,"description":6873},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[191,7047,7048],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7051,"title":7052,"body":7053,"category":191,"cover":192,"description":7057,"extension":193,"meta":7241,"navigation":90,"path":7242,"pinned":196,"publishedAt":197,"seo":7243,"slug":7244,"stem":7245,"summary":7246,"tags":7247,"updatedAt":197,"visible":90,"__hash__":7250},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7054,"toc":7231},[7055,7058,7060,7063,7065,7071,7077,7079,7101,7103,7105,7168,7170,7176,7178,7180,7196,7198,7212,7214,7222,7224,7226,7229],[10,7056,7057],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7059,16],{"id":16},[10,7061,7062],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7064,22],{"id":22},[10,7066,7067],{},[26,7068],{"alt":7069,"src":7070},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7072,7073,7076],{},[63,7074,7075],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7078,35],{"id":35},[37,7080,7081,7091,7098],{},[40,7082,2303,7083,7086,7087,7090],{},[63,7084,7085],{},"newline=\"\""," 让 ",[63,7088,7089],{},"csv"," 模块正确处理换行。",[40,7092,7093,7094,7097],{},"字段顺序由 ",[63,7095,7096],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7099,7100],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7102,51],{"id":51},[10,7104,54],{},[56,7106,7108],{"className":58,"code":7107,"language":60,"meta":61,"style":61},"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",[63,7109,7110,7115,7119,7124,7129,7134,7139,7144,7148,7153,7158,7163],{"__ignoreMap":61},[66,7111,7112],{"class":68,"line":69},[66,7113,7114],{},"import csv\n",[66,7116,7117],{"class":68,"line":75},[66,7118,91],{"emptyLinePlaceholder":90},[66,7120,7121],{"class":68,"line":81},[66,7122,7123],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[66,7125,7126],{"class":68,"line":87},[66,7127,7128],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[66,7130,7131],{"class":68,"line":94},[66,7132,7133],{},"writer.writeheader()\n",[66,7135,7136],{"class":68,"line":100},[66,7137,7138],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[66,7140,7141],{"class":68,"line":2453},[66,7142,7143],{},"writer_file.close()\n",[66,7145,7146],{"class":68,"line":2459},[66,7147,91],{"emptyLinePlaceholder":90},[66,7149,7150],{"class":68,"line":3884},[66,7151,7152],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[66,7154,7155],{"class":68,"line":4096},[66,7156,7157],{},"for row in csv.DictReader(reader_file):\n",[66,7159,7160],{"class":68,"line":5761},[66,7161,7162],{},"    print(row[\"name\"], row[\"score\"])\n",[66,7164,7165],{"class":68,"line":5766},[66,7166,7167],{},"reader_file.close()\n",[10,7169,106],{},[56,7171,7174],{"className":7172,"code":7173,"language":112,"meta":61},[110],"小郑 95\n",[63,7175,7173],{"__ignoreMap":61},[10,7177,117],{},[14,7179,120],{"id":120},[122,7181,7182,7191],{},[40,7183,7184,7187,7188,7190],{},[63,7185,7186],{},"DictWriter"," 按 ",[63,7189,7096],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7192,7193,7195],{},[63,7194,7075],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7197,138],{"id":138},[37,7199,7200,7203],{},[40,7201,7202],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7204,7205,7206,7208,7209,7211],{},"在 macOS 以外环境忽略 ",[63,7207,7085],{}," 可能出现额外空行；统一交给 ",[63,7210,7089],{}," 模块管理换行。",[14,7213,153],{"id":153},[122,7215,7216,7219],{},[40,7217,7218],{},"写入三名学习者的课程和分数。",[40,7220,7221],{},"读取 CSV 后把分数字符串转换为整数。",[10,7223,170],{},[14,7225,173],{"id":173},[10,7227,7228],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,7230,180],{},{"title":61,"searchDepth":75,"depth":75,"links":7232},[7233,7234,7235,7236,7237,7238,7239,7240],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7052,"description":7057},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[191,7248,7249],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7252,"title":7253,"body":7254,"category":191,"cover":192,"description":7258,"extension":193,"meta":7531,"navigation":90,"path":7532,"pinned":196,"publishedAt":197,"seo":7533,"slug":7534,"stem":7535,"summary":7536,"tags":7537,"updatedAt":197,"visible":90,"__hash__":7540},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7255,"toc":7518},[7256,7259,7261,7264,7266,7272,7283,7285,7302,7304,7306,7381,7383,7389,7391,7393,7418,7420,7429,7435,7446,7448,7454,7460,7469,7471,7486,7488,7509,7511,7513,7516],[10,7257,7258],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7260,16],{"id":16},[10,7262,7263],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7265,22],{"id":22},[10,7267,7268],{},[26,7269],{"alt":7270,"src":7271},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7273,7274,7275,7278,7279,7282],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[63,7276,7277],{},"except","；无论是否异常，",[63,7280,7281],{},"finally"," 都会在离开结构前执行。",[14,7284,35],{"id":35},[37,7286,7287,7293,7299],{},[40,7288,7289,7290,7292],{},"只捕获能够处理的具体异常，不使用空的 ",[63,7291,7277],{}," 吞掉全部错误。",[40,7294,7295,7298],{},[63,7296,7297],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7300,7301],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7303,51],{"id":51},[10,7305,54],{},[56,7307,7309],{"className":58,"code":7308,"language":60,"meta":61,"style":61},"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",[63,7310,7311,7316,7321,7326,7331,7336,7340,7345,7350,7355,7360,7364,7369,7375],{"__ignoreMap":61},[66,7312,7313],{"class":68,"line":69},[66,7314,7315],{},"def parse_age(text):\n",[66,7317,7318],{"class":68,"line":75},[66,7319,7320],{},"    age = int(text)\n",[66,7322,7323],{"class":68,"line":81},[66,7324,7325],{},"    if age \u003C 0:\n",[66,7327,7328],{"class":68,"line":87},[66,7329,7330],{},"        raise ValueError(\"年龄不能为负数\")\n",[66,7332,7333],{"class":68,"line":94},[66,7334,7335],{},"    return age\n",[66,7337,7338],{"class":68,"line":100},[66,7339,91],{"emptyLinePlaceholder":90},[66,7341,7342],{"class":68,"line":2453},[66,7343,7344],{},"try:\n",[66,7346,7347],{"class":68,"line":2459},[66,7348,7349],{},"    age = parse_age(\"18\")\n",[66,7351,7352],{"class":68,"line":3884},[66,7353,7354],{},"except ValueError as error:\n",[66,7356,7357],{"class":68,"line":4096},[66,7358,7359],{},"    print(\"输入错误：\", error)\n",[66,7361,7362],{"class":68,"line":5761},[66,7363,1112],{},[66,7365,7366],{"class":68,"line":5766},[66,7367,7368],{},"    print(\"年龄：\", age)\n",[66,7370,7372],{"class":68,"line":7371},13,[66,7373,7374],{},"finally:\n",[66,7376,7378],{"class":68,"line":7377},14,[66,7379,7380],{},"    print(\"处理结束\")\n",[10,7382,106],{},[56,7384,7387],{"className":7385,"code":7386,"language":112,"meta":61},[110],"年龄： 18\n处理结束\n",[63,7388,7386],{"__ignoreMap":61},[10,7390,117],{},[14,7392,120],{"id":120},[122,7394,7395,7407],{},[40,7396,7397,7399,7400,7402,7403,7406],{},[63,7398,3002],{}," 或主动 ",[63,7401,7297],{}," 都可能产生 ",[63,7404,7405],{},"ValueError","，控制流立即离开当前正常路径。",[40,7408,7409,7410,7412,7413,7415,7416,328],{},"有异常时进入匹配的 ",[63,7411,7277],{},"；没有异常时执行 ",[63,7414,1126],{},"；两种情况最后都会执行 ",[63,7417,7281],{},[294,7419,2663],{"id":2663},[10,7421,7422,2221,7424,1123,7426,7428],{},[63,7423,7277],{},[63,7425,1126],{},[63,7427,7281],{}," 的职责不同，不能只看它们出现的顺序。",[10,7430,7431],{},[26,7432],{"alt":7433,"src":7434},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7436,7437,7439,7440,7442,7443,7445],{},[63,7438,7277],{}," 处理匹配异常，",[63,7441,1126],{}," 只在无异常时运行，",[63,7444,7281],{}," 负责两条路径都需要的清理动作。",[294,7447,2663],{"id":4151},[10,7449,7450,7453],{},[63,7451,7452],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7455,7456],{},[26,7457],{"alt":7458,"src":7459},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7461,7462,7463,7465,7466,7468],{},"只把可能产生预期异常的操作放进 ",[63,7464,7452],{},"，后续正常业务放进 ",[63,7467,1126],{},"，错误边界会更清楚。",[14,7470,138],{"id":138},[37,7472,7473,7480],{},[40,7474,7475,7476,7479],{},"使用裸 ",[63,7477,7478],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7481,7482,7483,7485],{},"把整个程序包在一个巨大 ",[63,7484,7452],{}," 中，无法判断究竟哪一步允许失败。",[14,7487,153],{"id":153},[122,7489,7490,7503],{},[40,7491,7492,7493,7496,7497,1123,7500,328],{},"让 ",[63,7494,7495],{},"parse_age"," 分别处理 ",[63,7498,7499],{},"\"abc\"",[63,7501,7502],{},"\"-1\"",[40,7504,7505,7506,7508],{},"为文件读取捕获 ",[63,7507,6713],{}," 并给出清晰提示。",[10,7510,170],{},[14,7512,173],{"id":173},[10,7514,7515],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,7517,180],{},{"title":61,"searchDepth":75,"depth":75,"links":7519},[7520,7521,7522,7523,7524,7528,7529,7530],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":7525},[7526,7527],{"id":2663,"depth":81,"text":2663},{"id":4151,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7253,"description":7258},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[191,7538,7539],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7542,"title":7543,"body":7544,"category":191,"cover":192,"description":7548,"extension":193,"meta":7724,"navigation":90,"path":7725,"pinned":196,"publishedAt":197,"seo":7726,"slug":7727,"stem":7728,"summary":7729,"tags":7730,"updatedAt":197,"visible":90,"__hash__":7732},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7545,"toc":7714},[7546,7549,7551,7554,7556,7562,7568,7570,7586,7588,7590,7644,7646,7652,7654,7656,7669,7671,7684,7686,7705,7707,7709,7712],[10,7547,7548],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7550,16],{"id":16},[10,7552,7553],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7555,22],{"id":22},[10,7557,7558],{},[26,7559],{"alt":7560,"src":7561},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7563,7564,7565,7567],{},"进入 ",[63,7566,6723],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7569,35],{"id":35},[37,7571,7572,7577,7583],{},[40,7573,7574,7576],{},[63,7575,6723],{}," 把资源获取和释放配成一个清晰边界。",[40,7578,7579,7582],{},[63,7580,7581],{},"as file"," 得到的是上下文返回的资源对象。",[40,7584,7585],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7587,51],{"id":51},[10,7589,54],{},[56,7591,7593],{"className":58,"code":7592,"language":60,"meta":61,"style":61},"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",[63,7594,7595,7599,7603,7607,7611,7616,7621,7625,7630,7635,7639],{"__ignoreMap":61},[66,7596,7597],{"class":68,"line":69},[66,7598,6535],{},[66,7600,7601],{"class":68,"line":75},[66,7602,91],{"emptyLinePlaceholder":90},[66,7604,7605],{"class":68,"line":81},[66,7606,6746],{},[66,7608,7609],{"class":68,"line":87},[66,7610,91],{"emptyLinePlaceholder":90},[66,7612,7613],{"class":68,"line":94},[66,7614,7615],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[66,7617,7618],{"class":68,"line":100},[66,7619,7620],{},"    file.write(\"上下文管理器\\n\")\n",[66,7622,7623],{"class":68,"line":2453},[66,7624,91],{"emptyLinePlaceholder":90},[66,7626,7627],{"class":68,"line":2459},[66,7628,7629],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[66,7631,7632],{"class":68,"line":3884},[66,7633,7634],{},"    print(file.read())\n",[66,7636,7637],{"class":68,"line":4096},[66,7638,91],{"emptyLinePlaceholder":90},[66,7640,7641],{"class":68,"line":5761},[66,7642,7643],{},"print(file.closed)\n",[10,7645,106],{},[56,7647,7650],{"className":7648,"code":7649,"language":112,"meta":61},[110],"上下文管理器\n\nTrue\n",[63,7651,7649],{"__ignoreMap":61},[10,7653,117],{},[14,7655,120],{"id":120},[122,7657,7658,7666],{},[40,7659,7564,7660,7662,7663,328],{},[63,7661,6723],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[63,7664,7665],{},"file",[40,7667,7668],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7670,138],{"id":138},[37,7672,7673,7678],{},[40,7674,4719,7675,7677],{},[63,7676,6723],{}," 代码块外继续读写已经关闭的文件对象。",[40,7679,7680,7681,7683],{},"误以为 ",[63,7682,6723],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7685,153],{"id":153},[122,7687,7688,7697],{},[40,7689,7690,7691,7694,7695,328],{},"把第 30 篇的手动 ",[63,7692,7693],{},"open\u002Fclose"," 改写为 ",[63,7696,6723],{},[40,7698,4719,7699,7701,7702,328],{},[63,7700,6723],{}," 块后检查 ",[63,7703,7704],{},"file.closed",[10,7706,170],{},[14,7708,173],{"id":173},[10,7710,7711],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,7713,180],{},{"title":61,"searchDepth":75,"depth":75,"links":7715},[7716,7717,7718,7719,7720,7721,7722,7723],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7543,"description":7548},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[191,6723,7731],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7734,"title":7735,"body":7736,"category":191,"cover":192,"description":7740,"extension":193,"meta":7952,"navigation":90,"path":7953,"pinned":196,"publishedAt":197,"seo":7954,"slug":7955,"stem":7956,"summary":7957,"tags":7958,"updatedAt":197,"visible":90,"__hash__":7961},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7737,"toc":7940},[7738,7741,7743,7746,7748,7754,7757,7759,7776,7778,7780,7848,7850,7856,7858,7860,7885,7887,7890,7896,7905,7907,7918,7920,7931,7933,7935,7938],[10,7739,7740],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7742,16],{"id":16},[10,7744,7745],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7747,22],{"id":22},[10,7749,7750],{},[26,7751],{"alt":7752,"src":7753},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7755,7756],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7758,35],{"id":35},[37,7760,7761,7767,7773],{},[40,7762,7763,7766],{},[63,7764,7765],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7768,7769,7772],{},[63,7770,7771],{},"__init__"," 在实例创建过程中初始化属性。",[40,7774,7775],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7777,51],{"id":51},[10,7779,54],{},[56,7781,7783],{"className":58,"code":7782,"language":60,"meta":61,"style":61},"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",[63,7784,7785,7790,7795,7800,7805,7809,7814,7819,7824,7829,7833,7838,7843],{"__ignoreMap":61},[66,7786,7787],{"class":68,"line":69},[66,7788,7789],{},"class LearningRecord:\n",[66,7791,7792],{"class":68,"line":75},[66,7793,7794],{},"    def __init__(self, course, progress=0):\n",[66,7796,7797],{"class":68,"line":81},[66,7798,7799],{},"        self.course = course\n",[66,7801,7802],{"class":68,"line":87},[66,7803,7804],{},"        self.progress = progress\n",[66,7806,7807],{"class":68,"line":94},[66,7808,91],{"emptyLinePlaceholder":90},[66,7810,7811],{"class":68,"line":100},[66,7812,7813],{},"    def advance(self, amount):\n",[66,7815,7816],{"class":68,"line":2453},[66,7817,7818],{},"        self.progress = self.progress + amount\n",[66,7820,7821],{"class":68,"line":2459},[66,7822,7823],{},"        if self.progress > 100:\n",[66,7825,7826],{"class":68,"line":3884},[66,7827,7828],{},"            self.progress = 100\n",[66,7830,7831],{"class":68,"line":4096},[66,7832,91],{"emptyLinePlaceholder":90},[66,7834,7835],{"class":68,"line":5761},[66,7836,7837],{},"record = LearningRecord(\"Python\", 40)\n",[66,7839,7840],{"class":68,"line":5766},[66,7841,7842],{},"record.advance(15)\n",[66,7844,7845],{"class":68,"line":7371},[66,7846,7847],{},"print(record.course, record.progress)\n",[10,7849,106],{},[56,7851,7854],{"className":7852,"code":7853,"language":112,"meta":61},[110],"Python 55\n",[63,7855,7853],{"__ignoreMap":61},[10,7857,117],{},[14,7859,120],{"id":120},[122,7861,7862,7872],{},[40,7863,7864,7865,7868,7869,7871],{},"调用 ",[63,7866,7867],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[63,7870,7771],{}," 把课程和进度保存在该实例属性中。",[40,7873,7874,7877,7878,7881,7882,7884],{},[63,7875,7876],{},"record.advance(15)"," 自动把 ",[63,7879,7880],{},"record"," 作为 ",[63,7883,7765],{},"，方法更新同一实例的进度并限制上限。",[294,7886,2663],{"id":2663},[10,7888,7889],{},"类是共同定义，实例则各自保存状态。",[10,7891,7892],{},[26,7893],{"alt":7894,"src":7895},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7897,7898,7899,1123,7901,7904],{},"两个实例共享同一套方法定义，但 ",[63,7900,4516],{},[63,7902,7903],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7906,138],{"id":138},[37,7908,7909,7915],{},[40,7910,7911,7912,7914],{},"调用实例方法时手工再传一次 ",[63,7913,7765],{},"。通过实例调用时 Python 会自动绑定。",[40,7916,7917],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7919,153],{"id":153},[122,7921,7922,7928],{},[40,7923,5229,7924,7927],{},[63,7925,7926],{},"Book"," 类，保存标题和阅读页数。",[40,7929,7930],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7932,170],{},[14,7934,173],{"id":173},[10,7936,7937],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,7939,180],{},{"title":61,"searchDepth":75,"depth":75,"links":7941},[7942,7943,7944,7945,7946,7949,7950,7951],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":7947},[7948],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7735,"description":7740},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[191,7959,7960],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7963,"title":7964,"body":7965,"category":191,"cover":192,"description":7969,"extension":193,"meta":8147,"navigation":90,"path":8148,"pinned":196,"publishedAt":197,"seo":8149,"slug":8150,"stem":8151,"summary":8152,"tags":8153,"updatedAt":197,"visible":90,"__hash__":8156},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7966,"toc":8137},[7967,7970,7972,7975,7977,7983,7986,7988,7999,8001,8003,8070,8072,8078,8080,8082,8101,8103,8111,8113,8128,8130,8132,8135],[10,7968,7969],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7971,16],{"id":16},[10,7973,7974],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7976,22],{"id":22},[10,7978,7979],{},[26,7980],{"alt":7981,"src":7982},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7984,7985],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7987,35],{"id":35},[37,7989,7990,7993,7996],{},[40,7991,7992],{},"封装让对象通过方法维护自己的有效状态。",[40,7994,7995],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,7997,7998],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8000,51],{"id":51},[10,8002,54],{},[56,8004,8006],{"className":58,"code":8005,"language":60,"meta":61,"style":61},"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",[63,8007,8008,8013,8018,8023,8027,8032,8037,8042,8046,8051,8056,8060,8065],{"__ignoreMap":61},[66,8009,8010],{"class":68,"line":69},[66,8011,8012],{},"class Storage:\n",[66,8014,8015],{"class":68,"line":75},[66,8016,8017],{},"    def save(self, text):\n",[66,8019,8020],{"class":68,"line":81},[66,8021,8022],{},"        print(\"保存：\", text)\n",[66,8024,8025],{"class":68,"line":87},[66,8026,91],{"emptyLinePlaceholder":90},[66,8028,8029],{"class":68,"line":94},[66,8030,8031],{},"class LearningService:\n",[66,8033,8034],{"class":68,"line":100},[66,8035,8036],{},"    def __init__(self, storage):\n",[66,8038,8039],{"class":68,"line":2453},[66,8040,8041],{},"        self.storage = storage\n",[66,8043,8044],{"class":68,"line":2459},[66,8045,91],{"emptyLinePlaceholder":90},[66,8047,8048],{"class":68,"line":3884},[66,8049,8050],{},"    def finish_lesson(self, title):\n",[66,8052,8053],{"class":68,"line":4096},[66,8054,8055],{},"        self.storage.save(title)\n",[66,8057,8058],{"class":68,"line":5761},[66,8059,91],{"emptyLinePlaceholder":90},[66,8061,8062],{"class":68,"line":5766},[66,8063,8064],{},"service = LearningService(Storage())\n",[66,8066,8067],{"class":68,"line":7371},[66,8068,8069],{},"service.finish_lesson(\"异常处理\")\n",[10,8071,106],{},[56,8073,8076],{"className":8074,"code":8075,"language":112,"meta":61},[110],"保存： 异常处理\n",[63,8077,8075],{"__ignoreMap":61},[10,8079,117],{},[14,8081,120],{"id":120},[122,8083,8084,8094],{},[40,8085,8086,8089,8090,8093],{},[63,8087,8088],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[63,8091,8092],{},"save()"," 的协作对象。",[40,8095,8096,8097,8100],{},"调用业务方法时，服务把保存动作委托给 ",[63,8098,8099],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8102,138],{"id":138},[37,8104,8105,8108],{},[40,8106,8107],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8109,8110],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8112,153],{"id":153},[122,8114,8115,8125],{},[40,8116,8117,8118,8121,8122,328],{},"用组合让 ",[63,8119,8120],{},"OrderService"," 使用一个 ",[63,8123,8124],{},"Notifier",[40,8126,8127],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8129,170],{},[14,8131,173],{"id":173},[10,8133,8134],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,8136,180],{},{"title":61,"searchDepth":75,"depth":75,"links":8138},[8139,8140,8141,8142,8143,8144,8145,8146],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7964,"description":7969},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[191,8154,8155],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8158,"title":8159,"body":8160,"category":191,"cover":192,"description":8164,"extension":193,"meta":8367,"navigation":90,"path":8368,"pinned":196,"publishedAt":197,"seo":8369,"slug":8370,"stem":8371,"summary":8372,"tags":8373,"updatedAt":197,"visible":90,"__hash__":8376},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8161,"toc":8355},[8162,8165,8167,8170,8172,8178,8185,8187,8212,8214,8216,8268,8270,8276,8278,8280,8301,8303,8309,8315,8321,8323,8331,8333,8346,8348,8350,8353],[10,8163,8164],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8166,16],{"id":16},[10,8168,8169],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8171,22],{"id":22},[10,8173,8174],{},[26,8175],{"alt":8176,"src":8177},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8179,8180,8181,8184],{},"生成器运行到 ",[63,8182,8183],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8186,35],{"id":35},[37,8188,8189,8199,8209],{},[40,8190,8191,8194,8195,8198],{},[63,8192,8193],{},"iter()"," 从可迭代对象取得迭代器，",[63,8196,8197],{},"next()"," 请求下一个值。",[40,8200,8201,8202,8205,8206,8208],{},"没有更多值时迭代器抛出 ",[63,8203,8204],{},"StopIteration","，",[63,8207,4270],{}," 会自动处理。",[40,8210,8211],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8213,51],{"id":51},[10,8215,54],{},[56,8217,8219],{"className":58,"code":8218,"language":60,"meta":61,"style":61},"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",[63,8220,8221,8226,8231,8236,8241,8246,8250,8255,8260,8264],{"__ignoreMap":61},[66,8222,8223],{"class":68,"line":69},[66,8224,8225],{},"def countdown(start):\n",[66,8227,8228],{"class":68,"line":75},[66,8229,8230],{},"    current = start\n",[66,8232,8233],{"class":68,"line":81},[66,8234,8235],{},"    while current > 0:\n",[66,8237,8238],{"class":68,"line":87},[66,8239,8240],{},"        yield current\n",[66,8242,8243],{"class":68,"line":94},[66,8244,8245],{},"        current = current - 1\n",[66,8247,8248],{"class":68,"line":100},[66,8249,91],{"emptyLinePlaceholder":90},[66,8251,8252],{"class":68,"line":2453},[66,8253,8254],{},"iterator = countdown(3)\n",[66,8256,8257],{"class":68,"line":2459},[66,8258,8259],{},"print(next(iterator))\n",[66,8261,8262],{"class":68,"line":3884},[66,8263,8259],{},[66,8265,8266],{"class":68,"line":4096},[66,8267,8259],{},[10,8269,106],{},[56,8271,8274],{"className":8272,"code":8273,"language":112,"meta":61},[110],"3\n2\n1\n",[63,8275,8273],{"__ignoreMap":61},[10,8277,117],{},[14,8279,120],{"id":120},[122,8281,8282,8288],{},[40,8283,7864,8284,8287],{},[63,8285,8286],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8289,8290,8291,8293,8294,8296,8297,8300],{},"每次 ",[63,8292,8197],{}," 运行到下一个 ",[63,8295,8183],{}," 并暂停，局部变量 ",[63,8298,8299],{},"current"," 和执行位置被保留。",[294,8302,2663],{"id":2663},[10,8304,8305,8306,8308],{},"生成器的暂停位置可以展开成多次 ",[63,8307,8197],{}," 的时间线。",[10,8310,8311],{},[26,8312],{"alt":8313,"src":8314},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8316,8317,8318,8320],{},"每次请求只推进到下一个 ",[63,8319,8183],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8322,138],{"id":138},[37,8324,8325,8328],{},[40,8326,8327],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8329,8330],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8332,153],{"id":153},[122,8334,8335,8338],{},[40,8336,8337],{},"编写产生 1 到指定上限偶数的生成器。",[40,8339,3942,8340,8342,8343,8345],{},[63,8341,4270],{}," 遍历生成器，比较手动 ",[63,8344,8197],{}," 的差异。",[10,8347,170],{},[14,8349,173],{"id":173},[10,8351,8352],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,8354,180],{},{"title":61,"searchDepth":75,"depth":75,"links":8356},[8357,8358,8359,8360,8361,8364,8365,8366],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":8362},[8363],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8159,"description":8164},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[191,8374,8375],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8378,"title":8379,"body":8380,"category":191,"cover":192,"description":8384,"extension":193,"meta":8608,"navigation":90,"path":8609,"pinned":196,"publishedAt":197,"seo":8610,"slug":8611,"stem":8612,"summary":8613,"tags":8614,"updatedAt":197,"visible":90,"__hash__":8616},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8381,"toc":8596},[8382,8385,8387,8390,8392,8398,8401,8403,8423,8425,8427,8509,8511,8517,8519,8521,8543,8545,8548,8554,8561,8563,8573,8575,8587,8589,8591,8594],[10,8383,8384],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8386,16],{"id":16},[10,8388,8389],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8391,22],{"id":22},[10,8393,8394],{},[26,8395],{"alt":8396,"src":8397},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8399,8400],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8402,35],{"id":35},[37,8404,8405,8414,8417],{},[40,8406,8407,8410,8411,328],{},[63,8408,8409],{},"@trace"," 等价于 ",[63,8412,8413],{},"add = trace(add)",[40,8415,8416],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8418,8419,8422],{},[63,8420,8421],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8424,51],{"id":51},[10,8426,54],{},[56,8428,8430],{"className":58,"code":8429,"language":60,"meta":61,"style":61},"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",[63,8431,8432,8437,8441,8446,8451,8456,8461,8466,8471,8476,8481,8485,8490,8494,8498,8503],{"__ignoreMap":61},[66,8433,8434],{"class":68,"line":69},[66,8435,8436],{},"from functools import wraps\n",[66,8438,8439],{"class":68,"line":75},[66,8440,91],{"emptyLinePlaceholder":90},[66,8442,8443],{"class":68,"line":81},[66,8444,8445],{},"def trace(function):\n",[66,8447,8448],{"class":68,"line":87},[66,8449,8450],{},"    @wraps(function)\n",[66,8452,8453],{"class":68,"line":94},[66,8454,8455],{},"    def wrapper(*args, **kwargs):\n",[66,8457,8458],{"class":68,"line":100},[66,8459,8460],{},"        print(\"开始：\", function.__name__)\n",[66,8462,8463],{"class":68,"line":2453},[66,8464,8465],{},"        result = function(*args, **kwargs)\n",[66,8467,8468],{"class":68,"line":2459},[66,8469,8470],{},"        print(\"结束：\", function.__name__)\n",[66,8472,8473],{"class":68,"line":3884},[66,8474,8475],{},"        return result\n",[66,8477,8478],{"class":68,"line":4096},[66,8479,8480],{},"    return wrapper\n",[66,8482,8483],{"class":68,"line":5761},[66,8484,91],{"emptyLinePlaceholder":90},[66,8486,8487],{"class":68,"line":5766},[66,8488,8489],{},"@trace\n",[66,8491,8492],{"class":68,"line":7371},[66,8493,6114],{},[66,8495,8496],{"class":68,"line":7377},[66,8497,6119],{},[66,8499,8501],{"class":68,"line":8500},15,[66,8502,91],{"emptyLinePlaceholder":90},[66,8504,8506],{"class":68,"line":8505},16,[66,8507,8508],{},"print(add(2, 3))\n",[10,8510,106],{},[56,8512,8515],{"className":8513,"code":8514,"language":112,"meta":61},[110],"开始： add\n结束： add\n5\n",[63,8516,8514],{"__ignoreMap":61},[10,8518,117],{},[14,8520,120],{"id":120},[122,8522,8523,8540],{},[40,8524,8525,8526,8529,8530,8533,8534,8537,8538,328],{},"解释器执行定义时，把原 ",[63,8527,8528],{},"add"," 函数交给 ",[63,8531,8532],{},"trace","，返回的 ",[63,8535,8536],{},"wrapper"," 重新绑定到名字 ",[63,8539,8528],{},[40,8541,8542],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[294,8544,2663],{"id":2663},[10,8546,8547],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8549,8550],{},[26,8551],{"alt":8552,"src":8553},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8555,8556,8558,8559,328],{},[63,8557,8409],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[63,8560,8413],{},[14,8562,138],{"id":138},[37,8564,8565,8570],{},[40,8566,8567,8568,328],{},"包装函数忘记返回原函数结果，调用方得到 ",[63,8569,5312],{},[40,8571,8572],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8574,153],{"id":153},[122,8576,8577,8580],{},[40,8578,8579],{},"编写只记录调用次数的简单装饰器。",[40,8581,8582,8583,8586],{},"删除包装函数的 ",[63,8584,8585],{},"return result","，观察调用方得到什么。",[10,8588,170],{},[14,8590,173],{"id":173},[10,8592,8593],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,8595,180],{},{"title":61,"searchDepth":75,"depth":75,"links":8597},[8598,8599,8600,8601,8602,8605,8606,8607],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":8603},[8604],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8379,"description":8384},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[191,8615,5263],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8618,"title":8619,"body":8620,"category":191,"cover":192,"description":8624,"extension":193,"meta":8811,"navigation":90,"path":8812,"pinned":196,"publishedAt":197,"seo":8813,"slug":8814,"stem":8815,"summary":8816,"tags":8817,"updatedAt":197,"visible":90,"__hash__":8820},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8621,"toc":8799},[8622,8625,8627,8630,8632,8638,8641,8643,8654,8656,8658,8733,8735,8741,8743,8745,8756,8758,8761,8767,8770,8772,8780,8782,8790,8792,8794,8797],[10,8623,8624],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8626,16],{"id":16},[10,8628,8629],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8631,22],{"id":22},[10,8633,8634],{},[26,8635],{"alt":8636,"src":8637},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8639,8640],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8642,35],{"id":35},[37,8644,8645,8648,8651],{},[40,8646,8647],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8649,8650],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8652,8653],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8655,51],{"id":51},[10,8657,54],{},[56,8659,8661],{"className":58,"code":8660,"language":60,"meta":61,"style":61},"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",[63,8662,8663,8668,8673,8677,8682,8686,8691,8696,8701,8705,8710,8715,8720,8724,8728],{"__ignoreMap":61},[66,8664,8665],{"class":68,"line":69},[66,8666,8667],{},"import logging\n",[66,8669,8670],{"class":68,"line":75},[66,8671,8672],{},"import unittest\n",[66,8674,8675],{"class":68,"line":81},[66,8676,91],{"emptyLinePlaceholder":90},[66,8678,8679],{"class":68,"line":87},[66,8680,8681],{},"logging.basicConfig(level=logging.INFO)\n",[66,8683,8684],{"class":68,"line":94},[66,8685,91],{"emptyLinePlaceholder":90},[66,8687,8688],{"class":68,"line":100},[66,8689,8690],{},"def clamp_progress(value):\n",[66,8692,8693],{"class":68,"line":2453},[66,8694,8695],{},"    logging.info(\"检查进度：%s\", value)\n",[66,8697,8698],{"class":68,"line":2459},[66,8699,8700],{},"    return max(0, min(100, value))\n",[66,8702,8703],{"class":68,"line":3884},[66,8704,91],{"emptyLinePlaceholder":90},[66,8706,8707],{"class":68,"line":4096},[66,8708,8709],{},"class ProgressTest(unittest.TestCase):\n",[66,8711,8712],{"class":68,"line":5761},[66,8713,8714],{},"    def test_upper_limit(self):\n",[66,8716,8717],{"class":68,"line":5766},[66,8718,8719],{},"        self.assertEqual(clamp_progress(120), 100)\n",[66,8721,8722],{"class":68,"line":7371},[66,8723,91],{"emptyLinePlaceholder":90},[66,8725,8726],{"class":68,"line":7377},[66,8727,6128],{},[66,8729,8730],{"class":68,"line":8500},[66,8731,8732],{},"    unittest.main()\n",[10,8734,106],{},[56,8736,8739],{"className":8737,"code":8738,"language":112,"meta":61},[110],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[63,8740,8738],{"__ignoreMap":61},[10,8742,117],{},[14,8744,120],{"id":120},[122,8746,8747,8753],{},[40,8748,8749,8752],{},[63,8750,8751],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8754,8755],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[294,8757,2663],{"id":2663},[10,8759,8760],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8762,8763],{},[26,8764],{"alt":8765,"src":8766},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8768,8769],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8771,138],{"id":138},[37,8773,8774,8777],{},[40,8775,8776],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8778,8779],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8781,153],{"id":153},[122,8783,8784,8787],{},[40,8785,8786],{},"为负数进度增加测试。",[40,8788,8789],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8791,170],{},[14,8793,173],{"id":173},[10,8795,8796],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,8798,180],{},{"title":61,"searchDepth":75,"depth":75,"links":8800},[8801,8802,8803,8804,8805,8808,8809,8810],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":8806},[8807],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8619,"description":8624},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[191,8818,8819],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8822,"title":8823,"body":8824,"category":191,"cover":192,"description":8828,"extension":193,"meta":9128,"navigation":90,"path":9129,"pinned":196,"publishedAt":197,"seo":9130,"slug":9131,"stem":9132,"summary":9133,"tags":9134,"updatedAt":197,"visible":90,"__hash__":9137},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8825,"toc":9115},[8826,8829,8831,8834,8836,8842,8845,8847,8862,8864,8866,9013,9015,9021,9023,9025,9038,9040,9043,9049,9052,9054,9057,9063,9070,9072,9083,9085,9106,9108,9110,9113],[10,8827,8828],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8830,16],{"id":16},[10,8832,8833],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8835,22],{"id":22},[10,8837,8838],{},[26,8839],{"alt":8840,"src":8841},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8843,8844],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8846,35],{"id":35},[37,8848,8849,8852,8855],{},[40,8850,8851],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8853,8854],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8856,8857,8858,8861],{},"实际扩展前先为 ",[63,8859,8860],{},"add()"," 和存储边界补充测试。",[14,8863,51],{"id":51},[10,8865,54],{},[56,8867,8869],{"className":58,"code":8868,"language":60,"meta":61,"style":61},"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",[63,8870,8871,8875,8879,8883,8888,8893,8898,8903,8907,8912,8917,8922,8927,8932,8936,8941,8946,8952,8957,8963,8968,8973,8979,8985,8991,8996,9002,9007],{"__ignoreMap":61},[66,8872,8873],{"class":68,"line":69},[66,8874,6926],{},[66,8876,8877],{"class":68,"line":75},[66,8878,6535],{},[66,8880,8881],{"class":68,"line":81},[66,8882,91],{"emptyLinePlaceholder":90},[66,8884,8885],{"class":68,"line":87},[66,8886,8887],{},"class LearningRecords:\n",[66,8889,8890],{"class":68,"line":94},[66,8891,8892],{},"    def __init__(self, file_path):\n",[66,8894,8895],{"class":68,"line":100},[66,8896,8897],{},"        self.file_path = Path(file_path)\n",[66,8899,8900],{"class":68,"line":2453},[66,8901,8902],{},"        self.items = []\n",[66,8904,8905],{"class":68,"line":2459},[66,8906,91],{"emptyLinePlaceholder":90},[66,8908,8909],{"class":68,"line":3884},[66,8910,8911],{},"    def add(self, title):\n",[66,8913,8914],{"class":68,"line":4096},[66,8915,8916],{},"        title = title.strip()\n",[66,8918,8919],{"class":68,"line":5761},[66,8920,8921],{},"        if not title:\n",[66,8923,8924],{"class":68,"line":5766},[66,8925,8926],{},"            raise ValueError(\"课程名称不能为空\")\n",[66,8928,8929],{"class":68,"line":7371},[66,8930,8931],{},"        self.items.append({\"title\": title, \"done\": False})\n",[66,8933,8934],{"class":68,"line":7377},[66,8935,91],{"emptyLinePlaceholder":90},[66,8937,8938],{"class":68,"line":8500},[66,8939,8940],{},"    def save(self):\n",[66,8942,8943],{"class":68,"line":8505},[66,8944,8945],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[66,8947,8949],{"class":68,"line":8948},17,[66,8950,8951],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[66,8953,8955],{"class":68,"line":8954},18,[66,8956,91],{"emptyLinePlaceholder":90},[66,8958,8960],{"class":68,"line":8959},19,[66,8961,8962],{},"records = LearningRecords(\"learning-records.json\")\n",[66,8964,8966],{"class":68,"line":8965},20,[66,8967,91],{"emptyLinePlaceholder":90},[66,8969,8971],{"class":68,"line":8970},21,[66,8972,7344],{},[66,8974,8976],{"class":68,"line":8975},22,[66,8977,8978],{},"    title = input(\"输入已学习课程：\")\n",[66,8980,8982],{"class":68,"line":8981},23,[66,8983,8984],{},"    records.add(title)\n",[66,8986,8988],{"class":68,"line":8987},24,[66,8989,8990],{},"    records.save()\n",[66,8992,8994],{"class":68,"line":8993},25,[66,8995,7354],{},[66,8997,8999],{"class":68,"line":8998},26,[66,9000,9001],{},"    print(\"无法保存：\", error)\n",[66,9003,9005],{"class":68,"line":9004},27,[66,9006,1112],{},[66,9008,9010],{"class":68,"line":9009},28,[66,9011,9012],{},"    print(\"已保存 1 条学习记录\")\n",[10,9014,106],{},[56,9016,9019],{"className":9017,"code":9018,"language":112,"meta":61},[110],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[63,9020,9018],{"__ignoreMap":61},[10,9022,117],{},[14,9024,120],{"id":120},[122,9026,9027,9033],{},[40,9028,9029,9030,9032],{},"输入层取得课程名后，",[63,9031,8860],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9034,9035,9037],{},[63,9036,8092],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[294,9039,2663],{"id":2663},[10,9041,9042],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9044,9045],{},[26,9046],{"alt":9047,"src":9048},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9050,9051],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[294,9053,2663],{"id":4151},[10,9055,9056],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9058,9059],{},[26,9060],{"alt":9061,"src":9062},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9064,9065,9066,9069],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[63,9067,9068],{},"load()"," 把文件状态恢复到内存。",[14,9071,138],{"id":138},[37,9073,9074,9077],{},[40,9075,9076],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9078,9079,9080,9082],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[63,9081,9068],{}," 是下一项必要扩展。",[14,9084,153],{"id":153},[122,9086,9087,9093,9096],{},[40,9088,9089,9090,9092],{},"增加 ",[63,9091,9068],{},"，文件不存在时从空列表开始。",[40,9094,9095],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9097,9098,9099,9102,9103,9105],{},"把输入循环放进 ",[63,9100,9101],{},"main()","，通过 ",[63,9104,6070],{}," 控制程序入口。",[10,9107,170],{},[14,9109,173],{"id":173},[10,9111,9112],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[178,9114,180],{},{"title":61,"searchDepth":75,"depth":75,"links":9116},[9117,9118,9119,9120,9121,9125,9126,9127],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":9122},[9123,9124],{"id":2663,"depth":81,"text":2663},{"id":4151,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8823,"description":8828},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[191,9135,9136],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9139,9242,9361,9492,9635,9760,9897,10034,10175,10344,10481,10614,10737,10866,10993,11156,11332,11473,11602,11751,11894,12015,12138,12287,12440,12605,12732,12913,13056,13213,13364,13511,13666,13884,14039,14214,14365,14532,14719,14882,15124,15364],{"id":1359,"title":1360,"body":9140,"category":191,"cover":192,"description":1365,"extension":193,"meta":9239,"navigation":90,"path":1484,"pinned":196,"publishedAt":197,"seo":9240,"slug":1486,"stem":1487,"summary":1488,"tags":9241,"updatedAt":197,"visible":90,"__hash__":1491},{"type":7,"value":9141,"toc":9229},[9142,9144,9146,9148,9150,9154,9158,9160,9170,9172,9174,9182,9184,9189,9191,9193,9203,9205,9213,9215,9221,9223,9225,9227],[10,9143,1365],{},[14,9145,16],{"id":16},[10,9147,1370],{},[14,9149,22],{"id":22},[10,9151,9152],{},[26,9153],{"alt":1377,"src":1378},[10,9155,9156,1383],{},[63,9157,1137],{},[14,9159,35],{"id":35},[37,9161,9162,9166,9168],{},[40,9163,1390,9164,1393],{},[63,9165,1137],{},[40,9167,1396],{},[40,9169,1399],{},[14,9171,51],{"id":51},[10,9173,54],{},[56,9175,9176],{"className":58,"code":1406,"language":60,"meta":61,"style":61},[63,9177,9178],{"__ignoreMap":61},[66,9179,9180],{"class":68,"line":69},[66,9181,1406],{},[10,9183,106],{},[56,9185,9187],{"className":9186,"code":1418,"language":112,"meta":61},[110],[63,9188,1418],{"__ignoreMap":61},[10,9190,117],{},[14,9192,120],{"id":120},[122,9194,9195,9199],{},[40,9196,1429,9197,1433],{},[63,9198,1432],{},[40,9200,1436,9201,1440],{},[63,9202,1439],{},[14,9204,138],{"id":138},[37,9206,9207,9209],{},[40,9208,1447],{},[40,9210,1450,9211,1453],{},[63,9212,1137],{},[14,9214,153],{"id":153},[122,9216,9217,9219],{},[40,9218,1460],{},[40,9220,1463],{},[10,9222,170],{},[14,9224,173],{"id":173},[10,9226,1470],{},[178,9228,180],{},{"title":61,"searchDepth":75,"depth":75,"links":9230},[9231,9232,9233,9234,9235,9236,9237,9238],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":1360,"description":1365},[191,1355,1490],{"id":1493,"title":1494,"body":9243,"category":191,"cover":192,"description":1499,"extension":193,"meta":9358,"navigation":90,"path":1636,"pinned":196,"publishedAt":197,"seo":9359,"slug":1638,"stem":1639,"summary":1640,"tags":9360,"updatedAt":197,"visible":90,"__hash__":1643},{"type":7,"value":9244,"toc":9348},[9245,9247,9249,9251,9253,9257,9261,9263,9273,9275,9277,9297,9299,9304,9306,9308,9318,9320,9330,9332,9340,9342,9344,9346],[10,9246,1499],{},[14,9248,16],{"id":16},[10,9250,1504],{},[14,9252,22],{"id":22},[10,9254,9255],{},[26,9256],{"alt":1511,"src":1512},[10,9258,1515,9259,1518],{},[63,9260,657],{},[14,9262,35],{"id":35},[37,9264,9265,9267,9269],{},[40,9266,1525],{},[40,9268,1528],{},[40,9270,1531,9271,1535],{},[63,9272,1534],{},[14,9274,51],{"id":51},[10,9276,1540],{},[56,9278,9279],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,9280,9281,9287],{"__ignoreMap":61},[66,9282,9283,9285],{"class":68,"line":69},[66,9284,657],{"class":566},[66,9286,570],{"class":569},[66,9288,9289,9291,9293,9295],{"class":68,"line":75},[66,9290,657],{"class":566},[66,9292,599],{"class":569},[66,9294,603],{"class":602},[66,9296,570],{"class":569},[10,9298,106],{},[56,9300,9302],{"className":9301,"code":1566,"language":112,"meta":61},[110],[63,9303,1566],{"__ignoreMap":61},[10,9305,117],{},[14,9307,120],{"id":120},[122,9309,9310,9314],{},[40,9311,9312,1580],{},[63,9313,1579],{},[40,9315,9316,1585],{},[63,9317,665],{},[14,9319,138],{"id":138},[37,9321,9322,9326],{},[40,9323,1592,9324,1595],{},[63,9325,657],{},[40,9327,1598,9328,1601],{},[63,9329,657],{},[14,9331,153],{"id":153},[122,9333,9334,9338],{},[40,9335,904,9336,1611],{},[63,9337,1610],{},[40,9339,1614],{},[10,9341,170],{},[14,9343,173],{"id":173},[10,9345,1621],{},[178,9347,1624],{},{"title":61,"searchDepth":75,"depth":75,"links":9349},[9350,9351,9352,9353,9354,9355,9356,9357],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":1494,"description":1499},[191,1642,1018],{"id":1645,"title":1646,"body":9362,"category":191,"cover":192,"description":1812,"extension":193,"meta":9489,"navigation":90,"path":1814,"pinned":196,"publishedAt":197,"seo":9490,"slug":1816,"stem":1817,"summary":1818,"tags":9491,"updatedAt":197,"visible":90,"__hash__":1822},{"type":7,"value":9363,"toc":9479},[9364,9368,9370,9372,9374,9378,9380,9382,9398,9400,9402,9422,9424,9429,9431,9433,9445,9447,9457,9459,9469,9471,9473,9477],[10,9365,1651,9366,1654],{},[63,9367,1137],{},[14,9369,16],{"id":16},[10,9371,1659],{},[14,9373,22],{"id":22},[10,9375,9376],{},[26,9377],{"alt":1666,"src":1667},[10,9379,1670],{},[14,9381,35],{"id":35},[37,9383,9384,9390,9394],{},[40,9385,1677,9386,1680,9388,328],{},[63,9387,657],{},[63,9389,1683],{},[40,9391,1686,9392,1690],{},[63,9393,1689],{},[40,9395,1693,9396,1696],{},[63,9397,1137],{},[14,9399,51],{"id":51},[10,9401,54],{},[56,9403,9404],{"className":1703,"code":1704,"language":1705,"meta":61,"style":61},[63,9405,9406,9410,9414,9418],{"__ignoreMap":61},[66,9407,9408],{"class":68,"line":69},[66,9409,1712],{},[66,9411,9412],{"class":68,"line":75},[66,9413,1717],{},[66,9415,9416],{"class":68,"line":81},[66,9417,1722],{},[66,9419,9420],{"class":68,"line":87},[66,9421,1727],{},[10,9423,106],{},[56,9425,9427],{"className":9426,"code":1733,"language":112,"meta":61},[110],[63,9428,1733],{"__ignoreMap":61},[10,9430,117],{},[14,9432,120],{"id":120},[122,9434,9435,9441],{},[40,9436,1744,9437,1748,9439,328],{},[63,9438,1747],{},[63,9440,1751],{},[40,9442,1754,9443,1757],{},[63,9444,1439],{},[14,9446,138],{"id":138},[37,9448,9449,9455],{},[40,9450,1764,9451,1767,9453,1770],{},[63,9452,1683],{},[63,9454,1137],{},[40,9456,1773],{},[14,9458,153],{"id":153},[122,9460,9461,9465],{},[40,9462,1780,9463,328],{},[63,9464,1783],{},[40,9466,1786,9467,1789],{},[63,9468,1439],{},[10,9470,170],{},[14,9472,173],{"id":173},[10,9474,1796,9475,1799],{},[63,9476,1137],{},[178,9478,180],{},{"title":61,"searchDepth":75,"depth":75,"links":9480},[9481,9482,9483,9484,9485,9486,9487,9488],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":1646,"description":1812},[191,1820,1821],{"id":1824,"title":1825,"body":9493,"category":191,"cover":192,"description":1830,"extension":193,"meta":9632,"navigation":90,"path":2002,"pinned":196,"publishedAt":197,"seo":9633,"slug":2004,"stem":2005,"summary":2006,"tags":9634,"updatedAt":197,"visible":90,"__hash__":2010},{"type":7,"value":9494,"toc":9622},[9495,9497,9499,9501,9503,9507,9511,9513,9525,9527,9529,9565,9567,9572,9574,9576,9592,9594,9604,9606,9614,9616,9618,9620],[10,9496,1830],{},[14,9498,16],{"id":16},[10,9500,1835],{},[14,9502,22],{"id":22},[10,9504,9505],{},[26,9506],{"alt":1842,"src":1843},[10,9508,9509,1849],{},[63,9510,1848],{},[14,9512,35],{"id":35},[37,9514,9515,9517,9523],{},[40,9516,1856],{},[40,9518,9519,1862,9521,1866],{},[63,9520,1861],{},[63,9522,1865],{},[40,9524,1869],{},[14,9526,51],{"id":51},[10,9528,1540],{},[56,9530,9531],{"className":557,"code":1876,"language":559,"meta":61,"style":61},[63,9532,9533,9539,9545,9549,9559],{"__ignoreMap":61},[66,9534,9535,9537],{"class":68,"line":69},[66,9536,1883],{"class":566},[66,9538,1886],{"class":602},[66,9540,9541,9543],{"class":68,"line":75},[66,9542,1891],{"class":569},[66,9544,1886],{"class":602},[66,9546,9547],{"class":68,"line":81},[66,9548,1898],{"class":569},[66,9550,9551,9553,9555,9557],{"class":68,"line":87},[66,9552,1903],{"class":569},[66,9554,1906],{"class":602},[66,9556,1910],{"class":1909},[66,9558,1181],{"class":602},[66,9560,9561,9563],{"class":68,"line":94},[66,9562,657],{"class":566},[66,9564,1181],{"class":602},[10,9566,106],{},[56,9568,9570],{"className":9569,"code":1924,"language":112,"meta":61},[110],[63,9571,1924],{"__ignoreMap":61},[10,9573,117],{},[14,9575,120],{"id":120},[122,9577,9578,9586],{},[40,9579,9580,1937,9582,1940,9584,1943],{},[63,9581,1883],{},[63,9583,1891],{},[63,9585,1861],{},[40,9587,9588,1948,9590,1952],{},[63,9589,1848],{},[63,9591,1951],{},[14,9593,138],{"id":138},[37,9595,9596,9602],{},[40,9597,1959,9598,1123,9600,328],{},[63,9599,1861],{},[63,9601,1865],{},[40,9603,1966],{},[14,9605,153],{"id":153},[122,9607,9608,9612],{},[40,9609,1973,9610,1977],{},[63,9611,1976],{},[40,9613,1980],{},[10,9615,170],{},[14,9617,173],{"id":173},[10,9619,1987],{},[178,9621,1990],{},{"title":61,"searchDepth":75,"depth":75,"links":9623},[9624,9625,9626,9627,9628,9629,9630,9631],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":1825,"description":1830},[191,2008,2009],{"id":2012,"title":2013,"body":9636,"category":191,"cover":192,"description":2018,"extension":193,"meta":9757,"navigation":90,"path":2165,"pinned":196,"publishedAt":197,"seo":9758,"slug":2167,"stem":2168,"summary":2169,"tags":9759,"updatedAt":197,"visible":90,"__hash__":2173},{"type":7,"value":9637,"toc":9747},[9638,9640,9642,9644,9646,9650,9658,9660,9674,9676,9678,9694,9696,9701,9703,9705,9719,9721,9727,9729,9739,9741,9743,9745],[10,9639,2018],{},[14,9641,16],{"id":16},[10,9643,2023],{},[14,9645,22],{"id":22},[10,9647,9648],{},[26,9649],{"alt":2030,"src":2031},[10,9651,2034,9652,328,9654,2040,9656,328],{},[63,9653,1439],{},[63,9655,2039],{},[63,9657,1747],{},[14,9659,35],{"id":35},[37,9661,9662,9666,9672],{},[40,9663,9664,2052],{},[63,9665,2051],{},[40,9667,9668,2058,9670,328],{},[63,9669,2057],{},[63,9671,2061],{},[40,9673,2064],{},[14,9675,51],{"id":51},[10,9677,54],{},[56,9679,9680],{"className":58,"code":2071,"language":60,"meta":61,"style":61},[63,9681,9682,9686,9690],{"__ignoreMap":61},[66,9683,9684],{"class":68,"line":69},[66,9685,2078],{},[66,9687,9688],{"class":68,"line":75},[66,9689,2083],{},[66,9691,9692],{"class":68,"line":81},[66,9693,2088],{},[10,9695,106],{},[56,9697,9699],{"className":9698,"code":2094,"language":112,"meta":61},[110],[63,9700,2094],{"__ignoreMap":61},[10,9702,117],{},[14,9704,120],{"id":120},[122,9706,9707,9713],{},[40,9708,9709,2108,9711,328],{},[63,9710,2107],{},[63,9712,2061],{},[40,9714,9715,2115,9717,2119],{},[63,9716,1439],{},[63,9718,2118],{},[14,9720,138],{"id":138},[37,9722,9723,9725],{},[40,9724,2126],{},[40,9726,2129],{},[14,9728,153],{"id":153},[122,9730,9731,9733],{},[40,9732,2136],{},[40,9734,161,9735,164,9737,2144],{},[63,9736,2039],{},[63,9738,2143],{},[10,9740,170],{},[14,9742,173],{"id":173},[10,9744,2151],{},[178,9746,180],{},{"title":61,"searchDepth":75,"depth":75,"links":9748},[9749,9750,9751,9752,9753,9754,9755,9756],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":2013,"description":2018},[191,2171,2172],{"id":2175,"title":2176,"body":9761,"category":191,"cover":192,"description":2181,"extension":193,"meta":9894,"navigation":90,"path":2349,"pinned":196,"publishedAt":197,"seo":9895,"slug":2351,"stem":2352,"summary":2353,"tags":9896,"updatedAt":197,"visible":90,"__hash__":2357},{"type":7,"value":9762,"toc":9884},[9763,9765,9767,9769,9771,9775,9777,9779,9795,9797,9799,9823,9825,9830,9832,9834,9850,9852,9864,9866,9876,9878,9880,9882],[10,9764,2181],{},[14,9766,16],{"id":16},[10,9768,2186],{},[14,9770,22],{"id":22},[10,9772,9773],{},[26,9774],{"alt":2193,"src":2194},[10,9776,2197],{},[14,9778,35],{"id":35},[37,9780,9781,9783,9789],{},[40,9782,2204],{},[40,9784,2207,9785,164,9787,2214],{},[63,9786,2210],{},[63,9788,2213],{},[40,9790,2217,9791,2221,9793,2225],{},[63,9792,2220],{},[63,9794,2224],{},[14,9796,51],{"id":51},[10,9798,54],{},[56,9800,9801],{"className":58,"code":2232,"language":60,"meta":61,"style":61},[63,9802,9803,9807,9811,9815,9819],{"__ignoreMap":61},[66,9804,9805],{"class":68,"line":69},[66,9806,2239],{},[66,9808,9809],{"class":68,"line":75},[66,9810,2244],{},[66,9812,9813],{"class":68,"line":81},[66,9814,91],{"emptyLinePlaceholder":90},[66,9816,9817],{"class":68,"line":87},[66,9818,2253],{},[66,9820,9821],{"class":68,"line":94},[66,9822,2244],{},[10,9824,106],{},[56,9826,9828],{"className":9827,"code":2263,"language":112,"meta":61},[110],[63,9829,2263],{"__ignoreMap":61},[10,9831,117],{},[14,9833,120],{"id":120},[122,9835,9836,9842],{},[40,9837,904,9838,2277,9840,2280],{},[63,9839,2276],{},[63,9841,2210],{},[40,9843,904,9844,2286,9846,2290,9848,328],{},[63,9845,2285],{},[63,9847,2289],{},[63,9849,2293],{},[14,9851,138],{"id":138},[37,9853,9854,9856],{},[40,9855,2300],{},[40,9857,2303,9858,2221,9860,2221,9862,2311],{},[63,9859,2220],{},[63,9861,2224],{},[63,9863,2310],{},[14,9865,153],{"id":153},[122,9867,9868,9874],{},[40,9869,2318,9870,1123,9872,2325],{},[63,9871,2321],{},[63,9873,2324],{},[40,9875,2328],{},[10,9877,170],{},[14,9879,173],{"id":173},[10,9881,2335],{},[178,9883,180],{},{"title":61,"searchDepth":75,"depth":75,"links":9885},[9886,9887,9888,9889,9890,9891,9892,9893],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":2176,"description":2181},[191,2355,2356],{"id":2359,"title":2360,"body":9898,"category":191,"cover":192,"description":2365,"extension":193,"meta":10031,"navigation":90,"path":2532,"pinned":196,"publishedAt":197,"seo":10032,"slug":2534,"stem":2535,"summary":2536,"tags":10033,"updatedAt":197,"visible":90,"__hash__":2540},{"type":7,"value":9899,"toc":10021},[9900,9902,9904,9906,9908,9912,9914,9916,9934,9936,9938,9974,9976,9981,9983,9985,9995,9997,10005,10007,10013,10015,10017,10019],[10,9901,2365],{},[14,9903,16],{"id":16},[10,9905,2370],{},[14,9907,22],{"id":22},[10,9909,9910],{},[26,9911],{"alt":2377,"src":2378},[10,9913,2381],{},[14,9915,35],{"id":35},[37,9917,9918,9924,9932],{},[40,9919,9920,2391,9922,2395],{},[63,9921,2390],{},[63,9923,2394],{},[40,9925,9926,2401,9928,2405,9930,2409],{},[63,9927,2400],{},[63,9929,2404],{},[63,9931,2408],{},[40,9933,2412],{},[14,9935,51],{"id":51},[10,9937,54],{},[56,9939,9940],{"className":58,"code":2419,"language":60,"meta":61,"style":61},[63,9941,9942,9946,9950,9954,9958,9962,9966,9970],{"__ignoreMap":61},[66,9943,9944],{"class":68,"line":69},[66,9945,2426],{},[66,9947,9948],{"class":68,"line":75},[66,9949,2431],{},[66,9951,9952],{"class":68,"line":81},[66,9953,2436],{},[66,9955,9956],{"class":68,"line":87},[66,9957,91],{"emptyLinePlaceholder":90},[66,9959,9960],{"class":68,"line":94},[66,9961,2445],{},[66,9963,9964],{"class":68,"line":100},[66,9965,2450],{},[66,9967,9968],{"class":68,"line":2453},[66,9969,2456],{},[66,9971,9972],{"class":68,"line":2459},[66,9973,2462],{},[10,9975,106],{},[56,9977,9979],{"className":9978,"code":2468,"language":112,"meta":61},[110],[63,9980,2468],{"__ignoreMap":61},[10,9982,117],{},[14,9984,120],{"id":120},[122,9986,9987,9991],{},[40,9988,9989,2482],{},[63,9990,2481],{},[40,9992,9993,2488],{},[63,9994,2487],{},[14,9996,138],{"id":138},[37,9998,9999,10003],{},[40,10000,2495,10001,328],{},[63,10002,2498],{},[40,10004,2501],{},[14,10006,153],{"id":153},[122,10008,10009,10011],{},[40,10010,2508],{},[40,10012,2511],{},[10,10014,170],{},[14,10016,173],{"id":173},[10,10018,2518],{},[178,10020,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10022},[10023,10024,10025,10026,10027,10028,10029,10030],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":2360,"description":2365},[191,2538,2539],{"id":2542,"title":2543,"body":10035,"category":191,"cover":192,"description":2548,"extension":193,"meta":10172,"navigation":90,"path":2725,"pinned":196,"publishedAt":197,"seo":10173,"slug":2727,"stem":2728,"summary":2729,"tags":10174,"updatedAt":197,"visible":90,"__hash__":2733},{"type":7,"value":10036,"toc":10160},[10037,10039,10041,10043,10045,10049,10055,10057,10065,10067,10069,10093,10095,10100,10102,10104,10122,10124,10126,10130,10132,10134,10140,10142,10152,10154,10156,10158],[10,10038,2548],{},[14,10040,16],{"id":16},[10,10042,2553],{},[14,10044,22],{"id":22},[10,10046,10047],{},[26,10048],{"alt":2560,"src":2561},[10,10050,2564,10051,2568,10053,328],{},[63,10052,2567],{},[63,10054,2571],{},[14,10056,35],{"id":35},[37,10058,10059,10061,10063],{},[40,10060,2578],{},[40,10062,2581],{},[40,10064,2584],{},[14,10066,51],{"id":51},[10,10068,54],{},[56,10070,10071],{"className":58,"code":2591,"language":60,"meta":61,"style":61},[63,10072,10073,10077,10081,10085,10089],{"__ignoreMap":61},[66,10074,10075],{"class":68,"line":69},[66,10076,2598],{},[66,10078,10079],{"class":68,"line":75},[66,10080,2603],{},[66,10082,10083],{"class":68,"line":81},[66,10084,2608],{},[66,10086,10087],{"class":68,"line":87},[66,10088,2613],{},[66,10090,10091],{"class":68,"line":94},[66,10092,2618],{},[10,10094,106],{},[56,10096,10098],{"className":10097,"code":2624,"language":112,"meta":61},[110],[63,10099,2624],{"__ignoreMap":61},[10,10101,117],{},[14,10103,120],{"id":120},[122,10105,10106,10114],{},[40,10107,2635,10108,2638,10110,2642,10112,2646],{},[63,10109,191],{},[63,10111,2641],{},[63,10113,2645],{},[40,10115,10116,2652,10118,2656,10120,2660],{},[63,10117,2651],{},[63,10119,2655],{},[63,10121,2659],{},[294,10123,2663],{"id":2663},[10,10125,2666],{},[10,10127,10128],{},[26,10129],{"alt":2671,"src":2672},[10,10131,2675],{},[14,10133,138],{"id":138},[37,10135,10136,10138],{},[40,10137,2682],{},[40,10139,2685],{},[14,10141,153],{"id":153},[122,10143,10144,10150],{},[40,10145,2692,10146,2696,10148,328],{},[63,10147,2695],{},[63,10149,2699],{},[40,10151,2702],{},[10,10153,170],{},[14,10155,173],{"id":173},[10,10157,2709],{},[178,10159,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10161},[10162,10163,10164,10165,10166,10169,10170,10171],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":10167},[10168],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":2543,"description":2548},[191,2731,2732],{"id":2735,"title":2736,"body":10176,"category":191,"cover":192,"description":2741,"extension":193,"meta":10341,"navigation":90,"path":2956,"pinned":196,"publishedAt":197,"seo":10342,"slug":2958,"stem":2959,"summary":2960,"tags":10343,"updatedAt":197,"visible":90,"__hash__":2964},{"type":7,"value":10177,"toc":10329},[10178,10180,10182,10184,10186,10190,10196,10198,10218,10220,10222,10258,10260,10265,10267,10269,10283,10285,10287,10291,10297,10299,10309,10311,10321,10323,10325,10327],[10,10179,2741],{},[14,10181,16],{"id":16},[10,10183,2746],{},[14,10185,22],{"id":22},[10,10187,10188],{},[26,10189],{"alt":2753,"src":2754},[10,10191,2757,10192,975,10194,2764],{},[63,10193,2760],{},[63,10195,2763],{},[14,10197,35],{"id":35},[37,10199,10200,10208,10216],{},[40,10201,10202,2774,10204,2778,10206,2782],{},[63,10203,2773],{},[63,10205,2777],{},[63,10207,2781],{},[40,10209,10210,2788,10212,2792,10214,2796],{},[63,10211,2787],{},[63,10213,2791],{},[63,10215,2795],{},[40,10217,2799],{},[14,10219,51],{"id":51},[10,10221,54],{},[56,10223,10224],{"className":58,"code":2806,"language":60,"meta":61,"style":61},[63,10225,10226,10230,10234,10238,10242,10246,10250,10254],{"__ignoreMap":61},[66,10227,10228],{"class":68,"line":69},[66,10229,2813],{},[66,10231,10232],{"class":68,"line":75},[66,10233,2818],{},[66,10235,10236],{"class":68,"line":81},[66,10237,91],{"emptyLinePlaceholder":90},[66,10239,10240],{"class":68,"line":87},[66,10241,2827],{},[66,10243,10244],{"class":68,"line":94},[66,10245,2832],{},[66,10247,10248],{"class":68,"line":100},[66,10249,2837],{},[66,10251,10252],{"class":68,"line":2453},[66,10253,2842],{},[66,10255,10256],{"class":68,"line":2459},[66,10257,2847],{},[10,10259,106],{},[56,10261,10263],{"className":10262,"code":2853,"language":112,"meta":61},[110],[63,10264,2853],{"__ignoreMap":61},[10,10266,117],{},[14,10268,120],{"id":120},[122,10270,10271,10277],{},[40,10272,10273,2867,10275,2871],{},[63,10274,2866],{},[63,10276,2870],{},[40,10278,10279,2877,10281,2880],{},[63,10280,2876],{},[63,10282,2795],{},[294,10284,2663],{"id":2663},[10,10286,2885],{},[10,10288,10289],{},[26,10290],{"alt":2890,"src":2891},[10,10292,10293,2896,10295,2899],{},[63,10294,2787],{},[63,10296,2791],{},[14,10298,138],{"id":138},[37,10300,10301,10307],{},[40,10302,2906,10303,2909,10305,2912],{},[63,10304,2781],{},[63,10306,2773],{},[40,10308,2915],{},[14,10310,153],{"id":153},[122,10312,10313,10317],{},[40,10314,2922,10315,2926],{},[63,10316,2925],{},[40,10318,2929,10319,2933],{},[63,10320,2932],{},[10,10322,170],{},[14,10324,173],{"id":173},[10,10326,2940],{},[178,10328,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10330},[10331,10332,10333,10334,10335,10338,10339,10340],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":10336},[10337],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":2736,"description":2741},[191,2962,2963],{"id":2966,"title":2967,"body":10345,"category":191,"cover":192,"description":2972,"extension":193,"meta":10478,"navigation":90,"path":3141,"pinned":196,"publishedAt":197,"seo":10479,"slug":3143,"stem":3144,"summary":3145,"tags":10480,"updatedAt":197,"visible":90,"__hash__":3148},{"type":7,"value":10346,"toc":10468},[10347,10349,10351,10353,10355,10359,10369,10371,10381,10383,10385,10413,10415,10420,10422,10424,10438,10440,10448,10450,10460,10462,10464,10466],[10,10348,2972],{},[14,10350,16],{"id":16},[10,10352,2977],{},[14,10354,22],{"id":22},[10,10356,10357],{},[26,10358],{"alt":2984,"src":2985},[10,10360,10361,2991,10363,2995,10365,2999,10367,3003],{},[63,10362,2990],{},[63,10364,2994],{},[63,10366,2998],{},[63,10368,3002],{},[14,10370,35],{"id":35},[37,10372,10373,10375,10379],{},[40,10374,3010],{},[40,10376,10377,3015],{},[63,10378,3002],{},[40,10380,3018],{},[14,10382,51],{"id":51},[10,10384,54],{},[56,10386,10387],{"className":58,"code":3025,"language":60,"meta":61,"style":61},[63,10388,10389,10393,10397,10401,10405,10409],{"__ignoreMap":61},[66,10390,10391],{"class":68,"line":69},[66,10392,3032],{},[66,10394,10395],{"class":68,"line":75},[66,10396,3037],{},[66,10398,10399],{"class":68,"line":81},[66,10400,3042],{},[66,10402,10403],{"class":68,"line":87},[66,10404,91],{"emptyLinePlaceholder":90},[66,10406,10407],{"class":68,"line":94},[66,10408,3051],{},[66,10410,10411],{"class":68,"line":100},[66,10412,3056],{},[10,10414,106],{},[56,10416,10418],{"className":10417,"code":3062,"language":112,"meta":61},[110],[63,10419,3062],{"__ignoreMap":61},[10,10421,117],{},[14,10423,120],{"id":120},[122,10425,10426,10432],{},[40,10427,3073,10428,3076,10430,3080],{},[63,10429,2990],{},[63,10431,3079],{},[40,10433,10434,3086,10436,3090],{},[63,10435,3085],{},[63,10437,3089],{},[14,10439,138],{"id":138},[37,10441,10442,10446],{},[40,10443,3097,10444,3101],{},[63,10445,3100],{},[40,10447,3104],{},[14,10449,153],{"id":153},[122,10451,10452,10454],{},[40,10453,3111],{},[40,10455,1686,10456,3117,10458,3120],{},[63,10457,3116],{},[63,10459,3002],{},[10,10461,170],{},[14,10463,173],{"id":173},[10,10465,3127],{},[178,10467,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10469},[10470,10471,10472,10473,10474,10475,10476,10477],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":2967,"description":2972},[191,2310,3147],{"id":3150,"title":3151,"body":10482,"category":191,"cover":192,"description":3156,"extension":193,"meta":10611,"navigation":90,"path":3317,"pinned":196,"publishedAt":197,"seo":10612,"slug":3319,"stem":3320,"summary":3321,"tags":10613,"updatedAt":197,"visible":90,"__hash__":3324},{"type":7,"value":10483,"toc":10601},[10484,10486,10488,10490,10492,10496,10500,10502,10512,10514,10516,10548,10550,10555,10557,10559,10571,10573,10583,10585,10593,10595,10597,10599],[10,10485,3156],{},[14,10487,16],{"id":16},[10,10489,3161],{},[14,10491,22],{"id":22},[10,10493,10494],{},[26,10495],{"alt":3168,"src":3169},[10,10497,3172,10498,3176],{},[63,10499,3175],{},[14,10501,35],{"id":35},[37,10503,10504,10506,10508],{},[40,10505,3183],{},[40,10507,3186],{},[40,10509,3189,10510,328],{},[63,10511,3192],{},[14,10513,51],{"id":51},[10,10515,54],{},[56,10517,10518],{"className":58,"code":3199,"language":60,"meta":61,"style":61},[63,10519,10520,10524,10528,10532,10536,10540,10544],{"__ignoreMap":61},[66,10521,10522],{"class":68,"line":69},[66,10523,3206],{},[66,10525,10526],{"class":68,"line":75},[66,10527,3211],{},[66,10529,10530],{"class":68,"line":81},[66,10531,91],{"emptyLinePlaceholder":90},[66,10533,10534],{"class":68,"line":87},[66,10535,3220],{},[66,10537,10538],{"class":68,"line":94},[66,10539,3225],{},[66,10541,10542],{"class":68,"line":100},[66,10543,3230],{},[66,10545,10546],{"class":68,"line":2453},[66,10547,3235],{},[10,10549,106],{},[56,10551,10553],{"className":10552,"code":3241,"language":112,"meta":61},[110],[63,10554,3241],{"__ignoreMap":61},[10,10556,117],{},[14,10558,120],{"id":120},[122,10560,10561,10563],{},[40,10562,3252],{},[40,10564,10565,3258,10567,3262,10569,3266],{},[63,10566,3257],{},[63,10568,3261],{},[63,10570,3265],{},[14,10572,138],{"id":138},[37,10574,10575,10581],{},[40,10576,3273,10577,3277,10579,328],{},[63,10578,3276],{},[63,10580,3280],{},[40,10582,3283],{},[14,10584,153],{"id":153},[122,10586,10587,10589],{},[40,10588,3290],{},[40,10590,3293,10591,3296],{},[63,10592,3265],{},[10,10594,170],{},[14,10596,173],{"id":173},[10,10598,3303],{},[178,10600,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10602},[10603,10604,10605,10606,10607,10608,10609,10610],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":3151,"description":3156},[191,3323,204],{"id":4,"title":5,"body":10615,"category":191,"cover":192,"description":12,"extension":193,"meta":10734,"navigation":90,"path":195,"pinned":196,"publishedAt":197,"seo":10735,"slug":199,"stem":200,"summary":201,"tags":10736,"updatedAt":197,"visible":90,"__hash__":205},{"type":7,"value":10616,"toc":10724},[10617,10619,10621,10623,10625,10629,10631,10633,10641,10643,10645,10673,10675,10680,10682,10684,10694,10696,10704,10706,10716,10718,10720,10722],[10,10618,12],{},[14,10620,16],{"id":16},[10,10622,19],{},[14,10624,22],{"id":22},[10,10626,10627],{},[26,10628],{"alt":28,"src":29},[10,10630,32],{},[14,10632,35],{"id":35},[37,10634,10635,10637,10639],{},[40,10636,42],{},[40,10638,45],{},[40,10640,48],{},[14,10642,51],{"id":51},[10,10644,54],{},[56,10646,10647],{"className":58,"code":59,"language":60,"meta":61,"style":61},[63,10648,10649,10653,10657,10661,10665,10669],{"__ignoreMap":61},[66,10650,10651],{"class":68,"line":69},[66,10652,72],{},[66,10654,10655],{"class":68,"line":75},[66,10656,78],{},[66,10658,10659],{"class":68,"line":81},[66,10660,84],{},[66,10662,10663],{"class":68,"line":87},[66,10664,91],{"emptyLinePlaceholder":90},[66,10666,10667],{"class":68,"line":94},[66,10668,97],{},[66,10670,10671],{"class":68,"line":100},[66,10672,103],{},[10,10674,106],{},[56,10676,10678],{"className":10677,"code":111,"language":112,"meta":61},[110],[63,10679,111],{"__ignoreMap":61},[10,10681,117],{},[14,10683,120],{"id":120},[122,10685,10686,10690],{},[40,10687,10688,129],{},[63,10689,128],{},[40,10691,10692,135],{},[63,10693,134],{},[14,10695,138],{"id":138},[37,10697,10698,10702],{},[40,10699,143,10700,147],{},[63,10701,146],{},[40,10703,150],{},[14,10705,153],{"id":153},[122,10707,10708,10710],{},[40,10709,158],{},[40,10711,161,10712,164,10714,167],{},[63,10713,146],{},[63,10715,134],{},[10,10717,170],{},[14,10719,173],{"id":173},[10,10721,176],{},[178,10723,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10725},[10726,10727,10728,10729,10730,10731,10732,10733],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5,"description":12},[191,203,204],{"id":3449,"title":3450,"body":10738,"category":191,"cover":192,"description":3455,"extension":193,"meta":10863,"navigation":90,"path":3611,"pinned":196,"publishedAt":197,"seo":10864,"slug":3613,"stem":3614,"summary":3615,"tags":10865,"updatedAt":197,"visible":90,"__hash__":3618},{"type":7,"value":10739,"toc":10853},[10740,10742,10744,10746,10748,10752,10758,10760,10770,10772,10774,10802,10804,10809,10811,10813,10823,10825,10837,10839,10845,10847,10849,10851],[10,10741,3455],{},[14,10743,16],{"id":16},[10,10745,3460],{},[14,10747,22],{"id":22},[10,10749,10750],{},[26,10751],{"alt":3467,"src":3468},[10,10753,3471,10754,3475,10756,3478],{},[63,10755,3474],{},[63,10757,2210],{},[14,10759,35],{"id":35},[37,10761,10762,10764,10768],{},[40,10763,3485],{},[40,10765,2303,10766,3491],{},[63,10767,3490],{},[40,10769,3494],{},[14,10771,51],{"id":51},[10,10773,54],{},[56,10775,10776],{"className":58,"code":3501,"language":60,"meta":61,"style":61},[63,10777,10778,10782,10786,10790,10794,10798],{"__ignoreMap":61},[66,10779,10780],{"class":68,"line":69},[66,10781,3508],{},[66,10783,10784],{"class":68,"line":75},[66,10785,3513],{},[66,10787,10788],{"class":68,"line":81},[66,10789,91],{"emptyLinePlaceholder":90},[66,10791,10792],{"class":68,"line":87},[66,10793,3522],{},[66,10795,10796],{"class":68,"line":94},[66,10797,3527],{},[66,10799,10800],{"class":68,"line":100},[66,10801,3532],{},[10,10803,106],{},[56,10805,10807],{"className":10806,"code":3538,"language":112,"meta":61},[110],[63,10808,3538],{"__ignoreMap":61},[10,10810,117],{},[14,10812,120],{"id":120},[122,10814,10815,10817],{},[40,10816,3549],{},[40,10818,3552,10819,3555,10821,3559],{},[63,10820,2210],{},[63,10822,3558],{},[14,10824,138],{"id":138},[37,10826,10827,10831],{},[40,10828,3566,10829,3570],{},[63,10830,3569],{},[40,10832,3573,10833,3577,10835,328],{},[63,10834,3576],{},[63,10836,3580],{},[14,10838,153],{"id":153},[122,10840,10841,10843],{},[40,10842,3587],{},[40,10844,3590],{},[10,10846,170],{},[14,10848,173],{"id":173},[10,10850,3597],{},[178,10852,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10854},[10855,10856,10857,10858,10859,10860,10861,10862],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":3450,"description":3455},[191,3617,204],{"id":3620,"title":3621,"body":10867,"category":191,"cover":192,"description":3626,"extension":193,"meta":10990,"navigation":90,"path":3776,"pinned":196,"publishedAt":197,"seo":10991,"slug":3778,"stem":3779,"summary":3780,"tags":10992,"updatedAt":197,"visible":90,"__hash__":3783},{"type":7,"value":10868,"toc":10980},[10869,10871,10873,10875,10877,10881,10883,10885,10897,10899,10901,10929,10931,10936,10938,10940,10950,10952,10962,10964,10972,10974,10976,10978],[10,10870,3626],{},[14,10872,16],{"id":16},[10,10874,3631],{},[14,10876,22],{"id":22},[10,10878,10879],{},[26,10880],{"alt":3638,"src":3639},[10,10882,3642],{},[14,10884,35],{"id":35},[37,10886,10887,10889,10891],{},[40,10888,3649],{},[40,10890,3652],{},[40,10892,3655,10893,3659,10895,3663],{},[63,10894,3658],{},[63,10896,3662],{},[14,10898,51],{"id":51},[10,10900,54],{},[56,10902,10903],{"className":58,"code":3670,"language":60,"meta":61,"style":61},[63,10904,10905,10909,10913,10917,10921,10925],{"__ignoreMap":61},[66,10906,10907],{"class":68,"line":69},[66,10908,3677],{},[66,10910,10911],{"class":68,"line":75},[66,10912,3682],{},[66,10914,10915],{"class":68,"line":81},[66,10916,91],{"emptyLinePlaceholder":90},[66,10918,10919],{"class":68,"line":87},[66,10920,3691],{},[66,10922,10923],{"class":68,"line":94},[66,10924,3696],{},[66,10926,10927],{"class":68,"line":100},[66,10928,3701],{},[10,10930,106],{},[56,10932,10934],{"className":10933,"code":3707,"language":112,"meta":61},[110],[63,10935,3707],{"__ignoreMap":61},[10,10937,117],{},[14,10939,120],{"id":120},[122,10941,10942,10944],{},[40,10943,3718],{},[40,10945,10946,3724,10948,3728],{},[63,10947,3723],{},[63,10949,3727],{},[14,10951,138],{"id":138},[37,10953,10954,10960],{},[40,10955,2303,10956,3737,10958,328],{},[63,10957,3662],{},[63,10959,3658],{},[40,10961,3742],{},[14,10963,153],{"id":153},[122,10965,10966,10970],{},[40,10967,3749,10968,3752],{},[63,10969,3658],{},[40,10971,3755],{},[10,10973,170],{},[14,10975,173],{"id":173},[10,10977,3762],{},[178,10979,180],{},{"title":61,"searchDepth":75,"depth":75,"links":10981},[10982,10983,10984,10985,10986,10987,10988,10989],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":3621,"description":3626},[191,3782,204],{"id":3785,"title":3786,"body":10994,"category":191,"cover":192,"description":3791,"extension":193,"meta":11153,"navigation":90,"path":3990,"pinned":196,"publishedAt":197,"seo":11154,"slug":3992,"stem":3993,"summary":3994,"tags":11155,"updatedAt":197,"visible":90,"__hash__":3998},{"type":7,"value":10995,"toc":11141},[10996,10998,11000,11002,11004,11008,11014,11016,11028,11030,11032,11072,11074,11079,11081,11083,11097,11099,11101,11105,11107,11109,11119,11121,11133,11135,11137,11139],[10,10997,3791],{},[14,10999,16],{"id":16},[10,11001,3796],{},[14,11003,22],{"id":22},[10,11005,11006],{},[26,11007],{"alt":3803,"src":3804},[10,11009,11010,3810,11012,3814],{},[63,11011,3809],{},[63,11013,3813],{},[14,11015,35],{"id":35},[37,11017,11018,11024,11026],{},[40,11019,11020,3823,11022,3827],{},[63,11021,2773],{},[63,11023,3826],{},[40,11025,3830],{},[40,11027,3833],{},[14,11029,51],{"id":51},[10,11031,54],{},[56,11033,11034],{"className":58,"code":3840,"language":60,"meta":61,"style":61},[63,11035,11036,11040,11044,11048,11052,11056,11060,11064,11068],{"__ignoreMap":61},[66,11037,11038],{"class":68,"line":69},[66,11039,3847],{},[66,11041,11042],{"class":68,"line":75},[66,11043,3852],{},[66,11045,11046],{"class":68,"line":81},[66,11047,3857],{},[66,11049,11050],{"class":68,"line":87},[66,11051,91],{"emptyLinePlaceholder":90},[66,11053,11054],{"class":68,"line":94},[66,11055,3866],{},[66,11057,11058],{"class":68,"line":100},[66,11059,3871],{},[66,11061,11062],{"class":68,"line":2453},[66,11063,3876],{},[66,11065,11066],{"class":68,"line":2459},[66,11067,3881],{},[66,11069,11070],{"class":68,"line":3884},[66,11071,3887],{},[10,11073,106],{},[56,11075,11077],{"className":11076,"code":3893,"language":112,"meta":61},[110],[63,11078,3893],{"__ignoreMap":61},[10,11080,117],{},[14,11082,120],{"id":120},[122,11084,11085,11089],{},[40,11086,11087,3907],{},[63,11088,3906],{},[40,11090,11091,3913,11093,3917,11095,3921],{},[63,11092,3912],{},[63,11094,3916],{},[63,11096,3920],{},[294,11098,2663],{"id":2663},[10,11100,3926],{},[10,11102,11103],{},[26,11104],{"alt":3931,"src":3932},[10,11106,3935],{},[14,11108,138],{"id":138},[37,11110,11111,11117],{},[40,11112,3942,11113,3945,11115,328],{},[63,11114,2773],{},[63,11116,3826],{},[40,11118,3950],{},[14,11120,153],{"id":153},[122,11122,11123,11125],{},[40,11124,3957],{},[40,11126,2303,11127,3963,11129,1123,11131,328],{},[63,11128,3962],{},[63,11130,3826],{},[63,11132,2773],{},[10,11134,170],{},[14,11136,173],{"id":173},[10,11138,3974],{},[178,11140,180],{},{"title":61,"searchDepth":75,"depth":75,"links":11142},[11143,11144,11145,11146,11147,11150,11151,11152],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":11148},[11149],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":3786,"description":3791},[191,3996,3997],{"id":4000,"title":4001,"body":11157,"category":191,"cover":192,"description":4006,"extension":193,"meta":11329,"navigation":90,"path":4220,"pinned":196,"publishedAt":197,"seo":11330,"slug":4222,"stem":4223,"summary":4224,"tags":11331,"updatedAt":197,"visible":90,"__hash__":4227},{"type":7,"value":11158,"toc":11316},[11159,11161,11163,11165,11167,11171,11179,11181,11189,11191,11193,11237,11239,11244,11246,11248,11260,11262,11264,11268,11274,11276,11278,11282,11286,11288,11300,11302,11308,11310,11312,11314],[10,11160,4006],{},[14,11162,16],{"id":16},[10,11164,4011],{},[14,11166,22],{"id":22},[10,11168,11169],{},[26,11170],{"alt":4018,"src":4019},[10,11172,11173,2221,11175,2221,11177,4029],{},[63,11174,1122],{},[63,11176,4026],{},[63,11178,1126],{},[14,11180,35],{"id":35},[37,11182,11183,11185,11187],{},[40,11184,4036],{},[40,11186,4039],{},[40,11188,4042],{},[14,11190,51],{"id":51},[10,11192,54],{},[56,11194,11195],{"className":58,"code":4049,"language":60,"meta":61,"style":61},[63,11196,11197,11201,11205,11209,11213,11217,11221,11225,11229,11233],{"__ignoreMap":61},[66,11198,11199],{"class":68,"line":69},[66,11200,4056],{},[66,11202,11203],{"class":68,"line":75},[66,11204,91],{"emptyLinePlaceholder":90},[66,11206,11207],{"class":68,"line":81},[66,11208,4065],{},[66,11210,11211],{"class":68,"line":87},[66,11212,4070],{},[66,11214,11215],{"class":68,"line":94},[66,11216,4075],{},[66,11218,11219],{"class":68,"line":100},[66,11220,4080],{},[66,11222,11223],{"class":68,"line":2453},[66,11224,1112],{},[66,11226,11227],{"class":68,"line":2459},[66,11228,4089],{},[66,11230,11231],{"class":68,"line":3884},[66,11232,91],{"emptyLinePlaceholder":90},[66,11234,11235],{"class":68,"line":4096},[66,11236,4099],{},[10,11238,106],{},[56,11240,11242],{"className":11241,"code":4105,"language":112,"meta":61},[110],[63,11243,4105],{"__ignoreMap":61},[10,11245,117],{},[14,11247,120],{"id":120},[122,11249,11250,11254],{},[40,11251,4116,11252,4120],{},[63,11253,4119],{},[40,11255,11256,4126,11258,4129],{},[63,11257,4125],{},[63,11259,1126],{},[294,11261,2663],{"id":2663},[10,11263,4134],{},[10,11265,11266],{},[26,11267],{"alt":4139,"src":4140},[10,11269,11270,4145,11272,4148],{},[63,11271,4119],{},[63,11273,4125],{},[294,11275,2663],{"id":4151},[10,11277,4154],{},[10,11279,11280],{},[26,11281],{"alt":4159,"src":4160},[10,11283,4163,11284,4166],{},[63,11285,1122],{},[14,11287,138],{"id":138},[37,11289,11290,11294],{},[40,11291,4173,11292,4176],{},[63,11293,4125],{},[40,11295,4179,11296,4182,11298,4186],{},[63,11297,1122],{},[63,11299,4185],{},[14,11301,153],{"id":153},[122,11303,11304,11306],{},[40,11305,4193],{},[40,11307,4196],{},[10,11309,170],{},[14,11311,173],{"id":173},[10,11313,4203],{},[178,11315,180],{},{"title":61,"searchDepth":75,"depth":75,"links":11317},[11318,11319,11320,11321,11322,11326,11327,11328],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":11323},[11324,11325],{"id":2663,"depth":81,"text":2663},{"id":4151,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":4001,"description":4006},[191,1122,4226],{"id":4229,"title":4230,"body":11333,"category":191,"cover":192,"description":4235,"extension":193,"meta":11470,"navigation":90,"path":4402,"pinned":196,"publishedAt":197,"seo":11471,"slug":4404,"stem":4405,"summary":4406,"tags":11472,"updatedAt":197,"visible":90,"__hash__":4409},{"type":7,"value":11334,"toc":11458},[11335,11337,11339,11341,11343,11347,11351,11353,11363,11365,11367,11399,11401,11406,11408,11410,11420,11422,11424,11428,11432,11434,11440,11442,11450,11452,11454,11456],[10,11336,4235],{},[14,11338,16],{"id":16},[10,11340,4240],{},[14,11342,22],{"id":22},[10,11344,11345],{},[26,11346],{"alt":4247,"src":4248},[10,11348,11349,4254],{},[63,11350,4253],{},[14,11352,35],{"id":35},[37,11354,11355,11357,11359],{},[40,11356,4261],{},[40,11358,4264],{},[40,11360,4267,11361,4271],{},[63,11362,4270],{},[14,11364,51],{"id":51},[10,11366,54],{},[56,11368,11369],{"className":58,"code":4278,"language":60,"meta":61,"style":61},[63,11370,11371,11375,11379,11383,11387,11391,11395],{"__ignoreMap":61},[66,11372,11373],{"class":68,"line":69},[66,11374,4285],{},[66,11376,11377],{"class":68,"line":75},[66,11378,91],{"emptyLinePlaceholder":90},[66,11380,11381],{"class":68,"line":81},[66,11382,4294],{},[66,11384,11385],{"class":68,"line":87},[66,11386,4299],{},[66,11388,11389],{"class":68,"line":94},[66,11390,4304],{},[66,11392,11393],{"class":68,"line":100},[66,11394,91],{"emptyLinePlaceholder":90},[66,11396,11397],{"class":68,"line":2453},[66,11398,4313],{},[10,11400,106],{},[56,11402,11404],{"className":11403,"code":4319,"language":112,"meta":61},[110],[63,11405,4319],{"__ignoreMap":61},[10,11407,117],{},[14,11409,120],{"id":120},[122,11411,11412,11416],{},[40,11413,4330,11414,4334],{},[63,11415,4333],{},[40,11417,4337,11418,4340],{},[63,11419,4333],{},[294,11421,2663],{"id":2663},[10,11423,4345],{},[10,11425,11426],{},[26,11427],{"alt":4350,"src":4351},[10,11429,4354,11430,4357],{},[63,11431,4333],{},[14,11433,138],{"id":138},[37,11435,11436,11438],{},[40,11437,4364],{},[40,11439,4367],{},[14,11441,153],{"id":153},[122,11443,11444,11448],{},[40,11445,2303,11446,4376],{},[63,11447,4253],{},[40,11449,4379],{},[10,11451,170],{},[14,11453,173],{"id":173},[10,11455,4386],{},[178,11457,180],{},{"title":61,"searchDepth":75,"depth":75,"links":11459},[11460,11461,11462,11463,11464,11467,11468,11469],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":11465},[11466],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":4230,"description":4235},[191,4253,4408],{"id":4411,"title":4412,"body":11474,"category":191,"cover":192,"description":4417,"extension":193,"meta":11599,"navigation":90,"path":4566,"pinned":196,"publishedAt":197,"seo":11600,"slug":4568,"stem":4569,"summary":4570,"tags":11601,"updatedAt":197,"visible":90,"__hash__":4573},{"type":7,"value":11475,"toc":11589},[11476,11478,11480,11482,11484,11488,11492,11494,11504,11506,11508,11540,11542,11547,11549,11551,11563,11565,11571,11573,11581,11583,11585,11587],[10,11477,4417],{},[14,11479,16],{"id":16},[10,11481,4422],{},[14,11483,22],{"id":22},[10,11485,11486],{},[26,11487],{"alt":4429,"src":4430},[10,11489,11490,4435],{},[63,11491,4270],{},[14,11493,35],{"id":35},[37,11495,11496,11500,11502],{},[40,11497,11498,4445],{},[63,11499,4444],{},[40,11501,4448],{},[40,11503,4451],{},[14,11505,51],{"id":51},[10,11507,54],{},[56,11509,11510],{"className":58,"code":4458,"language":60,"meta":61,"style":61},[63,11511,11512,11516,11520,11524,11528,11532,11536],{"__ignoreMap":61},[66,11513,11514],{"class":68,"line":69},[66,11515,4465],{},[66,11517,11518],{"class":68,"line":75},[66,11519,91],{"emptyLinePlaceholder":90},[66,11521,11522],{"class":68,"line":81},[66,11523,4474],{},[66,11525,11526],{"class":68,"line":87},[66,11527,4479],{},[66,11529,11530],{"class":68,"line":94},[66,11531,91],{"emptyLinePlaceholder":90},[66,11533,11534],{"class":68,"line":100},[66,11535,4488],{},[66,11537,11538],{"class":68,"line":2453},[66,11539,4493],{},[10,11541,106],{},[56,11543,11545],{"className":11544,"code":4499,"language":112,"meta":61},[110],[63,11546,4499],{"__ignoreMap":61},[10,11548,117],{},[14,11550,120],{"id":120},[122,11552,11553,11559],{},[40,11554,4510,11555,4513,11557,4517],{},[63,11556,4270],{},[63,11558,4516],{},[40,11560,11561,4522],{},[63,11562,4444],{},[14,11564,138],{"id":138},[37,11566,11567,11569],{},[40,11568,4529],{},[40,11570,4532],{},[14,11572,153],{"id":153},[122,11574,11575,11577],{},[40,11576,4539],{},[40,11578,2303,11579,4545],{},[63,11580,4544],{},[10,11582,170],{},[14,11584,173],{"id":173},[10,11586,4552],{},[178,11588,180],{},{"title":61,"searchDepth":75,"depth":75,"links":11590},[11591,11592,11593,11594,11595,11596,11597,11598],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":4412,"description":4417},[191,4270,4572],{"id":4575,"title":4576,"body":11603,"category":191,"cover":192,"description":4581,"extension":193,"meta":11748,"navigation":90,"path":4756,"pinned":196,"publishedAt":197,"seo":11749,"slug":4758,"stem":4759,"summary":4760,"tags":11750,"updatedAt":197,"visible":90,"__hash__":4762},{"type":7,"value":11604,"toc":11738},[11605,11607,11609,11611,11613,11617,11623,11625,11639,11641,11643,11687,11689,11694,11696,11698,11708,11710,11722,11724,11730,11732,11734,11736],[10,11606,4581],{},[14,11608,16],{"id":16},[10,11610,4586],{},[14,11612,22],{"id":22},[10,11614,11615],{},[26,11616],{"alt":4593,"src":4594},[10,11618,11619,4600,11621,4604],{},[63,11620,4599],{},[63,11622,4603],{},[14,11624,35],{"id":35},[37,11626,11627,11629,11635],{},[40,11628,4611],{},[40,11630,11631,4616,11633,4619],{},[63,11632,4599],{},[63,11634,4253],{},[40,11636,4622,11637,4625],{},[63,11638,4603],{},[14,11640,51],{"id":51},[10,11642,54],{},[56,11644,11645],{"className":58,"code":4632,"language":60,"meta":61,"style":61},[63,11646,11647,11651,11655,11659,11663,11667,11671,11675,11679,11683],{"__ignoreMap":61},[66,11648,11649],{"class":68,"line":69},[66,11650,4639],{},[66,11652,11653],{"class":68,"line":75},[66,11654,91],{"emptyLinePlaceholder":90},[66,11656,11657],{"class":68,"line":81},[66,11658,4648],{},[66,11660,11661],{"class":68,"line":87},[66,11662,4653],{},[66,11664,11665],{"class":68,"line":94},[66,11666,4658],{},[66,11668,11669],{"class":68,"line":100},[66,11670,4663],{},[66,11672,11673],{"class":68,"line":2453},[66,11674,4668],{},[66,11676,11677],{"class":68,"line":2459},[66,11678,4493],{},[66,11680,11681],{"class":68,"line":3884},[66,11682,91],{"emptyLinePlaceholder":90},[66,11684,11685],{"class":68,"line":4096},[66,11686,4681],{},[10,11688,106],{},[56,11690,11692],{"className":11691,"code":4687,"language":112,"meta":61},[110],[63,11693,4687],{"__ignoreMap":61},[10,11695,117],{},[14,11697,120],{"id":120},[122,11699,11700,11704],{},[40,11701,4698,11702,4701],{},[63,11703,4599],{},[40,11705,4704,11706,4707],{},[63,11707,4603],{},[14,11709,138],{"id":138},[37,11711,11712,11716],{},[40,11713,143,11714,4716],{},[63,11715,4599],{},[40,11717,4719,11718,4722,11720,4725],{},[63,11719,4253],{},[63,11721,4599],{},[14,11723,153],{"id":153},[122,11725,11726,11728],{},[40,11727,4732],{},[40,11729,4735],{},[10,11731,170],{},[14,11733,173],{"id":173},[10,11735,4742],{},[178,11737,180],{},{"title":61,"searchDepth":75,"depth":75,"links":11739},[11740,11741,11742,11743,11744,11745,11746,11747],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":4576,"description":4581},[191,4603,4599],{"id":4764,"title":4765,"body":11752,"category":191,"cover":192,"description":4770,"extension":193,"meta":11891,"navigation":90,"path":4942,"pinned":196,"publishedAt":197,"seo":11892,"slug":4944,"stem":4945,"summary":4946,"tags":11893,"updatedAt":197,"visible":90,"__hash__":4950},{"type":7,"value":11753,"toc":11879},[11754,11756,11758,11760,11762,11766,11768,11770,11786,11788,11790,11818,11820,11825,11827,11829,11841,11843,11845,11849,11851,11853,11863,11865,11871,11873,11875,11877],[10,11755,4770],{},[14,11757,16],{"id":16},[10,11759,4775],{},[14,11761,22],{"id":22},[10,11763,11764],{},[26,11765],{"alt":4782,"src":4783},[10,11767,4786],{},[14,11769,35],{"id":35},[37,11771,11772,11774,11776],{},[40,11773,4793],{},[40,11775,4796],{},[40,11777,4799,11778,2221,11780,4806,11782,2221,11784,328],{},[63,11779,4802],{},[63,11781,4805],{},[63,11783,4809],{},[63,11785,4812],{},[14,11787,51],{"id":51},[10,11789,54],{},[56,11791,11792],{"className":58,"code":4819,"language":60,"meta":61,"style":61},[63,11793,11794,11798,11802,11806,11810,11814],{"__ignoreMap":61},[66,11795,11796],{"class":68,"line":69},[66,11797,4826],{},[66,11799,11800],{"class":68,"line":75},[66,11801,91],{"emptyLinePlaceholder":90},[66,11803,11804],{"class":68,"line":81},[66,11805,4835],{},[66,11807,11808],{"class":68,"line":87},[66,11809,4840],{},[66,11811,11812],{"class":68,"line":94},[66,11813,4845],{},[66,11815,11816],{"class":68,"line":100},[66,11817,4850],{},[10,11819,106],{},[56,11821,11823],{"className":11822,"code":4856,"language":112,"meta":61},[110],[63,11824,4856],{"__ignoreMap":61},[10,11826,117],{},[14,11828,120],{"id":120},[122,11830,11831,11839],{},[40,11832,4867,11833,4870,11835,1123,11837,328],{},[63,11834,4802],{},[63,11836,4873],{},[63,11838,4876],{},[40,11840,4879],{},[294,11842,2663],{"id":2663},[10,11844,4884],{},[10,11846,11847],{},[26,11848],{"alt":4889,"src":4890},[10,11850,4893],{},[14,11852,138],{"id":138},[37,11854,11855,11861],{},[40,11856,4900,11857,975,11859,4906],{},[63,11858,4903],{},[63,11860,4809],{},[40,11862,4909],{},[14,11864,153],{"id":153},[122,11866,11867,11869],{},[40,11868,4916],{},[40,11870,4919],{},[10,11872,170],{},[14,11874,173],{"id":173},[10,11876,4926],{},[178,11878,180],{},{"title":61,"searchDepth":75,"depth":75,"links":11880},[11881,11882,11883,11884,11885,11888,11889,11890],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":11886},[11887],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":4765,"description":4770},[191,4948,4949],{"id":4952,"title":4953,"body":11895,"category":191,"cover":192,"description":4958,"extension":193,"meta":12012,"navigation":90,"path":5097,"pinned":196,"publishedAt":197,"seo":12013,"slug":5099,"stem":5100,"summary":5101,"tags":12014,"updatedAt":197,"visible":90,"__hash__":5105},{"type":7,"value":11896,"toc":12002},[11897,11899,11901,11903,11905,11909,11911,11913,11921,11923,11925,11957,11959,11964,11966,11968,11976,11978,11986,11988,11994,11996,11998,12000],[10,11898,4958],{},[14,11900,16],{"id":16},[10,11902,4963],{},[14,11904,22],{"id":22},[10,11906,11907],{},[26,11908],{"alt":4970,"src":4971},[10,11910,4974],{},[14,11912,35],{"id":35},[37,11914,11915,11917,11919],{},[40,11916,4981],{},[40,11918,4984],{},[40,11920,4987],{},[14,11922,51],{"id":51},[10,11924,54],{},[56,11926,11927],{"className":58,"code":4994,"language":60,"meta":61,"style":61},[63,11928,11929,11933,11937,11941,11945,11949,11953],{"__ignoreMap":61},[66,11930,11931],{"class":68,"line":69},[66,11932,5001],{},[66,11934,11935],{"class":68,"line":75},[66,11936,91],{"emptyLinePlaceholder":90},[66,11938,11939],{"class":68,"line":81},[66,11940,5010],{},[66,11942,11943],{"class":68,"line":87},[66,11944,5015],{},[66,11946,11947],{"class":68,"line":94},[66,11948,91],{"emptyLinePlaceholder":90},[66,11950,11951],{"class":68,"line":100},[66,11952,5024],{},[66,11954,11955],{"class":68,"line":2453},[66,11956,5029],{},[10,11958,106],{},[56,11960,11962],{"className":11961,"code":5035,"language":112,"meta":61},[110],[63,11963,5035],{"__ignoreMap":61},[10,11965,117],{},[14,11967,120],{"id":120},[122,11969,11970,11972],{},[40,11971,5046],{},[40,11973,5049,11974,5053],{},[63,11975,5052],{},[14,11977,138],{"id":138},[37,11979,11980,11984],{},[40,11981,5060,11982,5063],{},[63,11983,4270],{},[40,11985,5066],{},[14,11987,153],{"id":153},[122,11989,11990,11992],{},[40,11991,5073],{},[40,11993,5076],{},[10,11995,170],{},[14,11997,173],{"id":173},[10,11999,5083],{},[178,12001,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12003},[12004,12005,12006,12007,12008,12009,12010,12011],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":4953,"description":4958},[191,5103,5104],{"id":5107,"title":5108,"body":12016,"category":191,"cover":192,"description":5113,"extension":193,"meta":12135,"navigation":90,"path":5257,"pinned":196,"publishedAt":197,"seo":12136,"slug":5259,"stem":5260,"summary":5261,"tags":12137,"updatedAt":197,"visible":90,"__hash__":5265},{"type":7,"value":12017,"toc":12125},[12018,12020,12022,12024,12026,12030,12032,12034,12042,12044,12046,12078,12080,12085,12087,12089,12099,12101,12107,12109,12117,12119,12121,12123],[10,12019,5113],{},[14,12021,16],{"id":16},[10,12023,5118],{},[14,12025,22],{"id":22},[10,12027,12028],{},[26,12029],{"alt":5125,"src":5126},[10,12031,5129],{},[14,12033,35],{"id":35},[37,12035,12036,12038,12040],{},[40,12037,5136],{},[40,12039,5139],{},[40,12041,5142],{},[14,12043,51],{"id":51},[10,12045,54],{},[56,12047,12048],{"className":58,"code":5149,"language":60,"meta":61,"style":61},[63,12049,12050,12054,12058,12062,12066,12070,12074],{"__ignoreMap":61},[66,12051,12052],{"class":68,"line":69},[66,12053,5156],{},[66,12055,12056],{"class":68,"line":75},[66,12057,5161],{},[66,12059,12060],{"class":68,"line":81},[66,12061,5166],{},[66,12063,12064],{"class":68,"line":87},[66,12065,91],{"emptyLinePlaceholder":90},[66,12067,12068],{"class":68,"line":94},[66,12069,5175],{},[66,12071,12072],{"class":68,"line":100},[66,12073,5180],{},[66,12075,12076],{"class":68,"line":2453},[66,12077,5185],{},[10,12079,106],{},[56,12081,12083],{"className":12082,"code":5191,"language":112,"meta":61},[110],[63,12084,5191],{"__ignoreMap":61},[10,12086,117],{},[14,12088,120],{"id":120},[122,12090,12091,12095],{},[40,12092,904,12093,5205],{},[63,12094,5204],{},[40,12096,5208,12097,5212],{},[63,12098,5211],{},[14,12100,138],{"id":138},[37,12102,12103,12105],{},[40,12104,5219],{},[40,12106,5222],{},[14,12108,153],{"id":153},[122,12110,12111,12115],{},[40,12112,5229,12113,5233],{},[63,12114,5232],{},[40,12116,5236],{},[10,12118,170],{},[14,12120,173],{"id":173},[10,12122,5243],{},[178,12124,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12126},[12127,12128,12129,12130,12131,12132,12133,12134],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5108,"description":5113},[191,5263,5264],{"id":5267,"title":5268,"body":12139,"category":191,"cover":192,"description":5273,"extension":193,"meta":12284,"navigation":90,"path":5454,"pinned":196,"publishedAt":197,"seo":12285,"slug":5456,"stem":5457,"summary":5458,"tags":12286,"updatedAt":197,"visible":90,"__hash__":5462},{"type":7,"value":12140,"toc":12272},[12141,12143,12145,12147,12149,12153,12157,12159,12171,12173,12175,12203,12205,12210,12212,12214,12228,12230,12232,12236,12244,12246,12256,12258,12264,12266,12268,12270],[10,12142,5273],{},[14,12144,16],{"id":16},[10,12146,5278],{},[14,12148,22],{"id":22},[10,12150,12151],{},[26,12152],{"alt":5285,"src":5286},[10,12154,5289,12155,5293],{},[63,12156,5292],{},[14,12158,35],{"id":35},[37,12160,12161,12163,12165],{},[40,12162,5300],{},[40,12164,5303],{},[40,12166,5306,12167,5309,12169,328],{},[63,12168,5292],{},[63,12170,5312],{},[14,12172,51],{"id":51},[10,12174,54],{},[56,12176,12177],{"className":58,"code":5319,"language":60,"meta":61,"style":61},[63,12178,12179,12183,12187,12191,12195,12199],{"__ignoreMap":61},[66,12180,12181],{"class":68,"line":69},[66,12182,5326],{},[66,12184,12185],{"class":68,"line":75},[66,12186,5331],{},[66,12188,12189],{"class":68,"line":81},[66,12190,5336],{},[66,12192,12193],{"class":68,"line":87},[66,12194,91],{"emptyLinePlaceholder":90},[66,12196,12197],{"class":68,"line":94},[66,12198,5345],{},[66,12200,12201],{"class":68,"line":100},[66,12202,5350],{},[10,12204,106],{},[56,12206,12208],{"className":12207,"code":5356,"language":112,"meta":61},[110],[63,12209,5356],{"__ignoreMap":61},[10,12211,117],{},[14,12213,120],{"id":120},[122,12215,12216,12222],{},[40,12217,5367,12218,2221,12220,5373],{},[63,12219,5370],{},[63,12221,4333],{},[40,12223,12224,5379,12226,5383],{},[63,12225,5378],{},[63,12227,5382],{},[294,12229,2663],{"id":2663},[10,12231,5388],{},[10,12233,12234],{},[26,12235],{"alt":5393,"src":5394},[10,12237,12238,2221,12240,1123,12242,5404],{},[63,12239,5370],{},[63,12241,4333],{},[63,12243,5403],{},[14,12245,138],{"id":138},[37,12247,12248,12252],{},[40,12249,5411,12250,5415],{},[63,12251,5414],{},[40,12253,5418,12254,5421],{},[63,12255,5403],{},[14,12257,153],{"id":153},[122,12259,12260,12262],{},[40,12261,5428],{},[40,12263,5431],{},[10,12265,170],{},[14,12267,173],{"id":173},[10,12269,5438],{},[178,12271,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12273},[12274,12275,12276,12277,12278,12281,12282,12283],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":12279},[12280],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5268,"description":5273},[191,5460,5461],{"id":5464,"title":5465,"body":12288,"category":191,"cover":192,"description":5470,"extension":193,"meta":12437,"navigation":90,"path":5651,"pinned":196,"publishedAt":197,"seo":12438,"slug":5653,"stem":5654,"summary":5655,"tags":12439,"updatedAt":197,"visible":90,"__hash__":5659},{"type":7,"value":12289,"toc":12425},[12290,12292,12294,12296,12298,12302,12304,12306,12318,12320,12322,12366,12368,12373,12375,12377,12389,12391,12393,12397,12399,12401,12409,12411,12417,12419,12421,12423],[10,12291,5470],{},[14,12293,16],{"id":16},[10,12295,5475],{},[14,12297,22],{"id":22},[10,12299,12300],{},[26,12301],{"alt":5482,"src":5483},[10,12303,5486],{},[14,12305,35],{"id":35},[37,12307,12308,12310,12314],{},[40,12309,5493],{},[40,12311,12312,5499],{},[63,12313,5498],{},[40,12315,12316,5505],{},[63,12317,5504],{},[14,12319,51],{"id":51},[10,12321,54],{},[56,12323,12324],{"className":58,"code":5512,"language":60,"meta":61,"style":61},[63,12325,12326,12330,12334,12338,12342,12346,12350,12354,12358,12362],{"__ignoreMap":61},[66,12327,12328],{"class":68,"line":69},[66,12329,5519],{},[66,12331,12332],{"class":68,"line":75},[66,12333,5524],{},[66,12335,12336],{"class":68,"line":81},[66,12337,91],{"emptyLinePlaceholder":90},[66,12339,12340],{"class":68,"line":87},[66,12341,5533],{},[66,12343,12344],{"class":68,"line":94},[66,12345,5538],{},[66,12347,12348],{"class":68,"line":100},[66,12349,91],{"emptyLinePlaceholder":90},[66,12351,12352],{"class":68,"line":2453},[66,12353,5547],{},[66,12355,12356],{"class":68,"line":2459},[66,12357,5552],{},[66,12359,12360],{"class":68,"line":3884},[66,12361,91],{"emptyLinePlaceholder":90},[66,12363,12364],{"class":68,"line":4096},[66,12365,5561],{},[10,12367,106],{},[56,12369,12371],{"className":12370,"code":5567,"language":112,"meta":61},[110],[63,12372,5567],{"__ignoreMap":61},[10,12374,117],{},[14,12376,120],{"id":120},[122,12378,12379,12383],{},[40,12380,5578,12381,5582],{},[63,12382,5581],{},[40,12384,12385,5588,12387,328],{},[63,12386,5587],{},[63,12388,5591],{},[294,12390,2663],{"id":2663},[10,12392,5596],{},[10,12394,12395],{},[26,12396],{"alt":5601,"src":5602},[10,12398,5605],{},[14,12400,138],{"id":138},[37,12402,12403,12407],{},[40,12404,5612,12405,5615],{},[63,12406,5312],{},[40,12408,5618],{},[14,12410,153],{"id":153},[122,12412,12413,12415],{},[40,12414,5625],{},[40,12416,5628],{},[10,12418,170],{},[14,12420,173],{"id":173},[10,12422,5635],{},[178,12424,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12426},[12427,12428,12429,12430,12431,12434,12435,12436],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":12432},[12433],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5465,"description":5470},[191,5657,5658],{"id":5661,"title":5662,"body":12441,"category":191,"cover":192,"description":5667,"extension":193,"meta":12602,"navigation":90,"path":5865,"pinned":196,"publishedAt":197,"seo":12603,"slug":5867,"stem":5868,"summary":5869,"tags":12604,"updatedAt":197,"visible":90,"__hash__":5873},{"type":7,"value":12442,"toc":12590},[12443,12445,12447,12449,12451,12455,12457,12459,12471,12473,12475,12527,12529,12534,12536,12538,12556,12558,12560,12564,12566,12568,12574,12576,12582,12584,12586,12588],[10,12444,5667],{},[14,12446,16],{"id":16},[10,12448,5672],{},[14,12450,22],{"id":22},[10,12452,12453],{},[26,12454],{"alt":5679,"src":5680},[10,12456,5683],{},[14,12458,35],{"id":35},[37,12460,12461,12463,12465],{},[40,12462,5690],{},[40,12464,5693],{},[40,12466,12467,164,12469,5702],{},[63,12468,5698],{},[63,12470,5701],{},[14,12472,51],{"id":51},[10,12474,54],{},[56,12476,12477],{"className":58,"code":5709,"language":60,"meta":61,"style":61},[63,12478,12479,12483,12487,12491,12495,12499,12503,12507,12511,12515,12519,12523],{"__ignoreMap":61},[66,12480,12481],{"class":68,"line":69},[66,12482,5716],{},[66,12484,12485],{"class":68,"line":75},[66,12486,91],{"emptyLinePlaceholder":90},[66,12488,12489],{"class":68,"line":81},[66,12490,5725],{},[66,12492,12493],{"class":68,"line":87},[66,12494,5730],{},[66,12496,12497],{"class":68,"line":94},[66,12498,91],{"emptyLinePlaceholder":90},[66,12500,12501],{"class":68,"line":100},[66,12502,5739],{},[66,12504,12505],{"class":68,"line":2453},[66,12506,5744],{},[66,12508,12509],{"class":68,"line":2459},[66,12510,5749],{},[66,12512,12513],{"class":68,"line":3884},[66,12514,91],{"emptyLinePlaceholder":90},[66,12516,12517],{"class":68,"line":4096},[66,12518,5758],{},[66,12520,12521],{"class":68,"line":5761},[66,12522,91],{"emptyLinePlaceholder":90},[66,12524,12525],{"class":68,"line":5766},[66,12526,5769],{},[10,12528,106],{},[56,12530,12532],{"className":12531,"code":5775,"language":112,"meta":61},[110],[63,12533,5775],{"__ignoreMap":61},[10,12535,117],{},[14,12537,120],{"id":120},[122,12539,12540,12550],{},[40,12541,12542,5789,12544,5793,12546,5796,12548,5800],{},[63,12543,5788],{},[63,12545,5792],{},[63,12547,5581],{},[63,12549,5799],{},[40,12551,12552,5805,12554,5808],{},[63,12553,4516],{},[63,12555,2172],{},[294,12557,2663],{"id":2663},[10,12559,5813],{},[10,12561,12562],{},[26,12563],{"alt":5818,"src":5819},[10,12565,5822],{},[14,12567,138],{"id":138},[37,12569,12570,12572],{},[40,12571,5829],{},[40,12573,5832],{},[14,12575,153],{"id":153},[122,12577,12578,12580],{},[40,12579,5839],{},[40,12581,5842],{},[10,12583,170],{},[14,12585,173],{"id":173},[10,12587,5849],{},[178,12589,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12591},[12592,12593,12594,12595,12596,12599,12600,12601],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":12597},[12598],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5662,"description":5667},[191,5871,5872],{"id":5875,"title":5876,"body":12606,"category":191,"cover":192,"description":5881,"extension":193,"meta":12729,"navigation":90,"path":6032,"pinned":196,"publishedAt":197,"seo":12730,"slug":6034,"stem":6035,"summary":6036,"tags":12731,"updatedAt":197,"visible":90,"__hash__":6040},{"type":7,"value":12607,"toc":12719},[12608,12610,12612,12614,12616,12620,12622,12624,12638,12640,12642,12670,12672,12677,12679,12681,12691,12693,12701,12703,12711,12713,12715,12717],[10,12609,5881],{},[14,12611,16],{"id":16},[10,12613,5886],{},[14,12615,22],{"id":22},[10,12617,12618],{},[26,12619],{"alt":5893,"src":5894},[10,12621,5897],{},[14,12623,35],{"id":35},[37,12625,12626,12628,12630],{},[40,12627,5904],{},[40,12629,5907],{},[40,12631,5910,12632,2221,12634,2221,12636,5918],{},[63,12633,2224],{},[63,12635,2390],{},[63,12637,5917],{},[14,12639,51],{"id":51},[10,12641,54],{},[56,12643,12644],{"className":58,"code":5925,"language":60,"meta":61,"style":61},[63,12645,12646,12650,12654,12658,12662,12666],{"__ignoreMap":61},[66,12647,12648],{"class":68,"line":69},[66,12649,5932],{},[66,12651,12652],{"class":68,"line":75},[66,12653,5937],{},[66,12655,12656],{"class":68,"line":81},[66,12657,5942],{},[66,12659,12660],{"class":68,"line":87},[66,12661,91],{"emptyLinePlaceholder":90},[66,12663,12664],{"class":68,"line":94},[66,12665,5951],{},[66,12667,12668],{"class":68,"line":100},[66,12669,5956],{},[10,12671,106],{},[56,12673,12675],{"className":12674,"code":5962,"language":112,"meta":61},[110],[63,12676,5962],{"__ignoreMap":61},[10,12678,117],{},[14,12680,120],{"id":120},[122,12682,12683,12689],{},[40,12684,5973,12685,5977,12687,5980],{},[63,12686,5976],{},[63,12688,2210],{},[40,12690,5983],{},[14,12692,138],{"id":138},[37,12694,12695,12699],{},[40,12696,5990,12697,5994],{},[63,12698,5993],{},[40,12700,5997],{},[14,12702,153],{"id":153},[122,12704,12705,12707],{},[40,12706,6004],{},[40,12708,6007,12709,6011],{},[63,12710,6010],{},[10,12712,170],{},[14,12714,173],{"id":173},[10,12716,6018],{},[178,12718,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12720},[12721,12722,12723,12724,12725,12726,12727,12728],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":5876,"description":5881},[191,6038,6039],{"id":6042,"title":6043,"body":12733,"category":191,"cover":192,"description":6048,"extension":193,"meta":12910,"navigation":90,"path":6276,"pinned":196,"publishedAt":197,"seo":12911,"slug":6278,"stem":6279,"summary":6280,"tags":12912,"updatedAt":197,"visible":90,"__hash__":6284},{"type":7,"value":12734,"toc":12898},[12735,12737,12739,12743,12745,12749,12755,12757,12769,12771,12775,12799,12803,12819,12825,12827,12832,12834,12836,12852,12854,12856,12860,12864,12866,12878,12880,12890,12892,12894,12896],[10,12736,6048],{},[14,12738,16],{"id":16},[10,12740,6053,12741,6056],{},[260,12742,5976],{},[14,12744,22],{"id":22},[10,12746,12747],{},[26,12748],{"alt":6063,"src":6064},[10,12750,6067,12751,6071,12753,6075],{},[63,12752,6070],{},[63,12754,6074],{},[14,12756,35],{"id":35},[37,12758,12759,12763,12765],{},[40,12760,6082,12761,6085],{},[63,12762,1137],{},[40,12764,6088],{},[40,12766,6091,12767,6095],{},[63,12768,6094],{},[14,12770,51],{"id":51},[10,12772,6100,12773,6104],{},[63,12774,6103],{},[56,12776,12777],{"className":58,"code":6107,"language":60,"meta":61,"style":61},[63,12778,12779,12783,12787,12791,12795],{"__ignoreMap":61},[66,12780,12781],{"class":68,"line":69},[66,12782,6114],{},[66,12784,12785],{"class":68,"line":75},[66,12786,6119],{},[66,12788,12789],{"class":68,"line":81},[66,12790,91],{"emptyLinePlaceholder":90},[66,12792,12793],{"class":68,"line":87},[66,12794,6128],{},[66,12796,12797],{"class":68,"line":94},[66,12798,6133],{},[10,12800,6136,12801,6140],{},[63,12802,6139],{},[56,12804,12805],{"className":58,"code":6143,"language":60,"meta":61,"style":61},[63,12806,12807,12811,12815],{"__ignoreMap":61},[66,12808,12809],{"class":68,"line":69},[66,12810,6150],{},[66,12812,12813],{"class":68,"line":75},[66,12814,91],{"emptyLinePlaceholder":90},[66,12816,12817],{"class":68,"line":81},[66,12818,6159],{},[10,12820,6162,12821,1123,12823,328],{},[63,12822,6165],{},[63,12824,6168],{},[10,12826,106],{},[56,12828,12830],{"className":12829,"code":6174,"language":112,"meta":61},[110],[63,12831,6174],{"__ignoreMap":61},[10,12833,117],{},[14,12835,120],{"id":120},[122,12837,12838,12844],{},[40,12839,6185,12840,6188,12842,6192],{},[63,12841,6103],{},[63,12843,6191],{},[40,12845,12846,6197,12848,6200,12850,6203],{},[63,12847,6139],{},[63,12849,6103],{},[63,12851,6139],{},[294,12853,2663],{"id":2663},[10,12855,6208],{},[10,12857,12858],{},[26,12859],{"alt":6213,"src":6214},[10,12861,6217,12862,6220],{},[63,12863,6191],{},[14,12865,138],{"id":138},[37,12867,12868,12874],{},[40,12869,6227,12870,1123,12872,328],{},[63,12871,6103],{},[63,12873,6139],{},[40,12875,6234,12876,6238],{},[63,12877,6237],{},[14,12879,153],{"id":153},[122,12881,12882,12886],{},[40,12883,2318,12884,6248],{},[63,12885,6247],{},[40,12887,6251,12888,328],{},[63,12889,6070],{},[10,12891,170],{},[14,12893,173],{"id":173},[10,12895,6260],{},[178,12897,180],{},{"title":61,"searchDepth":75,"depth":75,"links":12899},[12900,12901,12902,12903,12904,12907,12908,12909],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":12905},[12906],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":6043,"description":6048},[191,6282,6283],{"id":6286,"title":6287,"body":12914,"category":191,"cover":192,"description":6292,"extension":193,"meta":13053,"navigation":90,"path":6458,"pinned":196,"publishedAt":197,"seo":13054,"slug":6460,"stem":6461,"summary":6462,"tags":13055,"updatedAt":197,"visible":90,"__hash__":6465},{"type":7,"value":12915,"toc":13043},[12916,12918,12920,12922,12924,12928,12930,12932,12942,12944,12946,12986,12988,12993,12995,12997,13015,13017,13025,13027,13035,13037,13039,13041],[10,12917,6292],{},[14,12919,16],{"id":16},[10,12921,6297],{},[14,12923,22],{"id":22},[10,12925,12926],{},[26,12927],{"alt":6304,"src":6305},[10,12929,6308],{},[14,12931,35],{"id":35},[37,12933,12934,12938,12940],{},[40,12935,12936,6318],{},[63,12937,6317],{},[40,12939,6321],{},[40,12941,6324],{},[14,12943,51],{"id":51},[10,12945,1540],{},[56,12947,12948],{"className":557,"code":6331,"language":559,"meta":61,"style":61},[63,12949,12950,12960,12966,12972,12982],{"__ignoreMap":61},[66,12951,12952,12954,12956,12958],{"class":68,"line":69},[66,12953,657],{"class":566},[66,12955,599],{"class":569},[66,12957,6342],{"class":602},[66,12959,6345],{"class":602},[66,12961,12962,12964],{"class":68,"line":75},[66,12963,6350],{"class":569},[66,12965,6353],{"class":602},[66,12967,12968,12970],{"class":68,"line":81},[66,12969,60],{"class":566},[66,12971,570],{"class":569},[66,12973,12974,12976,12978,12980],{"class":68,"line":87},[66,12975,60],{"class":566},[66,12977,599],{"class":569},[66,12979,603],{"class":602},[66,12981,570],{"class":569},[66,12983,12984],{"class":68,"line":94},[66,12985,6374],{"class":566},[10,12987,106],{},[56,12989,12991],{"className":12990,"code":6380,"language":112,"meta":61},[110],[63,12992,6380],{"__ignoreMap":61},[10,12994,117],{},[14,12996,120],{"id":120},[122,12998,12999,13005],{},[40,13000,13001,6394,13003,6397],{},[63,13002,6393],{},[63,13004,657],{},[40,13006,6400,13007,164,13009,6406,13011,3659,13013,6412],{},[63,13008,60],{},[63,13010,6405],{},[63,13012,6317],{},[63,13014,6411],{},[14,13016,138],{"id":138},[37,13018,13019,13021],{},[40,13020,6419],{},[40,13022,143,13023,6424],{},[63,13024,6317],{},[14,13026,153],{"id":153},[122,13028,13029,13033],{},[40,13030,6431,13031,328],{},[63,13032,6434],{},[40,13034,6437],{},[10,13036,170],{},[14,13038,173],{"id":173},[10,13040,6444],{},[178,13042,1624],{},{"title":61,"searchDepth":75,"depth":75,"links":13044},[13045,13046,13047,13048,13049,13050,13051,13052],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":6287,"description":6292},[191,6464,226],{"id":6467,"title":6468,"body":13057,"category":191,"cover":192,"description":6473,"extension":193,"meta":13210,"navigation":90,"path":6662,"pinned":196,"publishedAt":197,"seo":13211,"slug":6664,"stem":6665,"summary":6666,"tags":13212,"updatedAt":197,"visible":90,"__hash__":6670},{"type":7,"value":13058,"toc":13200},[13059,13061,13063,13065,13067,13071,13077,13079,13095,13097,13099,13143,13145,13150,13152,13154,13166,13168,13182,13184,13192,13194,13196,13198],[10,13060,6473],{},[14,13062,16],{"id":16},[10,13064,6478],{},[14,13066,22],{"id":22},[10,13068,13069],{},[26,13070],{"alt":6485,"src":6486},[10,13072,13073,6492,13075,6495],{},[63,13074,6491],{},[63,13076,2400],{},[14,13078,35],{"id":35},[37,13080,13081,13083,13091],{},[40,13082,6502],{},[40,13084,13085,2221,13087,2221,13089,6514],{},[63,13086,6507],{},[63,13088,6510],{},[63,13090,6513],{},[40,13092,6517,13093,6521],{},[63,13094,6520],{},[14,13096,51],{"id":51},[10,13098,54],{},[56,13100,13101],{"className":58,"code":6528,"language":60,"meta":61,"style":61},[63,13102,13103,13107,13111,13115,13119,13123,13127,13131,13135,13139],{"__ignoreMap":61},[66,13104,13105],{"class":68,"line":69},[66,13106,6535],{},[66,13108,13109],{"class":68,"line":75},[66,13110,91],{"emptyLinePlaceholder":90},[66,13112,13113],{"class":68,"line":81},[66,13114,6544],{},[66,13116,13117],{"class":68,"line":87},[66,13118,6549],{},[66,13120,13121],{"class":68,"line":94},[66,13122,6554],{},[66,13124,13125],{"class":68,"line":100},[66,13126,91],{"emptyLinePlaceholder":90},[66,13128,13129],{"class":68,"line":2453},[66,13130,6563],{},[66,13132,13133],{"class":68,"line":2459},[66,13134,6568],{},[66,13136,13137],{"class":68,"line":3884},[66,13138,6573],{},[66,13140,13141],{"class":68,"line":4096},[66,13142,6578],{},[10,13144,106],{},[56,13146,13148],{"className":13147,"code":6584,"language":112,"meta":61},[110],[63,13149,6584],{"__ignoreMap":61},[10,13151,117],{},[14,13153,120],{"id":120},[122,13155,13156,13160],{},[40,13157,13158,6598],{},[63,13159,6597],{},[40,13161,2303,13162,6603,13164,6606],{},[63,13163,2400],{},[63,13165,6491],{},[14,13167,138],{"id":138},[37,13169,13170,13176],{},[40,13171,143,13172,6615,13174,6618],{},[63,13173,6491],{},[63,13175,6507],{},[40,13177,6621,13178,975,13180,6627],{},[63,13179,2400],{},[63,13181,6626],{},[14,13183,153],{"id":153},[122,13185,13186,13190],{},[40,13187,6634,13188,6638],{},[63,13189,6637],{},[40,13191,6641],{},[10,13193,170],{},[14,13195,173],{"id":173},[10,13197,6648],{},[178,13199,180],{},{"title":61,"searchDepth":75,"depth":75,"links":13201},[13202,13203,13204,13205,13206,13207,13208,13209],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":6468,"description":6473},[191,6668,6669],{"id":6672,"title":6673,"body":13214,"category":191,"cover":192,"description":6678,"extension":193,"meta":13361,"navigation":90,"path":6857,"pinned":196,"publishedAt":197,"seo":13362,"slug":6859,"stem":6860,"summary":6861,"tags":13363,"updatedAt":197,"visible":90,"__hash__":6865},{"type":7,"value":13215,"toc":13351},[13216,13218,13220,13222,13224,13228,13230,13232,13250,13252,13254,13302,13304,13309,13311,13313,13321,13323,13333,13335,13343,13345,13347,13349],[10,13217,6678],{},[14,13219,16],{"id":16},[10,13221,6683],{},[14,13223,22],{"id":22},[10,13225,13226],{},[26,13227],{"alt":6690,"src":6691},[10,13229,6694],{},[14,13231,35],{"id":35},[37,13233,13234,13238,13244],{},[40,13235,13236,6704],{},[63,13237,6703],{},[40,13239,13240,6710,13242,328],{},[63,13241,6709],{},[63,13243,6713],{},[40,13245,6716,13246,6720,13248,6724],{},[63,13247,6719],{},[63,13249,6723],{},[14,13251,51],{"id":51},[10,13253,54],{},[56,13255,13256],{"className":58,"code":6731,"language":60,"meta":61,"style":61},[63,13257,13258,13262,13266,13270,13274,13278,13282,13286,13290,13294,13298],{"__ignoreMap":61},[66,13259,13260],{"class":68,"line":69},[66,13261,6535],{},[66,13263,13264],{"class":68,"line":75},[66,13265,91],{"emptyLinePlaceholder":90},[66,13267,13268],{"class":68,"line":81},[66,13269,6746],{},[66,13271,13272],{"class":68,"line":87},[66,13273,6751],{},[66,13275,13276],{"class":68,"line":94},[66,13277,6756],{},[66,13279,13280],{"class":68,"line":100},[66,13281,6761],{},[66,13283,13284],{"class":68,"line":2453},[66,13285,91],{"emptyLinePlaceholder":90},[66,13287,13288],{"class":68,"line":2459},[66,13289,6770],{},[66,13291,13292],{"class":68,"line":3884},[66,13293,6775],{},[66,13295,13296],{"class":68,"line":4096},[66,13297,6780],{},[66,13299,13300],{"class":68,"line":5761},[66,13301,6785],{},[10,13303,106],{},[56,13305,13307],{"className":13306,"code":6791,"language":112,"meta":61},[110],[63,13308,6791],{"__ignoreMap":61},[10,13310,117],{},[14,13312,120],{"id":120},[122,13314,13315,13319],{},[40,13316,6802,13317,6805],{},[63,13318,6719],{},[40,13320,6808],{},[14,13322,138],{"id":138},[37,13324,13325,13329],{},[40,13326,2303,13327,6817],{},[63,13328,6703],{},[40,13330,6820,13331,328],{},[63,13332,6823],{},[14,13334,153],{"id":153},[122,13336,13337,13339],{},[40,13338,6830],{},[40,13340,6833,13341,6836],{},[63,13342,302],{},[10,13344,170],{},[14,13346,173],{"id":173},[10,13348,6843],{},[178,13350,180],{},{"title":61,"searchDepth":75,"depth":75,"links":13352},[13353,13354,13355,13356,13357,13358,13359,13360],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":6673,"description":6678},[191,6863,6864],{"id":6867,"title":6868,"body":13365,"category":191,"cover":192,"description":6873,"extension":193,"meta":13508,"navigation":90,"path":7041,"pinned":196,"publishedAt":197,"seo":13509,"slug":7043,"stem":7044,"summary":7045,"tags":13510,"updatedAt":197,"visible":90,"__hash__":7049},{"type":7,"value":13366,"toc":13498},[13367,13369,13371,13373,13375,13379,13385,13387,13397,13399,13401,13453,13455,13460,13462,13464,13474,13476,13482,13484,13490,13492,13494,13496],[10,13368,6873],{},[14,13370,16],{"id":16},[10,13372,6878],{},[14,13374,22],{"id":22},[10,13376,13377],{},[26,13378],{"alt":6885,"src":6886},[10,13380,13381,6892,13383,6896],{},[63,13382,6891],{},[63,13384,6895],{},[14,13386,35],{"id":35},[37,13388,13389,13391,13395],{},[40,13390,6903],{},[40,13392,13393,6909],{},[63,13394,6908],{},[40,13396,6912],{},[14,13398,51],{"id":51},[10,13400,54],{},[56,13402,13403],{"className":58,"code":6919,"language":60,"meta":61,"style":61},[63,13404,13405,13409,13413,13417,13421,13425,13429,13433,13437,13441,13445,13449],{"__ignoreMap":61},[66,13406,13407],{"class":68,"line":69},[66,13408,6926],{},[66,13410,13411],{"class":68,"line":75},[66,13412,91],{"emptyLinePlaceholder":90},[66,13414,13415],{"class":68,"line":81},[66,13416,6935],{},[66,13418,13419],{"class":68,"line":87},[66,13420,91],{"emptyLinePlaceholder":90},[66,13422,13423],{"class":68,"line":94},[66,13424,6944],{},[66,13426,13427],{"class":68,"line":100},[66,13428,6949],{},[66,13430,13431],{"class":68,"line":2453},[66,13432,6761],{},[66,13434,13435],{"class":68,"line":2459},[66,13436,91],{"emptyLinePlaceholder":90},[66,13438,13439],{"class":68,"line":3884},[66,13440,6962],{},[66,13442,13443],{"class":68,"line":4096},[66,13444,6967],{},[66,13446,13447],{"class":68,"line":5761},[66,13448,6780],{},[66,13450,13451],{"class":68,"line":5766},[66,13452,6976],{},[10,13454,106],{},[56,13456,13458],{"className":13457,"code":6982,"language":112,"meta":61},[110],[63,13459,6982],{"__ignoreMap":61},[10,13461,117],{},[14,13463,120],{"id":120},[122,13465,13466,13470],{},[40,13467,13468,6995],{},[63,13469,6891],{},[40,13471,13472,7000],{},[63,13473,6895],{},[14,13475,138],{"id":138},[37,13477,13478,13480],{},[40,13479,7007],{},[40,13481,7010],{},[14,13483,153],{"id":153},[122,13485,13486,13488],{},[40,13487,7017],{},[40,13489,7020],{},[10,13491,170],{},[14,13493,173],{"id":173},[10,13495,7027],{},[178,13497,180],{},{"title":61,"searchDepth":75,"depth":75,"links":13499},[13500,13501,13502,13503,13504,13505,13506,13507],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":6868,"description":6873},[191,7047,7048],{"id":7051,"title":7052,"body":13512,"category":191,"cover":192,"description":7057,"extension":193,"meta":13663,"navigation":90,"path":7242,"pinned":196,"publishedAt":197,"seo":13664,"slug":7244,"stem":7245,"summary":7246,"tags":13665,"updatedAt":197,"visible":90,"__hash__":7250},{"type":7,"value":13513,"toc":13653},[13514,13516,13518,13520,13522,13526,13530,13532,13546,13548,13550,13602,13604,13609,13611,13613,13625,13627,13637,13639,13645,13647,13649,13651],[10,13515,7057],{},[14,13517,16],{"id":16},[10,13519,7062],{},[14,13521,22],{"id":22},[10,13523,13524],{},[26,13525],{"alt":7069,"src":7070},[10,13527,13528,7076],{},[63,13529,7075],{},[14,13531,35],{"id":35},[37,13533,13534,13540,13544],{},[40,13535,2303,13536,7086,13538,7090],{},[63,13537,7085],{},[63,13539,7089],{},[40,13541,7093,13542,7097],{},[63,13543,7096],{},[40,13545,7100],{},[14,13547,51],{"id":51},[10,13549,54],{},[56,13551,13552],{"className":58,"code":7107,"language":60,"meta":61,"style":61},[63,13553,13554,13558,13562,13566,13570,13574,13578,13582,13586,13590,13594,13598],{"__ignoreMap":61},[66,13555,13556],{"class":68,"line":69},[66,13557,7114],{},[66,13559,13560],{"class":68,"line":75},[66,13561,91],{"emptyLinePlaceholder":90},[66,13563,13564],{"class":68,"line":81},[66,13565,7123],{},[66,13567,13568],{"class":68,"line":87},[66,13569,7128],{},[66,13571,13572],{"class":68,"line":94},[66,13573,7133],{},[66,13575,13576],{"class":68,"line":100},[66,13577,7138],{},[66,13579,13580],{"class":68,"line":2453},[66,13581,7143],{},[66,13583,13584],{"class":68,"line":2459},[66,13585,91],{"emptyLinePlaceholder":90},[66,13587,13588],{"class":68,"line":3884},[66,13589,7152],{},[66,13591,13592],{"class":68,"line":4096},[66,13593,7157],{},[66,13595,13596],{"class":68,"line":5761},[66,13597,7162],{},[66,13599,13600],{"class":68,"line":5766},[66,13601,7167],{},[10,13603,106],{},[56,13605,13607],{"className":13606,"code":7173,"language":112,"meta":61},[110],[63,13608,7173],{"__ignoreMap":61},[10,13610,117],{},[14,13612,120],{"id":120},[122,13614,13615,13621],{},[40,13616,13617,7187,13619,7190],{},[63,13618,7186],{},[63,13620,7096],{},[40,13622,13623,7195],{},[63,13624,7075],{},[14,13626,138],{"id":138},[37,13628,13629,13631],{},[40,13630,7202],{},[40,13632,7205,13633,7208,13635,7211],{},[63,13634,7085],{},[63,13636,7089],{},[14,13638,153],{"id":153},[122,13640,13641,13643],{},[40,13642,7218],{},[40,13644,7221],{},[10,13646,170],{},[14,13648,173],{"id":173},[10,13650,7228],{},[178,13652,180],{},{"title":61,"searchDepth":75,"depth":75,"links":13654},[13655,13656,13657,13658,13659,13660,13661,13662],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":7052,"description":7057},[191,7248,7249],{"id":7252,"title":7253,"body":13667,"category":191,"cover":192,"description":7258,"extension":193,"meta":13881,"navigation":90,"path":7532,"pinned":196,"publishedAt":197,"seo":13882,"slug":7534,"stem":7535,"summary":7536,"tags":13883,"updatedAt":197,"visible":90,"__hash__":7540},{"type":7,"value":13668,"toc":13868},[13669,13671,13673,13675,13677,13681,13687,13689,13701,13703,13705,13765,13767,13772,13774,13776,13794,13796,13804,13808,13816,13818,13822,13826,13832,13834,13844,13846,13860,13862,13864,13866],[10,13670,7258],{},[14,13672,16],{"id":16},[10,13674,7263],{},[14,13676,22],{"id":22},[10,13678,13679],{},[26,13680],{"alt":7270,"src":7271},[10,13682,7274,13683,7278,13685,7282],{},[63,13684,7277],{},[63,13686,7281],{},[14,13688,35],{"id":35},[37,13690,13691,13695,13699],{},[40,13692,7289,13693,7292],{},[63,13694,7277],{},[40,13696,13697,7298],{},[63,13698,7297],{},[40,13700,7301],{},[14,13702,51],{"id":51},[10,13704,54],{},[56,13706,13707],{"className":58,"code":7308,"language":60,"meta":61,"style":61},[63,13708,13709,13713,13717,13721,13725,13729,13733,13737,13741,13745,13749,13753,13757,13761],{"__ignoreMap":61},[66,13710,13711],{"class":68,"line":69},[66,13712,7315],{},[66,13714,13715],{"class":68,"line":75},[66,13716,7320],{},[66,13718,13719],{"class":68,"line":81},[66,13720,7325],{},[66,13722,13723],{"class":68,"line":87},[66,13724,7330],{},[66,13726,13727],{"class":68,"line":94},[66,13728,7335],{},[66,13730,13731],{"class":68,"line":100},[66,13732,91],{"emptyLinePlaceholder":90},[66,13734,13735],{"class":68,"line":2453},[66,13736,7344],{},[66,13738,13739],{"class":68,"line":2459},[66,13740,7349],{},[66,13742,13743],{"class":68,"line":3884},[66,13744,7354],{},[66,13746,13747],{"class":68,"line":4096},[66,13748,7359],{},[66,13750,13751],{"class":68,"line":5761},[66,13752,1112],{},[66,13754,13755],{"class":68,"line":5766},[66,13756,7368],{},[66,13758,13759],{"class":68,"line":7371},[66,13760,7374],{},[66,13762,13763],{"class":68,"line":7377},[66,13764,7380],{},[10,13766,106],{},[56,13768,13770],{"className":13769,"code":7386,"language":112,"meta":61},[110],[63,13771,7386],{"__ignoreMap":61},[10,13773,117],{},[14,13775,120],{"id":120},[122,13777,13778,13786],{},[40,13779,13780,7399,13782,7402,13784,7406],{},[63,13781,3002],{},[63,13783,7297],{},[63,13785,7405],{},[40,13787,7409,13788,7412,13790,7415,13792,328],{},[63,13789,7277],{},[63,13791,1126],{},[63,13793,7281],{},[294,13795,2663],{"id":2663},[10,13797,13798,2221,13800,1123,13802,7428],{},[63,13799,7277],{},[63,13801,1126],{},[63,13803,7281],{},[10,13805,13806],{},[26,13807],{"alt":7433,"src":7434},[10,13809,13810,7439,13812,7442,13814,7445],{},[63,13811,7277],{},[63,13813,1126],{},[63,13815,7281],{},[294,13817,2663],{"id":4151},[10,13819,13820,7453],{},[63,13821,7452],{},[10,13823,13824],{},[26,13825],{"alt":7458,"src":7459},[10,13827,7462,13828,7465,13830,7468],{},[63,13829,7452],{},[63,13831,1126],{},[14,13833,138],{"id":138},[37,13835,13836,13840],{},[40,13837,7475,13838,7479],{},[63,13839,7478],{},[40,13841,7482,13842,7485],{},[63,13843,7452],{},[14,13845,153],{"id":153},[122,13847,13848,13856],{},[40,13849,7492,13850,7496,13852,1123,13854,328],{},[63,13851,7495],{},[63,13853,7499],{},[63,13855,7502],{},[40,13857,7505,13858,7508],{},[63,13859,6713],{},[10,13861,170],{},[14,13863,173],{"id":173},[10,13865,7515],{},[178,13867,180],{},{"title":61,"searchDepth":75,"depth":75,"links":13869},[13870,13871,13872,13873,13874,13878,13879,13880],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":13875},[13876,13877],{"id":2663,"depth":81,"text":2663},{"id":4151,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":7253,"description":7258},[191,7538,7539],{"id":7542,"title":7543,"body":13885,"category":191,"cover":192,"description":7548,"extension":193,"meta":14036,"navigation":90,"path":7725,"pinned":196,"publishedAt":197,"seo":14037,"slug":7727,"stem":7728,"summary":7729,"tags":14038,"updatedAt":197,"visible":90,"__hash__":7732},{"type":7,"value":13886,"toc":14026},[13887,13889,13891,13893,13895,13899,13903,13905,13917,13919,13921,13969,13971,13976,13978,13980,13990,13992,14002,14004,14018,14020,14022,14024],[10,13888,7548],{},[14,13890,16],{"id":16},[10,13892,7553],{},[14,13894,22],{"id":22},[10,13896,13897],{},[26,13898],{"alt":7560,"src":7561},[10,13900,7564,13901,7567],{},[63,13902,6723],{},[14,13904,35],{"id":35},[37,13906,13907,13911,13915],{},[40,13908,13909,7576],{},[63,13910,6723],{},[40,13912,13913,7582],{},[63,13914,7581],{},[40,13916,7585],{},[14,13918,51],{"id":51},[10,13920,54],{},[56,13922,13923],{"className":58,"code":7592,"language":60,"meta":61,"style":61},[63,13924,13925,13929,13933,13937,13941,13945,13949,13953,13957,13961,13965],{"__ignoreMap":61},[66,13926,13927],{"class":68,"line":69},[66,13928,6535],{},[66,13930,13931],{"class":68,"line":75},[66,13932,91],{"emptyLinePlaceholder":90},[66,13934,13935],{"class":68,"line":81},[66,13936,6746],{},[66,13938,13939],{"class":68,"line":87},[66,13940,91],{"emptyLinePlaceholder":90},[66,13942,13943],{"class":68,"line":94},[66,13944,7615],{},[66,13946,13947],{"class":68,"line":100},[66,13948,7620],{},[66,13950,13951],{"class":68,"line":2453},[66,13952,91],{"emptyLinePlaceholder":90},[66,13954,13955],{"class":68,"line":2459},[66,13956,7629],{},[66,13958,13959],{"class":68,"line":3884},[66,13960,7634],{},[66,13962,13963],{"class":68,"line":4096},[66,13964,91],{"emptyLinePlaceholder":90},[66,13966,13967],{"class":68,"line":5761},[66,13968,7643],{},[10,13970,106],{},[56,13972,13974],{"className":13973,"code":7649,"language":112,"meta":61},[110],[63,13975,7649],{"__ignoreMap":61},[10,13977,117],{},[14,13979,120],{"id":120},[122,13981,13982,13988],{},[40,13983,7564,13984,7662,13986,328],{},[63,13985,6723],{},[63,13987,7665],{},[40,13989,7668],{},[14,13991,138],{"id":138},[37,13993,13994,13998],{},[40,13995,4719,13996,7677],{},[63,13997,6723],{},[40,13999,7680,14000,7683],{},[63,14001,6723],{},[14,14003,153],{"id":153},[122,14005,14006,14012],{},[40,14007,7690,14008,7694,14010,328],{},[63,14009,7693],{},[63,14011,6723],{},[40,14013,4719,14014,7701,14016,328],{},[63,14015,6723],{},[63,14017,7704],{},[10,14019,170],{},[14,14021,173],{"id":173},[10,14023,7711],{},[178,14025,180],{},{"title":61,"searchDepth":75,"depth":75,"links":14027},[14028,14029,14030,14031,14032,14033,14034,14035],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":7543,"description":7548},[191,6723,7731],{"id":7734,"title":7735,"body":14040,"category":191,"cover":192,"description":7740,"extension":193,"meta":14211,"navigation":90,"path":7953,"pinned":196,"publishedAt":197,"seo":14212,"slug":7955,"stem":7956,"summary":7957,"tags":14213,"updatedAt":197,"visible":90,"__hash__":7961},{"type":7,"value":14041,"toc":14199},[14042,14044,14046,14048,14050,14054,14056,14058,14070,14072,14074,14130,14132,14137,14139,14141,14157,14159,14161,14165,14171,14173,14181,14183,14191,14193,14195,14197],[10,14043,7740],{},[14,14045,16],{"id":16},[10,14047,7745],{},[14,14049,22],{"id":22},[10,14051,14052],{},[26,14053],{"alt":7752,"src":7753},[10,14055,7756],{},[14,14057,35],{"id":35},[37,14059,14060,14064,14068],{},[40,14061,14062,7766],{},[63,14063,7765],{},[40,14065,14066,7772],{},[63,14067,7771],{},[40,14069,7775],{},[14,14071,51],{"id":51},[10,14073,54],{},[56,14075,14076],{"className":58,"code":7782,"language":60,"meta":61,"style":61},[63,14077,14078,14082,14086,14090,14094,14098,14102,14106,14110,14114,14118,14122,14126],{"__ignoreMap":61},[66,14079,14080],{"class":68,"line":69},[66,14081,7789],{},[66,14083,14084],{"class":68,"line":75},[66,14085,7794],{},[66,14087,14088],{"class":68,"line":81},[66,14089,7799],{},[66,14091,14092],{"class":68,"line":87},[66,14093,7804],{},[66,14095,14096],{"class":68,"line":94},[66,14097,91],{"emptyLinePlaceholder":90},[66,14099,14100],{"class":68,"line":100},[66,14101,7813],{},[66,14103,14104],{"class":68,"line":2453},[66,14105,7818],{},[66,14107,14108],{"class":68,"line":2459},[66,14109,7823],{},[66,14111,14112],{"class":68,"line":3884},[66,14113,7828],{},[66,14115,14116],{"class":68,"line":4096},[66,14117,91],{"emptyLinePlaceholder":90},[66,14119,14120],{"class":68,"line":5761},[66,14121,7837],{},[66,14123,14124],{"class":68,"line":5766},[66,14125,7842],{},[66,14127,14128],{"class":68,"line":7371},[66,14129,7847],{},[10,14131,106],{},[56,14133,14135],{"className":14134,"code":7853,"language":112,"meta":61},[110],[63,14136,7853],{"__ignoreMap":61},[10,14138,117],{},[14,14140,120],{"id":120},[122,14142,14143,14149],{},[40,14144,7864,14145,7868,14147,7871],{},[63,14146,7867],{},[63,14148,7771],{},[40,14150,14151,7877,14153,7881,14155,7884],{},[63,14152,7876],{},[63,14154,7880],{},[63,14156,7765],{},[294,14158,2663],{"id":2663},[10,14160,7889],{},[10,14162,14163],{},[26,14164],{"alt":7894,"src":7895},[10,14166,7898,14167,1123,14169,7904],{},[63,14168,4516],{},[63,14170,7903],{},[14,14172,138],{"id":138},[37,14174,14175,14179],{},[40,14176,7911,14177,7914],{},[63,14178,7765],{},[40,14180,7917],{},[14,14182,153],{"id":153},[122,14184,14185,14189],{},[40,14186,5229,14187,7927],{},[63,14188,7926],{},[40,14190,7930],{},[10,14192,170],{},[14,14194,173],{"id":173},[10,14196,7937],{},[178,14198,180],{},{"title":61,"searchDepth":75,"depth":75,"links":14200},[14201,14202,14203,14204,14205,14208,14209,14210],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":14206},[14207],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":7735,"description":7740},[191,7959,7960],{"id":7963,"title":7964,"body":14215,"category":191,"cover":192,"description":7969,"extension":193,"meta":14362,"navigation":90,"path":8148,"pinned":196,"publishedAt":197,"seo":14363,"slug":8150,"stem":8151,"summary":8152,"tags":14364,"updatedAt":197,"visible":90,"__hash__":8156},{"type":7,"value":14216,"toc":14352},[14217,14219,14221,14223,14225,14229,14231,14233,14241,14243,14245,14301,14303,14308,14310,14312,14324,14326,14332,14334,14344,14346,14348,14350],[10,14218,7969],{},[14,14220,16],{"id":16},[10,14222,7974],{},[14,14224,22],{"id":22},[10,14226,14227],{},[26,14228],{"alt":7981,"src":7982},[10,14230,7985],{},[14,14232,35],{"id":35},[37,14234,14235,14237,14239],{},[40,14236,7992],{},[40,14238,7995],{},[40,14240,7998],{},[14,14242,51],{"id":51},[10,14244,54],{},[56,14246,14247],{"className":58,"code":8005,"language":60,"meta":61,"style":61},[63,14248,14249,14253,14257,14261,14265,14269,14273,14277,14281,14285,14289,14293,14297],{"__ignoreMap":61},[66,14250,14251],{"class":68,"line":69},[66,14252,8012],{},[66,14254,14255],{"class":68,"line":75},[66,14256,8017],{},[66,14258,14259],{"class":68,"line":81},[66,14260,8022],{},[66,14262,14263],{"class":68,"line":87},[66,14264,91],{"emptyLinePlaceholder":90},[66,14266,14267],{"class":68,"line":94},[66,14268,8031],{},[66,14270,14271],{"class":68,"line":100},[66,14272,8036],{},[66,14274,14275],{"class":68,"line":2453},[66,14276,8041],{},[66,14278,14279],{"class":68,"line":2459},[66,14280,91],{"emptyLinePlaceholder":90},[66,14282,14283],{"class":68,"line":3884},[66,14284,8050],{},[66,14286,14287],{"class":68,"line":4096},[66,14288,8055],{},[66,14290,14291],{"class":68,"line":5761},[66,14292,91],{"emptyLinePlaceholder":90},[66,14294,14295],{"class":68,"line":5766},[66,14296,8064],{},[66,14298,14299],{"class":68,"line":7371},[66,14300,8069],{},[10,14302,106],{},[56,14304,14306],{"className":14305,"code":8075,"language":112,"meta":61},[110],[63,14307,8075],{"__ignoreMap":61},[10,14309,117],{},[14,14311,120],{"id":120},[122,14313,14314,14320],{},[40,14315,14316,8089,14318,8093],{},[63,14317,8088],{},[63,14319,8092],{},[40,14321,8096,14322,8100],{},[63,14323,8099],{},[14,14325,138],{"id":138},[37,14327,14328,14330],{},[40,14329,8107],{},[40,14331,8110],{},[14,14333,153],{"id":153},[122,14335,14336,14342],{},[40,14337,8117,14338,8121,14340,328],{},[63,14339,8120],{},[63,14341,8124],{},[40,14343,8127],{},[10,14345,170],{},[14,14347,173],{"id":173},[10,14349,8134],{},[178,14351,180],{},{"title":61,"searchDepth":75,"depth":75,"links":14353},[14354,14355,14356,14357,14358,14359,14360,14361],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":7964,"description":7969},[191,8154,8155],{"id":8158,"title":8159,"body":14366,"category":191,"cover":192,"description":8164,"extension":193,"meta":14529,"navigation":90,"path":8368,"pinned":196,"publishedAt":197,"seo":14530,"slug":8370,"stem":8371,"summary":8372,"tags":14531,"updatedAt":197,"visible":90,"__hash__":8376},{"type":7,"value":14367,"toc":14517},[14368,14370,14372,14374,14376,14380,14384,14386,14402,14404,14406,14450,14452,14457,14459,14461,14475,14477,14481,14485,14489,14491,14497,14499,14509,14511,14513,14515],[10,14369,8164],{},[14,14371,16],{"id":16},[10,14373,8169],{},[14,14375,22],{"id":22},[10,14377,14378],{},[26,14379],{"alt":8176,"src":8177},[10,14381,8180,14382,8184],{},[63,14383,8183],{},[14,14385,35],{"id":35},[37,14387,14388,14394,14400],{},[40,14389,14390,8194,14392,8198],{},[63,14391,8193],{},[63,14393,8197],{},[40,14395,8201,14396,8205,14398,8208],{},[63,14397,8204],{},[63,14399,4270],{},[40,14401,8211],{},[14,14403,51],{"id":51},[10,14405,54],{},[56,14407,14408],{"className":58,"code":8218,"language":60,"meta":61,"style":61},[63,14409,14410,14414,14418,14422,14426,14430,14434,14438,14442,14446],{"__ignoreMap":61},[66,14411,14412],{"class":68,"line":69},[66,14413,8225],{},[66,14415,14416],{"class":68,"line":75},[66,14417,8230],{},[66,14419,14420],{"class":68,"line":81},[66,14421,8235],{},[66,14423,14424],{"class":68,"line":87},[66,14425,8240],{},[66,14427,14428],{"class":68,"line":94},[66,14429,8245],{},[66,14431,14432],{"class":68,"line":100},[66,14433,91],{"emptyLinePlaceholder":90},[66,14435,14436],{"class":68,"line":2453},[66,14437,8254],{},[66,14439,14440],{"class":68,"line":2459},[66,14441,8259],{},[66,14443,14444],{"class":68,"line":3884},[66,14445,8259],{},[66,14447,14448],{"class":68,"line":4096},[66,14449,8259],{},[10,14451,106],{},[56,14453,14455],{"className":14454,"code":8273,"language":112,"meta":61},[110],[63,14456,8273],{"__ignoreMap":61},[10,14458,117],{},[14,14460,120],{"id":120},[122,14462,14463,14467],{},[40,14464,7864,14465,8287],{},[63,14466,8286],{},[40,14468,8290,14469,8293,14471,8296,14473,8300],{},[63,14470,8197],{},[63,14472,8183],{},[63,14474,8299],{},[294,14476,2663],{"id":2663},[10,14478,8305,14479,8308],{},[63,14480,8197],{},[10,14482,14483],{},[26,14484],{"alt":8313,"src":8314},[10,14486,8317,14487,8320],{},[63,14488,8183],{},[14,14490,138],{"id":138},[37,14492,14493,14495],{},[40,14494,8327],{},[40,14496,8330],{},[14,14498,153],{"id":153},[122,14500,14501,14503],{},[40,14502,8337],{},[40,14504,3942,14505,8342,14507,8345],{},[63,14506,4270],{},[63,14508,8197],{},[10,14510,170],{},[14,14512,173],{"id":173},[10,14514,8352],{},[178,14516,180],{},{"title":61,"searchDepth":75,"depth":75,"links":14518},[14519,14520,14521,14522,14523,14526,14527,14528],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":14524},[14525],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":8159,"description":8164},[191,8374,8375],{"id":8378,"title":8379,"body":14533,"category":191,"cover":192,"description":8384,"extension":193,"meta":14716,"navigation":90,"path":8609,"pinned":196,"publishedAt":197,"seo":14717,"slug":8611,"stem":8612,"summary":8613,"tags":14718,"updatedAt":197,"visible":90,"__hash__":8616},{"type":7,"value":14534,"toc":14704},[14535,14537,14539,14541,14543,14547,14549,14551,14565,14567,14569,14637,14639,14644,14646,14648,14662,14664,14666,14670,14676,14678,14686,14688,14696,14698,14700,14702],[10,14536,8384],{},[14,14538,16],{"id":16},[10,14540,8389],{},[14,14542,22],{"id":22},[10,14544,14545],{},[26,14546],{"alt":8396,"src":8397},[10,14548,8400],{},[14,14550,35],{"id":35},[37,14552,14553,14559,14561],{},[40,14554,14555,8410,14557,328],{},[63,14556,8409],{},[63,14558,8413],{},[40,14560,8416],{},[40,14562,14563,8422],{},[63,14564,8421],{},[14,14566,51],{"id":51},[10,14568,54],{},[56,14570,14571],{"className":58,"code":8429,"language":60,"meta":61,"style":61},[63,14572,14573,14577,14581,14585,14589,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633],{"__ignoreMap":61},[66,14574,14575],{"class":68,"line":69},[66,14576,8436],{},[66,14578,14579],{"class":68,"line":75},[66,14580,91],{"emptyLinePlaceholder":90},[66,14582,14583],{"class":68,"line":81},[66,14584,8445],{},[66,14586,14587],{"class":68,"line":87},[66,14588,8450],{},[66,14590,14591],{"class":68,"line":94},[66,14592,8455],{},[66,14594,14595],{"class":68,"line":100},[66,14596,8460],{},[66,14598,14599],{"class":68,"line":2453},[66,14600,8465],{},[66,14602,14603],{"class":68,"line":2459},[66,14604,8470],{},[66,14606,14607],{"class":68,"line":3884},[66,14608,8475],{},[66,14610,14611],{"class":68,"line":4096},[66,14612,8480],{},[66,14614,14615],{"class":68,"line":5761},[66,14616,91],{"emptyLinePlaceholder":90},[66,14618,14619],{"class":68,"line":5766},[66,14620,8489],{},[66,14622,14623],{"class":68,"line":7371},[66,14624,6114],{},[66,14626,14627],{"class":68,"line":7377},[66,14628,6119],{},[66,14630,14631],{"class":68,"line":8500},[66,14632,91],{"emptyLinePlaceholder":90},[66,14634,14635],{"class":68,"line":8505},[66,14636,8508],{},[10,14638,106],{},[56,14640,14642],{"className":14641,"code":8514,"language":112,"meta":61},[110],[63,14643,8514],{"__ignoreMap":61},[10,14645,117],{},[14,14647,120],{"id":120},[122,14649,14650,14660],{},[40,14651,8525,14652,8529,14654,8533,14656,8537,14658,328],{},[63,14653,8528],{},[63,14655,8532],{},[63,14657,8536],{},[63,14659,8528],{},[40,14661,8542],{},[294,14663,2663],{"id":2663},[10,14665,8547],{},[10,14667,14668],{},[26,14669],{"alt":8552,"src":8553},[10,14671,14672,8558,14674,328],{},[63,14673,8409],{},[63,14675,8413],{},[14,14677,138],{"id":138},[37,14679,14680,14684],{},[40,14681,8567,14682,328],{},[63,14683,5312],{},[40,14685,8572],{},[14,14687,153],{"id":153},[122,14689,14690,14692],{},[40,14691,8579],{},[40,14693,8582,14694,8586],{},[63,14695,8585],{},[10,14697,170],{},[14,14699,173],{"id":173},[10,14701,8593],{},[178,14703,180],{},{"title":61,"searchDepth":75,"depth":75,"links":14705},[14706,14707,14708,14709,14710,14713,14714,14715],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":14711},[14712],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":8379,"description":8384},[191,8615,5263],{"id":8618,"title":8619,"body":14720,"category":191,"cover":192,"description":8624,"extension":193,"meta":14879,"navigation":90,"path":8812,"pinned":196,"publishedAt":197,"seo":14880,"slug":8814,"stem":8815,"summary":8816,"tags":14881,"updatedAt":197,"visible":90,"__hash__":8820},{"type":7,"value":14721,"toc":14867},[14722,14724,14726,14728,14730,14734,14736,14738,14746,14748,14750,14814,14816,14821,14823,14825,14833,14835,14837,14841,14843,14845,14851,14853,14859,14861,14863,14865],[10,14723,8624],{},[14,14725,16],{"id":16},[10,14727,8629],{},[14,14729,22],{"id":22},[10,14731,14732],{},[26,14733],{"alt":8636,"src":8637},[10,14735,8640],{},[14,14737,35],{"id":35},[37,14739,14740,14742,14744],{},[40,14741,8647],{},[40,14743,8650],{},[40,14745,8653],{},[14,14747,51],{"id":51},[10,14749,54],{},[56,14751,14752],{"className":58,"code":8660,"language":60,"meta":61,"style":61},[63,14753,14754,14758,14762,14766,14770,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810],{"__ignoreMap":61},[66,14755,14756],{"class":68,"line":69},[66,14757,8667],{},[66,14759,14760],{"class":68,"line":75},[66,14761,8672],{},[66,14763,14764],{"class":68,"line":81},[66,14765,91],{"emptyLinePlaceholder":90},[66,14767,14768],{"class":68,"line":87},[66,14769,8681],{},[66,14771,14772],{"class":68,"line":94},[66,14773,91],{"emptyLinePlaceholder":90},[66,14775,14776],{"class":68,"line":100},[66,14777,8690],{},[66,14779,14780],{"class":68,"line":2453},[66,14781,8695],{},[66,14783,14784],{"class":68,"line":2459},[66,14785,8700],{},[66,14787,14788],{"class":68,"line":3884},[66,14789,91],{"emptyLinePlaceholder":90},[66,14791,14792],{"class":68,"line":4096},[66,14793,8709],{},[66,14795,14796],{"class":68,"line":5761},[66,14797,8714],{},[66,14799,14800],{"class":68,"line":5766},[66,14801,8719],{},[66,14803,14804],{"class":68,"line":7371},[66,14805,91],{"emptyLinePlaceholder":90},[66,14807,14808],{"class":68,"line":7377},[66,14809,6128],{},[66,14811,14812],{"class":68,"line":8500},[66,14813,8732],{},[10,14815,106],{},[56,14817,14819],{"className":14818,"code":8738,"language":112,"meta":61},[110],[63,14820,8738],{"__ignoreMap":61},[10,14822,117],{},[14,14824,120],{"id":120},[122,14826,14827,14831],{},[40,14828,14829,8752],{},[63,14830,8751],{},[40,14832,8755],{},[294,14834,2663],{"id":2663},[10,14836,8760],{},[10,14838,14839],{},[26,14840],{"alt":8765,"src":8766},[10,14842,8769],{},[14,14844,138],{"id":138},[37,14846,14847,14849],{},[40,14848,8776],{},[40,14850,8779],{},[14,14852,153],{"id":153},[122,14854,14855,14857],{},[40,14856,8786],{},[40,14858,8789],{},[10,14860,170],{},[14,14862,173],{"id":173},[10,14864,8796],{},[178,14866,180],{},{"title":61,"searchDepth":75,"depth":75,"links":14868},[14869,14870,14871,14872,14873,14876,14877,14878],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":14874},[14875],{"id":2663,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":8619,"description":8624},[191,8818,8819],{"id":8822,"title":8823,"body":14883,"category":191,"cover":192,"description":8828,"extension":193,"meta":15121,"navigation":90,"path":9129,"pinned":196,"publishedAt":197,"seo":15122,"slug":9131,"stem":9132,"summary":9133,"tags":15123,"updatedAt":197,"visible":90,"__hash__":9137},{"type":7,"value":14884,"toc":15108},[14885,14887,14889,14891,14893,14897,14899,14901,14911,14913,14915,15031,15033,15038,15040,15042,15052,15054,15056,15060,15062,15064,15066,15070,15074,15076,15084,15086,15100,15102,15104,15106],[10,14886,8828],{},[14,14888,16],{"id":16},[10,14890,8833],{},[14,14892,22],{"id":22},[10,14894,14895],{},[26,14896],{"alt":8840,"src":8841},[10,14898,8844],{},[14,14900,35],{"id":35},[37,14902,14903,14905,14907],{},[40,14904,8851],{},[40,14906,8854],{},[40,14908,8857,14909,8861],{},[63,14910,8860],{},[14,14912,51],{"id":51},[10,14914,54],{},[56,14916,14917],{"className":58,"code":8868,"language":60,"meta":61,"style":61},[63,14918,14919,14923,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027],{"__ignoreMap":61},[66,14920,14921],{"class":68,"line":69},[66,14922,6926],{},[66,14924,14925],{"class":68,"line":75},[66,14926,6535],{},[66,14928,14929],{"class":68,"line":81},[66,14930,91],{"emptyLinePlaceholder":90},[66,14932,14933],{"class":68,"line":87},[66,14934,8887],{},[66,14936,14937],{"class":68,"line":94},[66,14938,8892],{},[66,14940,14941],{"class":68,"line":100},[66,14942,8897],{},[66,14944,14945],{"class":68,"line":2453},[66,14946,8902],{},[66,14948,14949],{"class":68,"line":2459},[66,14950,91],{"emptyLinePlaceholder":90},[66,14952,14953],{"class":68,"line":3884},[66,14954,8911],{},[66,14956,14957],{"class":68,"line":4096},[66,14958,8916],{},[66,14960,14961],{"class":68,"line":5761},[66,14962,8921],{},[66,14964,14965],{"class":68,"line":5766},[66,14966,8926],{},[66,14968,14969],{"class":68,"line":7371},[66,14970,8931],{},[66,14972,14973],{"class":68,"line":7377},[66,14974,91],{"emptyLinePlaceholder":90},[66,14976,14977],{"class":68,"line":8500},[66,14978,8940],{},[66,14980,14981],{"class":68,"line":8505},[66,14982,8945],{},[66,14984,14985],{"class":68,"line":8948},[66,14986,8951],{},[66,14988,14989],{"class":68,"line":8954},[66,14990,91],{"emptyLinePlaceholder":90},[66,14992,14993],{"class":68,"line":8959},[66,14994,8962],{},[66,14996,14997],{"class":68,"line":8965},[66,14998,91],{"emptyLinePlaceholder":90},[66,15000,15001],{"class":68,"line":8970},[66,15002,7344],{},[66,15004,15005],{"class":68,"line":8975},[66,15006,8978],{},[66,15008,15009],{"class":68,"line":8981},[66,15010,8984],{},[66,15012,15013],{"class":68,"line":8987},[66,15014,8990],{},[66,15016,15017],{"class":68,"line":8993},[66,15018,7354],{},[66,15020,15021],{"class":68,"line":8998},[66,15022,9001],{},[66,15024,15025],{"class":68,"line":9004},[66,15026,1112],{},[66,15028,15029],{"class":68,"line":9009},[66,15030,9012],{},[10,15032,106],{},[56,15034,15036],{"className":15035,"code":9018,"language":112,"meta":61},[110],[63,15037,9018],{"__ignoreMap":61},[10,15039,117],{},[14,15041,120],{"id":120},[122,15043,15044,15048],{},[40,15045,9029,15046,9032],{},[63,15047,8860],{},[40,15049,15050,9037],{},[63,15051,8092],{},[294,15053,2663],{"id":2663},[10,15055,9042],{},[10,15057,15058],{},[26,15059],{"alt":9047,"src":9048},[10,15061,9051],{},[294,15063,2663],{"id":4151},[10,15065,9056],{},[10,15067,15068],{},[26,15069],{"alt":9061,"src":9062},[10,15071,9065,15072,9069],{},[63,15073,9068],{},[14,15075,138],{"id":138},[37,15077,15078,15080],{},[40,15079,9076],{},[40,15081,9079,15082,9082],{},[63,15083,9068],{},[14,15085,153],{"id":153},[122,15087,15088,15092,15094],{},[40,15089,9089,15090,9092],{},[63,15091,9068],{},[40,15093,9095],{},[40,15095,9098,15096,9102,15098,9105],{},[63,15097,9101],{},[63,15099,6070],{},[10,15101,170],{},[14,15103,173],{"id":173},[10,15105,9112],{},[178,15107,180],{},{"title":61,"searchDepth":75,"depth":75,"links":15109},[15110,15111,15112,15113,15114,15118,15119,15120],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":120,"depth":75,"text":120,"children":15115},[15116,15117],{"id":2663,"depth":81,"text":2663},{"id":4151,"depth":81,"text":2663},{"id":138,"depth":75,"text":138},{"id":153,"depth":75,"text":153},{"id":173,"depth":75,"text":173},{},{"title":8823,"description":8828},[191,9135,9136],{"id":1022,"title":1023,"body":15125,"category":191,"cover":1031,"description":61,"extension":193,"meta":15361,"navigation":90,"path":1348,"pinned":196,"publishedAt":1349,"seo":15362,"slug":1351,"stem":1352,"summary":1353,"tags":15363,"updatedAt":1349,"visible":90,"__hash__":1357},{"type":7,"value":15126,"toc":15346},[15127,15131,15133,15135,15137,15139,15159,15161,15166,15168,15170,15198,15204,15206,15210,15212,15232,15234,15244,15246,15248,15250,15252,15254,15256,15258,15260,15262,15282,15284,15286,15290,15292,15294,15296,15298,15302,15304,15322,15324,15326,15328,15330,15332,15334,15336,15338,15340,15342,15344],[10,15128,15129],{},[26,15130],{"alt":1030,"src":1031},[10,15132,1034],{},[10,15134,1037],{},[14,15136,1041],{"id":1040},[10,15138,1044],{},[56,15140,15141],{"className":58,"code":1047,"language":60,"meta":61,"style":61},[63,15142,15143,15147,15151,15155],{"__ignoreMap":61},[66,15144,15145],{"class":68,"line":69},[66,15146,1054],{},[66,15148,15149],{"class":68,"line":75},[66,15150,1059],{},[66,15152,15153],{"class":68,"line":81},[66,15154,91],{"emptyLinePlaceholder":90},[66,15156,15157],{"class":68,"line":87},[66,15158,1068],{},[10,15160,1071],{},[56,15162,15164],{"className":15163,"code":1075,"language":112,"meta":61},[110],[63,15165,1075],{"__ignoreMap":61},[10,15167,1080],{},[10,15169,1083],{},[56,15171,15172],{"className":58,"code":1086,"language":60,"meta":61,"style":61},[63,15173,15174,15178,15182,15186,15190,15194],{"__ignoreMap":61},[66,15175,15176],{"class":68,"line":69},[66,15177,1093],{},[66,15179,15180],{"class":68,"line":75},[66,15181,91],{"emptyLinePlaceholder":90},[66,15183,15184],{"class":68,"line":81},[66,15185,1102],{},[66,15187,15188],{"class":68,"line":87},[66,15189,1107],{},[66,15191,15192],{"class":68,"line":94},[66,15193,1112],{},[66,15195,15196],{"class":68,"line":100},[66,15197,1117],{},[10,15199,15200,1123,15202,1127],{},[63,15201,1122],{},[63,15203,1126],{},[14,15205,1131],{"id":1130},[10,15207,1134,15208,1138],{},[63,15209,1137],{},[10,15211,1141],{},[56,15213,15214],{"className":58,"code":1144,"language":60,"meta":61,"style":61},[63,15215,15216,15220,15224,15228],{"__ignoreMap":61},[66,15217,15218],{"class":68,"line":69},[66,15219,1151],{},[66,15221,15222],{"class":68,"line":75},[66,15223,1156],{},[66,15225,15226],{"class":68,"line":81},[66,15227,1161],{},[66,15229,15230],{"class":68,"line":87},[66,15231,1166],{},[10,15233,1169],{},[56,15235,15236],{"className":557,"code":1172,"language":559,"meta":61,"style":61},[63,15237,15238],{"__ignoreMap":61},[66,15239,15240,15242],{"class":68,"line":69},[66,15241,657],{"class":566},[66,15243,1181],{"class":602},[10,15245,1184],{},[14,15247,1188],{"id":1187},[294,15249,1191],{"id":1191},[10,15251,1194],{},[294,15253,1197],{"id":1197},[10,15255,1200],{},[294,15257,1203],{"id":1203},[10,15259,1206],{},[10,15261,1209],{},[56,15263,15264],{"className":58,"code":1212,"language":60,"meta":61,"style":61},[63,15265,15266,15270,15274,15278],{"__ignoreMap":61},[66,15267,15268],{"class":68,"line":69},[66,15269,1219],{},[66,15271,15272],{"class":68,"line":75},[66,15273,91],{"emptyLinePlaceholder":90},[66,15275,15276],{"class":68,"line":81},[66,15277,1228],{},[66,15279,15280],{"class":68,"line":87},[66,15281,1233],{},[10,15283,1236],{},[294,15285,1239],{"id":1239},[10,15287,1242,15288,1245],{},[63,15289,226],{},[10,15291,1248],{},[294,15293,1251],{"id":1251},[10,15295,1254],{},[14,15297,1258],{"id":1257},[10,15299,15300],{},[26,15301],{"alt":1263,"src":1264},[10,15303,1267],{},[37,15305,15306,15308,15310,15312,15314,15316,15318,15320],{},[40,15307,1272],{},[40,15309,1275],{},[40,15311,1278],{},[40,15313,1281],{},[40,15315,1284],{},[40,15317,1287],{},[40,15319,1290],{},[40,15321,1293],{},[10,15323,1296],{},[14,15325,1300],{"id":1299},[10,15327,1303],{},[10,15329,1306],{},[14,15331,1310],{"id":1309},[10,15333,1313],{},[10,15335,1316],{},[10,15337,1319],{},[14,15339,1322],{"id":1322},[10,15341,1325],{},[10,15343,1328],{},[178,15345,1331],{},{"title":61,"searchDepth":75,"depth":75,"links":15347},[15348,15349,15350,15357,15358,15359,15360],{"id":1040,"depth":75,"text":1041},{"id":1130,"depth":75,"text":1131},{"id":1187,"depth":75,"text":1188,"children":15351},[15352,15353,15354,15355,15356],{"id":1191,"depth":81,"text":1191},{"id":1197,"depth":81,"text":1197},{"id":1203,"depth":81,"text":1203},{"id":1239,"depth":81,"text":1239},{"id":1251,"depth":81,"text":1251},{"id":1257,"depth":75,"text":1258},{"id":1299,"depth":75,"text":1300},{"id":1309,"depth":75,"text":1310},{"id":1322,"depth":75,"text":1322},{},{"title":1023,"description":61},[191,1355,1356],{"id":208,"title":209,"body":15365,"category":191,"cover":192,"description":61,"extension":193,"meta":15944,"navigation":90,"path":1011,"pinned":196,"publishedAt":1012,"seo":15945,"slug":1014,"stem":1015,"summary":1016,"tags":15946,"updatedAt":1012,"visible":90,"__hash__":1020},{"type":7,"value":15366,"toc":15920},[15367,15369,15371,15373,15377,15379,15381,15405,15417,15419,15421,15426,15430,15434,15446,15450,15454,15458,15460,15494,15496,15500,15504,15506,15528,15558,15570,15580,15588,15590,15596,15606,15608,15613,15617,15619,15633,15639,15659,15661,15663,15665,15675,15679,15681,15690,15694,15696,15698,15718,15722,15724,15726,15728,15730,15750,15752,15754,15756,15782,15784,15800,15802,15818,15822,15824,15826,15846,15848,15850,15852,15856,15866,15868,15870,15872,15882,15890,15892,15894,15908,15918],[14,15368,214],{"id":214},[10,15370,217],{},[10,15372,220],{},[10,15374,223,15375,227],{},[63,15376,226],{},[14,15378,230],{"id":230},[10,15380,233],{},[235,15382,15383,15385],{},[10,15384,239],{},[235,15386,15387,15393,15395,15399,15401],{},[10,15388,244,15389,248,15391,252],{},[63,15390,247],{},[63,15392,251],{},[10,15394,255],{},[10,15396,258,15397,263],{},[260,15398,262],{},[10,15400,266],{},[10,15402,15403],{},[26,15404],{"alt":271,"src":272},[235,15406,15407,15409],{},[10,15408,277],{},[235,15410,15411,15413],{},[10,15412,282],{},[10,15414,15415],{},[26,15416],{"alt":287,"src":288},[14,15418,292],{"id":291},[294,15420,297],{"id":296},[10,15422,300,15423,308],{},[302,15424,307],{"href":304,"rel":15425},[306],[235,15427,15428],{},[10,15429,313],{},[10,15431,15432],{},[26,15433],{"alt":318,"src":319},[37,15435,15436,15440,15444],{},[40,15437,324,15438,328],{},[260,15439,327],{},[40,15441,331,15442,328],{},[260,15443,334],{},[40,15445,337],{},[10,15447,15448],{},[26,15449],{"alt":342,"src":343},[235,15451,15452],{},[10,15453,348],{},[10,15455,15456],{},[26,15457],{"alt":353,"src":354},[294,15459,358],{"id":357},[235,15461,15462,15466,15470,15490],{},[235,15463,15464],{},[10,15465,365],{},[10,15467,368,15468,372],{},[260,15469,371],{},[56,15471,15472],{"className":58,"code":375,"language":60,"meta":61,"style":61},[63,15473,15474,15478,15482,15486],{"__ignoreMap":61},[66,15475,15476],{"class":68,"line":69},[66,15477,382],{},[66,15479,15480],{"class":68,"line":75},[66,15481,387],{},[66,15483,15484],{"class":68,"line":81},[66,15485,392],{},[66,15487,15488],{"class":68,"line":87},[66,15489,397],{},[10,15491,400,15492,404],{},[260,15493,403],{},[10,15495,407],{},[10,15497,410,15498,413],{},[63,15499,60],{},[10,15501,15502],{},[26,15503],{"alt":418,"src":419},[10,15505,422],{},[235,15507,15508,15510,15514],{},[10,15509,427],{},[10,15511,15512],{},[260,15513,432],{},[235,15515,15516,15520,15524],{},[10,15517,437,15518,440],{},[63,15519,60],{},[10,15521,443,15522,446],{},[63,15523,60],{},[10,15525,449,15526,453],{},[260,15527,452],{},[235,15529,15530,15532,15536],{},[10,15531,458],{},[10,15533,15534],{},[260,15535,463],{},[235,15537,15538,15544,15552,15554],{},[10,15539,15540,471,15542,475],{},[63,15541,470],{},[63,15543,474],{},[10,15545,478,15546,481,15548,485,15550,489],{},[63,15547,470],{},[260,15549,484],{},[260,15551,488],{},[10,15553,492],{},[10,15555,15556,498],{},[260,15557,497],{},[235,15559,15560,15562],{},[10,15561,503],{},[235,15563,15564,15568],{},[10,15565,508,15566,512],{},[260,15567,511],{},[10,15569,515],{},[235,15571,15572,15576],{},[10,15573,520,15574],{},[260,15575,523],{},[10,15577,15578],{},[26,15579],{"alt":528,"src":529},[235,15581,15582,15584],{},[10,15583,534],{},[10,15585,15586],{},[26,15587],{"alt":528,"src":539},[294,15589,543],{"id":542},[10,15591,546,15592,550,15594,554],{},[63,15593,549],{},[63,15595,553],{},[56,15597,15598],{"className":557,"code":558,"language":559,"meta":61,"style":61},[63,15599,15600],{"__ignoreMap":61},[66,15601,15602,15604],{"class":68,"line":69},[66,15603,60],{"class":566},[66,15605,570],{"class":569},[10,15607,573],{},[56,15609,15611],{"className":15610,"code":577,"language":112,"meta":61},[110],[63,15612,577],{"__ignoreMap":61},[10,15614,15615],{},[26,15616],{"alt":528,"src":584},[10,15618,587],{},[56,15620,15621],{"className":557,"code":590,"language":559,"meta":61,"style":61},[63,15622,15623],{"__ignoreMap":61},[66,15624,15625,15627,15629,15631],{"class":68,"line":69},[66,15626,60],{"class":566},[66,15628,599],{"class":569},[66,15630,603],{"class":602},[66,15632,570],{"class":569},[10,15634,608,15635,611,15637,615],{},[63,15636,60],{},[63,15638,614],{},[56,15640,15641],{"className":557,"code":618,"language":559,"meta":61,"style":61},[63,15642,15643,15649],{"__ignoreMap":61},[66,15644,15645,15647],{"class":68,"line":69},[66,15646,474],{"class":566},[66,15648,570],{"class":569},[66,15650,15651,15653,15655,15657],{"class":68,"line":75},[66,15652,474],{"class":566},[66,15654,599],{"class":569},[66,15656,603],{"class":602},[66,15658,570],{"class":569},[14,15660,640],{"id":639},[294,15662,644],{"id":643},[10,15664,647],{},[56,15666,15667],{"className":557,"code":650,"language":559,"meta":61,"style":61},[63,15668,15669],{"__ignoreMap":61},[66,15670,15671,15673],{"class":68,"line":69},[66,15672,657],{"class":566},[66,15674,570],{"class":569},[10,15676,662,15677,666],{},[63,15678,665],{},[294,15680,670],{"id":669},[10,15682,300,15683,678,15686,328,15688,685],{},[302,15684,677],{"href":675,"rel":15685},[306],[260,15687,681],{},[63,15689,684],{},[10,15691,688,15692,692],{},[63,15693,691],{},[294,15695,696],{"id":695},[10,15697,699],{},[56,15699,15700],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,15701,15702,15708],{"__ignoreMap":61},[66,15703,15704,15706],{"class":68,"line":69},[66,15705,657],{"class":566},[66,15707,570],{"class":569},[66,15709,15710,15712,15714,15716],{"class":68,"line":75},[66,15711,657],{"class":566},[66,15713,599],{"class":569},[66,15715,603],{"class":602},[66,15717,570],{"class":569},[10,15719,723,15720,726],{},[63,15721,657],{},[14,15723,730],{"id":729},[10,15725,733],{},[294,15727,737],{"id":736},[10,15729,740],{},[56,15731,15732],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,15733,15734,15740],{"__ignoreMap":61},[66,15735,15736,15738],{"class":68,"line":69},[66,15737,657],{"class":566},[66,15739,570],{"class":569},[66,15741,15742,15744,15746,15748],{"class":68,"line":75},[66,15743,657],{"class":566},[66,15745,599],{"class":569},[66,15747,603],{"class":602},[66,15749,570],{"class":569},[10,15751,763],{},[294,15753,767],{"id":766},[10,15755,770],{},[56,15757,15758],{"className":557,"code":773,"language":559,"meta":61,"style":61},[63,15759,15760,15768],{"__ignoreMap":61},[66,15761,15762,15764,15766],{"class":68,"line":69},[66,15763,780],{"class":566},[66,15765,783],{"class":602},[66,15767,786],{"class":602},[66,15769,15770,15772,15774,15776,15778,15780],{"class":68,"line":75},[66,15771,780],{"class":566},[66,15773,783],{"class":602},[66,15775,795],{"class":602},[66,15777,798],{"class":602},[66,15779,801],{"class":602},[66,15781,804],{"class":602},[10,15783,807],{},[56,15785,15786],{"className":557,"code":810,"language":559,"meta":61,"style":61},[63,15787,15788],{"__ignoreMap":61},[66,15789,15790,15792,15794,15796,15798],{"class":68,"line":69},[66,15791,780],{"class":566},[66,15793,819],{"class":602},[66,15795,795],{"class":602},[66,15797,798],{"class":602},[66,15799,826],{"class":602},[10,15801,829],{},[56,15803,15804],{"className":557,"code":832,"language":559,"meta":61,"style":61},[63,15805,15806],{"__ignoreMap":61},[66,15807,15808,15810,15812,15814,15816],{"class":68,"line":69},[66,15809,780],{"class":566},[66,15811,841],{"class":602},[66,15813,844],{"class":569},[66,15815,847],{"class":602},[66,15817,850],{"class":602},[10,15819,15820,855],{},[63,15821,780],{},[294,15823,859],{"id":858},[10,15825,862],{},[56,15827,15828],{"className":557,"code":702,"language":559,"meta":61,"style":61},[63,15829,15830,15836],{"__ignoreMap":61},[66,15831,15832,15834],{"class":68,"line":69},[66,15833,657],{"class":566},[66,15835,570],{"class":569},[66,15837,15838,15840,15842,15844],{"class":68,"line":75},[66,15839,657],{"class":566},[66,15841,599],{"class":569},[66,15843,603],{"class":602},[66,15845,570],{"class":569},[10,15847,885],{},[14,15849,888],{"id":888},[294,15851,892],{"id":891},[10,15853,895,15854,899],{},[63,15855,898],{},[122,15857,15858,15862,15864],{},[40,15859,904,15860,907],{},[63,15861,614],{},[40,15863,910],{},[40,15865,913],{},[10,15867,916],{},[294,15869,920],{"id":919},[10,15871,923],{},[56,15873,15874],{"className":557,"code":650,"language":559,"meta":61,"style":61},[63,15875,15876],{"__ignoreMap":61},[66,15877,15878,15880],{"class":68,"line":69},[66,15879,657],{"class":566},[66,15881,570],{"class":569},[10,15883,936,15884,939,15886,942,15888,328],{},[63,15885,657],{},[63,15887,60],{},[63,15889,657],{},[294,15891,948],{"id":947},[10,15893,951],{},[56,15895,15896],{"className":557,"code":954,"language":559,"meta":61,"style":61},[63,15897,15898],{"__ignoreMap":61},[66,15899,15900,15902,15904,15906],{"class":68,"line":69},[66,15901,657],{"class":566},[66,15903,599],{"class":569},[66,15905,603],{"class":602},[66,15907,570],{"class":569},[10,15909,969,15910,972,15912,975,15914,978,15916,982],{},[63,15911,657],{},[63,15913,60],{},[63,15915,474],{},[63,15917,981],{},[178,15919,985],{},{"title":61,"searchDepth":75,"depth":75,"links":15921},[15922,15923,15924,15929,15934,15939],{"id":214,"depth":75,"text":214},{"id":230,"depth":75,"text":230},{"id":291,"depth":75,"text":292,"children":15925},[15926,15927,15928],{"id":296,"depth":81,"text":297},{"id":357,"depth":81,"text":358},{"id":542,"depth":81,"text":543},{"id":639,"depth":75,"text":640,"children":15930},[15931,15932,15933],{"id":643,"depth":81,"text":644},{"id":669,"depth":81,"text":670},{"id":695,"depth":81,"text":696},{"id":729,"depth":75,"text":730,"children":15935},[15936,15937,15938],{"id":736,"depth":81,"text":737},{"id":766,"depth":81,"text":767},{"id":858,"depth":81,"text":859},{"id":888,"depth":75,"text":888,"children":15940},[15941,15942,15943],{"id":891,"depth":81,"text":892},{"id":919,"depth":81,"text":920},{"id":947,"depth":81,"text":948},{},{"title":209,"description":61},[191,1018,1019],1786973364574]