[{"data":1,"prerenderedAt":15953},["ShallowReactive",2],{"post-python-dictionary-basics":3,"sidebar-posts":221,"post-related-source":9144},{"id":4,"title":5,"body":6,"category":206,"cover":207,"description":12,"extension":208,"meta":209,"navigation":96,"path":210,"pinned":211,"publishedAt":212,"seo":213,"slug":214,"stem":215,"summary":216,"tags":217,"updatedAt":212,"visible":96,"__hash__":220},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":8,"toc":196},"minimark",[9,13,17,20,23,30,42,45,62,65,68,116,119,127,130,133,149,152,172,175,183,186,189,192],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、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\u002F13-dict-mapping.svg",[10,31,32,33,37,38,41],{},"字典通过键定位值，不使用连续位置表达含义。",[34,35,36],"code",{},"student[\"score\"]"," 读取的是键 ",[34,39,40],{},"score"," 对应的值，而不是“第几个元素”。",[14,43,44],{"id":44},"核心概念",[46,47,48,52,59],"ul",{},[49,50,51],"li",{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[49,53,54,55,58],{},"使用 ",[34,56,57],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[49,60,61],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,63,64],{"id":64},"跟着示例运行",[10,66,67],{},"把下面代码保存到本课脚本并运行：",[69,70,75],"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-python shiki shiki-themes github-dark","student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n","python","",[34,76,77,85,91,98,104,110],{"__ignoreMap":74},[78,79,82],"span",{"class":80,"line":81},"line",1,[78,83,84],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[78,86,88],{"class":80,"line":87},2,[78,89,90],{},"print(student[\"name\"])\n",[78,92,94],{"class":80,"line":93},3,[78,95,97],{"emptyLinePlaceholder":96},true,"\n",[78,99,101],{"class":80,"line":100},4,[78,102,103],{},"student[\"score\"] = 95\n",[78,105,107],{"class":80,"line":106},5,[78,108,109],{},"student[\"city\"] = \"郑州\"\n",[78,111,113],{"class":80,"line":112},6,[78,114,115],{},"print(student)\n",[10,117,118],{},"预期结果：",[69,120,125],{"className":121,"code":123,"language":124,"meta":74},[122],"language-text","小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n","text",[34,126,123],{"__ignoreMap":74},[10,128,129],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,131,132],{"id":132},"按执行顺序拆开看",[134,135,136,139],"ol",{},[49,137,138],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[49,140,141,142,144,145,148],{},"给已有键 ",[34,143,40],{}," 赋值会更新映射，给新键 ",[34,146,147],{},"city"," 赋值会增加映射。",[14,150,151],{"id":151},"初学者容易混淆的地方",[46,153,154,161],{},[49,155,156,157,160],{},"按位置理解字典并尝试 ",[34,158,159],{},"student[0]","，而实际键是字符串。",[49,162,163,164,167,168,171],{},"直接读取不确定存在的键并忽略 ",[34,165,166],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,169,170],{},"get()","。",[14,173,174],{"id":174},"练习",[134,176,177,180],{},[49,178,179],{},"建立一本书的标题、作者和页数字典。",[49,181,182],{},"添加分类键，再修改页数。",[10,184,185],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,187,188],{"id":188},"本篇边界",[10,190,191],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,194,195],"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":74,"searchDepth":87,"depth":87,"links":197},[198,199,200,201,202,203,204,205],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",false,"2026-08-17",{"title":5,"description":12},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[206,218,219],"字典","数据结构","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",[222,1035,1372,1506,1658,1837,2025,2190,2372,2555,2748,2979,3163,3339,3496,3625,3790,4005,4234,4416,4580,4769,4957,5112,5272,5469,5666,5880,6047,6291,6472,6677,6872,7056,7257,7547,7739,7968,8163,8383,8623,8827],{"id":223,"title":224,"body":225,"category":206,"cover":207,"description":74,"extension":208,"meta":1024,"navigation":96,"path":1025,"pinned":211,"publishedAt":1026,"seo":1027,"slug":1028,"stem":1029,"summary":1030,"tags":1031,"updatedAt":1026,"visible":96,"__hash__":1034},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":226,"toc":1000},[227,230,233,236,243,246,249,288,304,308,313,324,329,335,352,358,363,369,373,419,422,428,434,437,468,513,530,544,554,558,569,585,588,594,599,602,620,630,651,655,659,662,674,681,685,700,707,711,714,735,741,745,748,752,755,775,778,782,785,819,822,841,844,865,870,874,877,897,900,903,907,914,928,931,935,938,948,959,963,966,981,997],[14,228,229],{"id":229},"引言",[10,231,232],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,234,235],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,237,238,239,242],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,240,241],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,244,245],{"id":245},"扫盲",[10,247,248],{},"那么这里有几个概念：",[250,251,252,255],"blockquote",{},[10,253,254],{},"为什么需要安装python解释器？",[250,256,257,268,271,279,282],{},[10,258,259,260,263,264,267],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,261,262],{},"0","和",[34,265,266],{},"1","组成的机器指令。",[10,269,270],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,272,273,274,278],{},"这样，我们就能用",[275,276,277],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,280,281],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,283,284],{},[26,285],{"alt":286,"src":287},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[250,289,290,293],{},[10,291,292],{},"pip又是什么？",[250,294,295,298],{},[10,296,297],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,299,300],{},[26,301],{"alt":302,"src":303},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,305,307],{"id":306},"windows-安装","Windows 安装",[309,310,312],"h3",{"id":311},"_1-下载官方安装程序","1. 下载官方安装程序",[10,314,315,316,323],{},"打开 ",[317,318,322],"a",{"href":319,"rel":320},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[321],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[250,325,326],{},[10,327,328],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,330,331],{},[26,332],{"alt":333,"src":334},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[46,336,337,343,349],{},[49,338,339,340,171],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[275,341,342],{},"Windows installer (64-bit)",[49,344,345,346,171],{},"搭载 ARM 处理器的 Windows 设备选择 ",[275,347,348],{},"Windows installer (ARM64)",[49,350,351],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,353,354],{},[26,355],{"alt":356,"src":357},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[250,359,360],{},[10,361,362],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,364,365],{},[26,366],{"alt":367,"src":368},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[309,370,372],{"id":371},"_2-安装并加入-path","2. 安装并加入 PATH",[250,374,375,380,387,412],{},[250,376,377],{},[10,378,379],{},"PATH 环境变量",[10,381,382,383,386],{},"Windows 有一个特殊的变量叫 ",[275,384,385],{},"PATH","，它里面存了一串文件夹路径，比如：",[69,388,390],{"className":71,"code":389,"language":73,"meta":74,"style":74},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,391,392,397,402,407],{"__ignoreMap":74},[78,393,394],{"class":80,"line":81},[78,395,396],{},"D:\\Python313\\\n",[78,398,399],{"class":80,"line":87},[78,400,401],{},"D:\\Python313\\Scripts\\\n",[78,403,404],{"class":80,"line":93},[78,405,406],{},"C:\\Windows\\System32\\\n",[78,408,409],{"class":80,"line":100},[78,410,411],{},"...\n",[10,413,414,415,418],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[275,416,417],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,420,421],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,423,424,425,427],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,426,73],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,429,430],{},[26,431],{"alt":432,"src":433},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,435,436],{},"对安装界面最底部的两个勾选项分别解释 :",[250,438,439,442,447],{},[10,440,441],{},"Add python.exe to PATH",[10,443,444],{},[275,445,446],{},"把 Python 添加到系统环境变量",[250,448,449,455,461],{},[10,450,451,452,454],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,453,73],{}," 就能运行",[10,456,457,458,460],{},"不勾选的话，命令行输入 ",[34,459,73],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,462,463,464,467],{},"必须",[275,465,466],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[250,469,470,473,478],{},[10,471,472],{},"Use admin privileges when installing py.exe",[10,474,475],{},[275,476,477],{},"使用管理员权限安装 py.exe（Python 启动器）",[250,479,480,490,504,507],{},[10,481,482,485,486,489],{},[34,483,484],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,487,488],{},"py"," 来启动 Python。",[10,491,492,493,495,496,499,500,503],{},"勾选后，",[34,494,484],{}," 会安装到",[275,497,498],{},"系统级目录","，电脑上",[275,501,502],{},"所有用户账户","都能用",[10,505,506],{},"不勾选，只有当前用户能用",[10,508,509,512],{},[275,510,511],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[250,514,515,518],{},[10,516,517],{},"操作建议",[250,519,520,527],{},[10,521,522,523,526],{},"两个都勾上之后，再点 ",[275,524,525],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,528,529],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[250,531,532,538],{},[10,533,534,535],{},"Python 安装的",[275,536,537],{},"可选功能页",[10,539,540],{},[26,541],{"alt":542,"src":543},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[250,545,546,549],{},[10,547,548],{},"高级选项页",[10,550,551],{},[26,552],{"alt":542,"src":553},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[309,555,557],{"id":556},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,559,560,561,564,565,568],{},"按 ",[34,562,563],{},"Win + R","，输入 ",[34,566,567],{},"cmd"," 并回车，然后执行：",[69,570,574],{"className":571,"code":572,"language":573,"meta":74,"style":74},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,575,576],{"__ignoreMap":74},[78,577,578,581],{"class":80,"line":81},[78,579,73],{"class":580},"svObZ",[78,582,584],{"class":583},"sDLfK"," --version\n",[10,586,587],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[69,589,592],{"className":590,"code":591,"language":124,"meta":74},[122],"Python 3.x.x\n",[34,593,591],{"__ignoreMap":74},[10,595,596],{},[26,597],{"alt":542,"src":598},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,600,601],{},"继续检查 pip：",[69,603,605],{"className":571,"code":604,"language":573,"meta":74,"style":74},"python -m pip --version\n",[34,606,607],{"__ignoreMap":74},[78,608,609,611,614,618],{"class":80,"line":81},[78,610,73],{"class":580},[78,612,613],{"class":583}," -m",[78,615,617],{"class":616},"sU2Wk"," pip",[78,619,584],{"class":583},[10,621,622,623,625,626,629],{},"如果 ",[34,624,73],{}," 无法识别，但 ",[34,627,628],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[69,631,633],{"className":571,"code":632,"language":573,"meta":74,"style":74},"py --version\npy -m pip --version\n",[34,634,635,641],{"__ignoreMap":74},[78,636,637,639],{"class":80,"line":81},[78,638,488],{"class":580},[78,640,584],{"class":583},[78,642,643,645,647,649],{"class":80,"line":87},[78,644,488],{"class":580},[78,646,613],{"class":583},[78,648,617],{"class":616},[78,650,584],{"class":583},[14,652,654],{"id":653},"macos-安装","macOS 安装",[309,656,658],{"id":657},"_1-先检查现有环境","1. 先检查现有环境",[10,660,661],{},"打开“终端”应用，执行：",[69,663,665],{"className":571,"code":664,"language":573,"meta":74,"style":74},"python3 --version\n",[34,666,667],{"__ignoreMap":74},[78,668,669,672],{"class":80,"line":81},[78,670,671],{"class":580},"python3",[78,673,584],{"class":583},[10,675,676,677,680],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,678,679],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[309,682,684],{"id":683},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,686,315,687,692,693,171,696,699],{},[317,688,691],{"href":689,"rel":690},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[321],"Python macOS 下载页","，下载当前稳定版的 ",[275,694,695],{},"macOS 64-bit universal2 installer",[34,697,698],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,701,702,703,706],{},"下载完成后打开 ",[34,704,705],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[309,708,710],{"id":709},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,712,713],{},"安装完成后重新打开终端，执行：",[69,715,717],{"className":571,"code":716,"language":573,"meta":74,"style":74},"python3 --version\npython3 -m pip --version\n",[34,718,719,725],{"__ignoreMap":74},[78,720,721,723],{"class":80,"line":81},[78,722,671],{"class":580},[78,724,584],{"class":583},[78,726,727,729,731,733],{"class":80,"line":87},[78,728,671],{"class":580},[78,730,613],{"class":583},[78,732,617],{"class":616},[78,734,584],{"class":583},[10,736,737,738,740],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,739,671],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,742,744],{"id":743},"linux-安装","Linux 安装",[10,746,747],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[309,749,751],{"id":750},"_1-检查是否已经安装","1. 检查是否已经安装",[10,753,754],{},"打开终端，执行：",[69,756,757],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,758,759,765],{"__ignoreMap":74},[78,760,761,763],{"class":80,"line":81},[78,762,671],{"class":580},[78,764,584],{"class":583},[78,766,767,769,771,773],{"class":80,"line":87},[78,768,671],{"class":580},[78,770,613],{"class":583},[78,772,617],{"class":616},[78,774,584],{"class":583},[10,776,777],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[309,779,781],{"id":780},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,783,784],{},"Ubuntu 或 Debian：",[69,786,788],{"className":571,"code":787,"language":573,"meta":74,"style":74},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,789,790,801],{"__ignoreMap":74},[78,791,792,795,798],{"class":80,"line":81},[78,793,794],{"class":580},"sudo",[78,796,797],{"class":616}," apt",[78,799,800],{"class":616}," update\n",[78,802,803,805,807,810,813,816],{"class":80,"line":87},[78,804,794],{"class":580},[78,806,797],{"class":616},[78,808,809],{"class":616}," install",[78,811,812],{"class":616}," python3",[78,814,815],{"class":616}," python3-pip",[78,817,818],{"class":616}," python3-venv\n",[10,820,821],{},"Fedora：",[69,823,825],{"className":571,"code":824,"language":573,"meta":74,"style":74},"sudo dnf install python3 python3-pip\n",[34,826,827],{"__ignoreMap":74},[78,828,829,831,834,836,838],{"class":80,"line":81},[78,830,794],{"class":580},[78,832,833],{"class":616}," dnf",[78,835,809],{"class":616},[78,837,812],{"class":616},[78,839,840],{"class":616}," python3-pip\n",[10,842,843],{},"Arch Linux：",[69,845,847],{"className":571,"code":846,"language":573,"meta":74,"style":74},"sudo pacman -S python python-pip\n",[34,848,849],{"__ignoreMap":74},[78,850,851,853,856,859,862],{"class":80,"line":81},[78,852,794],{"class":580},[78,854,855],{"class":616}," pacman",[78,857,858],{"class":583}," -S",[78,860,861],{"class":616}," python",[78,863,864],{"class":616}," python-pip\n",[10,866,867,869],{},[34,868,794],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[309,871,873],{"id":872},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,875,876],{},"安装结束后执行：",[69,878,879],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,880,881,887],{"__ignoreMap":74},[78,882,883,885],{"class":80,"line":81},[78,884,671],{"class":580},[78,886,584],{"class":583},[78,888,889,891,893,895],{"class":80,"line":87},[78,890,671],{"class":580},[78,892,613],{"class":583},[78,894,617],{"class":616},[78,896,584],{"class":583},[10,898,899],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,901,902],{"id":902},"常见问题",[309,904,906],{"id":905},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,908,909,910,913],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,911,912],{},"python --version","。如果仍然失败，按下面的顺序检查：",[134,915,916,922,925],{},[49,917,918,919,921],{},"执行 ",[34,920,628],{},"，确认 Python Launcher 是否可用。",[49,923,924],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[49,926,927],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,929,930],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[309,932,934],{"id":933},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,936,937],{},"先尝试：",[69,939,940],{"className":571,"code":664,"language":573,"meta":74,"style":74},[34,941,942],{"__ignoreMap":74},[78,943,944,946],{"class":80,"line":81},[78,945,671],{"class":580},[78,947,584],{"class":583},[10,949,950,951,953,954,956,957,171],{},"在这两个系统中，只有 ",[34,952,671],{}," 命令而没有 ",[34,955,73],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,958,671],{},[309,960,962],{"id":961},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,964,965],{},"先使用模块方式检查：",[69,967,969],{"className":571,"code":968,"language":573,"meta":74,"style":74},"python3 -m pip --version\n",[34,970,971],{"__ignoreMap":74},[78,972,973,975,977,979],{"class":80,"line":81},[78,974,671],{"class":580},[78,976,613],{"class":583},[78,978,617],{"class":616},[78,980,584],{"class":583},[10,982,983,984,986,987,989,990,992,993,996],{},"Windows 用户将命令中的 ",[34,985,671],{}," 换成 ",[34,988,73],{}," 或 ",[34,991,488],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,994,995],{},"python3-pip","；不要直接使用其他系统的安装命令。",[193,998,999],{},"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":74,"searchDepth":87,"depth":87,"links":1001},[1002,1003,1004,1009,1014,1019],{"id":229,"depth":87,"text":229},{"id":245,"depth":87,"text":245},{"id":306,"depth":87,"text":307,"children":1005},[1006,1007,1008],{"id":311,"depth":93,"text":312},{"id":371,"depth":93,"text":372},{"id":556,"depth":93,"text":557},{"id":653,"depth":87,"text":654,"children":1010},[1011,1012,1013],{"id":657,"depth":93,"text":658},{"id":683,"depth":93,"text":684},{"id":709,"depth":93,"text":710},{"id":743,"depth":87,"text":744,"children":1015},[1016,1017,1018],{"id":750,"depth":93,"text":751},{"id":780,"depth":93,"text":781},{"id":872,"depth":93,"text":873},{"id":902,"depth":87,"text":902,"children":1020},[1021,1022,1023],{"id":905,"depth":93,"text":906},{"id":933,"depth":93,"text":934},{"id":961,"depth":93,"text":962},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":224,"description":74},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[206,1032,1033],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1036,"title":1037,"body":1038,"category":206,"cover":1045,"description":74,"extension":208,"meta":1361,"navigation":96,"path":1362,"pinned":211,"publishedAt":1363,"seo":1364,"slug":1365,"stem":1366,"summary":1367,"tags":1368,"updatedAt":1363,"visible":96,"__hash__":1371},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1039,"toc":1346},[1040,1046,1049,1052,1056,1059,1083,1086,1092,1095,1098,1132,1142,1146,1153,1156,1181,1184,1196,1199,1203,1206,1209,1212,1215,1218,1221,1224,1248,1251,1254,1260,1263,1266,1269,1273,1279,1282,1308,1311,1315,1318,1321,1325,1328,1331,1334,1337,1340,1343],[10,1041,1042],{},[26,1043],{"alt":1044,"src":1045},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1047,1048],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1050,1051],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1053,1055],{"id":1054},"python-代码是什么样的","Python 代码是什么样的",[10,1057,1058],{},"下面是一段简单的 Python 代码：",[69,1060,1062],{"className":71,"code":1061,"language":73,"meta":74,"style":74},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1063,1064,1069,1074,1078],{"__ignoreMap":74},[78,1065,1066],{"class":80,"line":81},[78,1067,1068],{},"name = \"Python\"\n",[78,1070,1071],{"class":80,"line":87},[78,1072,1073],{},"year = 2026\n",[78,1075,1076],{"class":80,"line":93},[78,1077,97],{"emptyLinePlaceholder":96},[78,1079,1080],{"class":80,"line":100},[78,1081,1082],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1084,1085],{},"运行结果：",[69,1087,1090],{"className":1088,"code":1089,"language":124,"meta":74},[122],"正在学习 Python，当前年份是 2026\n",[34,1091,1089],{"__ignoreMap":74},[10,1093,1094],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1096,1097],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[69,1099,1101],{"className":71,"code":1100,"language":73,"meta":74,"style":74},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1102,1103,1108,1112,1117,1122,1127],{"__ignoreMap":74},[78,1104,1105],{"class":80,"line":81},[78,1106,1107],{},"score = 85\n",[78,1109,1110],{"class":80,"line":87},[78,1111,97],{"emptyLinePlaceholder":96},[78,1113,1114],{"class":80,"line":93},[78,1115,1116],{},"if score >= 60:\n",[78,1118,1119],{"class":80,"line":100},[78,1120,1121],{},"    print(\"成绩合格\")\n",[78,1123,1124],{"class":80,"line":106},[78,1125,1126],{},"else:\n",[78,1128,1129],{"class":80,"line":112},[78,1130,1131],{},"    print(\"需要继续学习\")\n",[10,1133,1134,1137,1138,1141],{},[34,1135,1136],{},"if"," 和 ",[34,1139,1140],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1143,1145],{"id":1144},"python-如何运行代码","Python 如何运行代码",[10,1147,1148,1149,1152],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1150,1151],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1154,1155],{},"交互式环境适合快速验证一个表达式：",[69,1157,1159],{"className":71,"code":1158,"language":73,"meta":74,"style":74},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1160,1161,1166,1171,1176],{"__ignoreMap":74},[78,1162,1163],{"class":80,"line":81},[78,1164,1165],{},">>> 10 + 20\n",[78,1167,1168],{"class":80,"line":87},[78,1169,1170],{},"30\n",[78,1172,1173],{"class":80,"line":93},[78,1174,1175],{},">>> \"Python\".lower()\n",[78,1177,1178],{"class":80,"line":100},[78,1179,1180],{},"'python'\n",[10,1182,1183],{},"需要保存和重复运行的程序，则可以写入文件：",[69,1185,1187],{"className":571,"code":1186,"language":573,"meta":74,"style":74},"python3 hello.py\n",[34,1188,1189],{"__ignoreMap":74},[78,1190,1191,1193],{"class":80,"line":81},[78,1192,671],{"class":580},[78,1194,1195],{"class":616}," hello.py\n",[10,1197,1198],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1200,1202],{"id":1201},"python-的特点","Python 的特点",[309,1204,1205],{"id":1205},"语法相对简洁",[10,1207,1208],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[309,1210,1211],{"id":1211},"支持多种编程方式",[10,1213,1214],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[309,1216,1217],{"id":1217},"标准库比较完整",[10,1219,1220],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1222,1223],{},"例如，获取当前时间：",[69,1225,1227],{"className":71,"code":1226,"language":73,"meta":74,"style":74},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1228,1229,1234,1238,1243],{"__ignoreMap":74},[78,1230,1231],{"class":80,"line":81},[78,1232,1233],{},"from datetime import datetime\n",[78,1235,1236],{"class":80,"line":87},[78,1237,97],{"emptyLinePlaceholder":96},[78,1239,1240],{"class":80,"line":93},[78,1241,1242],{},"now = datetime.now()\n",[78,1244,1245],{"class":80,"line":100},[78,1246,1247],{},"print(now)\n",[10,1249,1250],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[309,1252,1253],{"id":1253},"第三方工具丰富",[10,1255,1256,1257,1259],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1258,241],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1261,1262],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[309,1264,1265],{"id":1265},"支持多个操作系统",[10,1267,1268],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1270,1272],{"id":1271},"python-可以做什么","Python 可以做什么",[10,1274,1275],{},[26,1276],{"alt":1277,"src":1278},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1280,1281],{},"Python 的应用范围比较广，常见方向包括：",[46,1283,1284,1287,1290,1293,1296,1299,1302,1305],{},[49,1285,1286],{},"编写自动化脚本，批量处理文件和重复任务；",[49,1288,1289],{},"开发网站后端和 API 服务；",[49,1291,1292],{},"进行数据清洗、统计分析和图表展示；",[49,1294,1295],{},"编写网络爬虫和信息采集工具；",[49,1297,1298],{},"开发自动化测试程序；",[49,1300,1301],{},"进行机器学习和人工智能开发；",[49,1303,1304],{},"编写运维、监控和辅助开发工具；",[49,1306,1307],{},"开发部分桌面应用和插件。",[10,1309,1310],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1312,1314],{"id":1313},"python-的发展","Python 的发展",[10,1316,1317],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1319,1320],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1322,1324],{"id":1323},"python-也有局限","Python 也有局限",[10,1326,1327],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1329,1330],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1332,1333],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1335,1336],{"id":1336},"写在最后",[10,1338,1339],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1341,1342],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[193,1344,1345],{},"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":74,"searchDepth":87,"depth":87,"links":1347},[1348,1349,1350,1357,1358,1359,1360],{"id":1054,"depth":87,"text":1055},{"id":1144,"depth":87,"text":1145},{"id":1201,"depth":87,"text":1202,"children":1351},[1352,1353,1354,1355,1356],{"id":1205,"depth":93,"text":1205},{"id":1211,"depth":93,"text":1211},{"id":1217,"depth":93,"text":1217},{"id":1253,"depth":93,"text":1253},{"id":1265,"depth":93,"text":1265},{"id":1271,"depth":87,"text":1272},{"id":1313,"depth":87,"text":1314},{"id":1323,"depth":87,"text":1324},{"id":1336,"depth":87,"text":1336},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1037,"description":74},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[206,1369,1370],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1373,"title":1374,"body":1375,"category":206,"cover":207,"description":1379,"extension":208,"meta":1497,"navigation":96,"path":1498,"pinned":211,"publishedAt":212,"seo":1499,"slug":1500,"stem":1501,"summary":1502,"tags":1503,"updatedAt":212,"visible":96,"__hash__":1505},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1376,"toc":1487},[1377,1380,1382,1385,1387,1393,1398,1400,1414,1416,1418,1427,1429,1435,1437,1439,1455,1457,1468,1470,1478,1480,1482,1485],[10,1378,1379],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1381,16],{"id":16},[10,1383,1384],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1386,22],{"id":22},[10,1388,1389],{},[26,1390],{"alt":1391,"src":1392},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1394,1395,1397],{},[34,1396,1151],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1399,44],{"id":44},[46,1401,1402,1408,1411],{},[49,1403,1404,1405,1407],{},"源代码是人编写的文本，通常保存在 ",[34,1406,1151],{}," 文件中。",[49,1409,1410],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[49,1412,1413],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1415,64],{"id":64},[10,1417,67],{},[69,1419,1421],{"className":71,"code":1420,"language":73,"meta":74,"style":74},"print(\"你好，Python\")\n",[34,1422,1423],{"__ignoreMap":74},[78,1424,1425],{"class":80,"line":81},[78,1426,1420],{},[10,1428,118],{},[69,1430,1433],{"className":1431,"code":1432,"language":124,"meta":74},[122],"你好，Python\n",[34,1434,1432],{"__ignoreMap":74},[10,1436,129],{},[14,1438,132],{"id":132},[134,1440,1441,1448],{},[49,1442,1443,1444,1447],{},"终端启动解释器后，解释器读取 ",[34,1445,1446],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[49,1449,1450,1451,1454],{},"字符串对象先准备好，再交给 ",[34,1452,1453],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1456,151],{"id":151},[46,1458,1459,1462],{},[49,1460,1461],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[49,1463,1464,1465,1467],{},"认为 ",[34,1466,1151],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1469,174],{"id":174},[134,1471,1472,1475],{},[49,1473,1474],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[49,1476,1477],{},"把示例文字改成自己的学习目标并重新运行。",[10,1479,185],{},[14,1481,188],{"id":188},[10,1483,1484],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,1486,195],{},{"title":74,"searchDepth":87,"depth":87,"links":1488},[1489,1490,1491,1492,1493,1494,1495,1496],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1374,"description":1379},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[206,1369,1504],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1507,"title":1508,"body":1509,"category":206,"cover":207,"description":1513,"extension":208,"meta":1649,"navigation":96,"path":1650,"pinned":211,"publishedAt":212,"seo":1651,"slug":1652,"stem":1653,"summary":1654,"tags":1655,"updatedAt":212,"visible":96,"__hash__":1657},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1510,"toc":1639},[1511,1514,1516,1519,1521,1527,1533,1535,1550,1552,1555,1575,1577,1583,1585,1587,1600,1602,1616,1618,1629,1631,1633,1636],[10,1512,1513],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1515,16],{"id":16},[10,1517,1518],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1520,22],{"id":22},[10,1522,1523],{},[26,1524],{"alt":1525,"src":1526},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1528,1529,1530,1532],{},"终端收到 ",[34,1531,671],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1534,44],{"id":44},[46,1536,1537,1540,1543],{},[49,1538,1539],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[49,1541,1542],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[49,1544,1545,1546,1549],{},"检查 pip 时使用 ",[34,1547,1548],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1551,64],{"id":64},[10,1553,1554],{},"在 macOS 终端执行：",[69,1556,1557],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,1558,1559,1565],{"__ignoreMap":74},[78,1560,1561,1563],{"class":80,"line":81},[78,1562,671],{"class":580},[78,1564,584],{"class":583},[78,1566,1567,1569,1571,1573],{"class":80,"line":87},[78,1568,671],{"class":580},[78,1570,613],{"class":583},[78,1572,617],{"class":616},[78,1574,584],{"class":583},[10,1576,118],{},[69,1578,1581],{"className":1579,"code":1580,"language":124,"meta":74},[122],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1582,1580],{"__ignoreMap":74},[10,1584,129],{},[14,1586,132],{"id":132},[134,1588,1589,1595],{},[49,1590,1591,1594],{},[34,1592,1593],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[49,1596,1597,1599],{},[34,1598,679],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1601,151],{"id":151},[46,1603,1604,1610],{},[49,1605,1606,1607,1609],{},"看到系统已有 ",[34,1608,671],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[49,1611,1612,1613,1615],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1614,671],{},"，不修改系统自带工具。",[14,1617,174],{"id":174},[134,1619,1620,1626],{},[49,1621,918,1622,1625],{},[34,1623,1624],{},"which python3","，记录当前解释器路径。",[49,1627,1628],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1630,185],{},[14,1632,188],{"id":188},[10,1634,1635],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,1637,1638],{},"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":74,"searchDepth":87,"depth":87,"links":1640},[1641,1642,1643,1644,1645,1646,1647,1648],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1508,"description":1513},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[206,1656,1032],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1659,"title":1660,"body":1661,"category":206,"cover":207,"description":1826,"extension":208,"meta":1827,"navigation":96,"path":1828,"pinned":211,"publishedAt":212,"seo":1829,"slug":1830,"stem":1831,"summary":1832,"tags":1833,"updatedAt":212,"visible":96,"__hash__":1836},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1662,"toc":1816},[1663,1669,1671,1674,1676,1682,1685,1687,1711,1713,1715,1742,1744,1750,1752,1754,1772,1774,1788,1790,1804,1806,1808,1814],[10,1664,1665,1666,1668],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1667,1151],{}," 脚本。",[14,1670,16],{"id":16},[10,1672,1673],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1675,22],{"id":22},[10,1677,1678],{},[26,1679],{"alt":1680,"src":1681},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1683,1684],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1686,44],{"id":44},[46,1688,1689,1698,1705],{},[49,1690,1691,1692,1694,1695,171],{},"在终端输入 ",[34,1693,671],{}," 进入 REPL，提示符通常是 ",[34,1696,1697],{},">>>",[49,1699,1700,1701,1704],{},"输入 ",[34,1702,1703],{},"exit()"," 或按 Control-D 退出 REPL。",[49,1706,1707,1708,1710],{},"需要保存、复查或多次运行的代码应写入 ",[34,1709,1151],{}," 文件。",[14,1712,64],{"id":64},[10,1714,67],{},[69,1716,1720],{"className":1717,"code":1718,"language":1719,"meta":74,"style":74},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1721,1722,1727,1732,1737],{"__ignoreMap":74},[78,1723,1724],{"class":80,"line":81},[78,1725,1726],{},">>> 2 + 3\n",[78,1728,1729],{"class":80,"line":87},[78,1730,1731],{},"5\n",[78,1733,1734],{"class":80,"line":93},[78,1735,1736],{},">>> \"python\".upper()\n",[78,1738,1739],{"class":80,"line":100},[78,1740,1741],{},"'PYTHON'\n",[10,1743,118],{},[69,1745,1748],{"className":1746,"code":1747,"language":124,"meta":74},[122],"REPL 会直接显示表达式结果\n",[34,1749,1747],{"__ignoreMap":74},[10,1751,129],{},[14,1753,132],{"id":132},[134,1755,1756,1766],{},[49,1757,1758,1759,1762,1763,171],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1760,1761],{},"2 + 3"," 能直接看到 ",[34,1764,1765],{},"5",[49,1767,1768,1769,1771],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1770,1453],{}," 才会写到标准输出。",[14,1773,151],{"id":151},[46,1775,1776,1785],{},[49,1777,1778,1779,1781,1782,1784],{},"把提示符 ",[34,1780,1697],{}," 复制进 ",[34,1783,1151],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[49,1786,1787],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1789,174],{"id":174},[134,1791,1792,1798],{},[49,1793,1794,1795,171],{},"在 REPL 计算 ",[34,1796,1797],{},"12 * 8",[49,1799,1800,1801,1803],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1802,1453],{}," 时是否显示结果。",[10,1805,185],{},[14,1807,188],{"id":188},[10,1809,1810,1811,1813],{},"本篇目标是根据任务选择 REPL 或 ",[34,1812,1151],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,1815,195],{},{"title":74,"searchDepth":87,"depth":87,"links":1817},[1818,1819,1820,1821,1822,1823,1824,1825],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1660,"description":1826},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[206,1834,1835],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1838,"title":1839,"body":1840,"category":206,"cover":207,"description":1844,"extension":208,"meta":2015,"navigation":96,"path":2016,"pinned":211,"publishedAt":212,"seo":2017,"slug":2018,"stem":2019,"summary":2020,"tags":2021,"updatedAt":212,"visible":96,"__hash__":2024},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1841,"toc":2005},[1842,1845,1847,1850,1852,1858,1864,1866,1884,1886,1888,1933,1935,1941,1943,1945,1967,1969,1981,1983,1995,1997,1999,2002],[10,1843,1844],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1846,16],{"id":16},[10,1848,1849],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1851,22],{"id":22},[10,1853,1854],{},[26,1855],{"alt":1856,"src":1857},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1859,1860,1863],{},[34,1861,1862],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1865,44],{"id":44},[46,1867,1868,1871,1881],{},[49,1869,1870],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[49,1872,1873,1876,1877,1880],{},[34,1874,1875],{},"pwd"," 显示当前目录，",[34,1878,1879],{},"ls"," 显示目录里的文件。",[49,1882,1883],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1885,64],{"id":64},[10,1887,1554],{},[69,1889,1891],{"className":571,"code":1890,"language":573,"meta":74,"style":74},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1892,1893,1901,1908,1913,1927],{"__ignoreMap":74},[78,1894,1895,1898],{"class":80,"line":81},[78,1896,1897],{"class":580},"mkdir",[78,1899,1900],{"class":616}," python-study\n",[78,1902,1903,1906],{"class":80,"line":87},[78,1904,1905],{"class":583},"cd",[78,1907,1900],{"class":616},[78,1909,1910],{"class":80,"line":93},[78,1911,1912],{"class":583},"pwd\n",[78,1914,1915,1918,1921,1925],{"class":80,"line":100},[78,1916,1917],{"class":583},"printf",[78,1919,1920],{"class":616}," 'print(\"项目已经运行\")\\n'",[78,1922,1924],{"class":1923},"snl16"," >",[78,1926,1195],{"class":616},[78,1928,1929,1931],{"class":80,"line":106},[78,1930,671],{"class":580},[78,1932,1195],{"class":616},[10,1934,118],{},[69,1936,1939],{"className":1937,"code":1938,"language":124,"meta":74},[122],"项目已经运行\n",[34,1940,1938],{"__ignoreMap":74},[10,1942,129],{},[14,1944,132],{"id":132},[134,1946,1947,1958],{},[49,1948,1949,1951,1952,1954,1955,1957],{},[34,1950,1897],{}," 创建目录，",[34,1953,1905],{}," 改变终端当前目录，",[34,1956,1875],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[49,1959,1960,1962,1963,1966],{},[34,1961,1862],{}," 会在当前目录寻找 ",[34,1964,1965],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1968,151],{"id":151},[46,1970,1971,1978],{},[49,1972,1973,1974,1137,1976,171],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,1975,1875],{},[34,1977,1879],{},[49,1979,1980],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1982,174],{"id":174},[134,1984,1985,1992],{},[49,1986,1987,1988,1991],{},"新建 ",[34,1989,1990],{},"lesson01.py"," 并输出课程编号。",[49,1993,1994],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1996,185],{},[14,1998,188],{"id":188},[10,2000,2001],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,2003,2004],{},"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":74,"searchDepth":87,"depth":87,"links":2006},[2007,2008,2009,2010,2011,2012,2013,2014],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1839,"description":1844},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[206,2022,2023],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2026,"title":2027,"body":2028,"category":206,"cover":207,"description":2032,"extension":208,"meta":2180,"navigation":96,"path":2181,"pinned":211,"publishedAt":212,"seo":2182,"slug":2183,"stem":2184,"summary":2185,"tags":2186,"updatedAt":212,"visible":96,"__hash__":2189},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2029,"toc":2170},[2030,2033,2035,2038,2040,2046,2057,2059,2079,2081,2083,2103,2105,2111,2113,2115,2134,2136,2144,2146,2161,2163,2165,2168],[10,2031,2032],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2034,16],{"id":16},[10,2036,2037],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2039,22],{"id":22},[10,2041,2042],{},[26,2043],{"alt":2044,"src":2045},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2047,2048,2049,171,2051,2054,2055,171],{},"Python 先计算表达式，再把得到的对象交给 ",[34,2050,1453],{},[34,2052,2053],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2056,1761],{},[14,2058,44],{"id":44},[46,2060,2061,2067,2076],{},[49,2062,2063,2066],{},[34,2064,2065],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[49,2068,2069,2072,2073,171],{},[34,2070,2071],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2074,2075],{},"12",[49,2077,2078],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2080,64],{"id":64},[10,2082,67],{},[69,2084,2086],{"className":71,"code":2085,"language":73,"meta":74,"style":74},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2087,2088,2093,2098],{"__ignoreMap":74},[78,2089,2090],{"class":80,"line":81},[78,2091,2092],{},"print(42)\n",[78,2094,2095],{"class":80,"line":87},[78,2096,2097],{},"print(7 + 5)\n",[78,2099,2100],{"class":80,"line":93},[78,2101,2102],{},"print(\"Python 基础课\")\n",[10,2104,118],{},[69,2106,2109],{"className":2107,"code":2108,"language":124,"meta":74},[122],"42\n12\nPython 基础课\n",[34,2110,2108],{"__ignoreMap":74},[10,2112,129],{},[14,2114,132],{"id":132},[134,2116,2117,2125],{},[49,2118,2119,2122,2123,171],{},[34,2120,2121],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2124,2075],{},[49,2126,2127,2129,2130,2133],{},[34,2128,1453],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2131,2132],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2135,151],{"id":151},[46,2137,2138,2141],{},[49,2139,2140],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[49,2142,2143],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2145,174],{"id":174},[134,2147,2148,2151],{},[49,2149,2150],{},"分别输出一个整数、一个小数和一段文本。",[49,2152,2153,2154,2156,2157,2160],{},"比较 ",[34,2155,2053],{}," 与 ",[34,2158,2159],{},"print(\"2 + 3\")"," 的结果。",[10,2162,185],{},[14,2164,188],{"id":188},[10,2166,2167],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,2169,195],{},{"title":74,"searchDepth":87,"depth":87,"links":2171},[2172,2173,2174,2175,2176,2177,2178,2179],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2027,"description":2032},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[206,2187,2188],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2191,"title":2192,"body":2193,"category":206,"cover":207,"description":2197,"extension":208,"meta":2362,"navigation":96,"path":2363,"pinned":211,"publishedAt":212,"seo":2364,"slug":2365,"stem":2366,"summary":2367,"tags":2368,"updatedAt":212,"visible":96,"__hash__":2371},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2194,"toc":2352},[2195,2198,2200,2203,2205,2211,2214,2216,2241,2243,2245,2273,2275,2281,2283,2285,2309,2311,2326,2328,2343,2345,2347,2350],[10,2196,2197],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2199,16],{"id":16},[10,2201,2202],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2204,22],{"id":22},[10,2206,2207],{},[26,2208],{"alt":2209,"src":2210},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2212,2213],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2215,44],{"id":44},[46,2217,2218,2221,2230],{},[49,2219,2220],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[49,2222,2223,2224,2156,2226,2229],{},"变量名区分大小写，",[34,2225,40],{},[34,2227,2228],{},"Score"," 是两个名字。",[49,2231,2232,2233,2236,2237,2240],{},"使用能表达含义的名称；不要用 ",[34,2234,2235],{},"list","、",[34,2238,2239],{},"str"," 等内置名称作为普通变量名。",[14,2242,64],{"id":64},[10,2244,67],{},[69,2246,2248],{"className":71,"code":2247,"language":73,"meta":74,"style":74},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2249,2250,2255,2260,2264,2269],{"__ignoreMap":74},[78,2251,2252],{"class":80,"line":81},[78,2253,2254],{},"score = 90\n",[78,2256,2257],{"class":80,"line":87},[78,2258,2259],{},"print(score)\n",[78,2261,2262],{"class":80,"line":93},[78,2263,97],{"emptyLinePlaceholder":96},[78,2265,2266],{"class":80,"line":100},[78,2267,2268],{},"score = 95\n",[78,2270,2271],{"class":80,"line":106},[78,2272,2259],{},[10,2274,118],{},[69,2276,2279],{"className":2277,"code":2278,"language":124,"meta":74},[122],"90\n95\n",[34,2280,2278],{"__ignoreMap":74},[10,2282,129],{},[14,2284,132],{"id":132},[134,2286,2287,2296],{},[49,2288,918,2289,2292,2293,2295],{},[34,2290,2291],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2294,40],{}," 再绑定到它。",[49,2297,918,2298,2301,2302,2305,2306,171],{},[34,2299,2300],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2303,2304],{},"90"," 没有被改造成 ",[34,2307,2308],{},"95",[14,2310,151],{"id":151},[46,2312,2313,2316],{},[49,2314,2315],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[49,2317,54,2318,2236,2320,2236,2322,2325],{},[34,2319,2235],{},[34,2321,2239],{},[34,2323,2324],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2327,174],{"id":174},[134,2329,2330,2340],{},[49,2331,2332,2333,1137,2336,2339],{},"创建 ",[34,2334,2335],{},"course_name",[34,2337,2338],{},"lesson_count"," 两个变量并输出。",[49,2341,2342],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2344,185],{},[14,2346,188],{"id":188},[10,2348,2349],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,2351,195],{},{"title":74,"searchDepth":87,"depth":87,"links":2353},[2354,2355,2356,2357,2358,2359,2360,2361],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2192,"description":2197},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[206,2369,2370],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2373,"title":2374,"body":2375,"category":206,"cover":207,"description":2379,"extension":208,"meta":2545,"navigation":96,"path":2546,"pinned":211,"publishedAt":212,"seo":2547,"slug":2548,"stem":2549,"summary":2550,"tags":2551,"updatedAt":212,"visible":96,"__hash__":2554},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2376,"toc":2535},[2377,2380,2382,2385,2387,2393,2396,2398,2427,2429,2431,2477,2479,2485,2487,2489,2503,2505,2516,2518,2526,2528,2530,2533],[10,2378,2379],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2381,16],{"id":16},[10,2383,2384],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2386,22],{"id":22},[10,2388,2389],{},[26,2390],{"alt":2391,"src":2392},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2394,2395],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2397,44],{"id":44},[46,2399,2400,2410,2424],{},[49,2401,2402,2405,2406,2409],{},[34,2403,2404],{},"int"," 表示整数，",[34,2407,2408],{},"float"," 表示浮点数。",[49,2411,2412,2415,2416,2419,2420,2423],{},[34,2413,2414],{},"\u002F"," 总是进行真除法；",[34,2417,2418],{},"\u002F\u002F"," 是向下取整除法，",[34,2421,2422],{},"%"," 得到余数。",[49,2425,2426],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2428,64],{"id":64},[10,2430,67],{},[69,2432,2434],{"className":71,"code":2433,"language":73,"meta":74,"style":74},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2435,2436,2441,2446,2451,2455,2460,2465,2471],{"__ignoreMap":74},[78,2437,2438],{"class":80,"line":81},[78,2439,2440],{},"price = 25\n",[78,2442,2443],{"class":80,"line":87},[78,2444,2445],{},"count = 4\n",[78,2447,2448],{"class":80,"line":93},[78,2449,2450],{},"discount = 0.9\n",[78,2452,2453],{"class":80,"line":100},[78,2454,97],{"emptyLinePlaceholder":96},[78,2456,2457],{"class":80,"line":106},[78,2458,2459],{},"total = price * count * discount\n",[78,2461,2462],{"class":80,"line":112},[78,2463,2464],{},"average = total \u002F count\n",[78,2466,2468],{"class":80,"line":2467},7,[78,2469,2470],{},"print(total)\n",[78,2472,2474],{"class":80,"line":2473},8,[78,2475,2476],{},"print(average)\n",[10,2478,118],{},[69,2480,2483],{"className":2481,"code":2482,"language":124,"meta":74},[122],"90.0\n22.5\n",[34,2484,2482],{"__ignoreMap":74},[10,2486,129],{},[14,2488,132],{"id":132},[134,2490,2491,2497],{},[49,2492,2493,2496],{},[34,2494,2495],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[49,2498,2499,2502],{},[34,2500,2501],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2504,151],{"id":151},[46,2506,2507,2513],{},[49,2508,2509,2510,171],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2511,2512],{},"decimal.Decimal",[49,2514,2515],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2517,174],{"id":174},[134,2519,2520,2523],{},[49,2521,2522],{},"计算 137 除以 10 的商和余数。",[49,2524,2525],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2527,185],{},[14,2529,188],{"id":188},[10,2531,2532],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,2534,195],{},{"title":74,"searchDepth":87,"depth":87,"links":2536},[2537,2538,2539,2540,2541,2542,2543,2544],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2374,"description":2379},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[206,2552,2553],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2556,"title":2557,"body":2558,"category":206,"cover":207,"description":2562,"extension":208,"meta":2738,"navigation":96,"path":2739,"pinned":211,"publishedAt":212,"seo":2740,"slug":2741,"stem":2742,"summary":2743,"tags":2744,"updatedAt":212,"visible":96,"__hash__":2747},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2559,"toc":2726},[2560,2563,2565,2568,2570,2576,2586,2588,2599,2601,2603,2633,2635,2641,2643,2645,2675,2678,2681,2687,2690,2692,2700,2702,2717,2719,2721,2724],[10,2561,2562],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2564,16],{"id":16},[10,2566,2567],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2569,22],{"id":22},[10,2571,2572],{},[26,2573],{"alt":2574,"src":2575},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2577,2578,2579,2582,2583,171],{},"切片 ",[34,2580,2581],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2584,2585],{},"stop - start",[14,2587,44],{"id":44},[46,2589,2590,2593,2596],{},[49,2591,2592],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[49,2594,2595],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[49,2597,2598],{},"切片会创建新的字符串，不会修改原字符串。",[14,2600,64],{"id":64},[10,2602,67],{},[69,2604,2606],{"className":71,"code":2605,"language":73,"meta":74,"style":74},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2607,2608,2613,2618,2623,2628],{"__ignoreMap":74},[78,2609,2610],{"class":80,"line":81},[78,2611,2612],{},"language = \"Python\"\n",[78,2614,2615],{"class":80,"line":87},[78,2616,2617],{},"print(language[0])\n",[78,2619,2620],{"class":80,"line":93},[78,2621,2622],{},"print(language[-1])\n",[78,2624,2625],{"class":80,"line":100},[78,2626,2627],{},"print(language[0:3])\n",[78,2629,2630],{"class":80,"line":106},[78,2631,2632],{},"print(language + \" 3.14\")\n",[10,2634,118],{},[69,2636,2639],{"className":2637,"code":2638,"language":124,"meta":74},[122],"P\nn\nPyt\nPython 3.14\n",[34,2640,2638],{"__ignoreMap":74},[10,2642,129],{},[14,2644,132],{"id":132},[134,2646,2647,2661],{},[49,2648,2649,2650,2652,2653,2656,2657,2660],{},"字符串 ",[34,2651,206],{}," 的正索引从 ",[34,2654,2655],{},"P"," 的 0 开始，负索引从末尾 ",[34,2658,2659],{},"n"," 的 -1 开始。",[49,2662,2663,2666,2667,2670,2671,2674],{},[34,2664,2665],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2668,2669],{},"Pyt","；索引 3 的 ",[34,2672,2673],{},"h"," 不在结果中。",[309,2676,2677],{"id":2677},"再看一个具体细节",[10,2679,2680],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2682,2683],{},[26,2684],{"alt":2685,"src":2686},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2688,2689],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2691,151],{"id":151},[46,2693,2694,2697],{},[49,2695,2696],{},"把第一个字符写成索引 1，造成整体偏移一位。",[49,2698,2699],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2701,174],{"id":174},[134,2703,2704,2714],{},[49,2705,2706,2707,2710,2711,171],{},"从 ",[34,2708,2709],{},"\"programming\""," 中切出 ",[34,2712,2713],{},"\"gram\"",[49,2715,2716],{},"使用负索引取得字符串倒数第二个字符。",[10,2718,185],{},[14,2720,188],{"id":188},[10,2722,2723],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,2725,195],{},{"title":74,"searchDepth":87,"depth":87,"links":2727},[2728,2729,2730,2731,2732,2735,2736,2737],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":2733},[2734],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2557,"description":2562},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[206,2745,2746],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2749,"title":2750,"body":2751,"category":206,"cover":207,"description":2755,"extension":208,"meta":2969,"navigation":96,"path":2970,"pinned":211,"publishedAt":212,"seo":2971,"slug":2972,"stem":2973,"summary":2974,"tags":2975,"updatedAt":212,"visible":96,"__hash__":2978},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2752,"toc":2957},[2753,2756,2758,2761,2763,2769,2779,2781,2814,2816,2818,2862,2864,2870,2872,2874,2895,2897,2900,2906,2914,2916,2930,2932,2948,2950,2952,2955],[10,2754,2755],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2757,16],{"id":16},[10,2759,2760],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2762,22],{"id":22},[10,2764,2765],{},[26,2766],{"alt":2767,"src":2768},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2770,2771,2772,989,2775,2778],{},"比较表达式先产生 ",[34,2773,2774],{},"True",[34,2776,2777],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2780,44],{"id":44},[46,2782,2783,2797,2811],{},[49,2784,2785,2788,2789,2792,2793,2796],{},[34,2786,2787],{},"=="," 判断是否相等，",[34,2790,2791],{},"!="," 判断是否不等；单个 ",[34,2794,2795],{},"="," 是赋值。",[49,2798,2799,2802,2803,2806,2807,2810],{},[34,2800,2801],{},"and"," 要求两侧都为真，",[34,2804,2805],{},"or"," 只需一侧为真，",[34,2808,2809],{},"not"," 取反。",[49,2812,2813],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2815,64],{"id":64},[10,2817,67],{},[69,2819,2821],{"className":71,"code":2820,"language":73,"meta":74,"style":74},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[34,2822,2823,2828,2833,2837,2842,2847,2852,2857],{"__ignoreMap":74},[78,2824,2825],{"class":80,"line":81},[78,2826,2827],{},"age = 20\n",[78,2829,2830],{"class":80,"line":87},[78,2831,2832],{},"has_ticket = True\n",[78,2834,2835],{"class":80,"line":93},[78,2836,97],{"emptyLinePlaceholder":96},[78,2838,2839],{"class":80,"line":100},[78,2840,2841],{},"is_adult = age >= 18\n",[78,2843,2844],{"class":80,"line":106},[78,2845,2846],{},"can_enter = is_adult and has_ticket\n",[78,2848,2849],{"class":80,"line":112},[78,2850,2851],{},"print(is_adult)\n",[78,2853,2854],{"class":80,"line":2467},[78,2855,2856],{},"print(can_enter)\n",[78,2858,2859],{"class":80,"line":2473},[78,2860,2861],{},"print(not has_ticket)\n",[10,2863,118],{},[69,2865,2868],{"className":2866,"code":2867,"language":124,"meta":74},[122],"True\nTrue\nFalse\n",[34,2869,2867],{"__ignoreMap":74},[10,2871,129],{},[14,2873,132],{"id":132},[134,2875,2876,2886],{},[49,2877,2878,2881,2882,2885],{},[34,2879,2880],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2883,2884],{},"is_adult","，这一步没有任何分支跳转。",[49,2887,2888,2891,2892,2894],{},[34,2889,2890],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2893,2809],{}," 只对紧随其后的值取反。",[309,2896,2677],{"id":2677},[10,2898,2899],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2901,2902],{},[26,2903],{"alt":2904,"src":2905},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2907,2908,2910,2911,2913],{},[34,2909,2801],{}," 只有“真、真”得到真；",[34,2912,2805],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2915,151],{"id":151},[46,2917,2918,2927],{},[49,2919,2920,2921,2923,2924,2926],{},"用单个等号判断相等。",[34,2922,2795],{}," 是赋值，",[34,2925,2787],{}," 才是相等比较。",[49,2928,2929],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2931,174],{"id":174},[134,2933,2934,2941],{},[49,2935,2936,2937,2940],{},"判断数字 ",[34,2938,2939],{},"15"," 是否同时大于 10 且小于 20。",[49,2942,2943,2944,2947],{},"分别修改年龄和票据状态，记录 ",[34,2945,2946],{},"can_enter"," 的四种组合结果。",[10,2949,185],{},[14,2951,188],{"id":188},[10,2953,2954],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,2956,195],{},{"title":74,"searchDepth":87,"depth":87,"links":2958},[2959,2960,2961,2962,2963,2966,2967,2968],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":2964},[2965],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2750,"description":2755},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[206,2976,2977],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2980,"title":2981,"body":2982,"category":206,"cover":207,"description":2986,"extension":208,"meta":3154,"navigation":96,"path":3155,"pinned":211,"publishedAt":212,"seo":3156,"slug":3157,"stem":3158,"summary":3159,"tags":3160,"updatedAt":212,"visible":96,"__hash__":3162},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2983,"toc":3144},[2984,2987,2989,2992,2994,3000,3018,3020,3033,3035,3037,3071,3073,3079,3081,3083,3105,3107,3119,3121,3135,3137,3139,3142],[10,2985,2986],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2988,16],{"id":16},[10,2990,2991],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2993,22],{"id":22},[10,2995,2996],{},[26,2997],{"alt":2998,"src":2999},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3001,3002,3005,3006,3009,3010,3013,3014,3017],{},[34,3003,3004],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,3007,3008],{},"18","，程序首先得到的也是 ",[34,3011,3012],{},"\"18\"","，需要 ",[34,3015,3016],{},"int()"," 后才能按整数参与计算。",[14,3019,44],{"id":44},[46,3021,3022,3025,3030],{},[49,3023,3024],{},"提示文字应告诉用户需要输入什么。",[49,3026,3027,3029],{},[34,3028,3016],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[49,3031,3032],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3034,64],{"id":64},[10,3036,67],{},[69,3038,3040],{"className":71,"code":3039,"language":73,"meta":74,"style":74},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,3041,3042,3047,3052,3057,3061,3066],{"__ignoreMap":74},[78,3043,3044],{"class":80,"line":81},[78,3045,3046],{},"name = input(\"请输入姓名：\")\n",[78,3048,3049],{"class":80,"line":87},[78,3050,3051],{},"age_text = input(\"请输入年龄：\")\n",[78,3053,3054],{"class":80,"line":93},[78,3055,3056],{},"age = int(age_text)\n",[78,3058,3059],{"class":80,"line":100},[78,3060,97],{"emptyLinePlaceholder":96},[78,3062,3063],{"class":80,"line":106},[78,3064,3065],{},"print(\"你好，\" + name)\n",[78,3067,3068],{"class":80,"line":112},[78,3069,3070],{},"print(age + 1)\n",[10,3072,118],{},[69,3074,3077],{"className":3075,"code":3076,"language":124,"meta":74},[122],"根据输入显示姓名，并输出下一年的年龄\n",[34,3078,3076],{"__ignoreMap":74},[10,3080,129],{},[14,3082,132],{"id":132},[134,3084,3085,3095],{},[49,3086,3087,3088,3090,3091,3094],{},"两次 ",[34,3089,3004],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3092,3093],{},"age_text"," 用来提醒这仍是文本。",[49,3096,3097,3100,3101,3104],{},[34,3098,3099],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3102,3103],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3106,151],{"id":151},[46,3108,3109,3116],{},[49,3110,3111,3112,3115],{},"直接计算 ",[34,3113,3114],{},"input(...) + 1","，忽略输入结果是字符串。",[49,3117,3118],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3120,174],{"id":174},[134,3122,3123,3126],{},[49,3124,3125],{},"接收两个整数并输出它们的和。",[49,3127,1700,3128,3131,3132,3134],{},[34,3129,3130],{},"18.5"," 给 ",[34,3133,3016],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3136,185],{},[14,3138,188],{"id":188},[10,3140,3141],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,3143,195],{},{"title":74,"searchDepth":87,"depth":87,"links":3145},[3146,3147,3148,3149,3150,3151,3152,3153],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2981,"description":2986},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[206,2324,3161],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3164,"title":3165,"body":3166,"category":206,"cover":207,"description":3170,"extension":208,"meta":3330,"navigation":96,"path":3331,"pinned":211,"publishedAt":212,"seo":3332,"slug":3333,"stem":3334,"summary":3335,"tags":3336,"updatedAt":212,"visible":96,"__hash__":3338},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3167,"toc":3320},[3168,3171,3173,3176,3178,3184,3191,3193,3207,3209,3211,3250,3252,3258,3260,3262,3281,3283,3298,3300,3311,3313,3315,3318],[10,3169,3170],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3172,16],{"id":16},[10,3174,3175],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3177,22],{"id":22},[10,3179,3180],{},[26,3181],{"alt":3182,"src":3183},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3185,3186,3187,3190],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3188,3189],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3192,44],{"id":44},[46,3194,3195,3198,3201],{},[49,3196,3197],{},"列表使用方括号，元素之间用逗号分隔。",[49,3199,3200],{},"列表可变，可以替换、追加和删除元素。",[49,3202,3203,3204,171],{},"访问不存在的索引会产生 ",[34,3205,3206],{},"IndexError",[14,3208,64],{"id":64},[10,3210,67],{},[69,3212,3214],{"className":71,"code":3213,"language":73,"meta":74,"style":74},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3215,3216,3221,3226,3230,3235,3240,3245],{"__ignoreMap":74},[78,3217,3218],{"class":80,"line":81},[78,3219,3220],{},"scores = [82, 90, 76]\n",[78,3222,3223],{"class":80,"line":87},[78,3224,3225],{},"print(scores[0])\n",[78,3227,3228],{"class":80,"line":93},[78,3229,97],{"emptyLinePlaceholder":96},[78,3231,3232],{"class":80,"line":100},[78,3233,3234],{},"scores[1] = 95\n",[78,3236,3237],{"class":80,"line":106},[78,3238,3239],{},"scores.append(88)\n",[78,3241,3242],{"class":80,"line":112},[78,3243,3244],{},"print(scores)\n",[78,3246,3247],{"class":80,"line":2467},[78,3248,3249],{},"print(len(scores))\n",[10,3251,118],{},[69,3253,3256],{"className":3254,"code":3255,"language":124,"meta":74},[122],"82\n[82, 95, 76, 88]\n4\n",[34,3257,3255],{"__ignoreMap":74},[10,3259,129],{},[14,3261,132],{"id":132},[134,3263,3264,3267],{},[49,3265,3266],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[49,3268,3269,3272,3273,3276,3277,3280],{},[34,3270,3271],{},"scores[1] = 95"," 替换第二个位置，",[34,3274,3275],{},"append(88)"," 在末尾增加新位置，",[34,3278,3279],{},"len()"," 因而从 3 变为 4。",[14,3282,151],{"id":151},[46,3284,3285,3295],{},[49,3286,3287,3288,3291,3292,171],{},"访问 ",[34,3289,3290],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3293,3294],{},"len(scores) - 1",[49,3296,3297],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3299,174],{"id":174},[134,3301,3302,3305],{},[49,3303,3304],{},"建立三项学习任务列表，再追加第四项。",[49,3306,3307,3308,3310],{},"修改第二项，并用 ",[34,3309,3279],{}," 检查元素数量。",[10,3312,185],{},[14,3314,188],{"id":188},[10,3316,3317],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,3319,195],{},{"title":74,"searchDepth":87,"depth":87,"links":3321},[3322,3323,3324,3325,3326,3327,3328,3329],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3165,"description":3170},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[206,3337,219],"列表","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3340,"title":3341,"body":3342,"category":206,"cover":207,"description":3346,"extension":208,"meta":3487,"navigation":96,"path":3488,"pinned":211,"publishedAt":212,"seo":3489,"slug":3490,"stem":3491,"summary":3492,"tags":3493,"updatedAt":212,"visible":96,"__hash__":3495},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3343,"toc":3477},[3344,3347,3349,3352,3354,3360,3363,3365,3376,3378,3380,3414,3416,3422,3424,3426,3440,3442,3454,3456,3468,3470,3472,3475],[10,3345,3346],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3348,16],{"id":16},[10,3350,3351],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3353,22],{"id":22},[10,3355,3356],{},[26,3357],{"alt":3358,"src":3359},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3361,3362],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3364,44],{"id":44},[46,3366,3367,3370,3373],{},[49,3368,3369],{},"元组常用来表达固定数量、固定含义的一组值。",[49,3371,3372],{},"只有一个元素的元组必须保留尾随逗号。",[49,3374,3375],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3377,64],{"id":64},[10,3379,67],{},[69,3381,3383],{"className":71,"code":3382,"language":73,"meta":74,"style":74},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3384,3385,3390,3395,3400,3404,3409],{"__ignoreMap":74},[78,3386,3387],{"class":80,"line":81},[78,3388,3389],{},"point = (120, 80)\n",[78,3391,3392],{"class":80,"line":87},[78,3393,3394],{},"print(point[0])\n",[78,3396,3397],{"class":80,"line":93},[78,3398,3399],{},"print(point[1])\n",[78,3401,3402],{"class":80,"line":100},[78,3403,97],{"emptyLinePlaceholder":96},[78,3405,3406],{"class":80,"line":106},[78,3407,3408],{},"single = (5,)\n",[78,3410,3411],{"class":80,"line":112},[78,3412,3413],{},"print(single)\n",[10,3415,118],{},[69,3417,3420],{"className":3418,"code":3419,"language":124,"meta":74},[122],"120\n80\n(5,)\n",[34,3421,3419],{"__ignoreMap":74},[10,3423,129],{},[14,3425,132],{"id":132},[134,3427,3428,3434],{},[49,3429,3430,3433],{},[34,3431,3432],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[49,3435,3436,3439],{},[34,3437,3438],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3441,151],{"id":151},[46,3443,3444,3451],{},[49,3445,3446,3447,3450],{},"把 ",[34,3448,3449],{},"(5)"," 当作元组，实际它仍是整数。",[49,3452,3453],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3455,174],{"id":174},[134,3457,3458,3461],{},[49,3459,3460],{},"用元组表示宽度和高度。",[49,3462,2153,3463,2156,3465,3467],{},[34,3464,3449],{},[34,3466,3438],{}," 的类型。",[10,3469,185],{},[14,3471,188],{"id":188},[10,3473,3474],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,3476,195],{},{"title":74,"searchDepth":87,"depth":87,"links":3478},[3479,3480,3481,3482,3483,3484,3485,3486],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3341,"description":3346},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[206,3494,219],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":4,"title":5,"body":3497,"category":206,"cover":207,"description":12,"extension":208,"meta":3622,"navigation":96,"path":210,"pinned":211,"publishedAt":212,"seo":3623,"slug":214,"stem":215,"summary":216,"tags":3624,"updatedAt":212,"visible":96,"__hash__":220},{"type":7,"value":3498,"toc":3612},[3499,3501,3503,3505,3507,3511,3517,3519,3529,3531,3533,3561,3563,3568,3570,3572,3582,3584,3596,3598,3604,3606,3608,3610],[10,3500,12],{},[14,3502,16],{"id":16},[10,3504,19],{},[14,3506,22],{"id":22},[10,3508,3509],{},[26,3510],{"alt":28,"src":29},[10,3512,32,3513,37,3515,41],{},[34,3514,36],{},[34,3516,40],{},[14,3518,44],{"id":44},[46,3520,3521,3523,3527],{},[49,3522,51],{},[49,3524,54,3525,58],{},[34,3526,57],{},[49,3528,61],{},[14,3530,64],{"id":64},[10,3532,67],{},[69,3534,3535],{"className":71,"code":72,"language":73,"meta":74,"style":74},[34,3536,3537,3541,3545,3549,3553,3557],{"__ignoreMap":74},[78,3538,3539],{"class":80,"line":81},[78,3540,84],{},[78,3542,3543],{"class":80,"line":87},[78,3544,90],{},[78,3546,3547],{"class":80,"line":93},[78,3548,97],{"emptyLinePlaceholder":96},[78,3550,3551],{"class":80,"line":100},[78,3552,103],{},[78,3554,3555],{"class":80,"line":106},[78,3556,109],{},[78,3558,3559],{"class":80,"line":112},[78,3560,115],{},[10,3562,118],{},[69,3564,3566],{"className":3565,"code":123,"language":124,"meta":74},[122],[34,3567,123],{"__ignoreMap":74},[10,3569,129],{},[14,3571,132],{"id":132},[134,3573,3574,3576],{},[49,3575,138],{},[49,3577,141,3578,144,3580,148],{},[34,3579,40],{},[34,3581,147],{},[14,3583,151],{"id":151},[46,3585,3586,3590],{},[49,3587,156,3588,160],{},[34,3589,159],{},[49,3591,163,3592,167,3594,171],{},[34,3593,166],{},[34,3595,170],{},[14,3597,174],{"id":174},[134,3599,3600,3602],{},[49,3601,179],{},[49,3603,182],{},[10,3605,185],{},[14,3607,188],{"id":188},[10,3609,191],{},[193,3611,195],{},{"title":74,"searchDepth":87,"depth":87,"links":3613},[3614,3615,3616,3617,3618,3619,3620,3621],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5,"description":12},[206,218,219],{"id":3626,"title":3627,"body":3628,"category":206,"cover":207,"description":3632,"extension":208,"meta":3781,"navigation":96,"path":3782,"pinned":211,"publishedAt":212,"seo":3783,"slug":3784,"stem":3785,"summary":3786,"tags":3787,"updatedAt":212,"visible":96,"__hash__":3789},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3629,"toc":3771},[3630,3633,3635,3638,3640,3646,3649,3651,3670,3672,3674,3708,3710,3716,3718,3720,3735,3737,3749,3751,3762,3764,3766,3769],[10,3631,3632],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3634,16],{"id":16},[10,3636,3637],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3639,22],{"id":22},[10,3641,3642],{},[26,3643],{"alt":3644,"src":3645},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3647,3648],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3650,44],{"id":44},[46,3652,3653,3656,3659],{},[49,3654,3655],{},"集合中的元素不重复。",[49,3657,3658],{},"集合是无序容器，不要依赖打印顺序或索引。",[49,3660,3661,3662,3665,3666,3669],{},"创建空集合必须写 ",[34,3663,3664],{},"set()","；",[34,3667,3668],{},"{}"," 创建的是空字典。",[14,3671,64],{"id":64},[10,3673,67],{},[69,3675,3677],{"className":71,"code":3676,"language":73,"meta":74,"style":74},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3678,3679,3684,3689,3693,3698,3703],{"__ignoreMap":74},[78,3680,3681],{"class":80,"line":81},[78,3682,3683],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[78,3685,3686],{"class":80,"line":87},[78,3687,3688],{},"right = {\"Python\", \"Docker\"}\n",[78,3690,3691],{"class":80,"line":93},[78,3692,97],{"emptyLinePlaceholder":96},[78,3694,3695],{"class":80,"line":100},[78,3696,3697],{},"print(left & right)\n",[78,3699,3700],{"class":80,"line":106},[78,3701,3702],{},"print(left | right)\n",[78,3704,3705],{"class":80,"line":112},[78,3706,3707],{},"print(\"Git\" in left)\n",[10,3709,118],{},[69,3711,3714],{"className":3712,"code":3713,"language":124,"meta":74},[122],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3715,3713],{"__ignoreMap":74},[10,3717,129],{},[14,3719,132],{"id":132},[134,3721,3722,3725],{},[49,3723,3724],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[49,3726,3727,3730,3731,3734],{},[34,3728,3729],{},"&"," 计算交集，",[34,3732,3733],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3736,151],{"id":151},[46,3738,3739,3746],{},[49,3740,54,3741,3743,3744,171],{},[34,3742,3668],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3745,3664],{},[49,3747,3748],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3750,174],{"id":174},[134,3752,3753,3759],{},[49,3754,3755,3756,3758],{},"把包含重复标签的列表交给 ",[34,3757,3664],{}," 去重。",[49,3760,3761],{},"计算两组课程标签的交集和差集。",[10,3763,185],{},[14,3765,188],{"id":188},[10,3767,3768],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,3770,195],{},{"title":74,"searchDepth":87,"depth":87,"links":3772},[3773,3774,3775,3776,3777,3778,3779,3780],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3627,"description":3632},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[206,3788,219],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3791,"title":3792,"body":3793,"category":206,"cover":207,"description":3797,"extension":208,"meta":3995,"navigation":96,"path":3996,"pinned":211,"publishedAt":212,"seo":3997,"slug":3998,"stem":3999,"summary":4000,"tags":4001,"updatedAt":212,"visible":96,"__hash__":4004},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3794,"toc":3983},[3795,3798,3800,3803,3805,3811,3821,3823,3840,3842,3844,3894,3896,3902,3904,3906,3928,3930,3933,3939,3942,3944,3957,3959,3974,3976,3978,3981],[10,3796,3797],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3799,16],{"id":16},[10,3801,3802],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3804,22],{"id":22},[10,3806,3807],{},[26,3808],{"alt":3809,"src":3810},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3812,3813,3816,3817,3820],{},[34,3814,3815],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3818,3819],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3822,44],{"id":44},[46,3824,3825,3834,3837],{},[49,3826,3827,3829,3830,3833],{},[34,3828,2787],{}," 比较内容是否相等，",[34,3831,3832],{},"is"," 比较是否为同一个对象。",[49,3835,3836],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[49,3838,3839],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3841,64],{"id":64},[10,3843,67],{},[69,3845,3847],{"className":71,"code":3846,"language":73,"meta":74,"style":74},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3848,3849,3854,3859,3864,3868,3873,3878,3883,3888],{"__ignoreMap":74},[78,3850,3851],{"class":80,"line":81},[78,3852,3853],{},"tasks = [\"变量\", \"字符串\"]\n",[78,3855,3856],{"class":80,"line":87},[78,3857,3858],{},"shared = tasks\n",[78,3860,3861],{"class":80,"line":93},[78,3862,3863],{},"backup = tasks.copy()\n",[78,3865,3866],{"class":80,"line":100},[78,3867,97],{"emptyLinePlaceholder":96},[78,3869,3870],{"class":80,"line":106},[78,3871,3872],{},"tasks.append(\"列表\")\n",[78,3874,3875],{"class":80,"line":112},[78,3876,3877],{},"print(shared)\n",[78,3879,3880],{"class":80,"line":2467},[78,3881,3882],{},"print(backup)\n",[78,3884,3885],{"class":80,"line":2473},[78,3886,3887],{},"print(tasks is shared)\n",[78,3889,3891],{"class":80,"line":3890},9,[78,3892,3893],{},"print(tasks is backup)\n",[10,3895,118],{},[69,3897,3900],{"className":3898,"code":3899,"language":124,"meta":74},[122],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3901,3899],{"__ignoreMap":74},[10,3903,129],{},[14,3905,132],{"id":132},[134,3907,3908,3914],{},[49,3909,3910,3913],{},[34,3911,3912],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[49,3915,3916,3919,3920,3923,3924,3927],{},[34,3917,3918],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3921,3922],{},"shared"," 能观察到变化，",[34,3925,3926],{},"backup"," 不会。",[309,3929,2677],{"id":2677},[10,3931,3932],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3934,3935],{},[26,3936],{"alt":3937,"src":3938},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3940,3941],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3943,151],{"id":151},[46,3945,3946,3954],{},[49,3947,3948,3949,3951,3952,171],{},"用 ",[34,3950,2787],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,3953,3832],{},[49,3955,3956],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3958,174],{"id":174},[134,3960,3961,3964],{},[49,3962,3963],{},"让两个变量引用同一个字典并修改其中一个。",[49,3965,54,3966,3969,3970,1137,3972,171],{},[34,3967,3968],{},"copy()"," 创建外层副本，再比较 ",[34,3971,3832],{},[34,3973,2787],{},[10,3975,185],{},[14,3977,188],{"id":188},[10,3979,3980],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,3982,195],{},{"title":74,"searchDepth":87,"depth":87,"links":3984},[3985,3986,3987,3988,3989,3992,3993,3994],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":3990},[3991],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3792,"description":3797},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[206,4002,4003],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4006,"title":4007,"body":4008,"category":206,"cover":207,"description":4012,"extension":208,"meta":4225,"navigation":96,"path":4226,"pinned":211,"publishedAt":212,"seo":4227,"slug":4228,"stem":4229,"summary":4230,"tags":4231,"updatedAt":212,"visible":96,"__hash__":4233},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4009,"toc":4212},[4010,4013,4015,4018,4020,4026,4036,4038,4049,4051,4053,4106,4108,4114,4116,4118,4136,4138,4141,4147,4155,4158,4161,4167,4173,4175,4193,4195,4203,4205,4207,4210],[10,4011,4012],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4014,16],{"id":16},[10,4016,4017],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4019,22],{"id":22},[10,4021,4022],{},[26,4023],{"alt":4024,"src":4025},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4027,4028,2236,4030,2236,4033,4035],{},[34,4029,1136],{},[34,4031,4032],{},"elif",[34,4034,1140],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4037,44],{"id":44},[46,4039,4040,4043,4046],{},[49,4041,4042],{},"冒号表示接下来开始一个代码块。",[49,4044,4045],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[49,4047,4048],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4050,64],{"id":64},[10,4052,67],{},[69,4054,4056],{"className":71,"code":4055,"language":73,"meta":74,"style":74},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4057,4058,4063,4067,4072,4077,4082,4087,4091,4096,4100],{"__ignoreMap":74},[78,4059,4060],{"class":80,"line":81},[78,4061,4062],{},"score = int(input(\"请输入分数：\"))\n",[78,4064,4065],{"class":80,"line":87},[78,4066,97],{"emptyLinePlaceholder":96},[78,4068,4069],{"class":80,"line":93},[78,4070,4071],{},"if score >= 90:\n",[78,4073,4074],{"class":80,"line":100},[78,4075,4076],{},"    level = \"优秀\"\n",[78,4078,4079],{"class":80,"line":106},[78,4080,4081],{},"elif score >= 60:\n",[78,4083,4084],{"class":80,"line":112},[78,4085,4086],{},"    level = \"合格\"\n",[78,4088,4089],{"class":80,"line":2467},[78,4090,1126],{},[78,4092,4093],{"class":80,"line":2473},[78,4094,4095],{},"    level = \"需要继续学习\"\n",[78,4097,4098],{"class":80,"line":3890},[78,4099,97],{"emptyLinePlaceholder":96},[78,4101,4103],{"class":80,"line":4102},10,[78,4104,4105],{},"print(level)\n",[10,4107,118],{},[69,4109,4112],{"className":4110,"code":4111,"language":124,"meta":74},[122],"输入 85 时输出：合格\n",[34,4113,4111],{"__ignoreMap":74},[10,4115,129],{},[14,4117,132],{"id":132},[134,4119,4120,4127],{},[49,4121,4122,4123,4126],{},"输入先转换为整数，程序从 ",[34,4124,4125],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[49,4128,4129,4132,4133,4135],{},[34,4130,4131],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4134,1140],{}," 被跳过；最终三个分支只会选择一个。",[309,4137,2677],{"id":2677},[10,4139,4140],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4142,4143],{},[26,4144],{"alt":4145,"src":4146},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4148,4149,4151,4152,4154],{},[34,4150,4125],{}," 必须放在 ",[34,4153,4131],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[309,4156,2677],{"id":4157},"再看一个具体细节-1",[10,4159,4160],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4162,4163],{},[26,4164],{"alt":4165,"src":4166},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4168,4169,4170,4172],{},"同一缩进层级属于同一个代码块；回到 ",[34,4171,1136],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4174,151],{"id":151},[46,4176,4177,4183],{},[49,4178,4179,4180,4182],{},"先写 ",[34,4181,4131],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[49,4184,4185,4186,4188,4189,4192],{},"混用多个独立 ",[34,4187,1136],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4190,4191],{},"if\u002Felif\u002Felse"," 链。",[14,4194,174],{"id":174},[134,4196,4197,4200],{},[49,4198,4199],{},"根据温度输出“冷、适中、热”三个等级。",[49,4201,4202],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4204,185],{},[14,4206,188],{"id":188},[10,4208,4209],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,4211,195],{},{"title":74,"searchDepth":87,"depth":87,"links":4213},[4214,4215,4216,4217,4218,4222,4223,4224],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":4219},[4220,4221],{"id":2677,"depth":93,"text":2677},{"id":4157,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4007,"description":4012},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[206,1136,4232],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4235,"title":4236,"body":4237,"category":206,"cover":207,"description":4241,"extension":208,"meta":4407,"navigation":96,"path":4408,"pinned":211,"publishedAt":212,"seo":4409,"slug":4410,"stem":4411,"summary":4412,"tags":4413,"updatedAt":212,"visible":96,"__hash__":4415},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4238,"toc":4395},[4239,4242,4244,4247,4249,4255,4261,4263,4278,4280,4282,4320,4322,4328,4330,4332,4347,4349,4352,4358,4364,4366,4374,4376,4386,4388,4390,4393],[10,4240,4241],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4243,16],{"id":16},[10,4245,4246],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4248,22],{"id":22},[10,4250,4251],{},[26,4252],{"alt":4253,"src":4254},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4256,4257,4260],{},[34,4258,4259],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4262,44],{"id":44},[46,4264,4265,4268,4271],{},[49,4266,4267],{},"进入循环前先准备参与条件判断的状态。",[49,4269,4270],{},"循环体中必须有机会让条件变为假。",[49,4272,4273,4274,4277],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4275,4276],{},"for"," 通常更直接。",[14,4279,64],{"id":64},[10,4281,67],{},[69,4283,4285],{"className":71,"code":4284,"language":73,"meta":74,"style":74},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4286,4287,4292,4296,4301,4306,4311,4315],{"__ignoreMap":74},[78,4288,4289],{"class":80,"line":81},[78,4290,4291],{},"count = 1\n",[78,4293,4294],{"class":80,"line":87},[78,4295,97],{"emptyLinePlaceholder":96},[78,4297,4298],{"class":80,"line":93},[78,4299,4300],{},"while count \u003C= 3:\n",[78,4302,4303],{"class":80,"line":100},[78,4304,4305],{},"    print(\"第\", count, \"次练习\")\n",[78,4307,4308],{"class":80,"line":106},[78,4309,4310],{},"    count = count + 1\n",[78,4312,4313],{"class":80,"line":112},[78,4314,97],{"emptyLinePlaceholder":96},[78,4316,4317],{"class":80,"line":2467},[78,4318,4319],{},"print(\"练习结束\")\n",[10,4321,118],{},[69,4323,4326],{"className":4324,"code":4325,"language":124,"meta":74},[122],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4327,4325],{"__ignoreMap":74},[10,4329,129],{},[14,4331,132],{"id":132},[134,4333,4334,4341],{},[49,4335,4336,4337,4340],{},"进入循环前 ",[34,4338,4339],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[49,4342,4343,4344,4346],{},"循环体末尾把 ",[34,4345,4339],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[309,4348,2677],{"id":2677},[10,4350,4351],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4353,4354],{},[26,4355],{"alt":4356,"src":4357},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4359,4360,4361,4363],{},"第4次检查时 ",[34,4362,4339],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4365,151],{"id":151},[46,4367,4368,4371],{},[49,4369,4370],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[49,4372,4373],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4375,174],{"id":174},[134,4377,4378,4383],{},[49,4379,54,4380,4382],{},[34,4381,4259],{}," 输出 1 到 5。",[49,4384,4385],{},"计算 1 到 10 的累加和。",[10,4387,185],{},[14,4389,188],{"id":188},[10,4391,4392],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,4394,195],{},{"title":74,"searchDepth":87,"depth":87,"links":4396},[4397,4398,4399,4400,4401,4404,4405,4406],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":4402},[4403],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4236,"description":4241},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[206,4259,4414],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4417,"title":4418,"body":4419,"category":206,"cover":207,"description":4423,"extension":208,"meta":4571,"navigation":96,"path":4572,"pinned":211,"publishedAt":212,"seo":4573,"slug":4574,"stem":4575,"summary":4576,"tags":4577,"updatedAt":212,"visible":96,"__hash__":4579},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4420,"toc":4561},[4421,4424,4426,4429,4431,4437,4442,4444,4458,4460,4462,4500,4502,4508,4510,4512,4529,4531,4539,4541,4552,4554,4556,4559],[10,4422,4423],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4425,16],{"id":16},[10,4427,4428],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4430,22],{"id":22},[10,4432,4433],{},[26,4434],{"alt":4435,"src":4436},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4438,4439,4441],{},[34,4440,4276],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4443,44],{"id":44},[46,4445,4446,4452,4455],{},[49,4447,4448,4451],{},[34,4449,4450],{},"range(1, 4)"," 包含 1，不包含 4。",[49,4453,4454],{},"只需要元素时直接遍历元素，不必手工维护索引。",[49,4456,4457],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4459,64],{"id":64},[10,4461,67],{},[69,4463,4465],{"className":71,"code":4464,"language":73,"meta":74,"style":74},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4466,4467,4472,4476,4481,4486,4490,4495],{"__ignoreMap":74},[78,4468,4469],{"class":80,"line":81},[78,4470,4471],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[78,4473,4474],{"class":80,"line":87},[78,4475,97],{"emptyLinePlaceholder":96},[78,4477,4478],{"class":80,"line":93},[78,4479,4480],{},"for course in courses:\n",[78,4482,4483],{"class":80,"line":100},[78,4484,4485],{},"    print(course)\n",[78,4487,4488],{"class":80,"line":106},[78,4489,97],{"emptyLinePlaceholder":96},[78,4491,4492],{"class":80,"line":112},[78,4493,4494],{},"for number in range(1, 4):\n",[78,4496,4497],{"class":80,"line":2467},[78,4498,4499],{},"    print(number)\n",[10,4501,118],{},[69,4503,4506],{"className":4504,"code":4505,"language":124,"meta":74},[122],"变量\n字符串\n列表\n1\n2\n3\n",[34,4507,4505],{"__ignoreMap":74},[10,4509,129],{},[14,4511,132],{"id":132},[134,4513,4514,4524],{},[49,4515,4516,4517,4519,4520,4523],{},"第一个 ",[34,4518,4276],{}," 依次从列表取得字符串，循环变量 ",[34,4521,4522],{},"course"," 每轮重新绑定。",[49,4525,4526,4528],{},[34,4527,4450],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4530,151],{"id":151},[46,4532,4533,4536],{},[49,4534,4535],{},"只需要元素却手工维护索引，增加越界风险。",[49,4537,4538],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4540,174],{"id":174},[134,4542,4543,4546],{},[49,4544,4545],{},"逐项输出一个字符串中的字符。",[49,4547,54,4548,4551],{},[34,4549,4550],{},"range()"," 输出 2、4、6、8。",[10,4553,185],{},[14,4555,188],{"id":188},[10,4557,4558],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,4560,195],{},{"title":74,"searchDepth":87,"depth":87,"links":4562},[4563,4564,4565,4566,4567,4568,4569,4570],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4418,"description":4423},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[206,4276,4578],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4581,"title":4582,"body":4583,"category":206,"cover":207,"description":4587,"extension":208,"meta":4761,"navigation":96,"path":4762,"pinned":211,"publishedAt":212,"seo":4763,"slug":4764,"stem":4765,"summary":4766,"tags":4767,"updatedAt":212,"visible":96,"__hash__":4768},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4584,"toc":4751},[4585,4588,4590,4593,4595,4601,4611,4613,4632,4634,4636,4688,4690,4696,4698,4700,4714,4716,4732,4734,4742,4744,4746,4749],[10,4586,4587],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4589,16],{"id":16},[10,4591,4592],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4594,22],{"id":22},[10,4596,4597],{},[26,4598],{"alt":4599,"src":4600},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4602,4603,4606,4607,4610],{},[34,4604,4605],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4608,4609],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4612,44],{"id":44},[46,4614,4615,4618,4626],{},[49,4616,4617],{},"先写普通循环，再在确有需要时加入流程控制语句。",[49,4619,4620,4622,4623,4625],{},[34,4621,4605],{}," 前要确认不会跳过 ",[34,4624,4259],{}," 循环中的状态更新。",[49,4627,4628,4629,4631],{},"多层嵌套中 ",[34,4630,4609],{}," 只结束它所在的最内层循环。",[14,4633,64],{"id":64},[10,4635,67],{},[69,4637,4639],{"className":71,"code":4638,"language":73,"meta":74,"style":74},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,4640,4641,4646,4650,4655,4660,4665,4670,4675,4679,4683],{"__ignoreMap":74},[78,4642,4643],{"class":80,"line":81},[78,4644,4645],{},"numbers = [3, -1, 0, 8, 12]\n",[78,4647,4648],{"class":80,"line":87},[78,4649,97],{"emptyLinePlaceholder":96},[78,4651,4652],{"class":80,"line":93},[78,4653,4654],{},"for number in numbers:\n",[78,4656,4657],{"class":80,"line":100},[78,4658,4659],{},"    if number \u003C 0:\n",[78,4661,4662],{"class":80,"line":106},[78,4663,4664],{},"        continue\n",[78,4666,4667],{"class":80,"line":112},[78,4668,4669],{},"    if number == 0:\n",[78,4671,4672],{"class":80,"line":2467},[78,4673,4674],{},"        break\n",[78,4676,4677],{"class":80,"line":2473},[78,4678,4499],{},[78,4680,4681],{"class":80,"line":3890},[78,4682,97],{"emptyLinePlaceholder":96},[78,4684,4685],{"class":80,"line":4102},[78,4686,4687],{},"print(\"循环结束\")\n",[10,4689,118],{},[69,4691,4694],{"className":4692,"code":4693,"language":124,"meta":74},[122],"3\n循环结束\n",[34,4695,4693],{"__ignoreMap":74},[10,4697,129],{},[14,4699,132],{"id":132},[134,4701,4702,4708],{},[49,4703,4704,4705,4707],{},"遇到 -1 时 ",[34,4706,4605],{}," 立即结束本轮，后面的判断和输出都不执行。",[49,4709,4710,4711,4713],{},"遇到 0 时 ",[34,4712,4609],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4715,151],{"id":151},[46,4717,4718,4723],{},[49,4719,3446,4720,4722],{},[34,4721,4605],{}," 当作结束循环，实际它只跳到下一轮。",[49,4724,4725,4726,4728,4729,4731],{},"在 ",[34,4727,4259],{}," 中把状态更新放在可能被 ",[34,4730,4605],{}," 跳过的位置，造成无限循环。",[14,4733,174],{"id":174},[134,4735,4736,4739],{},[49,4737,4738],{},"跳过列表中的空字符串并输出其他内容。",[49,4740,4741],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4743,185],{},[14,4745,188],{"id":188},[10,4747,4748],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,4750,195],{},{"title":74,"searchDepth":87,"depth":87,"links":4752},[4753,4754,4755,4756,4757,4758,4759,4760],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4582,"description":4587},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[206,4609,4605],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4770,"title":4771,"body":4772,"category":206,"cover":207,"description":4776,"extension":208,"meta":4947,"navigation":96,"path":4948,"pinned":211,"publishedAt":212,"seo":4949,"slug":4950,"stem":4951,"summary":4952,"tags":4953,"updatedAt":212,"visible":96,"__hash__":4956},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4773,"toc":4935},[4774,4777,4779,4782,4784,4790,4793,4795,4819,4821,4823,4857,4859,4865,4867,4869,4886,4888,4891,4897,4900,4902,4916,4918,4926,4928,4930,4933],[10,4775,4776],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4778,16],{"id":16},[10,4780,4781],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4783,22],{"id":22},[10,4785,4786],{},[26,4787],{"alt":4788,"src":4789},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4791,4792],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4794,44],{"id":44},[46,4796,4797,4800,4803],{},[49,4798,4799],{},"每增加一层嵌套，阅读成本都会上升。",[49,4801,4802],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[49,4804,4805,4806,2236,4809,4812,4813,2236,4816,171],{},"变量名使用 ",[34,4807,4808],{},"row",[34,4810,4811],{},"cell"," 等层级含义，避免全部写成 ",[34,4814,4815],{},"i",[34,4817,4818],{},"j",[14,4820,64],{"id":64},[10,4822,67],{},[69,4824,4826],{"className":71,"code":4825,"language":73,"meta":74,"style":74},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4827,4828,4833,4837,4842,4847,4852],{"__ignoreMap":74},[78,4829,4830],{"class":80,"line":81},[78,4831,4832],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[78,4834,4835],{"class":80,"line":87},[78,4836,97],{"emptyLinePlaceholder":96},[78,4838,4839],{"class":80,"line":93},[78,4840,4841],{},"for row in table:\n",[78,4843,4844],{"class":80,"line":100},[78,4845,4846],{},"    for cell in row:\n",[78,4848,4849],{"class":80,"line":106},[78,4850,4851],{},"        print(cell)\n",[78,4853,4854],{"class":80,"line":112},[78,4855,4856],{},"    print(\"一行结束\")\n",[10,4858,118],{},[69,4860,4863],{"className":4861,"code":4862,"language":124,"meta":74},[122],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4864,4862],{"__ignoreMap":74},[10,4866,129],{},[14,4868,132],{"id":132},[134,4870,4871,4883],{},[49,4872,4873,4874,4876,4877,1137,4880,171],{},"外层变量 ",[34,4875,4808],{}," 先引用第一行列表，内层才依次处理 ",[34,4878,4879],{},"A1",[34,4881,4882],{},"A2",[49,4884,4885],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[309,4887,2677],{"id":2677},[10,4889,4890],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4892,4893],{},[26,4894],{"alt":4895,"src":4896},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4898,4899],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4901,151],{"id":151},[46,4903,4904,4913],{},[49,4905,4906,4907,989,4910,4912],{},"把两层循环变量都叫 ",[34,4908,4909],{},"item",[34,4911,4815],{},"，难以确认当前层级。",[49,4914,4915],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4917,174],{"id":174},[134,4919,4920,4923],{},[49,4921,4922],{},"打印一个 2×3 数字表。",[49,4924,4925],{},"在内层增加条件，只输出大于 3 的元素。",[10,4927,185],{},[14,4929,188],{"id":188},[10,4931,4932],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,4934,195],{},{"title":74,"searchDepth":87,"depth":87,"links":4936},[4937,4938,4939,4940,4941,4944,4945,4946],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":4942},[4943],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4771,"description":4776},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[206,4954,4955],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4958,"title":4959,"body":4960,"category":206,"cover":207,"description":4964,"extension":208,"meta":5102,"navigation":96,"path":5103,"pinned":211,"publishedAt":212,"seo":5104,"slug":5105,"stem":5106,"summary":5107,"tags":5108,"updatedAt":212,"visible":96,"__hash__":5111},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4961,"toc":5092},[4962,4965,4967,4970,4972,4978,4981,4983,4994,4996,4998,5036,5038,5044,5046,5048,5060,5062,5073,5075,5083,5085,5087,5090],[10,4963,4964],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4966,16],{"id":16},[10,4968,4969],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4971,22],{"id":22},[10,4973,4974],{},[26,4975],{"alt":4976,"src":4977},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4979,4980],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4982,44],{"id":44},[46,4984,4985,4988,4991],{},[49,4986,4987],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[49,4989,4990],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[49,4992,4993],{},"推导式创建新列表，不修改输入列表。",[14,4995,64],{"id":64},[10,4997,67],{},[69,4999,5001],{"className":71,"code":5000,"language":73,"meta":74,"style":74},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,5002,5003,5008,5012,5017,5022,5026,5031],{"__ignoreMap":74},[78,5004,5005],{"class":80,"line":81},[78,5006,5007],{},"numbers = [1, 2, 3, 4, 5]\n",[78,5009,5010],{"class":80,"line":87},[78,5011,97],{"emptyLinePlaceholder":96},[78,5013,5014],{"class":80,"line":93},[78,5015,5016],{},"squares = [number * number for number in numbers]\n",[78,5018,5019],{"class":80,"line":100},[78,5020,5021],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[78,5023,5024],{"class":80,"line":106},[78,5025,97],{"emptyLinePlaceholder":96},[78,5027,5028],{"class":80,"line":112},[78,5029,5030],{},"print(squares)\n",[78,5032,5033],{"class":80,"line":2467},[78,5034,5035],{},"print(even_squares)\n",[10,5037,118],{},[69,5039,5042],{"className":5040,"code":5041,"language":124,"meta":74},[122],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5043,5041],{"__ignoreMap":74},[10,5045,129],{},[14,5047,132],{"id":132},[134,5049,5050,5053],{},[49,5051,5052],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[49,5054,5055,5056,5059],{},"第二条先用 ",[34,5057,5058],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5061,151],{"id":151},[46,5063,5064,5070],{},[49,5065,5066,5067,5069],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5068,4276],{}," 开始找输入。",[49,5071,5072],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5074,174],{"id":174},[134,5076,5077,5080],{},[49,5078,5079],{},"把字符串列表转换为长度列表。",[49,5081,5082],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5084,185],{},[14,5086,188],{"id":188},[10,5088,5089],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,5091,195],{},{"title":74,"searchDepth":87,"depth":87,"links":5093},[5094,5095,5096,5097,5098,5099,5100,5101],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4959,"description":4964},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[206,5109,5110],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5113,"title":5114,"body":5115,"category":206,"cover":207,"description":5119,"extension":208,"meta":5262,"navigation":96,"path":5263,"pinned":211,"publishedAt":212,"seo":5264,"slug":5265,"stem":5266,"summary":5267,"tags":5268,"updatedAt":212,"visible":96,"__hash__":5271},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5116,"toc":5252},[5117,5120,5122,5125,5127,5133,5136,5138,5149,5151,5153,5192,5194,5200,5202,5204,5219,5221,5229,5231,5243,5245,5247,5250],[10,5118,5119],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5121,16],{"id":16},[10,5123,5124],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5126,22],{"id":22},[10,5128,5129],{},[26,5130],{"alt":5131,"src":5132},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5134,5135],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5137,44],{"id":44},[46,5139,5140,5143,5146],{},[49,5141,5142],{},"函数名描述动作，使用小写字母和下划线。",[49,5144,5145],{},"函数定义要先执行，之后才能调用。",[49,5147,5148],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5150,64],{"id":64},[10,5152,67],{},[69,5154,5156],{"className":71,"code":5155,"language":73,"meta":74,"style":74},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5157,5158,5163,5168,5173,5177,5182,5187],{"__ignoreMap":74},[78,5159,5160],{"class":80,"line":81},[78,5161,5162],{},"def show_progress():\n",[78,5164,5165],{"class":80,"line":87},[78,5166,5167],{},"    print(\"正在学习函数\")\n",[78,5169,5170],{"class":80,"line":93},[78,5171,5172],{},"    print(\"本节完成 50%\")\n",[78,5174,5175],{"class":80,"line":100},[78,5176,97],{"emptyLinePlaceholder":96},[78,5178,5179],{"class":80,"line":106},[78,5180,5181],{},"print(\"调用前\")\n",[78,5183,5184],{"class":80,"line":112},[78,5185,5186],{},"show_progress()\n",[78,5188,5189],{"class":80,"line":2467},[78,5190,5191],{},"print(\"调用后\")\n",[10,5193,118],{},[69,5195,5198],{"className":5196,"code":5197,"language":124,"meta":74},[122],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5199,5197],{"__ignoreMap":74},[10,5201,129],{},[14,5203,132],{"id":132},[134,5205,5206,5212],{},[49,5207,918,5208,5211],{},[34,5209,5210],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[49,5213,5214,5215,5218],{},"运行到 ",[34,5216,5217],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5220,151],{"id":151},[46,5222,5223,5226],{},[49,5224,5225],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[49,5227,5228],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5230,174],{"id":174},[134,5232,5233,5240],{},[49,5234,5235,5236,5239],{},"定义 ",[34,5237,5238],{},"show_plan()"," 输出两行学习计划。",[49,5241,5242],{},"连续调用同一个函数两次，观察执行顺序。",[10,5244,185],{},[14,5246,188],{"id":188},[10,5248,5249],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,5251,195],{},{"title":74,"searchDepth":87,"depth":87,"links":5253},[5254,5255,5256,5257,5258,5259,5260,5261],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5114,"description":5119},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[206,5269,5270],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5273,"title":5274,"body":5275,"category":206,"cover":207,"description":5279,"extension":208,"meta":5459,"navigation":96,"path":5460,"pinned":211,"publishedAt":212,"seo":5461,"slug":5462,"stem":5463,"summary":5464,"tags":5465,"updatedAt":212,"visible":96,"__hash__":5468},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5276,"toc":5447},[5277,5280,5282,5285,5287,5293,5300,5302,5319,5321,5323,5357,5359,5365,5367,5369,5390,5392,5395,5401,5411,5413,5428,5430,5438,5440,5442,5445],[10,5278,5279],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5281,16],{"id":16},[10,5283,5284],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5286,22],{"id":22},[10,5288,5289],{},[26,5290],{"alt":5291,"src":5292},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5294,5295,5296,5299],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5297,5298],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5301,44],{"id":44},[46,5303,5304,5307,5310],{},[49,5305,5306],{},"形参出现在函数定义中，实参出现在函数调用中。",[49,5308,5309],{},"局部变量默认只在函数内部可见。",[49,5311,5312,5313,5315,5316,171],{},"没有显式 ",[34,5314,5298],{}," 的函数会返回 ",[34,5317,5318],{},"None",[14,5320,64],{"id":64},[10,5322,67],{},[69,5324,5326],{"className":71,"code":5325,"language":73,"meta":74,"style":74},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,5327,5328,5333,5338,5343,5347,5352],{"__ignoreMap":74},[78,5329,5330],{"class":80,"line":81},[78,5331,5332],{},"def calculate_total(price, count):\n",[78,5334,5335],{"class":80,"line":87},[78,5336,5337],{},"    total = price * count\n",[78,5339,5340],{"class":80,"line":93},[78,5341,5342],{},"    return total\n",[78,5344,5345],{"class":80,"line":100},[78,5346,97],{"emptyLinePlaceholder":96},[78,5348,5349],{"class":80,"line":106},[78,5350,5351],{},"result = calculate_total(25, 4)\n",[78,5353,5354],{"class":80,"line":112},[78,5355,5356],{},"print(result)\n",[10,5358,118],{},[69,5360,5363],{"className":5361,"code":5362,"language":124,"meta":74},[122],"100\n",[34,5364,5362],{"__ignoreMap":74},[10,5366,129],{},[14,5368,132],{"id":132},[134,5370,5371,5380],{},[49,5372,5373,5374,2236,5377,5379],{},"调用时 25 和 4 分别绑定到 ",[34,5375,5376],{},"price",[34,5378,4339],{},"，它们只在本次函数调用的局部范围中使用。",[49,5381,5382,5385,5386,5389],{},[34,5383,5384],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5387,5388],{},"result"," 并输出。",[309,5391,2677],{"id":2677},[10,5393,5394],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5396,5397],{},[26,5398],{"alt":5399,"src":5400},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5402,5403,2236,5405,1137,5407,5410],{},[34,5404,5376],{},[34,5406,4339],{},[34,5408,5409],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5412,151],{"id":151},[46,5414,5415,5422],{},[49,5416,5417,5418,5421],{},"在函数内部只 ",[34,5419,5420],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[49,5423,5424,5425,5427],{},"试图在函数外直接访问局部变量 ",[34,5426,5409],{},"，它的名字只在调用期间的局部作用域存在。",[14,5429,174],{"id":174},[134,5431,5432,5435],{},[49,5433,5434],{},"编写计算长方形面积的函数。",[49,5436,5437],{},"让函数返回结果后在调用方加上单位再输出。",[10,5439,185],{},[14,5441,188],{"id":188},[10,5443,5444],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,5446,195],{},{"title":74,"searchDepth":87,"depth":87,"links":5448},[5449,5450,5451,5452,5453,5456,5457,5458],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":5454},[5455],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5274,"description":5279},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[206,5466,5467],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5470,"title":5471,"body":5472,"category":206,"cover":207,"description":5476,"extension":208,"meta":5656,"navigation":96,"path":5657,"pinned":211,"publishedAt":212,"seo":5658,"slug":5659,"stem":5660,"summary":5661,"tags":5662,"updatedAt":212,"visible":96,"__hash__":5665},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5473,"toc":5644},[5474,5477,5479,5482,5484,5490,5493,5495,5512,5514,5516,5568,5570,5576,5578,5580,5598,5600,5603,5609,5612,5614,5625,5627,5635,5637,5639,5642],[10,5475,5476],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5478,16],{"id":16},[10,5480,5481],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5483,22],{"id":22},[10,5485,5486],{},[26,5487],{"alt":5488,"src":5489},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5491,5492],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5494,44],{"id":44},[46,5496,5497,5500,5506],{},[49,5498,5499],{},"必需参数应放在有默认值的参数之前。",[49,5501,5502,5505],{},[34,5503,5504],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[49,5507,5508,5511],{},[34,5509,5510],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5513,64],{"id":64},[10,5515,67],{},[69,5517,5519],{"className":71,"code":5518,"language":73,"meta":74,"style":74},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,5520,5521,5526,5531,5535,5540,5545,5549,5554,5559,5563],{"__ignoreMap":74},[78,5522,5523],{"class":80,"line":81},[78,5524,5525],{},"def build_title(name, level=\"基础\"):\n",[78,5527,5528],{"class":80,"line":87},[78,5529,5530],{},"    return name + \"｜\" + level\n",[78,5532,5533],{"class":80,"line":93},[78,5534,97],{"emptyLinePlaceholder":96},[78,5536,5537],{"class":80,"line":100},[78,5538,5539],{},"print(build_title(\"Python\"))\n",[78,5541,5542],{"class":80,"line":106},[78,5543,5544],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[78,5546,5547],{"class":80,"line":112},[78,5548,97],{"emptyLinePlaceholder":96},[78,5550,5551],{"class":80,"line":2467},[78,5552,5553],{},"def total(*numbers):\n",[78,5555,5556],{"class":80,"line":2473},[78,5557,5558],{},"    return sum(numbers)\n",[78,5560,5561],{"class":80,"line":3890},[78,5562,97],{"emptyLinePlaceholder":96},[78,5564,5565],{"class":80,"line":4102},[78,5566,5567],{},"print(total(10, 20, 30))\n",[10,5569,118],{},[69,5571,5574],{"className":5572,"code":5573,"language":124,"meta":74},[122],"Python｜基础\n异常处理｜进阶\n60\n",[34,5575,5573],{"__ignoreMap":74},[10,5577,129],{},[14,5579,132],{"id":132},[134,5581,5582,5589],{},[49,5583,5584,5585,5588],{},"第一次调用只提供必需参数，",[34,5586,5587],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[49,5590,5591,5594,5595,171],{},[34,5592,5593],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5596,5597],{},"sum()",[309,5599,2677],{"id":2677},[10,5601,5602],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5604,5605],{},[26,5606],{"alt":5607,"src":5608},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5610,5611],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5613,151],{"id":151},[46,5615,5616,5622],{},[49,5617,5618,5619,5621],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5620,5318],{}," 再在函数内创建。",[49,5623,5624],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5626,174],{"id":174},[134,5628,5629,5632],{},[49,5630,5631],{},"给问候函数增加默认称呼。",[49,5633,5634],{},"编写接收任意数量分数并返回总分的函数。",[10,5636,185],{},[14,5638,188],{"id":188},[10,5640,5641],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,5643,195],{},{"title":74,"searchDepth":87,"depth":87,"links":5645},[5646,5647,5648,5649,5650,5653,5654,5655],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":5651},[5652],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5471,"description":5476},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[206,5663,5664],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5667,"title":5668,"body":5669,"category":206,"cover":207,"description":5673,"extension":208,"meta":5870,"navigation":96,"path":5871,"pinned":211,"publishedAt":212,"seo":5872,"slug":5873,"stem":5874,"summary":5875,"tags":5876,"updatedAt":212,"visible":96,"__hash__":5879},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5670,"toc":5858},[5671,5674,5676,5679,5681,5687,5690,5692,5709,5711,5713,5776,5778,5784,5786,5788,5815,5817,5820,5826,5829,5831,5839,5841,5849,5851,5853,5856],[10,5672,5673],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5675,16],{"id":16},[10,5677,5678],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5680,22],{"id":22},[10,5682,5683],{},[26,5684],{"alt":5685,"src":5686},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5688,5689],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5691,44],{"id":44},[46,5693,5694,5697,5700],{},[49,5695,5696],{},"函数内部赋值默认创建局部变量。",[49,5698,5699],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[49,5701,5702,2156,5705,5708],{},[34,5703,5704],{},"global",[34,5706,5707],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5710,64],{"id":64},[10,5712,67],{},[69,5714,5716],{"className":71,"code":5715,"language":73,"meta":74,"style":74},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5717,5718,5723,5727,5732,5737,5741,5746,5751,5756,5760,5765,5770],{"__ignoreMap":74},[78,5719,5720],{"class":80,"line":81},[78,5721,5722],{},"course = \"Python\"\n",[78,5724,5725],{"class":80,"line":87},[78,5726,97],{"emptyLinePlaceholder":96},[78,5728,5729],{"class":80,"line":93},[78,5730,5731],{},"def outer():\n",[78,5733,5734],{"class":80,"line":100},[78,5735,5736],{},"    level = \"基础\"\n",[78,5738,5739],{"class":80,"line":106},[78,5740,97],{"emptyLinePlaceholder":96},[78,5742,5743],{"class":80,"line":112},[78,5744,5745],{},"    def show():\n",[78,5747,5748],{"class":80,"line":2467},[78,5749,5750],{},"        lesson = \"作用域\"\n",[78,5752,5753],{"class":80,"line":2473},[78,5754,5755],{},"        print(course, level, lesson)\n",[78,5757,5758],{"class":80,"line":3890},[78,5759,97],{"emptyLinePlaceholder":96},[78,5761,5762],{"class":80,"line":4102},[78,5763,5764],{},"    show()\n",[78,5766,5768],{"class":80,"line":5767},11,[78,5769,97],{"emptyLinePlaceholder":96},[78,5771,5773],{"class":80,"line":5772},12,[78,5774,5775],{},"outer()\n",[10,5777,118],{},[69,5779,5782],{"className":5780,"code":5781,"language":124,"meta":74},[122],"Python 基础 作用域\n",[34,5783,5781],{"__ignoreMap":74},[10,5785,129],{},[14,5787,132],{"id":132},[134,5789,5790,5807],{},[49,5791,5792,5795,5796,5799,5800,5802,5803,5806],{},[34,5793,5794],{},"show()"," 中查找 ",[34,5797,5798],{},"lesson"," 时先在局部找到，查找 ",[34,5801,5587],{}," 时到外层 ",[34,5804,5805],{},"outer()"," 找到。",[49,5808,5809,5811,5812,5814],{},[34,5810,4522],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5813,2188],{}," 最后在内置作用域找到。",[309,5816,2677],{"id":2677},[10,5818,5819],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5821,5822],{},[26,5823],{"alt":5824,"src":5825},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5827,5828],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5830,151],{"id":151},[46,5832,5833,5836],{},[49,5834,5835],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[49,5837,5838],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5840,174],{"id":174},[134,5842,5843,5846],{},[49,5844,5845],{},"在内外层定义同名变量，观察最近作用域优先。",[49,5847,5848],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5850,185],{},[14,5852,188],{"id":188},[10,5854,5855],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,5857,195],{},{"title":74,"searchDepth":87,"depth":87,"links":5859},[5860,5861,5862,5863,5864,5867,5868,5869],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":5865},[5866],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5668,"description":5673},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[206,5877,5878],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5881,"title":5882,"body":5883,"category":206,"cover":207,"description":5887,"extension":208,"meta":6037,"navigation":96,"path":6038,"pinned":211,"publishedAt":212,"seo":6039,"slug":6040,"stem":6041,"summary":6042,"tags":6043,"updatedAt":212,"visible":96,"__hash__":6046},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5884,"toc":6027},[5885,5888,5890,5893,5895,5901,5904,5906,5925,5927,5929,5963,5965,5971,5973,5975,5990,5992,6004,6006,6018,6020,6022,6025],[10,5886,5887],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5889,16],{"id":16},[10,5891,5892],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5894,22],{"id":22},[10,5896,5897],{},[26,5898],{"alt":5899,"src":5900},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5902,5903],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5905,44],{"id":44},[46,5907,5908,5911,5914],{},[49,5909,5910],{},"文档字符串紧跟在函数定义后的第一条语句。",[49,5912,5913],{},"注解表达接口意图，不代替输入校验和测试。",[49,5915,5916,5917,2236,5919,2236,5921,5924],{},"基础注解优先使用 ",[34,5918,2239],{},[34,5920,2404],{},[34,5922,5923],{},"list[str]"," 等直接写法。",[14,5926,64],{"id":64},[10,5928,67],{},[69,5930,5932],{"className":71,"code":5931,"language":73,"meta":74,"style":74},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5933,5934,5939,5944,5949,5953,5958],{"__ignoreMap":74},[78,5935,5936],{"class":80,"line":81},[78,5937,5938],{},"def format_score(name: str, score: int) -> str:\n",[78,5940,5941],{"class":80,"line":87},[78,5942,5943],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[78,5945,5946],{"class":80,"line":93},[78,5947,5948],{},"    return name + \"：\" + str(score)\n",[78,5950,5951],{"class":80,"line":100},[78,5952,97],{"emptyLinePlaceholder":96},[78,5954,5955],{"class":80,"line":106},[78,5956,5957],{},"print(format_score(\"小郑\", 95))\n",[78,5959,5960],{"class":80,"line":112},[78,5961,5962],{},"print(format_score.__doc__)\n",[10,5964,118],{},[69,5966,5969],{"className":5967,"code":5968,"language":124,"meta":74},[122],"小郑：95\n返回带姓名的分数文本。\n",[34,5970,5968],{"__ignoreMap":74},[10,5972,129],{},[14,5974,132],{"id":132},[134,5976,5977,5987],{},[49,5978,5979,5980,5983,5984,5986],{},"函数签名说明 ",[34,5981,5982],{},"name"," 预期为字符串、",[34,5985,40],{}," 预期为整数，返回值预期为字符串。",[49,5988,5989],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5991,151],{"id":151},[46,5993,5994,6001],{},[49,5995,5996,5997,6000],{},"认为加了 ",[34,5998,5999],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[49,6002,6003],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6005,174],{"id":174},[134,6007,6008,6011],{},[49,6009,6010],{},"为面积函数补充参数和返回值注解。",[49,6012,6013,6014,6017],{},"通过 ",[34,6015,6016],{},"函数名.__doc__"," 查看文档字符串。",[10,6019,185],{},[14,6021,188],{"id":188},[10,6023,6024],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,6026,195],{},{"title":74,"searchDepth":87,"depth":87,"links":6028},[6029,6030,6031,6032,6033,6034,6035,6036],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5882,"description":5887},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[206,6044,6045],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6048,"title":6049,"body":6050,"category":206,"cover":207,"description":6054,"extension":208,"meta":6281,"navigation":96,"path":6282,"pinned":211,"publishedAt":212,"seo":6283,"slug":6284,"stem":6285,"summary":6286,"tags":6287,"updatedAt":212,"visible":96,"__hash__":6290},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6051,"toc":6269},[6052,6055,6057,6063,6065,6071,6082,6084,6102,6104,6111,6140,6147,6166,6175,6177,6183,6185,6187,6210,6212,6215,6221,6227,6229,6245,6247,6260,6262,6264,6267],[10,6053,6054],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6056,16],{"id":16},[10,6058,6059,6060,6062],{},"本篇只处理“模块、import 与 ",[275,6061,5982],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6064,22],{"id":22},[10,6066,6067],{},[26,6068],{"alt":6069,"src":6070},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6072,6073,6074,6077,6078,6081],{},"同一个文件直接运行时 ",[34,6075,6076],{},"__name__"," 等于 ",[34,6079,6080],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6083,44],{"id":44},[46,6085,6086,6092,6095],{},[49,6087,6088,6089,6091],{},"一个 ",[34,6090,1151],{}," 文件就是一个模块。",[49,6093,6094],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[49,6096,6097,6098,6101],{},"避免使用 ",[34,6099,6100],{},"from module import *","，它会让名字来源不清楚。",[14,6103,64],{"id":64},[10,6105,6106,6107,6110],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6108,6109],{},"calculator.py","：",[69,6112,6114],{"className":71,"code":6113,"language":73,"meta":74,"style":74},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6115,6116,6121,6126,6130,6135],{"__ignoreMap":74},[78,6117,6118],{"class":80,"line":81},[78,6119,6120],{},"def add(left, right):\n",[78,6122,6123],{"class":80,"line":87},[78,6124,6125],{},"    return left + right\n",[78,6127,6128],{"class":80,"line":93},[78,6129,97],{"emptyLinePlaceholder":96},[78,6131,6132],{"class":80,"line":100},[78,6133,6134],{},"if __name__ == \"__main__\":\n",[78,6136,6137],{"class":80,"line":106},[78,6138,6139],{},"    print(add(2, 3))\n",[10,6141,6142,6143,6146],{},"再创建 ",[34,6144,6145],{},"app.py","，从模块中导入函数：",[69,6148,6150],{"className":71,"code":6149,"language":73,"meta":74,"style":74},"from calculator import add\n\nprint(add(10, 20))\n",[34,6151,6152,6157,6161],{"__ignoreMap":74},[78,6153,6154],{"class":80,"line":81},[78,6155,6156],{},"from calculator import add\n",[78,6158,6159],{"class":80,"line":87},[78,6160,97],{"emptyLinePlaceholder":96},[78,6162,6163],{"class":80,"line":93},[78,6164,6165],{},"print(add(10, 20))\n",[10,6167,6168,6169,1137,6172,171],{},"分别执行 ",[34,6170,6171],{},"python3 calculator.py",[34,6173,6174],{},"python3 app.py",[10,6176,118],{},[69,6178,6181],{"className":6179,"code":6180,"language":124,"meta":74},[122],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6182,6180],{"__ignoreMap":74},[10,6184,129],{},[14,6186,132],{"id":132},[134,6188,6189,6199],{},[49,6190,6191,6192,6194,6195,6198],{},"直接运行 ",[34,6193,6109],{}," 时，模块名是 ",[34,6196,6197],{},"__main__","，入口代码输出 5。",[49,6200,6201,6203,6204,6206,6207,6209],{},[34,6202,6145],{}," 导入模块时，",[34,6205,6109],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6208,6145],{}," 调用函数输出 30。",[309,6211,2677],{"id":2677},[10,6213,6214],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6216,6217],{},[26,6218],{"alt":6219,"src":6220},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6222,6223,6224,6226],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6225,6197],{}," 保护下的演示代码。",[14,6228,151],{"id":151},[46,6230,6231,6238],{},[49,6232,6233,6234,1137,6236,171],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6235,6109],{},[34,6237,6145],{},[49,6239,6240,6241,6244],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6242,6243],{},"json.py","，导致导入目标被遮蔽。",[14,6246,174],{"id":174},[134,6248,6249,6255],{},[49,6250,2332,6251,6254],{},[34,6252,6253],{},"text_tools.py"," 并导出一个格式化函数。",[49,6256,6257,6258,171],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6259,6076],{},[10,6261,185],{},[14,6263,188],{"id":188},[10,6265,6266],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,6268,195],{},{"title":74,"searchDepth":87,"depth":87,"links":6270},[6271,6272,6273,6274,6275,6278,6279,6280],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":6276},[6277],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6049,"description":6054},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[206,6288,6289],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6292,"title":6293,"body":6294,"category":206,"cover":207,"description":6298,"extension":208,"meta":6463,"navigation":96,"path":6464,"pinned":211,"publishedAt":212,"seo":6465,"slug":6466,"stem":6467,"summary":6468,"tags":6469,"updatedAt":212,"visible":96,"__hash__":6471},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6295,"toc":6453},[6296,6299,6301,6304,6306,6312,6315,6317,6331,6333,6335,6381,6383,6389,6391,6393,6419,6421,6431,6433,6444,6446,6448,6451],[10,6297,6298],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6300,16],{"id":16},[10,6302,6303],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6305,22],{"id":22},[10,6307,6308],{},[26,6309],{"alt":6310,"src":6311},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6313,6314],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6316,44],{"id":44},[46,6318,6319,6325,6328],{},[49,6320,6321,6324],{},[34,6322,6323],{},".venv"," 是常见目录名，不应提交到 Git。",[49,6326,6327],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[49,6329,6330],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6332,64],{"id":64},[10,6334,1554],{},[69,6336,6338],{"className":571,"code":6337,"language":573,"meta":74,"style":74},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6339,6340,6352,6360,6366,6376],{"__ignoreMap":74},[78,6341,6342,6344,6346,6349],{"class":80,"line":81},[78,6343,671],{"class":580},[78,6345,613],{"class":583},[78,6347,6348],{"class":616}," venv",[78,6350,6351],{"class":616}," .venv\n",[78,6353,6354,6357],{"class":80,"line":87},[78,6355,6356],{"class":583},"source",[78,6358,6359],{"class":616}," .venv\u002Fbin\u002Factivate\n",[78,6361,6362,6364],{"class":80,"line":93},[78,6363,73],{"class":580},[78,6365,584],{"class":583},[78,6367,6368,6370,6372,6374],{"class":80,"line":100},[78,6369,73],{"class":580},[78,6371,613],{"class":583},[78,6373,617],{"class":616},[78,6375,584],{"class":583},[78,6377,6378],{"class":80,"line":106},[78,6379,6380],{"class":580},"deactivate\n",[10,6382,118],{},[69,6384,6387],{"className":6385,"code":6386,"language":124,"meta":74},[122],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6388,6386],{"__ignoreMap":74},[10,6390,129],{},[14,6392,132],{"id":132},[134,6394,6395,6404],{},[49,6396,6397,6400,6401,6403],{},[34,6398,6399],{},"venv"," 根据当前 ",[34,6402,671],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[49,6405,6406,6407,2156,6409,6412,6413,3665,6415,6418],{},"激活后 ",[34,6408,73],{},[34,6410,6411],{},"python -m pip"," 优先指向 ",[34,6414,6323],{},[34,6416,6417],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6420,151],{"id":151},[46,6422,6423,6426],{},[49,6424,6425],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[49,6427,3446,6428,6430],{},[34,6429,6323],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6432,174],{"id":174},[134,6434,6435,6441],{},[49,6436,6437,6438,171],{},"创建虚拟环境并记录激活前后的 ",[34,6439,6440],{},"which python",[49,6442,6443],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6445,185],{},[14,6447,188],{"id":188},[10,6449,6450],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,6452,1638],{},{"title":74,"searchDepth":87,"depth":87,"links":6454},[6455,6456,6457,6458,6459,6460,6461,6462],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6293,"description":6298},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[206,6470,241],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6473,"title":6474,"body":6475,"category":206,"cover":207,"description":6479,"extension":208,"meta":6667,"navigation":96,"path":6668,"pinned":211,"publishedAt":212,"seo":6669,"slug":6670,"stem":6671,"summary":6672,"tags":6673,"updatedAt":212,"visible":96,"__hash__":6676},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6476,"toc":6657},[6477,6480,6482,6485,6487,6493,6502,6504,6528,6530,6532,6585,6587,6593,6595,6597,6613,6615,6634,6636,6648,6650,6652,6655],[10,6478,6479],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6481,16],{"id":16},[10,6483,6484],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6486,22],{"id":22},[10,6488,6489],{},[26,6490],{"alt":6491,"src":6492},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6494,6495,6498,6499,6501],{},[34,6496,6497],{},"Path"," 使用 ",[34,6500,2414],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6503,44],{"id":44},[46,6505,6506,6509,6521],{},[49,6507,6508],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[49,6510,6511,2236,6514,2236,6517,6520],{},[34,6512,6513],{},"exists()",[34,6515,6516],{},"is_file()",[34,6518,6519],{},"is_dir()"," 检查真实文件系统状态。",[49,6522,6523,6524,6527],{},"创建目录前明确目标；",[34,6525,6526],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6529,64],{"id":64},[10,6531,67],{},[69,6533,6535],{"className":71,"code":6534,"language":73,"meta":74,"style":74},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,6536,6537,6542,6546,6551,6556,6561,6565,6570,6575,6580],{"__ignoreMap":74},[78,6538,6539],{"class":80,"line":81},[78,6540,6541],{},"from pathlib import Path\n",[78,6543,6544],{"class":80,"line":87},[78,6545,97],{"emptyLinePlaceholder":96},[78,6547,6548],{"class":80,"line":93},[78,6549,6550],{},"project = Path.cwd()\n",[78,6552,6553],{"class":80,"line":100},[78,6554,6555],{},"data_dir = project \u002F \"data\"\n",[78,6557,6558],{"class":80,"line":106},[78,6559,6560],{},"file_path = data_dir \u002F \"records.json\"\n",[78,6562,6563],{"class":80,"line":112},[78,6564,97],{"emptyLinePlaceholder":96},[78,6566,6567],{"class":80,"line":2467},[78,6568,6569],{},"print(project)\n",[78,6571,6572],{"class":80,"line":2473},[78,6573,6574],{},"print(file_path.name)\n",[78,6576,6577],{"class":80,"line":3890},[78,6578,6579],{},"print(file_path.suffix)\n",[78,6581,6582],{"class":80,"line":4102},[78,6583,6584],{},"print(file_path.exists())\n",[10,6586,118],{},[69,6588,6591],{"className":6589,"code":6590,"language":124,"meta":74},[122],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6592,6590],{"__ignoreMap":74},[10,6594,129],{},[14,6596,132],{"id":132},[134,6598,6599,6605],{},[49,6600,6601,6604],{},[34,6602,6603],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[49,6606,54,6607,6609,6610,6612],{},[34,6608,2414],{}," 组合路径片段只创建新的 ",[34,6611,6497],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6614,151],{"id":151},[46,6616,6617,6625],{},[49,6618,3446,6619,6621,6622,6624],{},[34,6620,6497],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6623,6513],{}," 等方法确认。",[49,6626,6627,6628,989,6630,6633],{},"手工拼接 ",[34,6629,2414],{},[34,6631,6632],{},"\\"," 分隔符，降低跨平台可读性。",[14,6635,174],{"id":174},[134,6637,6638,6645],{},[49,6639,6640,6641,6644],{},"组合 ",[34,6642,6643],{},"output\u002Freport.txt"," 路径但先不创建文件。",[49,6646,6647],{},"输出路径的父目录、文件名和扩展名。",[10,6649,185],{},[14,6651,188],{"id":188},[10,6653,6654],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,6656,195],{},{"title":74,"searchDepth":87,"depth":87,"links":6658},[6659,6660,6661,6662,6663,6664,6665,6666],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6474,"description":6479},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[206,6674,6675],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6678,"title":6679,"body":6680,"category":206,"cover":207,"description":6684,"extension":208,"meta":6862,"navigation":96,"path":6863,"pinned":211,"publishedAt":212,"seo":6864,"slug":6865,"stem":6866,"summary":6867,"tags":6868,"updatedAt":212,"visible":96,"__hash__":6871},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6681,"toc":6852},[6682,6685,6687,6690,6692,6698,6701,6703,6731,6733,6735,6792,6794,6800,6802,6804,6815,6817,6830,6832,6843,6845,6847,6850],[10,6683,6684],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6686,16],{"id":16},[10,6688,6689],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6691,22],{"id":22},[10,6693,6694],{},[26,6695],{"alt":6696,"src":6697},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6699,6700],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6702,44],{"id":44},[46,6704,6705,6711,6720],{},[49,6706,6707,6710],{},[34,6708,6709],{},"w"," 模式会截断原文件，写入前必须确认目标。",[49,6712,6713,6716,6717,171],{},[34,6714,6715],{},"r"," 模式读取不存在文件会产生 ",[34,6718,6719],{},"FileNotFoundError",[49,6721,6722,6723,6726,6727,6730],{},"本篇显式调用 ",[34,6724,6725],{},"close()","；第 34 篇会用 ",[34,6728,6729],{},"with"," 更可靠地管理关闭动作。",[14,6732,64],{"id":64},[10,6734,67],{},[69,6736,6738],{"className":71,"code":6737,"language":73,"meta":74,"style":74},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,6739,6740,6744,6748,6753,6758,6763,6768,6772,6777,6782,6787],{"__ignoreMap":74},[78,6741,6742],{"class":80,"line":81},[78,6743,6541],{},[78,6745,6746],{"class":80,"line":87},[78,6747,97],{"emptyLinePlaceholder":96},[78,6749,6750],{"class":80,"line":93},[78,6751,6752],{},"file_path = Path(\"notes.txt\")\n",[78,6754,6755],{"class":80,"line":100},[78,6756,6757],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[78,6759,6760],{"class":80,"line":106},[78,6761,6762],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[78,6764,6765],{"class":80,"line":112},[78,6766,6767],{},"writer.close()\n",[78,6769,6770],{"class":80,"line":2467},[78,6771,97],{"emptyLinePlaceholder":96},[78,6773,6774],{"class":80,"line":2473},[78,6775,6776],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[78,6778,6779],{"class":80,"line":3890},[78,6780,6781],{},"content = reader.read()\n",[78,6783,6784],{"class":80,"line":4102},[78,6785,6786],{},"reader.close()\n",[78,6788,6789],{"class":80,"line":5767},[78,6790,6791],{},"print(content)\n",[10,6793,118],{},[69,6795,6798],{"className":6796,"code":6797,"language":124,"meta":74},[122],"变量\n循环\n函数\n",[34,6799,6797],{"__ignoreMap":74},[10,6801,129],{},[14,6803,132],{"id":132},[134,6805,6806,6812],{},[49,6807,6808,6809,6811],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6810,6725],{}," 确保缓冲内容交给文件系统。",[49,6813,6814],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6816,151],{"id":151},[46,6818,6819,6824],{},[49,6820,54,6821,6823],{},[34,6822,6709],{}," 模式打开重要文件却未确认覆盖风险。",[49,6825,6826,6827,171],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6828,6829],{},"encoding=\"utf-8\"",[14,6831,174],{"id":174},[134,6833,6834,6837],{},[49,6835,6836],{},"写入三行学习记录并读取。",[49,6838,6839,6840,6842],{},"改用 ",[34,6841,317],{}," 模式追加一行，确认原内容仍保留。",[10,6844,185],{},[14,6846,188],{"id":188},[10,6848,6849],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,6851,195],{},{"title":74,"searchDepth":87,"depth":87,"links":6853},[6854,6855,6856,6857,6858,6859,6860,6861],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6679,"description":6684},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[206,6869,6870],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6873,"title":6874,"body":6875,"category":206,"cover":207,"description":6879,"extension":208,"meta":7046,"navigation":96,"path":7047,"pinned":211,"publishedAt":212,"seo":7048,"slug":7049,"stem":7050,"summary":7051,"tags":7052,"updatedAt":212,"visible":96,"__hash__":7055},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6876,"toc":7036},[6877,6880,6882,6885,6887,6893,6903,6905,6919,6921,6923,6983,6985,6991,6993,6995,7007,7009,7017,7019,7027,7029,7031,7034],[10,6878,6879],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6881,16],{"id":16},[10,6883,6884],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6886,22],{"id":22},[10,6888,6889],{},[26,6890],{"alt":6891,"src":6892},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6894,6895,6898,6899,6902],{},[34,6896,6897],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6900,6901],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6904,44],{"id":44},[46,6906,6907,6910,6916],{},[49,6908,6909],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[49,6911,6912,6915],{},[34,6913,6914],{},"ensure_ascii=False"," 让中文以可读字符写入。",[49,6917,6918],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6920,64],{"id":64},[10,6922,67],{},[69,6924,6926],{"className":71,"code":6925,"language":73,"meta":74,"style":74},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,6927,6928,6933,6937,6942,6946,6951,6956,6960,6964,6969,6974,6978],{"__ignoreMap":74},[78,6929,6930],{"class":80,"line":81},[78,6931,6932],{},"import json\n",[78,6934,6935],{"class":80,"line":87},[78,6936,97],{"emptyLinePlaceholder":96},[78,6938,6939],{"class":80,"line":93},[78,6940,6941],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[78,6943,6944],{"class":80,"line":100},[78,6945,97],{"emptyLinePlaceholder":96},[78,6947,6948],{"class":80,"line":106},[78,6949,6950],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[78,6952,6953],{"class":80,"line":112},[78,6954,6955],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[78,6957,6958],{"class":80,"line":2467},[78,6959,6767],{},[78,6961,6962],{"class":80,"line":2473},[78,6963,97],{"emptyLinePlaceholder":96},[78,6965,6966],{"class":80,"line":3890},[78,6967,6968],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[78,6970,6971],{"class":80,"line":4102},[78,6972,6973],{},"loaded = json.load(reader)\n",[78,6975,6976],{"class":80,"line":5767},[78,6977,6786],{},[78,6979,6980],{"class":80,"line":5772},[78,6981,6982],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6984,118],{},[69,6986,6989],{"className":6987,"code":6988,"language":124,"meta":74},[122],"Python 60\n",[34,6990,6988],{"__ignoreMap":74},[10,6992,129],{},[14,6994,132],{"id":132},[134,6996,6997,7002],{},[49,6998,6999,7001],{},[34,7000,6897],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[49,7003,7004,7006],{},[34,7005,6901],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7008,151],{"id":151},[46,7010,7011,7014],{},[49,7012,7013],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[49,7015,7016],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7018,174],{"id":174},[134,7020,7021,7024],{},[49,7022,7023],{},"保存包含两条学习记录的列表。",[49,7025,7026],{},"读取后修改进度，再重新写回文件。",[10,7028,185],{},[14,7030,188],{"id":188},[10,7032,7033],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,7035,195],{},{"title":74,"searchDepth":87,"depth":87,"links":7037},[7038,7039,7040,7041,7042,7043,7044,7045],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6874,"description":6879},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[206,7053,7054],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7057,"title":7058,"body":7059,"category":206,"cover":207,"description":7063,"extension":208,"meta":7247,"navigation":96,"path":7248,"pinned":211,"publishedAt":212,"seo":7249,"slug":7250,"stem":7251,"summary":7252,"tags":7253,"updatedAt":212,"visible":96,"__hash__":7256},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7060,"toc":7237},[7061,7064,7066,7069,7071,7077,7083,7085,7107,7109,7111,7174,7176,7182,7184,7186,7202,7204,7218,7220,7228,7230,7232,7235],[10,7062,7063],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7065,16],{"id":16},[10,7067,7068],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7070,22],{"id":22},[10,7072,7073],{},[26,7074],{"alt":7075,"src":7076},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7078,7079,7082],{},[34,7080,7081],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7084,44],{"id":44},[46,7086,7087,7097,7104],{},[49,7088,54,7089,7092,7093,7096],{},[34,7090,7091],{},"newline=\"\""," 让 ",[34,7094,7095],{},"csv"," 模块正确处理换行。",[49,7098,7099,7100,7103],{},"字段顺序由 ",[34,7101,7102],{},"fieldnames"," 决定，字典键需要与字段名一致。",[49,7105,7106],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7108,64],{"id":64},[10,7110,67],{},[69,7112,7114],{"className":71,"code":7113,"language":73,"meta":74,"style":74},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,7115,7116,7121,7125,7130,7135,7140,7145,7150,7154,7159,7164,7169],{"__ignoreMap":74},[78,7117,7118],{"class":80,"line":81},[78,7119,7120],{},"import csv\n",[78,7122,7123],{"class":80,"line":87},[78,7124,97],{"emptyLinePlaceholder":96},[78,7126,7127],{"class":80,"line":93},[78,7128,7129],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[78,7131,7132],{"class":80,"line":100},[78,7133,7134],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[78,7136,7137],{"class":80,"line":106},[78,7138,7139],{},"writer.writeheader()\n",[78,7141,7142],{"class":80,"line":112},[78,7143,7144],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[78,7146,7147],{"class":80,"line":2467},[78,7148,7149],{},"writer_file.close()\n",[78,7151,7152],{"class":80,"line":2473},[78,7153,97],{"emptyLinePlaceholder":96},[78,7155,7156],{"class":80,"line":3890},[78,7157,7158],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[78,7160,7161],{"class":80,"line":4102},[78,7162,7163],{},"for row in csv.DictReader(reader_file):\n",[78,7165,7166],{"class":80,"line":5767},[78,7167,7168],{},"    print(row[\"name\"], row[\"score\"])\n",[78,7170,7171],{"class":80,"line":5772},[78,7172,7173],{},"reader_file.close()\n",[10,7175,118],{},[69,7177,7180],{"className":7178,"code":7179,"language":124,"meta":74},[122],"小郑 95\n",[34,7181,7179],{"__ignoreMap":74},[10,7183,129],{},[14,7185,132],{"id":132},[134,7187,7188,7197],{},[49,7189,7190,7193,7194,7196],{},[34,7191,7192],{},"DictWriter"," 按 ",[34,7195,7102],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[49,7198,7199,7201],{},[34,7200,7081],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7203,151],{"id":151},[46,7205,7206,7209],{},[49,7207,7208],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[49,7210,7211,7212,7214,7215,7217],{},"在 macOS 以外环境忽略 ",[34,7213,7091],{}," 可能出现额外空行；统一交给 ",[34,7216,7095],{}," 模块管理换行。",[14,7219,174],{"id":174},[134,7221,7222,7225],{},[49,7223,7224],{},"写入三名学习者的课程和分数。",[49,7226,7227],{},"读取 CSV 后把分数字符串转换为整数。",[10,7229,185],{},[14,7231,188],{"id":188},[10,7233,7234],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,7236,195],{},{"title":74,"searchDepth":87,"depth":87,"links":7238},[7239,7240,7241,7242,7243,7244,7245,7246],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7058,"description":7063},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[206,7254,7255],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7258,"title":7259,"body":7260,"category":206,"cover":207,"description":7264,"extension":208,"meta":7537,"navigation":96,"path":7538,"pinned":211,"publishedAt":212,"seo":7539,"slug":7540,"stem":7541,"summary":7542,"tags":7543,"updatedAt":212,"visible":96,"__hash__":7546},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7261,"toc":7524},[7262,7265,7267,7270,7272,7278,7289,7291,7308,7310,7312,7387,7389,7395,7397,7399,7424,7426,7435,7441,7452,7454,7460,7466,7475,7477,7492,7494,7515,7517,7519,7522],[10,7263,7264],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7266,16],{"id":16},[10,7268,7269],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7271,22],{"id":22},[10,7273,7274],{},[26,7275],{"alt":7276,"src":7277},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7279,7280,7281,7284,7285,7288],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7282,7283],{},"except","；无论是否异常，",[34,7286,7287],{},"finally"," 都会在离开结构前执行。",[14,7290,44],{"id":44},[46,7292,7293,7299,7305],{},[49,7294,7295,7296,7298],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7297,7283],{}," 吞掉全部错误。",[49,7300,7301,7304],{},[34,7302,7303],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[49,7306,7307],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7309,64],{"id":64},[10,7311,67],{},[69,7313,7315],{"className":71,"code":7314,"language":73,"meta":74,"style":74},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,7316,7317,7322,7327,7332,7337,7342,7346,7351,7356,7361,7366,7370,7375,7381],{"__ignoreMap":74},[78,7318,7319],{"class":80,"line":81},[78,7320,7321],{},"def parse_age(text):\n",[78,7323,7324],{"class":80,"line":87},[78,7325,7326],{},"    age = int(text)\n",[78,7328,7329],{"class":80,"line":93},[78,7330,7331],{},"    if age \u003C 0:\n",[78,7333,7334],{"class":80,"line":100},[78,7335,7336],{},"        raise ValueError(\"年龄不能为负数\")\n",[78,7338,7339],{"class":80,"line":106},[78,7340,7341],{},"    return age\n",[78,7343,7344],{"class":80,"line":112},[78,7345,97],{"emptyLinePlaceholder":96},[78,7347,7348],{"class":80,"line":2467},[78,7349,7350],{},"try:\n",[78,7352,7353],{"class":80,"line":2473},[78,7354,7355],{},"    age = parse_age(\"18\")\n",[78,7357,7358],{"class":80,"line":3890},[78,7359,7360],{},"except ValueError as error:\n",[78,7362,7363],{"class":80,"line":4102},[78,7364,7365],{},"    print(\"输入错误：\", error)\n",[78,7367,7368],{"class":80,"line":5767},[78,7369,1126],{},[78,7371,7372],{"class":80,"line":5772},[78,7373,7374],{},"    print(\"年龄：\", age)\n",[78,7376,7378],{"class":80,"line":7377},13,[78,7379,7380],{},"finally:\n",[78,7382,7384],{"class":80,"line":7383},14,[78,7385,7386],{},"    print(\"处理结束\")\n",[10,7388,118],{},[69,7390,7393],{"className":7391,"code":7392,"language":124,"meta":74},[122],"年龄： 18\n处理结束\n",[34,7394,7392],{"__ignoreMap":74},[10,7396,129],{},[14,7398,132],{"id":132},[134,7400,7401,7413],{},[49,7402,7403,7405,7406,7408,7409,7412],{},[34,7404,3016],{}," 或主动 ",[34,7407,7303],{}," 都可能产生 ",[34,7410,7411],{},"ValueError","，控制流立即离开当前正常路径。",[49,7414,7415,7416,7418,7419,7421,7422,171],{},"有异常时进入匹配的 ",[34,7417,7283],{},"；没有异常时执行 ",[34,7420,1140],{},"；两种情况最后都会执行 ",[34,7423,7287],{},[309,7425,2677],{"id":2677},[10,7427,7428,2236,7430,1137,7432,7434],{},[34,7429,7283],{},[34,7431,1140],{},[34,7433,7287],{}," 的职责不同，不能只看它们出现的顺序。",[10,7436,7437],{},[26,7438],{"alt":7439,"src":7440},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7442,7443,7445,7446,7448,7449,7451],{},[34,7444,7283],{}," 处理匹配异常，",[34,7447,1140],{}," 只在无异常时运行，",[34,7450,7287],{}," 负责两条路径都需要的清理动作。",[309,7453,2677],{"id":4157},[10,7455,7456,7459],{},[34,7457,7458],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7461,7462],{},[26,7463],{"alt":7464,"src":7465},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7467,7468,7469,7471,7472,7474],{},"只把可能产生预期异常的操作放进 ",[34,7470,7458],{},"，后续正常业务放进 ",[34,7473,1140],{},"，错误边界会更清楚。",[14,7476,151],{"id":151},[46,7478,7479,7486],{},[49,7480,7481,7482,7485],{},"使用裸 ",[34,7483,7484],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[49,7487,7488,7489,7491],{},"把整个程序包在一个巨大 ",[34,7490,7458],{}," 中，无法判断究竟哪一步允许失败。",[14,7493,174],{"id":174},[134,7495,7496,7509],{},[49,7497,7498,7499,7502,7503,1137,7506,171],{},"让 ",[34,7500,7501],{},"parse_age"," 分别处理 ",[34,7504,7505],{},"\"abc\"",[34,7507,7508],{},"\"-1\"",[49,7510,7511,7512,7514],{},"为文件读取捕获 ",[34,7513,6719],{}," 并给出清晰提示。",[10,7516,185],{},[14,7518,188],{"id":188},[10,7520,7521],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,7523,195],{},{"title":74,"searchDepth":87,"depth":87,"links":7525},[7526,7527,7528,7529,7530,7534,7535,7536],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":7531},[7532,7533],{"id":2677,"depth":93,"text":2677},{"id":4157,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7259,"description":7264},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[206,7544,7545],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7548,"title":7549,"body":7550,"category":206,"cover":207,"description":7554,"extension":208,"meta":7730,"navigation":96,"path":7731,"pinned":211,"publishedAt":212,"seo":7732,"slug":7733,"stem":7734,"summary":7735,"tags":7736,"updatedAt":212,"visible":96,"__hash__":7738},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7551,"toc":7720},[7552,7555,7557,7560,7562,7568,7574,7576,7592,7594,7596,7650,7652,7658,7660,7662,7675,7677,7690,7692,7711,7713,7715,7718],[10,7553,7554],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7556,16],{"id":16},[10,7558,7559],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7561,22],{"id":22},[10,7563,7564],{},[26,7565],{"alt":7566,"src":7567},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7569,7570,7571,7573],{},"进入 ",[34,7572,6729],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7575,44],{"id":44},[46,7577,7578,7583,7589],{},[49,7579,7580,7582],{},[34,7581,6729],{}," 把资源获取和释放配成一个清晰边界。",[49,7584,7585,7588],{},[34,7586,7587],{},"as file"," 得到的是上下文返回的资源对象。",[49,7590,7591],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7593,64],{"id":64},[10,7595,67],{},[69,7597,7599],{"className":71,"code":7598,"language":73,"meta":74,"style":74},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[34,7600,7601,7605,7609,7613,7617,7622,7627,7631,7636,7641,7645],{"__ignoreMap":74},[78,7602,7603],{"class":80,"line":81},[78,7604,6541],{},[78,7606,7607],{"class":80,"line":87},[78,7608,97],{"emptyLinePlaceholder":96},[78,7610,7611],{"class":80,"line":93},[78,7612,6752],{},[78,7614,7615],{"class":80,"line":100},[78,7616,97],{"emptyLinePlaceholder":96},[78,7618,7619],{"class":80,"line":106},[78,7620,7621],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[78,7623,7624],{"class":80,"line":112},[78,7625,7626],{},"    file.write(\"上下文管理器\\n\")\n",[78,7628,7629],{"class":80,"line":2467},[78,7630,97],{"emptyLinePlaceholder":96},[78,7632,7633],{"class":80,"line":2473},[78,7634,7635],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[78,7637,7638],{"class":80,"line":3890},[78,7639,7640],{},"    print(file.read())\n",[78,7642,7643],{"class":80,"line":4102},[78,7644,97],{"emptyLinePlaceholder":96},[78,7646,7647],{"class":80,"line":5767},[78,7648,7649],{},"print(file.closed)\n",[10,7651,118],{},[69,7653,7656],{"className":7654,"code":7655,"language":124,"meta":74},[122],"上下文管理器\n\nTrue\n",[34,7657,7655],{"__ignoreMap":74},[10,7659,129],{},[14,7661,132],{"id":132},[134,7663,7664,7672],{},[49,7665,7570,7666,7668,7669,171],{},[34,7667,6729],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7670,7671],{},"file",[49,7673,7674],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7676,151],{"id":151},[46,7678,7679,7684],{},[49,7680,4725,7681,7683],{},[34,7682,6729],{}," 代码块外继续读写已经关闭的文件对象。",[49,7685,7686,7687,7689],{},"误以为 ",[34,7688,6729],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7691,174],{"id":174},[134,7693,7694,7703],{},[49,7695,7696,7697,7700,7701,171],{},"把第 30 篇的手动 ",[34,7698,7699],{},"open\u002Fclose"," 改写为 ",[34,7702,6729],{},[49,7704,4725,7705,7707,7708,171],{},[34,7706,6729],{}," 块后检查 ",[34,7709,7710],{},"file.closed",[10,7712,185],{},[14,7714,188],{"id":188},[10,7716,7717],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,7719,195],{},{"title":74,"searchDepth":87,"depth":87,"links":7721},[7722,7723,7724,7725,7726,7727,7728,7729],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7549,"description":7554},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[206,6729,7737],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7740,"title":7741,"body":7742,"category":206,"cover":207,"description":7746,"extension":208,"meta":7958,"navigation":96,"path":7959,"pinned":211,"publishedAt":212,"seo":7960,"slug":7961,"stem":7962,"summary":7963,"tags":7964,"updatedAt":212,"visible":96,"__hash__":7967},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7743,"toc":7946},[7744,7747,7749,7752,7754,7760,7763,7765,7782,7784,7786,7854,7856,7862,7864,7866,7891,7893,7896,7902,7911,7913,7924,7926,7937,7939,7941,7944],[10,7745,7746],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7748,16],{"id":16},[10,7750,7751],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7753,22],{"id":22},[10,7755,7756],{},[26,7757],{"alt":7758,"src":7759},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7761,7762],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7764,44],{"id":44},[46,7766,7767,7773,7779],{},[49,7768,7769,7772],{},[34,7770,7771],{},"self"," 表示当前实例，由方法调用自动传入。",[49,7774,7775,7778],{},[34,7776,7777],{},"__init__"," 在实例创建过程中初始化属性。",[49,7780,7781],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7783,64],{"id":64},[10,7785,67],{},[69,7787,7789],{"className":71,"code":7788,"language":73,"meta":74,"style":74},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,7790,7791,7796,7801,7806,7811,7815,7820,7825,7830,7835,7839,7844,7849],{"__ignoreMap":74},[78,7792,7793],{"class":80,"line":81},[78,7794,7795],{},"class LearningRecord:\n",[78,7797,7798],{"class":80,"line":87},[78,7799,7800],{},"    def __init__(self, course, progress=0):\n",[78,7802,7803],{"class":80,"line":93},[78,7804,7805],{},"        self.course = course\n",[78,7807,7808],{"class":80,"line":100},[78,7809,7810],{},"        self.progress = progress\n",[78,7812,7813],{"class":80,"line":106},[78,7814,97],{"emptyLinePlaceholder":96},[78,7816,7817],{"class":80,"line":112},[78,7818,7819],{},"    def advance(self, amount):\n",[78,7821,7822],{"class":80,"line":2467},[78,7823,7824],{},"        self.progress = self.progress + amount\n",[78,7826,7827],{"class":80,"line":2473},[78,7828,7829],{},"        if self.progress > 100:\n",[78,7831,7832],{"class":80,"line":3890},[78,7833,7834],{},"            self.progress = 100\n",[78,7836,7837],{"class":80,"line":4102},[78,7838,97],{"emptyLinePlaceholder":96},[78,7840,7841],{"class":80,"line":5767},[78,7842,7843],{},"record = LearningRecord(\"Python\", 40)\n",[78,7845,7846],{"class":80,"line":5772},[78,7847,7848],{},"record.advance(15)\n",[78,7850,7851],{"class":80,"line":7377},[78,7852,7853],{},"print(record.course, record.progress)\n",[10,7855,118],{},[69,7857,7860],{"className":7858,"code":7859,"language":124,"meta":74},[122],"Python 55\n",[34,7861,7859],{"__ignoreMap":74},[10,7863,129],{},[14,7865,132],{"id":132},[134,7867,7868,7878],{},[49,7869,7870,7871,7874,7875,7877],{},"调用 ",[34,7872,7873],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7876,7777],{}," 把课程和进度保存在该实例属性中。",[49,7879,7880,7883,7884,7887,7888,7890],{},[34,7881,7882],{},"record.advance(15)"," 自动把 ",[34,7885,7886],{},"record"," 作为 ",[34,7889,7771],{},"，方法更新同一实例的进度并限制上限。",[309,7892,2677],{"id":2677},[10,7894,7895],{},"类是共同定义，实例则各自保存状态。",[10,7897,7898],{},[26,7899],{"alt":7900,"src":7901},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7903,7904,7905,1137,7907,7910],{},"两个实例共享同一套方法定义，但 ",[34,7906,4522],{},[34,7908,7909],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7912,151],{"id":151},[46,7914,7915,7921],{},[49,7916,7917,7918,7920],{},"调用实例方法时手工再传一次 ",[34,7919,7771],{},"。通过实例调用时 Python 会自动绑定。",[49,7922,7923],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7925,174],{"id":174},[134,7927,7928,7934],{},[49,7929,5235,7930,7933],{},[34,7931,7932],{},"Book"," 类，保存标题和阅读页数。",[49,7935,7936],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7938,185],{},[14,7940,188],{"id":188},[10,7942,7943],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,7945,195],{},{"title":74,"searchDepth":87,"depth":87,"links":7947},[7948,7949,7950,7951,7952,7955,7956,7957],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":7953},[7954],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7741,"description":7746},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[206,7965,7966],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7969,"title":7970,"body":7971,"category":206,"cover":207,"description":7975,"extension":208,"meta":8153,"navigation":96,"path":8154,"pinned":211,"publishedAt":212,"seo":8155,"slug":8156,"stem":8157,"summary":8158,"tags":8159,"updatedAt":212,"visible":96,"__hash__":8162},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7972,"toc":8143},[7973,7976,7978,7981,7983,7989,7992,7994,8005,8007,8009,8076,8078,8084,8086,8088,8107,8109,8117,8119,8134,8136,8138,8141],[10,7974,7975],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7977,16],{"id":16},[10,7979,7980],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7982,22],{"id":22},[10,7984,7985],{},[26,7986],{"alt":7987,"src":7988},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7990,7991],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7993,44],{"id":44},[46,7995,7996,7999,8002],{},[49,7997,7998],{},"封装让对象通过方法维护自己的有效状态。",[49,8000,8001],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[49,8003,8004],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8006,64],{"id":64},[10,8008,67],{},[69,8010,8012],{"className":71,"code":8011,"language":73,"meta":74,"style":74},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,8013,8014,8019,8024,8029,8033,8038,8043,8048,8052,8057,8062,8066,8071],{"__ignoreMap":74},[78,8015,8016],{"class":80,"line":81},[78,8017,8018],{},"class Storage:\n",[78,8020,8021],{"class":80,"line":87},[78,8022,8023],{},"    def save(self, text):\n",[78,8025,8026],{"class":80,"line":93},[78,8027,8028],{},"        print(\"保存：\", text)\n",[78,8030,8031],{"class":80,"line":100},[78,8032,97],{"emptyLinePlaceholder":96},[78,8034,8035],{"class":80,"line":106},[78,8036,8037],{},"class LearningService:\n",[78,8039,8040],{"class":80,"line":112},[78,8041,8042],{},"    def __init__(self, storage):\n",[78,8044,8045],{"class":80,"line":2467},[78,8046,8047],{},"        self.storage = storage\n",[78,8049,8050],{"class":80,"line":2473},[78,8051,97],{"emptyLinePlaceholder":96},[78,8053,8054],{"class":80,"line":3890},[78,8055,8056],{},"    def finish_lesson(self, title):\n",[78,8058,8059],{"class":80,"line":4102},[78,8060,8061],{},"        self.storage.save(title)\n",[78,8063,8064],{"class":80,"line":5767},[78,8065,97],{"emptyLinePlaceholder":96},[78,8067,8068],{"class":80,"line":5772},[78,8069,8070],{},"service = LearningService(Storage())\n",[78,8072,8073],{"class":80,"line":7377},[78,8074,8075],{},"service.finish_lesson(\"异常处理\")\n",[10,8077,118],{},[69,8079,8082],{"className":8080,"code":8081,"language":124,"meta":74},[122],"保存： 异常处理\n",[34,8083,8081],{"__ignoreMap":74},[10,8085,129],{},[14,8087,132],{"id":132},[134,8089,8090,8100],{},[49,8091,8092,8095,8096,8099],{},[34,8093,8094],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8097,8098],{},"save()"," 的协作对象。",[49,8101,8102,8103,8106],{},"调用业务方法时，服务把保存动作委托给 ",[34,8104,8105],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8108,151],{"id":151},[46,8110,8111,8114],{},[49,8112,8113],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[49,8115,8116],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8118,174],{"id":174},[134,8120,8121,8131],{},[49,8122,8123,8124,8127,8128,171],{},"用组合让 ",[34,8125,8126],{},"OrderService"," 使用一个 ",[34,8129,8130],{},"Notifier",[49,8132,8133],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8135,185],{},[14,8137,188],{"id":188},[10,8139,8140],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,8142,195],{},{"title":74,"searchDepth":87,"depth":87,"links":8144},[8145,8146,8147,8148,8149,8150,8151,8152],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7970,"description":7975},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[206,8160,8161],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8164,"title":8165,"body":8166,"category":206,"cover":207,"description":8170,"extension":208,"meta":8373,"navigation":96,"path":8374,"pinned":211,"publishedAt":212,"seo":8375,"slug":8376,"stem":8377,"summary":8378,"tags":8379,"updatedAt":212,"visible":96,"__hash__":8382},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8167,"toc":8361},[8168,8171,8173,8176,8178,8184,8191,8193,8218,8220,8222,8274,8276,8282,8284,8286,8307,8309,8315,8321,8327,8329,8337,8339,8352,8354,8356,8359],[10,8169,8170],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8172,16],{"id":16},[10,8174,8175],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8177,22],{"id":22},[10,8179,8180],{},[26,8181],{"alt":8182,"src":8183},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8185,8186,8187,8190],{},"生成器运行到 ",[34,8188,8189],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8192,44],{"id":44},[46,8194,8195,8205,8215],{},[49,8196,8197,8200,8201,8204],{},[34,8198,8199],{},"iter()"," 从可迭代对象取得迭代器，",[34,8202,8203],{},"next()"," 请求下一个值。",[49,8206,8207,8208,8211,8212,8214],{},"没有更多值时迭代器抛出 ",[34,8209,8210],{},"StopIteration","，",[34,8213,4276],{}," 会自动处理。",[49,8216,8217],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8219,64],{"id":64},[10,8221,67],{},[69,8223,8225],{"className":71,"code":8224,"language":73,"meta":74,"style":74},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,8226,8227,8232,8237,8242,8247,8252,8256,8261,8266,8270],{"__ignoreMap":74},[78,8228,8229],{"class":80,"line":81},[78,8230,8231],{},"def countdown(start):\n",[78,8233,8234],{"class":80,"line":87},[78,8235,8236],{},"    current = start\n",[78,8238,8239],{"class":80,"line":93},[78,8240,8241],{},"    while current > 0:\n",[78,8243,8244],{"class":80,"line":100},[78,8245,8246],{},"        yield current\n",[78,8248,8249],{"class":80,"line":106},[78,8250,8251],{},"        current = current - 1\n",[78,8253,8254],{"class":80,"line":112},[78,8255,97],{"emptyLinePlaceholder":96},[78,8257,8258],{"class":80,"line":2467},[78,8259,8260],{},"iterator = countdown(3)\n",[78,8262,8263],{"class":80,"line":2473},[78,8264,8265],{},"print(next(iterator))\n",[78,8267,8268],{"class":80,"line":3890},[78,8269,8265],{},[78,8271,8272],{"class":80,"line":4102},[78,8273,8265],{},[10,8275,118],{},[69,8277,8280],{"className":8278,"code":8279,"language":124,"meta":74},[122],"3\n2\n1\n",[34,8281,8279],{"__ignoreMap":74},[10,8283,129],{},[14,8285,132],{"id":132},[134,8287,8288,8294],{},[49,8289,7870,8290,8293],{},[34,8291,8292],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[49,8295,8296,8297,8299,8300,8302,8303,8306],{},"每次 ",[34,8298,8203],{}," 运行到下一个 ",[34,8301,8189],{}," 并暂停，局部变量 ",[34,8304,8305],{},"current"," 和执行位置被保留。",[309,8308,2677],{"id":2677},[10,8310,8311,8312,8314],{},"生成器的暂停位置可以展开成多次 ",[34,8313,8203],{}," 的时间线。",[10,8316,8317],{},[26,8318],{"alt":8319,"src":8320},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8322,8323,8324,8326],{},"每次请求只推进到下一个 ",[34,8325,8189],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8328,151],{"id":151},[46,8330,8331,8334],{},[49,8332,8333],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[49,8335,8336],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8338,174],{"id":174},[134,8340,8341,8344],{},[49,8342,8343],{},"编写产生 1 到指定上限偶数的生成器。",[49,8345,3948,8346,8348,8349,8351],{},[34,8347,4276],{}," 遍历生成器，比较手动 ",[34,8350,8203],{}," 的差异。",[10,8353,185],{},[14,8355,188],{"id":188},[10,8357,8358],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,8360,195],{},{"title":74,"searchDepth":87,"depth":87,"links":8362},[8363,8364,8365,8366,8367,8370,8371,8372],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":8368},[8369],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8165,"description":8170},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[206,8380,8381],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8384,"title":8385,"body":8386,"category":206,"cover":207,"description":8390,"extension":208,"meta":8614,"navigation":96,"path":8615,"pinned":211,"publishedAt":212,"seo":8616,"slug":8617,"stem":8618,"summary":8619,"tags":8620,"updatedAt":212,"visible":96,"__hash__":8622},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8387,"toc":8602},[8388,8391,8393,8396,8398,8404,8407,8409,8429,8431,8433,8515,8517,8523,8525,8527,8549,8551,8554,8560,8567,8569,8579,8581,8593,8595,8597,8600],[10,8389,8390],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8392,16],{"id":16},[10,8394,8395],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8397,22],{"id":22},[10,8399,8400],{},[26,8401],{"alt":8402,"src":8403},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8405,8406],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8408,44],{"id":44},[46,8410,8411,8420,8423],{},[49,8412,8413,8416,8417,171],{},[34,8414,8415],{},"@trace"," 等价于 ",[34,8418,8419],{},"add = trace(add)",[49,8421,8422],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[49,8424,8425,8428],{},[34,8426,8427],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8430,64],{"id":64},[10,8432,67],{},[69,8434,8436],{"className":71,"code":8435,"language":73,"meta":74,"style":74},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,8437,8438,8443,8447,8452,8457,8462,8467,8472,8477,8482,8487,8491,8496,8500,8504,8509],{"__ignoreMap":74},[78,8439,8440],{"class":80,"line":81},[78,8441,8442],{},"from functools import wraps\n",[78,8444,8445],{"class":80,"line":87},[78,8446,97],{"emptyLinePlaceholder":96},[78,8448,8449],{"class":80,"line":93},[78,8450,8451],{},"def trace(function):\n",[78,8453,8454],{"class":80,"line":100},[78,8455,8456],{},"    @wraps(function)\n",[78,8458,8459],{"class":80,"line":106},[78,8460,8461],{},"    def wrapper(*args, **kwargs):\n",[78,8463,8464],{"class":80,"line":112},[78,8465,8466],{},"        print(\"开始：\", function.__name__)\n",[78,8468,8469],{"class":80,"line":2467},[78,8470,8471],{},"        result = function(*args, **kwargs)\n",[78,8473,8474],{"class":80,"line":2473},[78,8475,8476],{},"        print(\"结束：\", function.__name__)\n",[78,8478,8479],{"class":80,"line":3890},[78,8480,8481],{},"        return result\n",[78,8483,8484],{"class":80,"line":4102},[78,8485,8486],{},"    return wrapper\n",[78,8488,8489],{"class":80,"line":5767},[78,8490,97],{"emptyLinePlaceholder":96},[78,8492,8493],{"class":80,"line":5772},[78,8494,8495],{},"@trace\n",[78,8497,8498],{"class":80,"line":7377},[78,8499,6120],{},[78,8501,8502],{"class":80,"line":7383},[78,8503,6125],{},[78,8505,8507],{"class":80,"line":8506},15,[78,8508,97],{"emptyLinePlaceholder":96},[78,8510,8512],{"class":80,"line":8511},16,[78,8513,8514],{},"print(add(2, 3))\n",[10,8516,118],{},[69,8518,8521],{"className":8519,"code":8520,"language":124,"meta":74},[122],"开始： add\n结束： add\n5\n",[34,8522,8520],{"__ignoreMap":74},[10,8524,129],{},[14,8526,132],{"id":132},[134,8528,8529,8546],{},[49,8530,8531,8532,8535,8536,8539,8540,8543,8544,171],{},"解释器执行定义时，把原 ",[34,8533,8534],{},"add"," 函数交给 ",[34,8537,8538],{},"trace","，返回的 ",[34,8541,8542],{},"wrapper"," 重新绑定到名字 ",[34,8545,8534],{},[49,8547,8548],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[309,8550,2677],{"id":2677},[10,8552,8553],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8555,8556],{},[26,8557],{"alt":8558,"src":8559},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8561,8562,8564,8565,171],{},[34,8563,8415],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8566,8419],{},[14,8568,151],{"id":151},[46,8570,8571,8576],{},[49,8572,8573,8574,171],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8575,5318],{},[49,8577,8578],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8580,174],{"id":174},[134,8582,8583,8586],{},[49,8584,8585],{},"编写只记录调用次数的简单装饰器。",[49,8587,8588,8589,8592],{},"删除包装函数的 ",[34,8590,8591],{},"return result","，观察调用方得到什么。",[10,8594,185],{},[14,8596,188],{"id":188},[10,8598,8599],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,8601,195],{},{"title":74,"searchDepth":87,"depth":87,"links":8603},[8604,8605,8606,8607,8608,8611,8612,8613],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":8609},[8610],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8385,"description":8390},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[206,8621,5269],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8624,"title":8625,"body":8626,"category":206,"cover":207,"description":8630,"extension":208,"meta":8817,"navigation":96,"path":8818,"pinned":211,"publishedAt":212,"seo":8819,"slug":8820,"stem":8821,"summary":8822,"tags":8823,"updatedAt":212,"visible":96,"__hash__":8826},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8627,"toc":8805},[8628,8631,8633,8636,8638,8644,8647,8649,8660,8662,8664,8739,8741,8747,8749,8751,8762,8764,8767,8773,8776,8778,8786,8788,8796,8798,8800,8803],[10,8629,8630],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8632,16],{"id":16},[10,8634,8635],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8637,22],{"id":22},[10,8639,8640],{},[26,8641],{"alt":8642,"src":8643},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8645,8646],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8648,44],{"id":44},[46,8650,8651,8654,8657],{},[49,8652,8653],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[49,8655,8656],{},"日志记录运行状态，测试判断结果是否符合约定。",[49,8658,8659],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8661,64],{"id":64},[10,8663,67],{},[69,8665,8667],{"className":71,"code":8666,"language":73,"meta":74,"style":74},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,8668,8669,8674,8679,8683,8688,8692,8697,8702,8707,8711,8716,8721,8726,8730,8734],{"__ignoreMap":74},[78,8670,8671],{"class":80,"line":81},[78,8672,8673],{},"import logging\n",[78,8675,8676],{"class":80,"line":87},[78,8677,8678],{},"import unittest\n",[78,8680,8681],{"class":80,"line":93},[78,8682,97],{"emptyLinePlaceholder":96},[78,8684,8685],{"class":80,"line":100},[78,8686,8687],{},"logging.basicConfig(level=logging.INFO)\n",[78,8689,8690],{"class":80,"line":106},[78,8691,97],{"emptyLinePlaceholder":96},[78,8693,8694],{"class":80,"line":112},[78,8695,8696],{},"def clamp_progress(value):\n",[78,8698,8699],{"class":80,"line":2467},[78,8700,8701],{},"    logging.info(\"检查进度：%s\", value)\n",[78,8703,8704],{"class":80,"line":2473},[78,8705,8706],{},"    return max(0, min(100, value))\n",[78,8708,8709],{"class":80,"line":3890},[78,8710,97],{"emptyLinePlaceholder":96},[78,8712,8713],{"class":80,"line":4102},[78,8714,8715],{},"class ProgressTest(unittest.TestCase):\n",[78,8717,8718],{"class":80,"line":5767},[78,8719,8720],{},"    def test_upper_limit(self):\n",[78,8722,8723],{"class":80,"line":5772},[78,8724,8725],{},"        self.assertEqual(clamp_progress(120), 100)\n",[78,8727,8728],{"class":80,"line":7377},[78,8729,97],{"emptyLinePlaceholder":96},[78,8731,8732],{"class":80,"line":7383},[78,8733,6134],{},[78,8735,8736],{"class":80,"line":8506},[78,8737,8738],{},"    unittest.main()\n",[10,8740,118],{},[69,8742,8745],{"className":8743,"code":8744,"language":124,"meta":74},[122],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8746,8744],{"__ignoreMap":74},[10,8748,129],{},[14,8750,132],{"id":132},[134,8752,8753,8759],{},[49,8754,8755,8758],{},[34,8756,8757],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[49,8760,8761],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[309,8763,2677],{"id":2677},[10,8765,8766],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8768,8769],{},[26,8770],{"alt":8771,"src":8772},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8774,8775],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8777,151],{"id":151},[46,8779,8780,8783],{},[49,8781,8782],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[49,8784,8785],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8787,174],{"id":174},[134,8789,8790,8793],{},[49,8791,8792],{},"为负数进度增加测试。",[49,8794,8795],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8797,185],{},[14,8799,188],{"id":188},[10,8801,8802],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,8804,195],{},{"title":74,"searchDepth":87,"depth":87,"links":8806},[8807,8808,8809,8810,8811,8814,8815,8816],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":8812},[8813],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8625,"description":8630},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[206,8824,8825],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8828,"title":8829,"body":8830,"category":206,"cover":207,"description":8834,"extension":208,"meta":9134,"navigation":96,"path":9135,"pinned":211,"publishedAt":212,"seo":9136,"slug":9137,"stem":9138,"summary":9139,"tags":9140,"updatedAt":212,"visible":96,"__hash__":9143},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8831,"toc":9121},[8832,8835,8837,8840,8842,8848,8851,8853,8868,8870,8872,9019,9021,9027,9029,9031,9044,9046,9049,9055,9058,9060,9063,9069,9076,9078,9089,9091,9112,9114,9116,9119],[10,8833,8834],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8836,16],{"id":16},[10,8838,8839],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8841,22],{"id":22},[10,8843,8844],{},[26,8845],{"alt":8846,"src":8847},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8849,8850],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8852,44],{"id":44},[46,8854,8855,8858,8861],{},[49,8856,8857],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[49,8859,8860],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[49,8862,8863,8864,8867],{},"实际扩展前先为 ",[34,8865,8866],{},"add()"," 和存储边界补充测试。",[14,8869,64],{"id":64},[10,8871,67],{},[69,8873,8875],{"className":71,"code":8874,"language":73,"meta":74,"style":74},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,8876,8877,8881,8885,8889,8894,8899,8904,8909,8913,8918,8923,8928,8933,8938,8942,8947,8952,8958,8963,8969,8974,8979,8985,8991,8997,9002,9008,9013],{"__ignoreMap":74},[78,8878,8879],{"class":80,"line":81},[78,8880,6932],{},[78,8882,8883],{"class":80,"line":87},[78,8884,6541],{},[78,8886,8887],{"class":80,"line":93},[78,8888,97],{"emptyLinePlaceholder":96},[78,8890,8891],{"class":80,"line":100},[78,8892,8893],{},"class LearningRecords:\n",[78,8895,8896],{"class":80,"line":106},[78,8897,8898],{},"    def __init__(self, file_path):\n",[78,8900,8901],{"class":80,"line":112},[78,8902,8903],{},"        self.file_path = Path(file_path)\n",[78,8905,8906],{"class":80,"line":2467},[78,8907,8908],{},"        self.items = []\n",[78,8910,8911],{"class":80,"line":2473},[78,8912,97],{"emptyLinePlaceholder":96},[78,8914,8915],{"class":80,"line":3890},[78,8916,8917],{},"    def add(self, title):\n",[78,8919,8920],{"class":80,"line":4102},[78,8921,8922],{},"        title = title.strip()\n",[78,8924,8925],{"class":80,"line":5767},[78,8926,8927],{},"        if not title:\n",[78,8929,8930],{"class":80,"line":5772},[78,8931,8932],{},"            raise ValueError(\"课程名称不能为空\")\n",[78,8934,8935],{"class":80,"line":7377},[78,8936,8937],{},"        self.items.append({\"title\": title, \"done\": False})\n",[78,8939,8940],{"class":80,"line":7383},[78,8941,97],{"emptyLinePlaceholder":96},[78,8943,8944],{"class":80,"line":8506},[78,8945,8946],{},"    def save(self):\n",[78,8948,8949],{"class":80,"line":8511},[78,8950,8951],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[78,8953,8955],{"class":80,"line":8954},17,[78,8956,8957],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[78,8959,8961],{"class":80,"line":8960},18,[78,8962,97],{"emptyLinePlaceholder":96},[78,8964,8966],{"class":80,"line":8965},19,[78,8967,8968],{},"records = LearningRecords(\"learning-records.json\")\n",[78,8970,8972],{"class":80,"line":8971},20,[78,8973,97],{"emptyLinePlaceholder":96},[78,8975,8977],{"class":80,"line":8976},21,[78,8978,7350],{},[78,8980,8982],{"class":80,"line":8981},22,[78,8983,8984],{},"    title = input(\"输入已学习课程：\")\n",[78,8986,8988],{"class":80,"line":8987},23,[78,8989,8990],{},"    records.add(title)\n",[78,8992,8994],{"class":80,"line":8993},24,[78,8995,8996],{},"    records.save()\n",[78,8998,9000],{"class":80,"line":8999},25,[78,9001,7360],{},[78,9003,9005],{"class":80,"line":9004},26,[78,9006,9007],{},"    print(\"无法保存：\", error)\n",[78,9009,9011],{"class":80,"line":9010},27,[78,9012,1126],{},[78,9014,9016],{"class":80,"line":9015},28,[78,9017,9018],{},"    print(\"已保存 1 条学习记录\")\n",[10,9020,118],{},[69,9022,9025],{"className":9023,"code":9024,"language":124,"meta":74},[122],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9026,9024],{"__ignoreMap":74},[10,9028,129],{},[14,9030,132],{"id":132},[134,9032,9033,9039],{},[49,9034,9035,9036,9038],{},"输入层取得课程名后，",[34,9037,8866],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[49,9040,9041,9043],{},[34,9042,8098],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[309,9045,2677],{"id":2677},[10,9047,9048],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9050,9051],{},[26,9052],{"alt":9053,"src":9054},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9056,9057],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[309,9059,2677],{"id":4157},[10,9061,9062],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9064,9065],{},[26,9066],{"alt":9067,"src":9068},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9070,9071,9072,9075],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9073,9074],{},"load()"," 把文件状态恢复到内存。",[14,9077,151],{"id":151},[46,9079,9080,9083],{},[49,9081,9082],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[49,9084,9085,9086,9088],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9087,9074],{}," 是下一项必要扩展。",[14,9090,174],{"id":174},[134,9092,9093,9099,9102],{},[49,9094,9095,9096,9098],{},"增加 ",[34,9097,9074],{},"，文件不存在时从空列表开始。",[49,9100,9101],{},"增加按序号标记完成的功能，并校验序号范围。",[49,9103,9104,9105,9108,9109,9111],{},"把输入循环放进 ",[34,9106,9107],{},"main()","，通过 ",[34,9110,6076],{}," 控制程序入口。",[10,9113,185],{},[14,9115,188],{"id":188},[10,9117,9118],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[193,9120,195],{},{"title":74,"searchDepth":87,"depth":87,"links":9122},[9123,9124,9125,9126,9127,9131,9132,9133],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":9128},[9129,9130],{"id":2677,"depth":93,"text":2677},{"id":4157,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8829,"description":8834},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[206,9141,9142],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9145,9248,9367,9498,9641,9766,9903,10040,10181,10350,10487,10620,10743,10872,10999,11162,11338,11479,11608,11757,11900,12021,12144,12293,12446,12611,12738,12919,13062,13219,13370,13517,13672,13890,14045,14220,14371,14538,14725,14888,15130,15370],{"id":1373,"title":1374,"body":9146,"category":206,"cover":207,"description":1379,"extension":208,"meta":9245,"navigation":96,"path":1498,"pinned":211,"publishedAt":212,"seo":9246,"slug":1500,"stem":1501,"summary":1502,"tags":9247,"updatedAt":212,"visible":96,"__hash__":1505},{"type":7,"value":9147,"toc":9235},[9148,9150,9152,9154,9156,9160,9164,9166,9176,9178,9180,9188,9190,9195,9197,9199,9209,9211,9219,9221,9227,9229,9231,9233],[10,9149,1379],{},[14,9151,16],{"id":16},[10,9153,1384],{},[14,9155,22],{"id":22},[10,9157,9158],{},[26,9159],{"alt":1391,"src":1392},[10,9161,9162,1397],{},[34,9163,1151],{},[14,9165,44],{"id":44},[46,9167,9168,9172,9174],{},[49,9169,1404,9170,1407],{},[34,9171,1151],{},[49,9173,1410],{},[49,9175,1413],{},[14,9177,64],{"id":64},[10,9179,67],{},[69,9181,9182],{"className":71,"code":1420,"language":73,"meta":74,"style":74},[34,9183,9184],{"__ignoreMap":74},[78,9185,9186],{"class":80,"line":81},[78,9187,1420],{},[10,9189,118],{},[69,9191,9193],{"className":9192,"code":1432,"language":124,"meta":74},[122],[34,9194,1432],{"__ignoreMap":74},[10,9196,129],{},[14,9198,132],{"id":132},[134,9200,9201,9205],{},[49,9202,1443,9203,1447],{},[34,9204,1446],{},[49,9206,1450,9207,1454],{},[34,9208,1453],{},[14,9210,151],{"id":151},[46,9212,9213,9215],{},[49,9214,1461],{},[49,9216,1464,9217,1467],{},[34,9218,1151],{},[14,9220,174],{"id":174},[134,9222,9223,9225],{},[49,9224,1474],{},[49,9226,1477],{},[10,9228,185],{},[14,9230,188],{"id":188},[10,9232,1484],{},[193,9234,195],{},{"title":74,"searchDepth":87,"depth":87,"links":9236},[9237,9238,9239,9240,9241,9242,9243,9244],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":1374,"description":1379},[206,1369,1504],{"id":1507,"title":1508,"body":9249,"category":206,"cover":207,"description":1513,"extension":208,"meta":9364,"navigation":96,"path":1650,"pinned":211,"publishedAt":212,"seo":9365,"slug":1652,"stem":1653,"summary":1654,"tags":9366,"updatedAt":212,"visible":96,"__hash__":1657},{"type":7,"value":9250,"toc":9354},[9251,9253,9255,9257,9259,9263,9267,9269,9279,9281,9283,9303,9305,9310,9312,9314,9324,9326,9336,9338,9346,9348,9350,9352],[10,9252,1513],{},[14,9254,16],{"id":16},[10,9256,1518],{},[14,9258,22],{"id":22},[10,9260,9261],{},[26,9262],{"alt":1525,"src":1526},[10,9264,1529,9265,1532],{},[34,9266,671],{},[14,9268,44],{"id":44},[46,9270,9271,9273,9275],{},[49,9272,1539],{},[49,9274,1542],{},[49,9276,1545,9277,1549],{},[34,9278,1548],{},[14,9280,64],{"id":64},[10,9282,1554],{},[69,9284,9285],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,9286,9287,9293],{"__ignoreMap":74},[78,9288,9289,9291],{"class":80,"line":81},[78,9290,671],{"class":580},[78,9292,584],{"class":583},[78,9294,9295,9297,9299,9301],{"class":80,"line":87},[78,9296,671],{"class":580},[78,9298,613],{"class":583},[78,9300,617],{"class":616},[78,9302,584],{"class":583},[10,9304,118],{},[69,9306,9308],{"className":9307,"code":1580,"language":124,"meta":74},[122],[34,9309,1580],{"__ignoreMap":74},[10,9311,129],{},[14,9313,132],{"id":132},[134,9315,9316,9320],{},[49,9317,9318,1594],{},[34,9319,1593],{},[49,9321,9322,1599],{},[34,9323,679],{},[14,9325,151],{"id":151},[46,9327,9328,9332],{},[49,9329,1606,9330,1609],{},[34,9331,671],{},[49,9333,1612,9334,1615],{},[34,9335,671],{},[14,9337,174],{"id":174},[134,9339,9340,9344],{},[49,9341,918,9342,1625],{},[34,9343,1624],{},[49,9345,1628],{},[10,9347,185],{},[14,9349,188],{"id":188},[10,9351,1635],{},[193,9353,1638],{},{"title":74,"searchDepth":87,"depth":87,"links":9355},[9356,9357,9358,9359,9360,9361,9362,9363],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":1508,"description":1513},[206,1656,1032],{"id":1659,"title":1660,"body":9368,"category":206,"cover":207,"description":1826,"extension":208,"meta":9495,"navigation":96,"path":1828,"pinned":211,"publishedAt":212,"seo":9496,"slug":1830,"stem":1831,"summary":1832,"tags":9497,"updatedAt":212,"visible":96,"__hash__":1836},{"type":7,"value":9369,"toc":9485},[9370,9374,9376,9378,9380,9384,9386,9388,9404,9406,9408,9428,9430,9435,9437,9439,9451,9453,9463,9465,9475,9477,9479,9483],[10,9371,1665,9372,1668],{},[34,9373,1151],{},[14,9375,16],{"id":16},[10,9377,1673],{},[14,9379,22],{"id":22},[10,9381,9382],{},[26,9383],{"alt":1680,"src":1681},[10,9385,1684],{},[14,9387,44],{"id":44},[46,9389,9390,9396,9400],{},[49,9391,1691,9392,1694,9394,171],{},[34,9393,671],{},[34,9395,1697],{},[49,9397,1700,9398,1704],{},[34,9399,1703],{},[49,9401,1707,9402,1710],{},[34,9403,1151],{},[14,9405,64],{"id":64},[10,9407,67],{},[69,9409,9410],{"className":1717,"code":1718,"language":1719,"meta":74,"style":74},[34,9411,9412,9416,9420,9424],{"__ignoreMap":74},[78,9413,9414],{"class":80,"line":81},[78,9415,1726],{},[78,9417,9418],{"class":80,"line":87},[78,9419,1731],{},[78,9421,9422],{"class":80,"line":93},[78,9423,1736],{},[78,9425,9426],{"class":80,"line":100},[78,9427,1741],{},[10,9429,118],{},[69,9431,9433],{"className":9432,"code":1747,"language":124,"meta":74},[122],[34,9434,1747],{"__ignoreMap":74},[10,9436,129],{},[14,9438,132],{"id":132},[134,9440,9441,9447],{},[49,9442,1758,9443,1762,9445,171],{},[34,9444,1761],{},[34,9446,1765],{},[49,9448,1768,9449,1771],{},[34,9450,1453],{},[14,9452,151],{"id":151},[46,9454,9455,9461],{},[49,9456,1778,9457,1781,9459,1784],{},[34,9458,1697],{},[34,9460,1151],{},[49,9462,1787],{},[14,9464,174],{"id":174},[134,9466,9467,9471],{},[49,9468,1794,9469,171],{},[34,9470,1797],{},[49,9472,1800,9473,1803],{},[34,9474,1453],{},[10,9476,185],{},[14,9478,188],{"id":188},[10,9480,1810,9481,1813],{},[34,9482,1151],{},[193,9484,195],{},{"title":74,"searchDepth":87,"depth":87,"links":9486},[9487,9488,9489,9490,9491,9492,9493,9494],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":1660,"description":1826},[206,1834,1835],{"id":1838,"title":1839,"body":9499,"category":206,"cover":207,"description":1844,"extension":208,"meta":9638,"navigation":96,"path":2016,"pinned":211,"publishedAt":212,"seo":9639,"slug":2018,"stem":2019,"summary":2020,"tags":9640,"updatedAt":212,"visible":96,"__hash__":2024},{"type":7,"value":9500,"toc":9628},[9501,9503,9505,9507,9509,9513,9517,9519,9531,9533,9535,9571,9573,9578,9580,9582,9598,9600,9610,9612,9620,9622,9624,9626],[10,9502,1844],{},[14,9504,16],{"id":16},[10,9506,1849],{},[14,9508,22],{"id":22},[10,9510,9511],{},[26,9512],{"alt":1856,"src":1857},[10,9514,9515,1863],{},[34,9516,1862],{},[14,9518,44],{"id":44},[46,9520,9521,9523,9529],{},[49,9522,1870],{},[49,9524,9525,1876,9527,1880],{},[34,9526,1875],{},[34,9528,1879],{},[49,9530,1883],{},[14,9532,64],{"id":64},[10,9534,1554],{},[69,9536,9537],{"className":571,"code":1890,"language":573,"meta":74,"style":74},[34,9538,9539,9545,9551,9555,9565],{"__ignoreMap":74},[78,9540,9541,9543],{"class":80,"line":81},[78,9542,1897],{"class":580},[78,9544,1900],{"class":616},[78,9546,9547,9549],{"class":80,"line":87},[78,9548,1905],{"class":583},[78,9550,1900],{"class":616},[78,9552,9553],{"class":80,"line":93},[78,9554,1912],{"class":583},[78,9556,9557,9559,9561,9563],{"class":80,"line":100},[78,9558,1917],{"class":583},[78,9560,1920],{"class":616},[78,9562,1924],{"class":1923},[78,9564,1195],{"class":616},[78,9566,9567,9569],{"class":80,"line":106},[78,9568,671],{"class":580},[78,9570,1195],{"class":616},[10,9572,118],{},[69,9574,9576],{"className":9575,"code":1938,"language":124,"meta":74},[122],[34,9577,1938],{"__ignoreMap":74},[10,9579,129],{},[14,9581,132],{"id":132},[134,9583,9584,9592],{},[49,9585,9586,1951,9588,1954,9590,1957],{},[34,9587,1897],{},[34,9589,1905],{},[34,9591,1875],{},[49,9593,9594,1962,9596,1966],{},[34,9595,1862],{},[34,9597,1965],{},[14,9599,151],{"id":151},[46,9601,9602,9608],{},[49,9603,1973,9604,1137,9606,171],{},[34,9605,1875],{},[34,9607,1879],{},[49,9609,1980],{},[14,9611,174],{"id":174},[134,9613,9614,9618],{},[49,9615,1987,9616,1991],{},[34,9617,1990],{},[49,9619,1994],{},[10,9621,185],{},[14,9623,188],{"id":188},[10,9625,2001],{},[193,9627,2004],{},{"title":74,"searchDepth":87,"depth":87,"links":9629},[9630,9631,9632,9633,9634,9635,9636,9637],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":1839,"description":1844},[206,2022,2023],{"id":2026,"title":2027,"body":9642,"category":206,"cover":207,"description":2032,"extension":208,"meta":9763,"navigation":96,"path":2181,"pinned":211,"publishedAt":212,"seo":9764,"slug":2183,"stem":2184,"summary":2185,"tags":9765,"updatedAt":212,"visible":96,"__hash__":2189},{"type":7,"value":9643,"toc":9753},[9644,9646,9648,9650,9652,9656,9664,9666,9680,9682,9684,9700,9702,9707,9709,9711,9725,9727,9733,9735,9745,9747,9749,9751],[10,9645,2032],{},[14,9647,16],{"id":16},[10,9649,2037],{},[14,9651,22],{"id":22},[10,9653,9654],{},[26,9655],{"alt":2044,"src":2045},[10,9657,2048,9658,171,9660,2054,9662,171],{},[34,9659,1453],{},[34,9661,2053],{},[34,9663,1761],{},[14,9665,44],{"id":44},[46,9667,9668,9672,9678],{},[49,9669,9670,2066],{},[34,9671,2065],{},[49,9673,9674,2072,9676,171],{},[34,9675,2071],{},[34,9677,2075],{},[49,9679,2078],{},[14,9681,64],{"id":64},[10,9683,67],{},[69,9685,9686],{"className":71,"code":2085,"language":73,"meta":74,"style":74},[34,9687,9688,9692,9696],{"__ignoreMap":74},[78,9689,9690],{"class":80,"line":81},[78,9691,2092],{},[78,9693,9694],{"class":80,"line":87},[78,9695,2097],{},[78,9697,9698],{"class":80,"line":93},[78,9699,2102],{},[10,9701,118],{},[69,9703,9705],{"className":9704,"code":2108,"language":124,"meta":74},[122],[34,9706,2108],{"__ignoreMap":74},[10,9708,129],{},[14,9710,132],{"id":132},[134,9712,9713,9719],{},[49,9714,9715,2122,9717,171],{},[34,9716,2121],{},[34,9718,2075],{},[49,9720,9721,2129,9723,2133],{},[34,9722,1453],{},[34,9724,2132],{},[14,9726,151],{"id":151},[46,9728,9729,9731],{},[49,9730,2140],{},[49,9732,2143],{},[14,9734,174],{"id":174},[134,9736,9737,9739],{},[49,9738,2150],{},[49,9740,2153,9741,2156,9743,2160],{},[34,9742,2053],{},[34,9744,2159],{},[10,9746,185],{},[14,9748,188],{"id":188},[10,9750,2167],{},[193,9752,195],{},{"title":74,"searchDepth":87,"depth":87,"links":9754},[9755,9756,9757,9758,9759,9760,9761,9762],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":2027,"description":2032},[206,2187,2188],{"id":2191,"title":2192,"body":9767,"category":206,"cover":207,"description":2197,"extension":208,"meta":9900,"navigation":96,"path":2363,"pinned":211,"publishedAt":212,"seo":9901,"slug":2365,"stem":2366,"summary":2367,"tags":9902,"updatedAt":212,"visible":96,"__hash__":2371},{"type":7,"value":9768,"toc":9890},[9769,9771,9773,9775,9777,9781,9783,9785,9801,9803,9805,9829,9831,9836,9838,9840,9856,9858,9870,9872,9882,9884,9886,9888],[10,9770,2197],{},[14,9772,16],{"id":16},[10,9774,2202],{},[14,9776,22],{"id":22},[10,9778,9779],{},[26,9780],{"alt":2209,"src":2210},[10,9782,2213],{},[14,9784,44],{"id":44},[46,9786,9787,9789,9795],{},[49,9788,2220],{},[49,9790,2223,9791,2156,9793,2229],{},[34,9792,40],{},[34,9794,2228],{},[49,9796,2232,9797,2236,9799,2240],{},[34,9798,2235],{},[34,9800,2239],{},[14,9802,64],{"id":64},[10,9804,67],{},[69,9806,9807],{"className":71,"code":2247,"language":73,"meta":74,"style":74},[34,9808,9809,9813,9817,9821,9825],{"__ignoreMap":74},[78,9810,9811],{"class":80,"line":81},[78,9812,2254],{},[78,9814,9815],{"class":80,"line":87},[78,9816,2259],{},[78,9818,9819],{"class":80,"line":93},[78,9820,97],{"emptyLinePlaceholder":96},[78,9822,9823],{"class":80,"line":100},[78,9824,2268],{},[78,9826,9827],{"class":80,"line":106},[78,9828,2259],{},[10,9830,118],{},[69,9832,9834],{"className":9833,"code":2278,"language":124,"meta":74},[122],[34,9835,2278],{"__ignoreMap":74},[10,9837,129],{},[14,9839,132],{"id":132},[134,9841,9842,9848],{},[49,9843,918,9844,2292,9846,2295],{},[34,9845,2291],{},[34,9847,40],{},[49,9849,918,9850,2301,9852,2305,9854,171],{},[34,9851,2300],{},[34,9853,2304],{},[34,9855,2308],{},[14,9857,151],{"id":151},[46,9859,9860,9862],{},[49,9861,2315],{},[49,9863,54,9864,2236,9866,2236,9868,2325],{},[34,9865,2235],{},[34,9867,2239],{},[34,9869,2324],{},[14,9871,174],{"id":174},[134,9873,9874,9880],{},[49,9875,2332,9876,1137,9878,2339],{},[34,9877,2335],{},[34,9879,2338],{},[49,9881,2342],{},[10,9883,185],{},[14,9885,188],{"id":188},[10,9887,2349],{},[193,9889,195],{},{"title":74,"searchDepth":87,"depth":87,"links":9891},[9892,9893,9894,9895,9896,9897,9898,9899],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":2192,"description":2197},[206,2369,2370],{"id":2373,"title":2374,"body":9904,"category":206,"cover":207,"description":2379,"extension":208,"meta":10037,"navigation":96,"path":2546,"pinned":211,"publishedAt":212,"seo":10038,"slug":2548,"stem":2549,"summary":2550,"tags":10039,"updatedAt":212,"visible":96,"__hash__":2554},{"type":7,"value":9905,"toc":10027},[9906,9908,9910,9912,9914,9918,9920,9922,9940,9942,9944,9980,9982,9987,9989,9991,10001,10003,10011,10013,10019,10021,10023,10025],[10,9907,2379],{},[14,9909,16],{"id":16},[10,9911,2384],{},[14,9913,22],{"id":22},[10,9915,9916],{},[26,9917],{"alt":2391,"src":2392},[10,9919,2395],{},[14,9921,44],{"id":44},[46,9923,9924,9930,9938],{},[49,9925,9926,2405,9928,2409],{},[34,9927,2404],{},[34,9929,2408],{},[49,9931,9932,2415,9934,2419,9936,2423],{},[34,9933,2414],{},[34,9935,2418],{},[34,9937,2422],{},[49,9939,2426],{},[14,9941,64],{"id":64},[10,9943,67],{},[69,9945,9946],{"className":71,"code":2433,"language":73,"meta":74,"style":74},[34,9947,9948,9952,9956,9960,9964,9968,9972,9976],{"__ignoreMap":74},[78,9949,9950],{"class":80,"line":81},[78,9951,2440],{},[78,9953,9954],{"class":80,"line":87},[78,9955,2445],{},[78,9957,9958],{"class":80,"line":93},[78,9959,2450],{},[78,9961,9962],{"class":80,"line":100},[78,9963,97],{"emptyLinePlaceholder":96},[78,9965,9966],{"class":80,"line":106},[78,9967,2459],{},[78,9969,9970],{"class":80,"line":112},[78,9971,2464],{},[78,9973,9974],{"class":80,"line":2467},[78,9975,2470],{},[78,9977,9978],{"class":80,"line":2473},[78,9979,2476],{},[10,9981,118],{},[69,9983,9985],{"className":9984,"code":2482,"language":124,"meta":74},[122],[34,9986,2482],{"__ignoreMap":74},[10,9988,129],{},[14,9990,132],{"id":132},[134,9992,9993,9997],{},[49,9994,9995,2496],{},[34,9996,2495],{},[49,9998,9999,2502],{},[34,10000,2501],{},[14,10002,151],{"id":151},[46,10004,10005,10009],{},[49,10006,2509,10007,171],{},[34,10008,2512],{},[49,10010,2515],{},[14,10012,174],{"id":174},[134,10014,10015,10017],{},[49,10016,2522],{},[49,10018,2525],{},[10,10020,185],{},[14,10022,188],{"id":188},[10,10024,2532],{},[193,10026,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10028},[10029,10030,10031,10032,10033,10034,10035,10036],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":2374,"description":2379},[206,2552,2553],{"id":2556,"title":2557,"body":10041,"category":206,"cover":207,"description":2562,"extension":208,"meta":10178,"navigation":96,"path":2739,"pinned":211,"publishedAt":212,"seo":10179,"slug":2741,"stem":2742,"summary":2743,"tags":10180,"updatedAt":212,"visible":96,"__hash__":2747},{"type":7,"value":10042,"toc":10166},[10043,10045,10047,10049,10051,10055,10061,10063,10071,10073,10075,10099,10101,10106,10108,10110,10128,10130,10132,10136,10138,10140,10146,10148,10158,10160,10162,10164],[10,10044,2562],{},[14,10046,16],{"id":16},[10,10048,2567],{},[14,10050,22],{"id":22},[10,10052,10053],{},[26,10054],{"alt":2574,"src":2575},[10,10056,2578,10057,2582,10059,171],{},[34,10058,2581],{},[34,10060,2585],{},[14,10062,44],{"id":44},[46,10064,10065,10067,10069],{},[49,10066,2592],{},[49,10068,2595],{},[49,10070,2598],{},[14,10072,64],{"id":64},[10,10074,67],{},[69,10076,10077],{"className":71,"code":2605,"language":73,"meta":74,"style":74},[34,10078,10079,10083,10087,10091,10095],{"__ignoreMap":74},[78,10080,10081],{"class":80,"line":81},[78,10082,2612],{},[78,10084,10085],{"class":80,"line":87},[78,10086,2617],{},[78,10088,10089],{"class":80,"line":93},[78,10090,2622],{},[78,10092,10093],{"class":80,"line":100},[78,10094,2627],{},[78,10096,10097],{"class":80,"line":106},[78,10098,2632],{},[10,10100,118],{},[69,10102,10104],{"className":10103,"code":2638,"language":124,"meta":74},[122],[34,10105,2638],{"__ignoreMap":74},[10,10107,129],{},[14,10109,132],{"id":132},[134,10111,10112,10120],{},[49,10113,2649,10114,2652,10116,2656,10118,2660],{},[34,10115,206],{},[34,10117,2655],{},[34,10119,2659],{},[49,10121,10122,2666,10124,2670,10126,2674],{},[34,10123,2665],{},[34,10125,2669],{},[34,10127,2673],{},[309,10129,2677],{"id":2677},[10,10131,2680],{},[10,10133,10134],{},[26,10135],{"alt":2685,"src":2686},[10,10137,2689],{},[14,10139,151],{"id":151},[46,10141,10142,10144],{},[49,10143,2696],{},[49,10145,2699],{},[14,10147,174],{"id":174},[134,10149,10150,10156],{},[49,10151,2706,10152,2710,10154,171],{},[34,10153,2709],{},[34,10155,2713],{},[49,10157,2716],{},[10,10159,185],{},[14,10161,188],{"id":188},[10,10163,2723],{},[193,10165,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10167},[10168,10169,10170,10171,10172,10175,10176,10177],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":10173},[10174],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":2557,"description":2562},[206,2745,2746],{"id":2749,"title":2750,"body":10182,"category":206,"cover":207,"description":2755,"extension":208,"meta":10347,"navigation":96,"path":2970,"pinned":211,"publishedAt":212,"seo":10348,"slug":2972,"stem":2973,"summary":2974,"tags":10349,"updatedAt":212,"visible":96,"__hash__":2978},{"type":7,"value":10183,"toc":10335},[10184,10186,10188,10190,10192,10196,10202,10204,10224,10226,10228,10264,10266,10271,10273,10275,10289,10291,10293,10297,10303,10305,10315,10317,10327,10329,10331,10333],[10,10185,2755],{},[14,10187,16],{"id":16},[10,10189,2760],{},[14,10191,22],{"id":22},[10,10193,10194],{},[26,10195],{"alt":2767,"src":2768},[10,10197,2771,10198,989,10200,2778],{},[34,10199,2774],{},[34,10201,2777],{},[14,10203,44],{"id":44},[46,10205,10206,10214,10222],{},[49,10207,10208,2788,10210,2792,10212,2796],{},[34,10209,2787],{},[34,10211,2791],{},[34,10213,2795],{},[49,10215,10216,2802,10218,2806,10220,2810],{},[34,10217,2801],{},[34,10219,2805],{},[34,10221,2809],{},[49,10223,2813],{},[14,10225,64],{"id":64},[10,10227,67],{},[69,10229,10230],{"className":71,"code":2820,"language":73,"meta":74,"style":74},[34,10231,10232,10236,10240,10244,10248,10252,10256,10260],{"__ignoreMap":74},[78,10233,10234],{"class":80,"line":81},[78,10235,2827],{},[78,10237,10238],{"class":80,"line":87},[78,10239,2832],{},[78,10241,10242],{"class":80,"line":93},[78,10243,97],{"emptyLinePlaceholder":96},[78,10245,10246],{"class":80,"line":100},[78,10247,2841],{},[78,10249,10250],{"class":80,"line":106},[78,10251,2846],{},[78,10253,10254],{"class":80,"line":112},[78,10255,2851],{},[78,10257,10258],{"class":80,"line":2467},[78,10259,2856],{},[78,10261,10262],{"class":80,"line":2473},[78,10263,2861],{},[10,10265,118],{},[69,10267,10269],{"className":10268,"code":2867,"language":124,"meta":74},[122],[34,10270,2867],{"__ignoreMap":74},[10,10272,129],{},[14,10274,132],{"id":132},[134,10276,10277,10283],{},[49,10278,10279,2881,10281,2885],{},[34,10280,2880],{},[34,10282,2884],{},[49,10284,10285,2891,10287,2894],{},[34,10286,2890],{},[34,10288,2809],{},[309,10290,2677],{"id":2677},[10,10292,2899],{},[10,10294,10295],{},[26,10296],{"alt":2904,"src":2905},[10,10298,10299,2910,10301,2913],{},[34,10300,2801],{},[34,10302,2805],{},[14,10304,151],{"id":151},[46,10306,10307,10313],{},[49,10308,2920,10309,2923,10311,2926],{},[34,10310,2795],{},[34,10312,2787],{},[49,10314,2929],{},[14,10316,174],{"id":174},[134,10318,10319,10323],{},[49,10320,2936,10321,2940],{},[34,10322,2939],{},[49,10324,2943,10325,2947],{},[34,10326,2946],{},[10,10328,185],{},[14,10330,188],{"id":188},[10,10332,2954],{},[193,10334,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10336},[10337,10338,10339,10340,10341,10344,10345,10346],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":10342},[10343],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":2750,"description":2755},[206,2976,2977],{"id":2980,"title":2981,"body":10351,"category":206,"cover":207,"description":2986,"extension":208,"meta":10484,"navigation":96,"path":3155,"pinned":211,"publishedAt":212,"seo":10485,"slug":3157,"stem":3158,"summary":3159,"tags":10486,"updatedAt":212,"visible":96,"__hash__":3162},{"type":7,"value":10352,"toc":10474},[10353,10355,10357,10359,10361,10365,10375,10377,10387,10389,10391,10419,10421,10426,10428,10430,10444,10446,10454,10456,10466,10468,10470,10472],[10,10354,2986],{},[14,10356,16],{"id":16},[10,10358,2991],{},[14,10360,22],{"id":22},[10,10362,10363],{},[26,10364],{"alt":2998,"src":2999},[10,10366,10367,3005,10369,3009,10371,3013,10373,3017],{},[34,10368,3004],{},[34,10370,3008],{},[34,10372,3012],{},[34,10374,3016],{},[14,10376,44],{"id":44},[46,10378,10379,10381,10385],{},[49,10380,3024],{},[49,10382,10383,3029],{},[34,10384,3016],{},[49,10386,3032],{},[14,10388,64],{"id":64},[10,10390,67],{},[69,10392,10393],{"className":71,"code":3039,"language":73,"meta":74,"style":74},[34,10394,10395,10399,10403,10407,10411,10415],{"__ignoreMap":74},[78,10396,10397],{"class":80,"line":81},[78,10398,3046],{},[78,10400,10401],{"class":80,"line":87},[78,10402,3051],{},[78,10404,10405],{"class":80,"line":93},[78,10406,3056],{},[78,10408,10409],{"class":80,"line":100},[78,10410,97],{"emptyLinePlaceholder":96},[78,10412,10413],{"class":80,"line":106},[78,10414,3065],{},[78,10416,10417],{"class":80,"line":112},[78,10418,3070],{},[10,10420,118],{},[69,10422,10424],{"className":10423,"code":3076,"language":124,"meta":74},[122],[34,10425,3076],{"__ignoreMap":74},[10,10427,129],{},[14,10429,132],{"id":132},[134,10431,10432,10438],{},[49,10433,3087,10434,3090,10436,3094],{},[34,10435,3004],{},[34,10437,3093],{},[49,10439,10440,3100,10442,3104],{},[34,10441,3099],{},[34,10443,3103],{},[14,10445,151],{"id":151},[46,10447,10448,10452],{},[49,10449,3111,10450,3115],{},[34,10451,3114],{},[49,10453,3118],{},[14,10455,174],{"id":174},[134,10457,10458,10460],{},[49,10459,3125],{},[49,10461,1700,10462,3131,10464,3134],{},[34,10463,3130],{},[34,10465,3016],{},[10,10467,185],{},[14,10469,188],{"id":188},[10,10471,3141],{},[193,10473,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10475},[10476,10477,10478,10479,10480,10481,10482,10483],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":2981,"description":2986},[206,2324,3161],{"id":3164,"title":3165,"body":10488,"category":206,"cover":207,"description":3170,"extension":208,"meta":10617,"navigation":96,"path":3331,"pinned":211,"publishedAt":212,"seo":10618,"slug":3333,"stem":3334,"summary":3335,"tags":10619,"updatedAt":212,"visible":96,"__hash__":3338},{"type":7,"value":10489,"toc":10607},[10490,10492,10494,10496,10498,10502,10506,10508,10518,10520,10522,10554,10556,10561,10563,10565,10577,10579,10589,10591,10599,10601,10603,10605],[10,10491,3170],{},[14,10493,16],{"id":16},[10,10495,3175],{},[14,10497,22],{"id":22},[10,10499,10500],{},[26,10501],{"alt":3182,"src":3183},[10,10503,3186,10504,3190],{},[34,10505,3189],{},[14,10507,44],{"id":44},[46,10509,10510,10512,10514],{},[49,10511,3197],{},[49,10513,3200],{},[49,10515,3203,10516,171],{},[34,10517,3206],{},[14,10519,64],{"id":64},[10,10521,67],{},[69,10523,10524],{"className":71,"code":3213,"language":73,"meta":74,"style":74},[34,10525,10526,10530,10534,10538,10542,10546,10550],{"__ignoreMap":74},[78,10527,10528],{"class":80,"line":81},[78,10529,3220],{},[78,10531,10532],{"class":80,"line":87},[78,10533,3225],{},[78,10535,10536],{"class":80,"line":93},[78,10537,97],{"emptyLinePlaceholder":96},[78,10539,10540],{"class":80,"line":100},[78,10541,3234],{},[78,10543,10544],{"class":80,"line":106},[78,10545,3239],{},[78,10547,10548],{"class":80,"line":112},[78,10549,3244],{},[78,10551,10552],{"class":80,"line":2467},[78,10553,3249],{},[10,10555,118],{},[69,10557,10559],{"className":10558,"code":3255,"language":124,"meta":74},[122],[34,10560,3255],{"__ignoreMap":74},[10,10562,129],{},[14,10564,132],{"id":132},[134,10566,10567,10569],{},[49,10568,3266],{},[49,10570,10571,3272,10573,3276,10575,3280],{},[34,10572,3271],{},[34,10574,3275],{},[34,10576,3279],{},[14,10578,151],{"id":151},[46,10580,10581,10587],{},[49,10582,3287,10583,3291,10585,171],{},[34,10584,3290],{},[34,10586,3294],{},[49,10588,3297],{},[14,10590,174],{"id":174},[134,10592,10593,10595],{},[49,10594,3304],{},[49,10596,3307,10597,3310],{},[34,10598,3279],{},[10,10600,185],{},[14,10602,188],{"id":188},[10,10604,3317],{},[193,10606,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10608},[10609,10610,10611,10612,10613,10614,10615,10616],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":3165,"description":3170},[206,3337,219],{"id":3340,"title":3341,"body":10621,"category":206,"cover":207,"description":3346,"extension":208,"meta":10740,"navigation":96,"path":3488,"pinned":211,"publishedAt":212,"seo":10741,"slug":3490,"stem":3491,"summary":3492,"tags":10742,"updatedAt":212,"visible":96,"__hash__":3495},{"type":7,"value":10622,"toc":10730},[10623,10625,10627,10629,10631,10635,10637,10639,10647,10649,10651,10679,10681,10686,10688,10690,10700,10702,10710,10712,10722,10724,10726,10728],[10,10624,3346],{},[14,10626,16],{"id":16},[10,10628,3351],{},[14,10630,22],{"id":22},[10,10632,10633],{},[26,10634],{"alt":3358,"src":3359},[10,10636,3362],{},[14,10638,44],{"id":44},[46,10640,10641,10643,10645],{},[49,10642,3369],{},[49,10644,3372],{},[49,10646,3375],{},[14,10648,64],{"id":64},[10,10650,67],{},[69,10652,10653],{"className":71,"code":3382,"language":73,"meta":74,"style":74},[34,10654,10655,10659,10663,10667,10671,10675],{"__ignoreMap":74},[78,10656,10657],{"class":80,"line":81},[78,10658,3389],{},[78,10660,10661],{"class":80,"line":87},[78,10662,3394],{},[78,10664,10665],{"class":80,"line":93},[78,10666,3399],{},[78,10668,10669],{"class":80,"line":100},[78,10670,97],{"emptyLinePlaceholder":96},[78,10672,10673],{"class":80,"line":106},[78,10674,3408],{},[78,10676,10677],{"class":80,"line":112},[78,10678,3413],{},[10,10680,118],{},[69,10682,10684],{"className":10683,"code":3419,"language":124,"meta":74},[122],[34,10685,3419],{"__ignoreMap":74},[10,10687,129],{},[14,10689,132],{"id":132},[134,10691,10692,10696],{},[49,10693,10694,3433],{},[34,10695,3432],{},[49,10697,10698,3439],{},[34,10699,3438],{},[14,10701,151],{"id":151},[46,10703,10704,10708],{},[49,10705,3446,10706,3450],{},[34,10707,3449],{},[49,10709,3453],{},[14,10711,174],{"id":174},[134,10713,10714,10716],{},[49,10715,3460],{},[49,10717,2153,10718,2156,10720,3467],{},[34,10719,3449],{},[34,10721,3438],{},[10,10723,185],{},[14,10725,188],{"id":188},[10,10727,3474],{},[193,10729,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10731},[10732,10733,10734,10735,10736,10737,10738,10739],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":3341,"description":3346},[206,3494,219],{"id":4,"title":5,"body":10744,"category":206,"cover":207,"description":12,"extension":208,"meta":10869,"navigation":96,"path":210,"pinned":211,"publishedAt":212,"seo":10870,"slug":214,"stem":215,"summary":216,"tags":10871,"updatedAt":212,"visible":96,"__hash__":220},{"type":7,"value":10745,"toc":10859},[10746,10748,10750,10752,10754,10758,10764,10766,10776,10778,10780,10808,10810,10815,10817,10819,10829,10831,10843,10845,10851,10853,10855,10857],[10,10747,12],{},[14,10749,16],{"id":16},[10,10751,19],{},[14,10753,22],{"id":22},[10,10755,10756],{},[26,10757],{"alt":28,"src":29},[10,10759,32,10760,37,10762,41],{},[34,10761,36],{},[34,10763,40],{},[14,10765,44],{"id":44},[46,10767,10768,10770,10774],{},[49,10769,51],{},[49,10771,54,10772,58],{},[34,10773,57],{},[49,10775,61],{},[14,10777,64],{"id":64},[10,10779,67],{},[69,10781,10782],{"className":71,"code":72,"language":73,"meta":74,"style":74},[34,10783,10784,10788,10792,10796,10800,10804],{"__ignoreMap":74},[78,10785,10786],{"class":80,"line":81},[78,10787,84],{},[78,10789,10790],{"class":80,"line":87},[78,10791,90],{},[78,10793,10794],{"class":80,"line":93},[78,10795,97],{"emptyLinePlaceholder":96},[78,10797,10798],{"class":80,"line":100},[78,10799,103],{},[78,10801,10802],{"class":80,"line":106},[78,10803,109],{},[78,10805,10806],{"class":80,"line":112},[78,10807,115],{},[10,10809,118],{},[69,10811,10813],{"className":10812,"code":123,"language":124,"meta":74},[122],[34,10814,123],{"__ignoreMap":74},[10,10816,129],{},[14,10818,132],{"id":132},[134,10820,10821,10823],{},[49,10822,138],{},[49,10824,141,10825,144,10827,148],{},[34,10826,40],{},[34,10828,147],{},[14,10830,151],{"id":151},[46,10832,10833,10837],{},[49,10834,156,10835,160],{},[34,10836,159],{},[49,10838,163,10839,167,10841,171],{},[34,10840,166],{},[34,10842,170],{},[14,10844,174],{"id":174},[134,10846,10847,10849],{},[49,10848,179],{},[49,10850,182],{},[10,10852,185],{},[14,10854,188],{"id":188},[10,10856,191],{},[193,10858,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10860},[10861,10862,10863,10864,10865,10866,10867,10868],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5,"description":12},[206,218,219],{"id":3626,"title":3627,"body":10873,"category":206,"cover":207,"description":3632,"extension":208,"meta":10996,"navigation":96,"path":3782,"pinned":211,"publishedAt":212,"seo":10997,"slug":3784,"stem":3785,"summary":3786,"tags":10998,"updatedAt":212,"visible":96,"__hash__":3789},{"type":7,"value":10874,"toc":10986},[10875,10877,10879,10881,10883,10887,10889,10891,10903,10905,10907,10935,10937,10942,10944,10946,10956,10958,10968,10970,10978,10980,10982,10984],[10,10876,3632],{},[14,10878,16],{"id":16},[10,10880,3637],{},[14,10882,22],{"id":22},[10,10884,10885],{},[26,10886],{"alt":3644,"src":3645},[10,10888,3648],{},[14,10890,44],{"id":44},[46,10892,10893,10895,10897],{},[49,10894,3655],{},[49,10896,3658],{},[49,10898,3661,10899,3665,10901,3669],{},[34,10900,3664],{},[34,10902,3668],{},[14,10904,64],{"id":64},[10,10906,67],{},[69,10908,10909],{"className":71,"code":3676,"language":73,"meta":74,"style":74},[34,10910,10911,10915,10919,10923,10927,10931],{"__ignoreMap":74},[78,10912,10913],{"class":80,"line":81},[78,10914,3683],{},[78,10916,10917],{"class":80,"line":87},[78,10918,3688],{},[78,10920,10921],{"class":80,"line":93},[78,10922,97],{"emptyLinePlaceholder":96},[78,10924,10925],{"class":80,"line":100},[78,10926,3697],{},[78,10928,10929],{"class":80,"line":106},[78,10930,3702],{},[78,10932,10933],{"class":80,"line":112},[78,10934,3707],{},[10,10936,118],{},[69,10938,10940],{"className":10939,"code":3713,"language":124,"meta":74},[122],[34,10941,3713],{"__ignoreMap":74},[10,10943,129],{},[14,10945,132],{"id":132},[134,10947,10948,10950],{},[49,10949,3724],{},[49,10951,10952,3730,10954,3734],{},[34,10953,3729],{},[34,10955,3733],{},[14,10957,151],{"id":151},[46,10959,10960,10966],{},[49,10961,54,10962,3743,10964,171],{},[34,10963,3668],{},[34,10965,3664],{},[49,10967,3748],{},[14,10969,174],{"id":174},[134,10971,10972,10976],{},[49,10973,3755,10974,3758],{},[34,10975,3664],{},[49,10977,3761],{},[10,10979,185],{},[14,10981,188],{"id":188},[10,10983,3768],{},[193,10985,195],{},{"title":74,"searchDepth":87,"depth":87,"links":10987},[10988,10989,10990,10991,10992,10993,10994,10995],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":3627,"description":3632},[206,3788,219],{"id":3791,"title":3792,"body":11000,"category":206,"cover":207,"description":3797,"extension":208,"meta":11159,"navigation":96,"path":3996,"pinned":211,"publishedAt":212,"seo":11160,"slug":3998,"stem":3999,"summary":4000,"tags":11161,"updatedAt":212,"visible":96,"__hash__":4004},{"type":7,"value":11001,"toc":11147},[11002,11004,11006,11008,11010,11014,11020,11022,11034,11036,11038,11078,11080,11085,11087,11089,11103,11105,11107,11111,11113,11115,11125,11127,11139,11141,11143,11145],[10,11003,3797],{},[14,11005,16],{"id":16},[10,11007,3802],{},[14,11009,22],{"id":22},[10,11011,11012],{},[26,11013],{"alt":3809,"src":3810},[10,11015,11016,3816,11018,3820],{},[34,11017,3815],{},[34,11019,3819],{},[14,11021,44],{"id":44},[46,11023,11024,11030,11032],{},[49,11025,11026,3829,11028,3833],{},[34,11027,2787],{},[34,11029,3832],{},[49,11031,3836],{},[49,11033,3839],{},[14,11035,64],{"id":64},[10,11037,67],{},[69,11039,11040],{"className":71,"code":3846,"language":73,"meta":74,"style":74},[34,11041,11042,11046,11050,11054,11058,11062,11066,11070,11074],{"__ignoreMap":74},[78,11043,11044],{"class":80,"line":81},[78,11045,3853],{},[78,11047,11048],{"class":80,"line":87},[78,11049,3858],{},[78,11051,11052],{"class":80,"line":93},[78,11053,3863],{},[78,11055,11056],{"class":80,"line":100},[78,11057,97],{"emptyLinePlaceholder":96},[78,11059,11060],{"class":80,"line":106},[78,11061,3872],{},[78,11063,11064],{"class":80,"line":112},[78,11065,3877],{},[78,11067,11068],{"class":80,"line":2467},[78,11069,3882],{},[78,11071,11072],{"class":80,"line":2473},[78,11073,3887],{},[78,11075,11076],{"class":80,"line":3890},[78,11077,3893],{},[10,11079,118],{},[69,11081,11083],{"className":11082,"code":3899,"language":124,"meta":74},[122],[34,11084,3899],{"__ignoreMap":74},[10,11086,129],{},[14,11088,132],{"id":132},[134,11090,11091,11095],{},[49,11092,11093,3913],{},[34,11094,3912],{},[49,11096,11097,3919,11099,3923,11101,3927],{},[34,11098,3918],{},[34,11100,3922],{},[34,11102,3926],{},[309,11104,2677],{"id":2677},[10,11106,3932],{},[10,11108,11109],{},[26,11110],{"alt":3937,"src":3938},[10,11112,3941],{},[14,11114,151],{"id":151},[46,11116,11117,11123],{},[49,11118,3948,11119,3951,11121,171],{},[34,11120,2787],{},[34,11122,3832],{},[49,11124,3956],{},[14,11126,174],{"id":174},[134,11128,11129,11131],{},[49,11130,3963],{},[49,11132,54,11133,3969,11135,1137,11137,171],{},[34,11134,3968],{},[34,11136,3832],{},[34,11138,2787],{},[10,11140,185],{},[14,11142,188],{"id":188},[10,11144,3980],{},[193,11146,195],{},{"title":74,"searchDepth":87,"depth":87,"links":11148},[11149,11150,11151,11152,11153,11156,11157,11158],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":11154},[11155],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":3792,"description":3797},[206,4002,4003],{"id":4006,"title":4007,"body":11163,"category":206,"cover":207,"description":4012,"extension":208,"meta":11335,"navigation":96,"path":4226,"pinned":211,"publishedAt":212,"seo":11336,"slug":4228,"stem":4229,"summary":4230,"tags":11337,"updatedAt":212,"visible":96,"__hash__":4233},{"type":7,"value":11164,"toc":11322},[11165,11167,11169,11171,11173,11177,11185,11187,11195,11197,11199,11243,11245,11250,11252,11254,11266,11268,11270,11274,11280,11282,11284,11288,11292,11294,11306,11308,11314,11316,11318,11320],[10,11166,4012],{},[14,11168,16],{"id":16},[10,11170,4017],{},[14,11172,22],{"id":22},[10,11174,11175],{},[26,11176],{"alt":4024,"src":4025},[10,11178,11179,2236,11181,2236,11183,4035],{},[34,11180,1136],{},[34,11182,4032],{},[34,11184,1140],{},[14,11186,44],{"id":44},[46,11188,11189,11191,11193],{},[49,11190,4042],{},[49,11192,4045],{},[49,11194,4048],{},[14,11196,64],{"id":64},[10,11198,67],{},[69,11200,11201],{"className":71,"code":4055,"language":73,"meta":74,"style":74},[34,11202,11203,11207,11211,11215,11219,11223,11227,11231,11235,11239],{"__ignoreMap":74},[78,11204,11205],{"class":80,"line":81},[78,11206,4062],{},[78,11208,11209],{"class":80,"line":87},[78,11210,97],{"emptyLinePlaceholder":96},[78,11212,11213],{"class":80,"line":93},[78,11214,4071],{},[78,11216,11217],{"class":80,"line":100},[78,11218,4076],{},[78,11220,11221],{"class":80,"line":106},[78,11222,4081],{},[78,11224,11225],{"class":80,"line":112},[78,11226,4086],{},[78,11228,11229],{"class":80,"line":2467},[78,11230,1126],{},[78,11232,11233],{"class":80,"line":2473},[78,11234,4095],{},[78,11236,11237],{"class":80,"line":3890},[78,11238,97],{"emptyLinePlaceholder":96},[78,11240,11241],{"class":80,"line":4102},[78,11242,4105],{},[10,11244,118],{},[69,11246,11248],{"className":11247,"code":4111,"language":124,"meta":74},[122],[34,11249,4111],{"__ignoreMap":74},[10,11251,129],{},[14,11253,132],{"id":132},[134,11255,11256,11260],{},[49,11257,4122,11258,4126],{},[34,11259,4125],{},[49,11261,11262,4132,11264,4135],{},[34,11263,4131],{},[34,11265,1140],{},[309,11267,2677],{"id":2677},[10,11269,4140],{},[10,11271,11272],{},[26,11273],{"alt":4145,"src":4146},[10,11275,11276,4151,11278,4154],{},[34,11277,4125],{},[34,11279,4131],{},[309,11281,2677],{"id":4157},[10,11283,4160],{},[10,11285,11286],{},[26,11287],{"alt":4165,"src":4166},[10,11289,4169,11290,4172],{},[34,11291,1136],{},[14,11293,151],{"id":151},[46,11295,11296,11300],{},[49,11297,4179,11298,4182],{},[34,11299,4131],{},[49,11301,4185,11302,4188,11304,4192],{},[34,11303,1136],{},[34,11305,4191],{},[14,11307,174],{"id":174},[134,11309,11310,11312],{},[49,11311,4199],{},[49,11313,4202],{},[10,11315,185],{},[14,11317,188],{"id":188},[10,11319,4209],{},[193,11321,195],{},{"title":74,"searchDepth":87,"depth":87,"links":11323},[11324,11325,11326,11327,11328,11332,11333,11334],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":11329},[11330,11331],{"id":2677,"depth":93,"text":2677},{"id":4157,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":4007,"description":4012},[206,1136,4232],{"id":4235,"title":4236,"body":11339,"category":206,"cover":207,"description":4241,"extension":208,"meta":11476,"navigation":96,"path":4408,"pinned":211,"publishedAt":212,"seo":11477,"slug":4410,"stem":4411,"summary":4412,"tags":11478,"updatedAt":212,"visible":96,"__hash__":4415},{"type":7,"value":11340,"toc":11464},[11341,11343,11345,11347,11349,11353,11357,11359,11369,11371,11373,11405,11407,11412,11414,11416,11426,11428,11430,11434,11438,11440,11446,11448,11456,11458,11460,11462],[10,11342,4241],{},[14,11344,16],{"id":16},[10,11346,4246],{},[14,11348,22],{"id":22},[10,11350,11351],{},[26,11352],{"alt":4253,"src":4254},[10,11354,11355,4260],{},[34,11356,4259],{},[14,11358,44],{"id":44},[46,11360,11361,11363,11365],{},[49,11362,4267],{},[49,11364,4270],{},[49,11366,4273,11367,4277],{},[34,11368,4276],{},[14,11370,64],{"id":64},[10,11372,67],{},[69,11374,11375],{"className":71,"code":4284,"language":73,"meta":74,"style":74},[34,11376,11377,11381,11385,11389,11393,11397,11401],{"__ignoreMap":74},[78,11378,11379],{"class":80,"line":81},[78,11380,4291],{},[78,11382,11383],{"class":80,"line":87},[78,11384,97],{"emptyLinePlaceholder":96},[78,11386,11387],{"class":80,"line":93},[78,11388,4300],{},[78,11390,11391],{"class":80,"line":100},[78,11392,4305],{},[78,11394,11395],{"class":80,"line":106},[78,11396,4310],{},[78,11398,11399],{"class":80,"line":112},[78,11400,97],{"emptyLinePlaceholder":96},[78,11402,11403],{"class":80,"line":2467},[78,11404,4319],{},[10,11406,118],{},[69,11408,11410],{"className":11409,"code":4325,"language":124,"meta":74},[122],[34,11411,4325],{"__ignoreMap":74},[10,11413,129],{},[14,11415,132],{"id":132},[134,11417,11418,11422],{},[49,11419,4336,11420,4340],{},[34,11421,4339],{},[49,11423,4343,11424,4346],{},[34,11425,4339],{},[309,11427,2677],{"id":2677},[10,11429,4351],{},[10,11431,11432],{},[26,11433],{"alt":4356,"src":4357},[10,11435,4360,11436,4363],{},[34,11437,4339],{},[14,11439,151],{"id":151},[46,11441,11442,11444],{},[49,11443,4370],{},[49,11445,4373],{},[14,11447,174],{"id":174},[134,11449,11450,11454],{},[49,11451,54,11452,4382],{},[34,11453,4259],{},[49,11455,4385],{},[10,11457,185],{},[14,11459,188],{"id":188},[10,11461,4392],{},[193,11463,195],{},{"title":74,"searchDepth":87,"depth":87,"links":11465},[11466,11467,11468,11469,11470,11473,11474,11475],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":11471},[11472],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":4236,"description":4241},[206,4259,4414],{"id":4417,"title":4418,"body":11480,"category":206,"cover":207,"description":4423,"extension":208,"meta":11605,"navigation":96,"path":4572,"pinned":211,"publishedAt":212,"seo":11606,"slug":4574,"stem":4575,"summary":4576,"tags":11607,"updatedAt":212,"visible":96,"__hash__":4579},{"type":7,"value":11481,"toc":11595},[11482,11484,11486,11488,11490,11494,11498,11500,11510,11512,11514,11546,11548,11553,11555,11557,11569,11571,11577,11579,11587,11589,11591,11593],[10,11483,4423],{},[14,11485,16],{"id":16},[10,11487,4428],{},[14,11489,22],{"id":22},[10,11491,11492],{},[26,11493],{"alt":4435,"src":4436},[10,11495,11496,4441],{},[34,11497,4276],{},[14,11499,44],{"id":44},[46,11501,11502,11506,11508],{},[49,11503,11504,4451],{},[34,11505,4450],{},[49,11507,4454],{},[49,11509,4457],{},[14,11511,64],{"id":64},[10,11513,67],{},[69,11515,11516],{"className":71,"code":4464,"language":73,"meta":74,"style":74},[34,11517,11518,11522,11526,11530,11534,11538,11542],{"__ignoreMap":74},[78,11519,11520],{"class":80,"line":81},[78,11521,4471],{},[78,11523,11524],{"class":80,"line":87},[78,11525,97],{"emptyLinePlaceholder":96},[78,11527,11528],{"class":80,"line":93},[78,11529,4480],{},[78,11531,11532],{"class":80,"line":100},[78,11533,4485],{},[78,11535,11536],{"class":80,"line":106},[78,11537,97],{"emptyLinePlaceholder":96},[78,11539,11540],{"class":80,"line":112},[78,11541,4494],{},[78,11543,11544],{"class":80,"line":2467},[78,11545,4499],{},[10,11547,118],{},[69,11549,11551],{"className":11550,"code":4505,"language":124,"meta":74},[122],[34,11552,4505],{"__ignoreMap":74},[10,11554,129],{},[14,11556,132],{"id":132},[134,11558,11559,11565],{},[49,11560,4516,11561,4519,11563,4523],{},[34,11562,4276],{},[34,11564,4522],{},[49,11566,11567,4528],{},[34,11568,4450],{},[14,11570,151],{"id":151},[46,11572,11573,11575],{},[49,11574,4535],{},[49,11576,4538],{},[14,11578,174],{"id":174},[134,11580,11581,11583],{},[49,11582,4545],{},[49,11584,54,11585,4551],{},[34,11586,4550],{},[10,11588,185],{},[14,11590,188],{"id":188},[10,11592,4558],{},[193,11594,195],{},{"title":74,"searchDepth":87,"depth":87,"links":11596},[11597,11598,11599,11600,11601,11602,11603,11604],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":4418,"description":4423},[206,4276,4578],{"id":4581,"title":4582,"body":11609,"category":206,"cover":207,"description":4587,"extension":208,"meta":11754,"navigation":96,"path":4762,"pinned":211,"publishedAt":212,"seo":11755,"slug":4764,"stem":4765,"summary":4766,"tags":11756,"updatedAt":212,"visible":96,"__hash__":4768},{"type":7,"value":11610,"toc":11744},[11611,11613,11615,11617,11619,11623,11629,11631,11645,11647,11649,11693,11695,11700,11702,11704,11714,11716,11728,11730,11736,11738,11740,11742],[10,11612,4587],{},[14,11614,16],{"id":16},[10,11616,4592],{},[14,11618,22],{"id":22},[10,11620,11621],{},[26,11622],{"alt":4599,"src":4600},[10,11624,11625,4606,11627,4610],{},[34,11626,4605],{},[34,11628,4609],{},[14,11630,44],{"id":44},[46,11632,11633,11635,11641],{},[49,11634,4617],{},[49,11636,11637,4622,11639,4625],{},[34,11638,4605],{},[34,11640,4259],{},[49,11642,4628,11643,4631],{},[34,11644,4609],{},[14,11646,64],{"id":64},[10,11648,67],{},[69,11650,11651],{"className":71,"code":4638,"language":73,"meta":74,"style":74},[34,11652,11653,11657,11661,11665,11669,11673,11677,11681,11685,11689],{"__ignoreMap":74},[78,11654,11655],{"class":80,"line":81},[78,11656,4645],{},[78,11658,11659],{"class":80,"line":87},[78,11660,97],{"emptyLinePlaceholder":96},[78,11662,11663],{"class":80,"line":93},[78,11664,4654],{},[78,11666,11667],{"class":80,"line":100},[78,11668,4659],{},[78,11670,11671],{"class":80,"line":106},[78,11672,4664],{},[78,11674,11675],{"class":80,"line":112},[78,11676,4669],{},[78,11678,11679],{"class":80,"line":2467},[78,11680,4674],{},[78,11682,11683],{"class":80,"line":2473},[78,11684,4499],{},[78,11686,11687],{"class":80,"line":3890},[78,11688,97],{"emptyLinePlaceholder":96},[78,11690,11691],{"class":80,"line":4102},[78,11692,4687],{},[10,11694,118],{},[69,11696,11698],{"className":11697,"code":4693,"language":124,"meta":74},[122],[34,11699,4693],{"__ignoreMap":74},[10,11701,129],{},[14,11703,132],{"id":132},[134,11705,11706,11710],{},[49,11707,4704,11708,4707],{},[34,11709,4605],{},[49,11711,4710,11712,4713],{},[34,11713,4609],{},[14,11715,151],{"id":151},[46,11717,11718,11722],{},[49,11719,3446,11720,4722],{},[34,11721,4605],{},[49,11723,4725,11724,4728,11726,4731],{},[34,11725,4259],{},[34,11727,4605],{},[14,11729,174],{"id":174},[134,11731,11732,11734],{},[49,11733,4738],{},[49,11735,4741],{},[10,11737,185],{},[14,11739,188],{"id":188},[10,11741,4748],{},[193,11743,195],{},{"title":74,"searchDepth":87,"depth":87,"links":11745},[11746,11747,11748,11749,11750,11751,11752,11753],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":4582,"description":4587},[206,4609,4605],{"id":4770,"title":4771,"body":11758,"category":206,"cover":207,"description":4776,"extension":208,"meta":11897,"navigation":96,"path":4948,"pinned":211,"publishedAt":212,"seo":11898,"slug":4950,"stem":4951,"summary":4952,"tags":11899,"updatedAt":212,"visible":96,"__hash__":4956},{"type":7,"value":11759,"toc":11885},[11760,11762,11764,11766,11768,11772,11774,11776,11792,11794,11796,11824,11826,11831,11833,11835,11847,11849,11851,11855,11857,11859,11869,11871,11877,11879,11881,11883],[10,11761,4776],{},[14,11763,16],{"id":16},[10,11765,4781],{},[14,11767,22],{"id":22},[10,11769,11770],{},[26,11771],{"alt":4788,"src":4789},[10,11773,4792],{},[14,11775,44],{"id":44},[46,11777,11778,11780,11782],{},[49,11779,4799],{},[49,11781,4802],{},[49,11783,4805,11784,2236,11786,4812,11788,2236,11790,171],{},[34,11785,4808],{},[34,11787,4811],{},[34,11789,4815],{},[34,11791,4818],{},[14,11793,64],{"id":64},[10,11795,67],{},[69,11797,11798],{"className":71,"code":4825,"language":73,"meta":74,"style":74},[34,11799,11800,11804,11808,11812,11816,11820],{"__ignoreMap":74},[78,11801,11802],{"class":80,"line":81},[78,11803,4832],{},[78,11805,11806],{"class":80,"line":87},[78,11807,97],{"emptyLinePlaceholder":96},[78,11809,11810],{"class":80,"line":93},[78,11811,4841],{},[78,11813,11814],{"class":80,"line":100},[78,11815,4846],{},[78,11817,11818],{"class":80,"line":106},[78,11819,4851],{},[78,11821,11822],{"class":80,"line":112},[78,11823,4856],{},[10,11825,118],{},[69,11827,11829],{"className":11828,"code":4862,"language":124,"meta":74},[122],[34,11830,4862],{"__ignoreMap":74},[10,11832,129],{},[14,11834,132],{"id":132},[134,11836,11837,11845],{},[49,11838,4873,11839,4876,11841,1137,11843,171],{},[34,11840,4808],{},[34,11842,4879],{},[34,11844,4882],{},[49,11846,4885],{},[309,11848,2677],{"id":2677},[10,11850,4890],{},[10,11852,11853],{},[26,11854],{"alt":4895,"src":4896},[10,11856,4899],{},[14,11858,151],{"id":151},[46,11860,11861,11867],{},[49,11862,4906,11863,989,11865,4912],{},[34,11864,4909],{},[34,11866,4815],{},[49,11868,4915],{},[14,11870,174],{"id":174},[134,11872,11873,11875],{},[49,11874,4922],{},[49,11876,4925],{},[10,11878,185],{},[14,11880,188],{"id":188},[10,11882,4932],{},[193,11884,195],{},{"title":74,"searchDepth":87,"depth":87,"links":11886},[11887,11888,11889,11890,11891,11894,11895,11896],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":11892},[11893],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":4771,"description":4776},[206,4954,4955],{"id":4958,"title":4959,"body":11901,"category":206,"cover":207,"description":4964,"extension":208,"meta":12018,"navigation":96,"path":5103,"pinned":211,"publishedAt":212,"seo":12019,"slug":5105,"stem":5106,"summary":5107,"tags":12020,"updatedAt":212,"visible":96,"__hash__":5111},{"type":7,"value":11902,"toc":12008},[11903,11905,11907,11909,11911,11915,11917,11919,11927,11929,11931,11963,11965,11970,11972,11974,11982,11984,11992,11994,12000,12002,12004,12006],[10,11904,4964],{},[14,11906,16],{"id":16},[10,11908,4969],{},[14,11910,22],{"id":22},[10,11912,11913],{},[26,11914],{"alt":4976,"src":4977},[10,11916,4980],{},[14,11918,44],{"id":44},[46,11920,11921,11923,11925],{},[49,11922,4987],{},[49,11924,4990],{},[49,11926,4993],{},[14,11928,64],{"id":64},[10,11930,67],{},[69,11932,11933],{"className":71,"code":5000,"language":73,"meta":74,"style":74},[34,11934,11935,11939,11943,11947,11951,11955,11959],{"__ignoreMap":74},[78,11936,11937],{"class":80,"line":81},[78,11938,5007],{},[78,11940,11941],{"class":80,"line":87},[78,11942,97],{"emptyLinePlaceholder":96},[78,11944,11945],{"class":80,"line":93},[78,11946,5016],{},[78,11948,11949],{"class":80,"line":100},[78,11950,5021],{},[78,11952,11953],{"class":80,"line":106},[78,11954,97],{"emptyLinePlaceholder":96},[78,11956,11957],{"class":80,"line":112},[78,11958,5030],{},[78,11960,11961],{"class":80,"line":2467},[78,11962,5035],{},[10,11964,118],{},[69,11966,11968],{"className":11967,"code":5041,"language":124,"meta":74},[122],[34,11969,5041],{"__ignoreMap":74},[10,11971,129],{},[14,11973,132],{"id":132},[134,11975,11976,11978],{},[49,11977,5052],{},[49,11979,5055,11980,5059],{},[34,11981,5058],{},[14,11983,151],{"id":151},[46,11985,11986,11990],{},[49,11987,5066,11988,5069],{},[34,11989,4276],{},[49,11991,5072],{},[14,11993,174],{"id":174},[134,11995,11996,11998],{},[49,11997,5079],{},[49,11999,5082],{},[10,12001,185],{},[14,12003,188],{"id":188},[10,12005,5089],{},[193,12007,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12009},[12010,12011,12012,12013,12014,12015,12016,12017],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":4959,"description":4964},[206,5109,5110],{"id":5113,"title":5114,"body":12022,"category":206,"cover":207,"description":5119,"extension":208,"meta":12141,"navigation":96,"path":5263,"pinned":211,"publishedAt":212,"seo":12142,"slug":5265,"stem":5266,"summary":5267,"tags":12143,"updatedAt":212,"visible":96,"__hash__":5271},{"type":7,"value":12023,"toc":12131},[12024,12026,12028,12030,12032,12036,12038,12040,12048,12050,12052,12084,12086,12091,12093,12095,12105,12107,12113,12115,12123,12125,12127,12129],[10,12025,5119],{},[14,12027,16],{"id":16},[10,12029,5124],{},[14,12031,22],{"id":22},[10,12033,12034],{},[26,12035],{"alt":5131,"src":5132},[10,12037,5135],{},[14,12039,44],{"id":44},[46,12041,12042,12044,12046],{},[49,12043,5142],{},[49,12045,5145],{},[49,12047,5148],{},[14,12049,64],{"id":64},[10,12051,67],{},[69,12053,12054],{"className":71,"code":5155,"language":73,"meta":74,"style":74},[34,12055,12056,12060,12064,12068,12072,12076,12080],{"__ignoreMap":74},[78,12057,12058],{"class":80,"line":81},[78,12059,5162],{},[78,12061,12062],{"class":80,"line":87},[78,12063,5167],{},[78,12065,12066],{"class":80,"line":93},[78,12067,5172],{},[78,12069,12070],{"class":80,"line":100},[78,12071,97],{"emptyLinePlaceholder":96},[78,12073,12074],{"class":80,"line":106},[78,12075,5181],{},[78,12077,12078],{"class":80,"line":112},[78,12079,5186],{},[78,12081,12082],{"class":80,"line":2467},[78,12083,5191],{},[10,12085,118],{},[69,12087,12089],{"className":12088,"code":5197,"language":124,"meta":74},[122],[34,12090,5197],{"__ignoreMap":74},[10,12092,129],{},[14,12094,132],{"id":132},[134,12096,12097,12101],{},[49,12098,918,12099,5211],{},[34,12100,5210],{},[49,12102,5214,12103,5218],{},[34,12104,5217],{},[14,12106,151],{"id":151},[46,12108,12109,12111],{},[49,12110,5225],{},[49,12112,5228],{},[14,12114,174],{"id":174},[134,12116,12117,12121],{},[49,12118,5235,12119,5239],{},[34,12120,5238],{},[49,12122,5242],{},[10,12124,185],{},[14,12126,188],{"id":188},[10,12128,5249],{},[193,12130,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12132},[12133,12134,12135,12136,12137,12138,12139,12140],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5114,"description":5119},[206,5269,5270],{"id":5273,"title":5274,"body":12145,"category":206,"cover":207,"description":5279,"extension":208,"meta":12290,"navigation":96,"path":5460,"pinned":211,"publishedAt":212,"seo":12291,"slug":5462,"stem":5463,"summary":5464,"tags":12292,"updatedAt":212,"visible":96,"__hash__":5468},{"type":7,"value":12146,"toc":12278},[12147,12149,12151,12153,12155,12159,12163,12165,12177,12179,12181,12209,12211,12216,12218,12220,12234,12236,12238,12242,12250,12252,12262,12264,12270,12272,12274,12276],[10,12148,5279],{},[14,12150,16],{"id":16},[10,12152,5284],{},[14,12154,22],{"id":22},[10,12156,12157],{},[26,12158],{"alt":5291,"src":5292},[10,12160,5295,12161,5299],{},[34,12162,5298],{},[14,12164,44],{"id":44},[46,12166,12167,12169,12171],{},[49,12168,5306],{},[49,12170,5309],{},[49,12172,5312,12173,5315,12175,171],{},[34,12174,5298],{},[34,12176,5318],{},[14,12178,64],{"id":64},[10,12180,67],{},[69,12182,12183],{"className":71,"code":5325,"language":73,"meta":74,"style":74},[34,12184,12185,12189,12193,12197,12201,12205],{"__ignoreMap":74},[78,12186,12187],{"class":80,"line":81},[78,12188,5332],{},[78,12190,12191],{"class":80,"line":87},[78,12192,5337],{},[78,12194,12195],{"class":80,"line":93},[78,12196,5342],{},[78,12198,12199],{"class":80,"line":100},[78,12200,97],{"emptyLinePlaceholder":96},[78,12202,12203],{"class":80,"line":106},[78,12204,5351],{},[78,12206,12207],{"class":80,"line":112},[78,12208,5356],{},[10,12210,118],{},[69,12212,12214],{"className":12213,"code":5362,"language":124,"meta":74},[122],[34,12215,5362],{"__ignoreMap":74},[10,12217,129],{},[14,12219,132],{"id":132},[134,12221,12222,12228],{},[49,12223,5373,12224,2236,12226,5379],{},[34,12225,5376],{},[34,12227,4339],{},[49,12229,12230,5385,12232,5389],{},[34,12231,5384],{},[34,12233,5388],{},[309,12235,2677],{"id":2677},[10,12237,5394],{},[10,12239,12240],{},[26,12241],{"alt":5399,"src":5400},[10,12243,12244,2236,12246,1137,12248,5410],{},[34,12245,5376],{},[34,12247,4339],{},[34,12249,5409],{},[14,12251,151],{"id":151},[46,12253,12254,12258],{},[49,12255,5417,12256,5421],{},[34,12257,5420],{},[49,12259,5424,12260,5427],{},[34,12261,5409],{},[14,12263,174],{"id":174},[134,12265,12266,12268],{},[49,12267,5434],{},[49,12269,5437],{},[10,12271,185],{},[14,12273,188],{"id":188},[10,12275,5444],{},[193,12277,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12279},[12280,12281,12282,12283,12284,12287,12288,12289],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":12285},[12286],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5274,"description":5279},[206,5466,5467],{"id":5470,"title":5471,"body":12294,"category":206,"cover":207,"description":5476,"extension":208,"meta":12443,"navigation":96,"path":5657,"pinned":211,"publishedAt":212,"seo":12444,"slug":5659,"stem":5660,"summary":5661,"tags":12445,"updatedAt":212,"visible":96,"__hash__":5665},{"type":7,"value":12295,"toc":12431},[12296,12298,12300,12302,12304,12308,12310,12312,12324,12326,12328,12372,12374,12379,12381,12383,12395,12397,12399,12403,12405,12407,12415,12417,12423,12425,12427,12429],[10,12297,5476],{},[14,12299,16],{"id":16},[10,12301,5481],{},[14,12303,22],{"id":22},[10,12305,12306],{},[26,12307],{"alt":5488,"src":5489},[10,12309,5492],{},[14,12311,44],{"id":44},[46,12313,12314,12316,12320],{},[49,12315,5499],{},[49,12317,12318,5505],{},[34,12319,5504],{},[49,12321,12322,5511],{},[34,12323,5510],{},[14,12325,64],{"id":64},[10,12327,67],{},[69,12329,12330],{"className":71,"code":5518,"language":73,"meta":74,"style":74},[34,12331,12332,12336,12340,12344,12348,12352,12356,12360,12364,12368],{"__ignoreMap":74},[78,12333,12334],{"class":80,"line":81},[78,12335,5525],{},[78,12337,12338],{"class":80,"line":87},[78,12339,5530],{},[78,12341,12342],{"class":80,"line":93},[78,12343,97],{"emptyLinePlaceholder":96},[78,12345,12346],{"class":80,"line":100},[78,12347,5539],{},[78,12349,12350],{"class":80,"line":106},[78,12351,5544],{},[78,12353,12354],{"class":80,"line":112},[78,12355,97],{"emptyLinePlaceholder":96},[78,12357,12358],{"class":80,"line":2467},[78,12359,5553],{},[78,12361,12362],{"class":80,"line":2473},[78,12363,5558],{},[78,12365,12366],{"class":80,"line":3890},[78,12367,97],{"emptyLinePlaceholder":96},[78,12369,12370],{"class":80,"line":4102},[78,12371,5567],{},[10,12373,118],{},[69,12375,12377],{"className":12376,"code":5573,"language":124,"meta":74},[122],[34,12378,5573],{"__ignoreMap":74},[10,12380,129],{},[14,12382,132],{"id":132},[134,12384,12385,12389],{},[49,12386,5584,12387,5588],{},[34,12388,5587],{},[49,12390,12391,5594,12393,171],{},[34,12392,5593],{},[34,12394,5597],{},[309,12396,2677],{"id":2677},[10,12398,5602],{},[10,12400,12401],{},[26,12402],{"alt":5607,"src":5608},[10,12404,5611],{},[14,12406,151],{"id":151},[46,12408,12409,12413],{},[49,12410,5618,12411,5621],{},[34,12412,5318],{},[49,12414,5624],{},[14,12416,174],{"id":174},[134,12418,12419,12421],{},[49,12420,5631],{},[49,12422,5634],{},[10,12424,185],{},[14,12426,188],{"id":188},[10,12428,5641],{},[193,12430,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12432},[12433,12434,12435,12436,12437,12440,12441,12442],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":12438},[12439],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5471,"description":5476},[206,5663,5664],{"id":5667,"title":5668,"body":12447,"category":206,"cover":207,"description":5673,"extension":208,"meta":12608,"navigation":96,"path":5871,"pinned":211,"publishedAt":212,"seo":12609,"slug":5873,"stem":5874,"summary":5875,"tags":12610,"updatedAt":212,"visible":96,"__hash__":5879},{"type":7,"value":12448,"toc":12596},[12449,12451,12453,12455,12457,12461,12463,12465,12477,12479,12481,12533,12535,12540,12542,12544,12562,12564,12566,12570,12572,12574,12580,12582,12588,12590,12592,12594],[10,12450,5673],{},[14,12452,16],{"id":16},[10,12454,5678],{},[14,12456,22],{"id":22},[10,12458,12459],{},[26,12460],{"alt":5685,"src":5686},[10,12462,5689],{},[14,12464,44],{"id":44},[46,12466,12467,12469,12471],{},[49,12468,5696],{},[49,12470,5699],{},[49,12472,12473,2156,12475,5708],{},[34,12474,5704],{},[34,12476,5707],{},[14,12478,64],{"id":64},[10,12480,67],{},[69,12482,12483],{"className":71,"code":5715,"language":73,"meta":74,"style":74},[34,12484,12485,12489,12493,12497,12501,12505,12509,12513,12517,12521,12525,12529],{"__ignoreMap":74},[78,12486,12487],{"class":80,"line":81},[78,12488,5722],{},[78,12490,12491],{"class":80,"line":87},[78,12492,97],{"emptyLinePlaceholder":96},[78,12494,12495],{"class":80,"line":93},[78,12496,5731],{},[78,12498,12499],{"class":80,"line":100},[78,12500,5736],{},[78,12502,12503],{"class":80,"line":106},[78,12504,97],{"emptyLinePlaceholder":96},[78,12506,12507],{"class":80,"line":112},[78,12508,5745],{},[78,12510,12511],{"class":80,"line":2467},[78,12512,5750],{},[78,12514,12515],{"class":80,"line":2473},[78,12516,5755],{},[78,12518,12519],{"class":80,"line":3890},[78,12520,97],{"emptyLinePlaceholder":96},[78,12522,12523],{"class":80,"line":4102},[78,12524,5764],{},[78,12526,12527],{"class":80,"line":5767},[78,12528,97],{"emptyLinePlaceholder":96},[78,12530,12531],{"class":80,"line":5772},[78,12532,5775],{},[10,12534,118],{},[69,12536,12538],{"className":12537,"code":5781,"language":124,"meta":74},[122],[34,12539,5781],{"__ignoreMap":74},[10,12541,129],{},[14,12543,132],{"id":132},[134,12545,12546,12556],{},[49,12547,12548,5795,12550,5799,12552,5802,12554,5806],{},[34,12549,5794],{},[34,12551,5798],{},[34,12553,5587],{},[34,12555,5805],{},[49,12557,12558,5811,12560,5814],{},[34,12559,4522],{},[34,12561,2188],{},[309,12563,2677],{"id":2677},[10,12565,5819],{},[10,12567,12568],{},[26,12569],{"alt":5824,"src":5825},[10,12571,5828],{},[14,12573,151],{"id":151},[46,12575,12576,12578],{},[49,12577,5835],{},[49,12579,5838],{},[14,12581,174],{"id":174},[134,12583,12584,12586],{},[49,12585,5845],{},[49,12587,5848],{},[10,12589,185],{},[14,12591,188],{"id":188},[10,12593,5855],{},[193,12595,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12597},[12598,12599,12600,12601,12602,12605,12606,12607],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":12603},[12604],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5668,"description":5673},[206,5877,5878],{"id":5881,"title":5882,"body":12612,"category":206,"cover":207,"description":5887,"extension":208,"meta":12735,"navigation":96,"path":6038,"pinned":211,"publishedAt":212,"seo":12736,"slug":6040,"stem":6041,"summary":6042,"tags":12737,"updatedAt":212,"visible":96,"__hash__":6046},{"type":7,"value":12613,"toc":12725},[12614,12616,12618,12620,12622,12626,12628,12630,12644,12646,12648,12676,12678,12683,12685,12687,12697,12699,12707,12709,12717,12719,12721,12723],[10,12615,5887],{},[14,12617,16],{"id":16},[10,12619,5892],{},[14,12621,22],{"id":22},[10,12623,12624],{},[26,12625],{"alt":5899,"src":5900},[10,12627,5903],{},[14,12629,44],{"id":44},[46,12631,12632,12634,12636],{},[49,12633,5910],{},[49,12635,5913],{},[49,12637,5916,12638,2236,12640,2236,12642,5924],{},[34,12639,2239],{},[34,12641,2404],{},[34,12643,5923],{},[14,12645,64],{"id":64},[10,12647,67],{},[69,12649,12650],{"className":71,"code":5931,"language":73,"meta":74,"style":74},[34,12651,12652,12656,12660,12664,12668,12672],{"__ignoreMap":74},[78,12653,12654],{"class":80,"line":81},[78,12655,5938],{},[78,12657,12658],{"class":80,"line":87},[78,12659,5943],{},[78,12661,12662],{"class":80,"line":93},[78,12663,5948],{},[78,12665,12666],{"class":80,"line":100},[78,12667,97],{"emptyLinePlaceholder":96},[78,12669,12670],{"class":80,"line":106},[78,12671,5957],{},[78,12673,12674],{"class":80,"line":112},[78,12675,5962],{},[10,12677,118],{},[69,12679,12681],{"className":12680,"code":5968,"language":124,"meta":74},[122],[34,12682,5968],{"__ignoreMap":74},[10,12684,129],{},[14,12686,132],{"id":132},[134,12688,12689,12695],{},[49,12690,5979,12691,5983,12693,5986],{},[34,12692,5982],{},[34,12694,40],{},[49,12696,5989],{},[14,12698,151],{"id":151},[46,12700,12701,12705],{},[49,12702,5996,12703,6000],{},[34,12704,5999],{},[49,12706,6003],{},[14,12708,174],{"id":174},[134,12710,12711,12713],{},[49,12712,6010],{},[49,12714,6013,12715,6017],{},[34,12716,6016],{},[10,12718,185],{},[14,12720,188],{"id":188},[10,12722,6024],{},[193,12724,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12726},[12727,12728,12729,12730,12731,12732,12733,12734],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":5882,"description":5887},[206,6044,6045],{"id":6048,"title":6049,"body":12739,"category":206,"cover":207,"description":6054,"extension":208,"meta":12916,"navigation":96,"path":6282,"pinned":211,"publishedAt":212,"seo":12917,"slug":6284,"stem":6285,"summary":6286,"tags":12918,"updatedAt":212,"visible":96,"__hash__":6290},{"type":7,"value":12740,"toc":12904},[12741,12743,12745,12749,12751,12755,12761,12763,12775,12777,12781,12805,12809,12825,12831,12833,12838,12840,12842,12858,12860,12862,12866,12870,12872,12884,12886,12896,12898,12900,12902],[10,12742,6054],{},[14,12744,16],{"id":16},[10,12746,6059,12747,6062],{},[275,12748,5982],{},[14,12750,22],{"id":22},[10,12752,12753],{},[26,12754],{"alt":6069,"src":6070},[10,12756,6073,12757,6077,12759,6081],{},[34,12758,6076],{},[34,12760,6080],{},[14,12762,44],{"id":44},[46,12764,12765,12769,12771],{},[49,12766,6088,12767,6091],{},[34,12768,1151],{},[49,12770,6094],{},[49,12772,6097,12773,6101],{},[34,12774,6100],{},[14,12776,64],{"id":64},[10,12778,6106,12779,6110],{},[34,12780,6109],{},[69,12782,12783],{"className":71,"code":6113,"language":73,"meta":74,"style":74},[34,12784,12785,12789,12793,12797,12801],{"__ignoreMap":74},[78,12786,12787],{"class":80,"line":81},[78,12788,6120],{},[78,12790,12791],{"class":80,"line":87},[78,12792,6125],{},[78,12794,12795],{"class":80,"line":93},[78,12796,97],{"emptyLinePlaceholder":96},[78,12798,12799],{"class":80,"line":100},[78,12800,6134],{},[78,12802,12803],{"class":80,"line":106},[78,12804,6139],{},[10,12806,6142,12807,6146],{},[34,12808,6145],{},[69,12810,12811],{"className":71,"code":6149,"language":73,"meta":74,"style":74},[34,12812,12813,12817,12821],{"__ignoreMap":74},[78,12814,12815],{"class":80,"line":81},[78,12816,6156],{},[78,12818,12819],{"class":80,"line":87},[78,12820,97],{"emptyLinePlaceholder":96},[78,12822,12823],{"class":80,"line":93},[78,12824,6165],{},[10,12826,6168,12827,1137,12829,171],{},[34,12828,6171],{},[34,12830,6174],{},[10,12832,118],{},[69,12834,12836],{"className":12835,"code":6180,"language":124,"meta":74},[122],[34,12837,6180],{"__ignoreMap":74},[10,12839,129],{},[14,12841,132],{"id":132},[134,12843,12844,12850],{},[49,12845,6191,12846,6194,12848,6198],{},[34,12847,6109],{},[34,12849,6197],{},[49,12851,12852,6203,12854,6206,12856,6209],{},[34,12853,6145],{},[34,12855,6109],{},[34,12857,6145],{},[309,12859,2677],{"id":2677},[10,12861,6214],{},[10,12863,12864],{},[26,12865],{"alt":6219,"src":6220},[10,12867,6223,12868,6226],{},[34,12869,6197],{},[14,12871,151],{"id":151},[46,12873,12874,12880],{},[49,12875,6233,12876,1137,12878,171],{},[34,12877,6109],{},[34,12879,6145],{},[49,12881,6240,12882,6244],{},[34,12883,6243],{},[14,12885,174],{"id":174},[134,12887,12888,12892],{},[49,12889,2332,12890,6254],{},[34,12891,6253],{},[49,12893,6257,12894,171],{},[34,12895,6076],{},[10,12897,185],{},[14,12899,188],{"id":188},[10,12901,6266],{},[193,12903,195],{},{"title":74,"searchDepth":87,"depth":87,"links":12905},[12906,12907,12908,12909,12910,12913,12914,12915],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":12911},[12912],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":6049,"description":6054},[206,6288,6289],{"id":6292,"title":6293,"body":12920,"category":206,"cover":207,"description":6298,"extension":208,"meta":13059,"navigation":96,"path":6464,"pinned":211,"publishedAt":212,"seo":13060,"slug":6466,"stem":6467,"summary":6468,"tags":13061,"updatedAt":212,"visible":96,"__hash__":6471},{"type":7,"value":12921,"toc":13049},[12922,12924,12926,12928,12930,12934,12936,12938,12948,12950,12952,12992,12994,12999,13001,13003,13021,13023,13031,13033,13041,13043,13045,13047],[10,12923,6298],{},[14,12925,16],{"id":16},[10,12927,6303],{},[14,12929,22],{"id":22},[10,12931,12932],{},[26,12933],{"alt":6310,"src":6311},[10,12935,6314],{},[14,12937,44],{"id":44},[46,12939,12940,12944,12946],{},[49,12941,12942,6324],{},[34,12943,6323],{},[49,12945,6327],{},[49,12947,6330],{},[14,12949,64],{"id":64},[10,12951,1554],{},[69,12953,12954],{"className":571,"code":6337,"language":573,"meta":74,"style":74},[34,12955,12956,12966,12972,12978,12988],{"__ignoreMap":74},[78,12957,12958,12960,12962,12964],{"class":80,"line":81},[78,12959,671],{"class":580},[78,12961,613],{"class":583},[78,12963,6348],{"class":616},[78,12965,6351],{"class":616},[78,12967,12968,12970],{"class":80,"line":87},[78,12969,6356],{"class":583},[78,12971,6359],{"class":616},[78,12973,12974,12976],{"class":80,"line":93},[78,12975,73],{"class":580},[78,12977,584],{"class":583},[78,12979,12980,12982,12984,12986],{"class":80,"line":100},[78,12981,73],{"class":580},[78,12983,613],{"class":583},[78,12985,617],{"class":616},[78,12987,584],{"class":583},[78,12989,12990],{"class":80,"line":106},[78,12991,6380],{"class":580},[10,12993,118],{},[69,12995,12997],{"className":12996,"code":6386,"language":124,"meta":74},[122],[34,12998,6386],{"__ignoreMap":74},[10,13000,129],{},[14,13002,132],{"id":132},[134,13004,13005,13011],{},[49,13006,13007,6400,13009,6403],{},[34,13008,6399],{},[34,13010,671],{},[49,13012,6406,13013,2156,13015,6412,13017,3665,13019,6418],{},[34,13014,73],{},[34,13016,6411],{},[34,13018,6323],{},[34,13020,6417],{},[14,13022,151],{"id":151},[46,13024,13025,13027],{},[49,13026,6425],{},[49,13028,3446,13029,6430],{},[34,13030,6323],{},[14,13032,174],{"id":174},[134,13034,13035,13039],{},[49,13036,6437,13037,171],{},[34,13038,6440],{},[49,13040,6443],{},[10,13042,185],{},[14,13044,188],{"id":188},[10,13046,6450],{},[193,13048,1638],{},{"title":74,"searchDepth":87,"depth":87,"links":13050},[13051,13052,13053,13054,13055,13056,13057,13058],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":6293,"description":6298},[206,6470,241],{"id":6473,"title":6474,"body":13063,"category":206,"cover":207,"description":6479,"extension":208,"meta":13216,"navigation":96,"path":6668,"pinned":211,"publishedAt":212,"seo":13217,"slug":6670,"stem":6671,"summary":6672,"tags":13218,"updatedAt":212,"visible":96,"__hash__":6676},{"type":7,"value":13064,"toc":13206},[13065,13067,13069,13071,13073,13077,13083,13085,13101,13103,13105,13149,13151,13156,13158,13160,13172,13174,13188,13190,13198,13200,13202,13204],[10,13066,6479],{},[14,13068,16],{"id":16},[10,13070,6484],{},[14,13072,22],{"id":22},[10,13074,13075],{},[26,13076],{"alt":6491,"src":6492},[10,13078,13079,6498,13081,6501],{},[34,13080,6497],{},[34,13082,2414],{},[14,13084,44],{"id":44},[46,13086,13087,13089,13097],{},[49,13088,6508],{},[49,13090,13091,2236,13093,2236,13095,6520],{},[34,13092,6513],{},[34,13094,6516],{},[34,13096,6519],{},[49,13098,6523,13099,6527],{},[34,13100,6526],{},[14,13102,64],{"id":64},[10,13104,67],{},[69,13106,13107],{"className":71,"code":6534,"language":73,"meta":74,"style":74},[34,13108,13109,13113,13117,13121,13125,13129,13133,13137,13141,13145],{"__ignoreMap":74},[78,13110,13111],{"class":80,"line":81},[78,13112,6541],{},[78,13114,13115],{"class":80,"line":87},[78,13116,97],{"emptyLinePlaceholder":96},[78,13118,13119],{"class":80,"line":93},[78,13120,6550],{},[78,13122,13123],{"class":80,"line":100},[78,13124,6555],{},[78,13126,13127],{"class":80,"line":106},[78,13128,6560],{},[78,13130,13131],{"class":80,"line":112},[78,13132,97],{"emptyLinePlaceholder":96},[78,13134,13135],{"class":80,"line":2467},[78,13136,6569],{},[78,13138,13139],{"class":80,"line":2473},[78,13140,6574],{},[78,13142,13143],{"class":80,"line":3890},[78,13144,6579],{},[78,13146,13147],{"class":80,"line":4102},[78,13148,6584],{},[10,13150,118],{},[69,13152,13154],{"className":13153,"code":6590,"language":124,"meta":74},[122],[34,13155,6590],{"__ignoreMap":74},[10,13157,129],{},[14,13159,132],{"id":132},[134,13161,13162,13166],{},[49,13163,13164,6604],{},[34,13165,6603],{},[49,13167,54,13168,6609,13170,6612],{},[34,13169,2414],{},[34,13171,6497],{},[14,13173,151],{"id":151},[46,13175,13176,13182],{},[49,13177,3446,13178,6621,13180,6624],{},[34,13179,6497],{},[34,13181,6513],{},[49,13183,6627,13184,989,13186,6633],{},[34,13185,2414],{},[34,13187,6632],{},[14,13189,174],{"id":174},[134,13191,13192,13196],{},[49,13193,6640,13194,6644],{},[34,13195,6643],{},[49,13197,6647],{},[10,13199,185],{},[14,13201,188],{"id":188},[10,13203,6654],{},[193,13205,195],{},{"title":74,"searchDepth":87,"depth":87,"links":13207},[13208,13209,13210,13211,13212,13213,13214,13215],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":6474,"description":6479},[206,6674,6675],{"id":6678,"title":6679,"body":13220,"category":206,"cover":207,"description":6684,"extension":208,"meta":13367,"navigation":96,"path":6863,"pinned":211,"publishedAt":212,"seo":13368,"slug":6865,"stem":6866,"summary":6867,"tags":13369,"updatedAt":212,"visible":96,"__hash__":6871},{"type":7,"value":13221,"toc":13357},[13222,13224,13226,13228,13230,13234,13236,13238,13256,13258,13260,13308,13310,13315,13317,13319,13327,13329,13339,13341,13349,13351,13353,13355],[10,13223,6684],{},[14,13225,16],{"id":16},[10,13227,6689],{},[14,13229,22],{"id":22},[10,13231,13232],{},[26,13233],{"alt":6696,"src":6697},[10,13235,6700],{},[14,13237,44],{"id":44},[46,13239,13240,13244,13250],{},[49,13241,13242,6710],{},[34,13243,6709],{},[49,13245,13246,6716,13248,171],{},[34,13247,6715],{},[34,13249,6719],{},[49,13251,6722,13252,6726,13254,6730],{},[34,13253,6725],{},[34,13255,6729],{},[14,13257,64],{"id":64},[10,13259,67],{},[69,13261,13262],{"className":71,"code":6737,"language":73,"meta":74,"style":74},[34,13263,13264,13268,13272,13276,13280,13284,13288,13292,13296,13300,13304],{"__ignoreMap":74},[78,13265,13266],{"class":80,"line":81},[78,13267,6541],{},[78,13269,13270],{"class":80,"line":87},[78,13271,97],{"emptyLinePlaceholder":96},[78,13273,13274],{"class":80,"line":93},[78,13275,6752],{},[78,13277,13278],{"class":80,"line":100},[78,13279,6757],{},[78,13281,13282],{"class":80,"line":106},[78,13283,6762],{},[78,13285,13286],{"class":80,"line":112},[78,13287,6767],{},[78,13289,13290],{"class":80,"line":2467},[78,13291,97],{"emptyLinePlaceholder":96},[78,13293,13294],{"class":80,"line":2473},[78,13295,6776],{},[78,13297,13298],{"class":80,"line":3890},[78,13299,6781],{},[78,13301,13302],{"class":80,"line":4102},[78,13303,6786],{},[78,13305,13306],{"class":80,"line":5767},[78,13307,6791],{},[10,13309,118],{},[69,13311,13313],{"className":13312,"code":6797,"language":124,"meta":74},[122],[34,13314,6797],{"__ignoreMap":74},[10,13316,129],{},[14,13318,132],{"id":132},[134,13320,13321,13325],{},[49,13322,6808,13323,6811],{},[34,13324,6725],{},[49,13326,6814],{},[14,13328,151],{"id":151},[46,13330,13331,13335],{},[49,13332,54,13333,6823],{},[34,13334,6709],{},[49,13336,6826,13337,171],{},[34,13338,6829],{},[14,13340,174],{"id":174},[134,13342,13343,13345],{},[49,13344,6836],{},[49,13346,6839,13347,6842],{},[34,13348,317],{},[10,13350,185],{},[14,13352,188],{"id":188},[10,13354,6849],{},[193,13356,195],{},{"title":74,"searchDepth":87,"depth":87,"links":13358},[13359,13360,13361,13362,13363,13364,13365,13366],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":6679,"description":6684},[206,6869,6870],{"id":6873,"title":6874,"body":13371,"category":206,"cover":207,"description":6879,"extension":208,"meta":13514,"navigation":96,"path":7047,"pinned":211,"publishedAt":212,"seo":13515,"slug":7049,"stem":7050,"summary":7051,"tags":13516,"updatedAt":212,"visible":96,"__hash__":7055},{"type":7,"value":13372,"toc":13504},[13373,13375,13377,13379,13381,13385,13391,13393,13403,13405,13407,13459,13461,13466,13468,13470,13480,13482,13488,13490,13496,13498,13500,13502],[10,13374,6879],{},[14,13376,16],{"id":16},[10,13378,6884],{},[14,13380,22],{"id":22},[10,13382,13383],{},[26,13384],{"alt":6891,"src":6892},[10,13386,13387,6898,13389,6902],{},[34,13388,6897],{},[34,13390,6901],{},[14,13392,44],{"id":44},[46,13394,13395,13397,13401],{},[49,13396,6909],{},[49,13398,13399,6915],{},[34,13400,6914],{},[49,13402,6918],{},[14,13404,64],{"id":64},[10,13406,67],{},[69,13408,13409],{"className":71,"code":6925,"language":73,"meta":74,"style":74},[34,13410,13411,13415,13419,13423,13427,13431,13435,13439,13443,13447,13451,13455],{"__ignoreMap":74},[78,13412,13413],{"class":80,"line":81},[78,13414,6932],{},[78,13416,13417],{"class":80,"line":87},[78,13418,97],{"emptyLinePlaceholder":96},[78,13420,13421],{"class":80,"line":93},[78,13422,6941],{},[78,13424,13425],{"class":80,"line":100},[78,13426,97],{"emptyLinePlaceholder":96},[78,13428,13429],{"class":80,"line":106},[78,13430,6950],{},[78,13432,13433],{"class":80,"line":112},[78,13434,6955],{},[78,13436,13437],{"class":80,"line":2467},[78,13438,6767],{},[78,13440,13441],{"class":80,"line":2473},[78,13442,97],{"emptyLinePlaceholder":96},[78,13444,13445],{"class":80,"line":3890},[78,13446,6968],{},[78,13448,13449],{"class":80,"line":4102},[78,13450,6973],{},[78,13452,13453],{"class":80,"line":5767},[78,13454,6786],{},[78,13456,13457],{"class":80,"line":5772},[78,13458,6982],{},[10,13460,118],{},[69,13462,13464],{"className":13463,"code":6988,"language":124,"meta":74},[122],[34,13465,6988],{"__ignoreMap":74},[10,13467,129],{},[14,13469,132],{"id":132},[134,13471,13472,13476],{},[49,13473,13474,7001],{},[34,13475,6897],{},[49,13477,13478,7006],{},[34,13479,6901],{},[14,13481,151],{"id":151},[46,13483,13484,13486],{},[49,13485,7013],{},[49,13487,7016],{},[14,13489,174],{"id":174},[134,13491,13492,13494],{},[49,13493,7023],{},[49,13495,7026],{},[10,13497,185],{},[14,13499,188],{"id":188},[10,13501,7033],{},[193,13503,195],{},{"title":74,"searchDepth":87,"depth":87,"links":13505},[13506,13507,13508,13509,13510,13511,13512,13513],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":6874,"description":6879},[206,7053,7054],{"id":7057,"title":7058,"body":13518,"category":206,"cover":207,"description":7063,"extension":208,"meta":13669,"navigation":96,"path":7248,"pinned":211,"publishedAt":212,"seo":13670,"slug":7250,"stem":7251,"summary":7252,"tags":13671,"updatedAt":212,"visible":96,"__hash__":7256},{"type":7,"value":13519,"toc":13659},[13520,13522,13524,13526,13528,13532,13536,13538,13552,13554,13556,13608,13610,13615,13617,13619,13631,13633,13643,13645,13651,13653,13655,13657],[10,13521,7063],{},[14,13523,16],{"id":16},[10,13525,7068],{},[14,13527,22],{"id":22},[10,13529,13530],{},[26,13531],{"alt":7075,"src":7076},[10,13533,13534,7082],{},[34,13535,7081],{},[14,13537,44],{"id":44},[46,13539,13540,13546,13550],{},[49,13541,54,13542,7092,13544,7096],{},[34,13543,7091],{},[34,13545,7095],{},[49,13547,7099,13548,7103],{},[34,13549,7102],{},[49,13551,7106],{},[14,13553,64],{"id":64},[10,13555,67],{},[69,13557,13558],{"className":71,"code":7113,"language":73,"meta":74,"style":74},[34,13559,13560,13564,13568,13572,13576,13580,13584,13588,13592,13596,13600,13604],{"__ignoreMap":74},[78,13561,13562],{"class":80,"line":81},[78,13563,7120],{},[78,13565,13566],{"class":80,"line":87},[78,13567,97],{"emptyLinePlaceholder":96},[78,13569,13570],{"class":80,"line":93},[78,13571,7129],{},[78,13573,13574],{"class":80,"line":100},[78,13575,7134],{},[78,13577,13578],{"class":80,"line":106},[78,13579,7139],{},[78,13581,13582],{"class":80,"line":112},[78,13583,7144],{},[78,13585,13586],{"class":80,"line":2467},[78,13587,7149],{},[78,13589,13590],{"class":80,"line":2473},[78,13591,97],{"emptyLinePlaceholder":96},[78,13593,13594],{"class":80,"line":3890},[78,13595,7158],{},[78,13597,13598],{"class":80,"line":4102},[78,13599,7163],{},[78,13601,13602],{"class":80,"line":5767},[78,13603,7168],{},[78,13605,13606],{"class":80,"line":5772},[78,13607,7173],{},[10,13609,118],{},[69,13611,13613],{"className":13612,"code":7179,"language":124,"meta":74},[122],[34,13614,7179],{"__ignoreMap":74},[10,13616,129],{},[14,13618,132],{"id":132},[134,13620,13621,13627],{},[49,13622,13623,7193,13625,7196],{},[34,13624,7192],{},[34,13626,7102],{},[49,13628,13629,7201],{},[34,13630,7081],{},[14,13632,151],{"id":151},[46,13634,13635,13637],{},[49,13636,7208],{},[49,13638,7211,13639,7214,13641,7217],{},[34,13640,7091],{},[34,13642,7095],{},[14,13644,174],{"id":174},[134,13646,13647,13649],{},[49,13648,7224],{},[49,13650,7227],{},[10,13652,185],{},[14,13654,188],{"id":188},[10,13656,7234],{},[193,13658,195],{},{"title":74,"searchDepth":87,"depth":87,"links":13660},[13661,13662,13663,13664,13665,13666,13667,13668],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":7058,"description":7063},[206,7254,7255],{"id":7258,"title":7259,"body":13673,"category":206,"cover":207,"description":7264,"extension":208,"meta":13887,"navigation":96,"path":7538,"pinned":211,"publishedAt":212,"seo":13888,"slug":7540,"stem":7541,"summary":7542,"tags":13889,"updatedAt":212,"visible":96,"__hash__":7546},{"type":7,"value":13674,"toc":13874},[13675,13677,13679,13681,13683,13687,13693,13695,13707,13709,13711,13771,13773,13778,13780,13782,13800,13802,13810,13814,13822,13824,13828,13832,13838,13840,13850,13852,13866,13868,13870,13872],[10,13676,7264],{},[14,13678,16],{"id":16},[10,13680,7269],{},[14,13682,22],{"id":22},[10,13684,13685],{},[26,13686],{"alt":7276,"src":7277},[10,13688,7280,13689,7284,13691,7288],{},[34,13690,7283],{},[34,13692,7287],{},[14,13694,44],{"id":44},[46,13696,13697,13701,13705],{},[49,13698,7295,13699,7298],{},[34,13700,7283],{},[49,13702,13703,7304],{},[34,13704,7303],{},[49,13706,7307],{},[14,13708,64],{"id":64},[10,13710,67],{},[69,13712,13713],{"className":71,"code":7314,"language":73,"meta":74,"style":74},[34,13714,13715,13719,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767],{"__ignoreMap":74},[78,13716,13717],{"class":80,"line":81},[78,13718,7321],{},[78,13720,13721],{"class":80,"line":87},[78,13722,7326],{},[78,13724,13725],{"class":80,"line":93},[78,13726,7331],{},[78,13728,13729],{"class":80,"line":100},[78,13730,7336],{},[78,13732,13733],{"class":80,"line":106},[78,13734,7341],{},[78,13736,13737],{"class":80,"line":112},[78,13738,97],{"emptyLinePlaceholder":96},[78,13740,13741],{"class":80,"line":2467},[78,13742,7350],{},[78,13744,13745],{"class":80,"line":2473},[78,13746,7355],{},[78,13748,13749],{"class":80,"line":3890},[78,13750,7360],{},[78,13752,13753],{"class":80,"line":4102},[78,13754,7365],{},[78,13756,13757],{"class":80,"line":5767},[78,13758,1126],{},[78,13760,13761],{"class":80,"line":5772},[78,13762,7374],{},[78,13764,13765],{"class":80,"line":7377},[78,13766,7380],{},[78,13768,13769],{"class":80,"line":7383},[78,13770,7386],{},[10,13772,118],{},[69,13774,13776],{"className":13775,"code":7392,"language":124,"meta":74},[122],[34,13777,7392],{"__ignoreMap":74},[10,13779,129],{},[14,13781,132],{"id":132},[134,13783,13784,13792],{},[49,13785,13786,7405,13788,7408,13790,7412],{},[34,13787,3016],{},[34,13789,7303],{},[34,13791,7411],{},[49,13793,7415,13794,7418,13796,7421,13798,171],{},[34,13795,7283],{},[34,13797,1140],{},[34,13799,7287],{},[309,13801,2677],{"id":2677},[10,13803,13804,2236,13806,1137,13808,7434],{},[34,13805,7283],{},[34,13807,1140],{},[34,13809,7287],{},[10,13811,13812],{},[26,13813],{"alt":7439,"src":7440},[10,13815,13816,7445,13818,7448,13820,7451],{},[34,13817,7283],{},[34,13819,1140],{},[34,13821,7287],{},[309,13823,2677],{"id":4157},[10,13825,13826,7459],{},[34,13827,7458],{},[10,13829,13830],{},[26,13831],{"alt":7464,"src":7465},[10,13833,7468,13834,7471,13836,7474],{},[34,13835,7458],{},[34,13837,1140],{},[14,13839,151],{"id":151},[46,13841,13842,13846],{},[49,13843,7481,13844,7485],{},[34,13845,7484],{},[49,13847,7488,13848,7491],{},[34,13849,7458],{},[14,13851,174],{"id":174},[134,13853,13854,13862],{},[49,13855,7498,13856,7502,13858,1137,13860,171],{},[34,13857,7501],{},[34,13859,7505],{},[34,13861,7508],{},[49,13863,7511,13864,7514],{},[34,13865,6719],{},[10,13867,185],{},[14,13869,188],{"id":188},[10,13871,7521],{},[193,13873,195],{},{"title":74,"searchDepth":87,"depth":87,"links":13875},[13876,13877,13878,13879,13880,13884,13885,13886],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":13881},[13882,13883],{"id":2677,"depth":93,"text":2677},{"id":4157,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":7259,"description":7264},[206,7544,7545],{"id":7548,"title":7549,"body":13891,"category":206,"cover":207,"description":7554,"extension":208,"meta":14042,"navigation":96,"path":7731,"pinned":211,"publishedAt":212,"seo":14043,"slug":7733,"stem":7734,"summary":7735,"tags":14044,"updatedAt":212,"visible":96,"__hash__":7738},{"type":7,"value":13892,"toc":14032},[13893,13895,13897,13899,13901,13905,13909,13911,13923,13925,13927,13975,13977,13982,13984,13986,13996,13998,14008,14010,14024,14026,14028,14030],[10,13894,7554],{},[14,13896,16],{"id":16},[10,13898,7559],{},[14,13900,22],{"id":22},[10,13902,13903],{},[26,13904],{"alt":7566,"src":7567},[10,13906,7570,13907,7573],{},[34,13908,6729],{},[14,13910,44],{"id":44},[46,13912,13913,13917,13921],{},[49,13914,13915,7582],{},[34,13916,6729],{},[49,13918,13919,7588],{},[34,13920,7587],{},[49,13922,7591],{},[14,13924,64],{"id":64},[10,13926,67],{},[69,13928,13929],{"className":71,"code":7598,"language":73,"meta":74,"style":74},[34,13930,13931,13935,13939,13943,13947,13951,13955,13959,13963,13967,13971],{"__ignoreMap":74},[78,13932,13933],{"class":80,"line":81},[78,13934,6541],{},[78,13936,13937],{"class":80,"line":87},[78,13938,97],{"emptyLinePlaceholder":96},[78,13940,13941],{"class":80,"line":93},[78,13942,6752],{},[78,13944,13945],{"class":80,"line":100},[78,13946,97],{"emptyLinePlaceholder":96},[78,13948,13949],{"class":80,"line":106},[78,13950,7621],{},[78,13952,13953],{"class":80,"line":112},[78,13954,7626],{},[78,13956,13957],{"class":80,"line":2467},[78,13958,97],{"emptyLinePlaceholder":96},[78,13960,13961],{"class":80,"line":2473},[78,13962,7635],{},[78,13964,13965],{"class":80,"line":3890},[78,13966,7640],{},[78,13968,13969],{"class":80,"line":4102},[78,13970,97],{"emptyLinePlaceholder":96},[78,13972,13973],{"class":80,"line":5767},[78,13974,7649],{},[10,13976,118],{},[69,13978,13980],{"className":13979,"code":7655,"language":124,"meta":74},[122],[34,13981,7655],{"__ignoreMap":74},[10,13983,129],{},[14,13985,132],{"id":132},[134,13987,13988,13994],{},[49,13989,7570,13990,7668,13992,171],{},[34,13991,6729],{},[34,13993,7671],{},[49,13995,7674],{},[14,13997,151],{"id":151},[46,13999,14000,14004],{},[49,14001,4725,14002,7683],{},[34,14003,6729],{},[49,14005,7686,14006,7689],{},[34,14007,6729],{},[14,14009,174],{"id":174},[134,14011,14012,14018],{},[49,14013,7696,14014,7700,14016,171],{},[34,14015,7699],{},[34,14017,6729],{},[49,14019,4725,14020,7707,14022,171],{},[34,14021,6729],{},[34,14023,7710],{},[10,14025,185],{},[14,14027,188],{"id":188},[10,14029,7717],{},[193,14031,195],{},{"title":74,"searchDepth":87,"depth":87,"links":14033},[14034,14035,14036,14037,14038,14039,14040,14041],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":7549,"description":7554},[206,6729,7737],{"id":7740,"title":7741,"body":14046,"category":206,"cover":207,"description":7746,"extension":208,"meta":14217,"navigation":96,"path":7959,"pinned":211,"publishedAt":212,"seo":14218,"slug":7961,"stem":7962,"summary":7963,"tags":14219,"updatedAt":212,"visible":96,"__hash__":7967},{"type":7,"value":14047,"toc":14205},[14048,14050,14052,14054,14056,14060,14062,14064,14076,14078,14080,14136,14138,14143,14145,14147,14163,14165,14167,14171,14177,14179,14187,14189,14197,14199,14201,14203],[10,14049,7746],{},[14,14051,16],{"id":16},[10,14053,7751],{},[14,14055,22],{"id":22},[10,14057,14058],{},[26,14059],{"alt":7758,"src":7759},[10,14061,7762],{},[14,14063,44],{"id":44},[46,14065,14066,14070,14074],{},[49,14067,14068,7772],{},[34,14069,7771],{},[49,14071,14072,7778],{},[34,14073,7777],{},[49,14075,7781],{},[14,14077,64],{"id":64},[10,14079,67],{},[69,14081,14082],{"className":71,"code":7788,"language":73,"meta":74,"style":74},[34,14083,14084,14088,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132],{"__ignoreMap":74},[78,14085,14086],{"class":80,"line":81},[78,14087,7795],{},[78,14089,14090],{"class":80,"line":87},[78,14091,7800],{},[78,14093,14094],{"class":80,"line":93},[78,14095,7805],{},[78,14097,14098],{"class":80,"line":100},[78,14099,7810],{},[78,14101,14102],{"class":80,"line":106},[78,14103,97],{"emptyLinePlaceholder":96},[78,14105,14106],{"class":80,"line":112},[78,14107,7819],{},[78,14109,14110],{"class":80,"line":2467},[78,14111,7824],{},[78,14113,14114],{"class":80,"line":2473},[78,14115,7829],{},[78,14117,14118],{"class":80,"line":3890},[78,14119,7834],{},[78,14121,14122],{"class":80,"line":4102},[78,14123,97],{"emptyLinePlaceholder":96},[78,14125,14126],{"class":80,"line":5767},[78,14127,7843],{},[78,14129,14130],{"class":80,"line":5772},[78,14131,7848],{},[78,14133,14134],{"class":80,"line":7377},[78,14135,7853],{},[10,14137,118],{},[69,14139,14141],{"className":14140,"code":7859,"language":124,"meta":74},[122],[34,14142,7859],{"__ignoreMap":74},[10,14144,129],{},[14,14146,132],{"id":132},[134,14148,14149,14155],{},[49,14150,7870,14151,7874,14153,7877],{},[34,14152,7873],{},[34,14154,7777],{},[49,14156,14157,7883,14159,7887,14161,7890],{},[34,14158,7882],{},[34,14160,7886],{},[34,14162,7771],{},[309,14164,2677],{"id":2677},[10,14166,7895],{},[10,14168,14169],{},[26,14170],{"alt":7900,"src":7901},[10,14172,7904,14173,1137,14175,7910],{},[34,14174,4522],{},[34,14176,7909],{},[14,14178,151],{"id":151},[46,14180,14181,14185],{},[49,14182,7917,14183,7920],{},[34,14184,7771],{},[49,14186,7923],{},[14,14188,174],{"id":174},[134,14190,14191,14195],{},[49,14192,5235,14193,7933],{},[34,14194,7932],{},[49,14196,7936],{},[10,14198,185],{},[14,14200,188],{"id":188},[10,14202,7943],{},[193,14204,195],{},{"title":74,"searchDepth":87,"depth":87,"links":14206},[14207,14208,14209,14210,14211,14214,14215,14216],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":14212},[14213],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":7741,"description":7746},[206,7965,7966],{"id":7969,"title":7970,"body":14221,"category":206,"cover":207,"description":7975,"extension":208,"meta":14368,"navigation":96,"path":8154,"pinned":211,"publishedAt":212,"seo":14369,"slug":8156,"stem":8157,"summary":8158,"tags":14370,"updatedAt":212,"visible":96,"__hash__":8162},{"type":7,"value":14222,"toc":14358},[14223,14225,14227,14229,14231,14235,14237,14239,14247,14249,14251,14307,14309,14314,14316,14318,14330,14332,14338,14340,14350,14352,14354,14356],[10,14224,7975],{},[14,14226,16],{"id":16},[10,14228,7980],{},[14,14230,22],{"id":22},[10,14232,14233],{},[26,14234],{"alt":7987,"src":7988},[10,14236,7991],{},[14,14238,44],{"id":44},[46,14240,14241,14243,14245],{},[49,14242,7998],{},[49,14244,8001],{},[49,14246,8004],{},[14,14248,64],{"id":64},[10,14250,67],{},[69,14252,14253],{"className":71,"code":8011,"language":73,"meta":74,"style":74},[34,14254,14255,14259,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303],{"__ignoreMap":74},[78,14256,14257],{"class":80,"line":81},[78,14258,8018],{},[78,14260,14261],{"class":80,"line":87},[78,14262,8023],{},[78,14264,14265],{"class":80,"line":93},[78,14266,8028],{},[78,14268,14269],{"class":80,"line":100},[78,14270,97],{"emptyLinePlaceholder":96},[78,14272,14273],{"class":80,"line":106},[78,14274,8037],{},[78,14276,14277],{"class":80,"line":112},[78,14278,8042],{},[78,14280,14281],{"class":80,"line":2467},[78,14282,8047],{},[78,14284,14285],{"class":80,"line":2473},[78,14286,97],{"emptyLinePlaceholder":96},[78,14288,14289],{"class":80,"line":3890},[78,14290,8056],{},[78,14292,14293],{"class":80,"line":4102},[78,14294,8061],{},[78,14296,14297],{"class":80,"line":5767},[78,14298,97],{"emptyLinePlaceholder":96},[78,14300,14301],{"class":80,"line":5772},[78,14302,8070],{},[78,14304,14305],{"class":80,"line":7377},[78,14306,8075],{},[10,14308,118],{},[69,14310,14312],{"className":14311,"code":8081,"language":124,"meta":74},[122],[34,14313,8081],{"__ignoreMap":74},[10,14315,129],{},[14,14317,132],{"id":132},[134,14319,14320,14326],{},[49,14321,14322,8095,14324,8099],{},[34,14323,8094],{},[34,14325,8098],{},[49,14327,8102,14328,8106],{},[34,14329,8105],{},[14,14331,151],{"id":151},[46,14333,14334,14336],{},[49,14335,8113],{},[49,14337,8116],{},[14,14339,174],{"id":174},[134,14341,14342,14348],{},[49,14343,8123,14344,8127,14346,171],{},[34,14345,8126],{},[34,14347,8130],{},[49,14349,8133],{},[10,14351,185],{},[14,14353,188],{"id":188},[10,14355,8140],{},[193,14357,195],{},{"title":74,"searchDepth":87,"depth":87,"links":14359},[14360,14361,14362,14363,14364,14365,14366,14367],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":7970,"description":7975},[206,8160,8161],{"id":8164,"title":8165,"body":14372,"category":206,"cover":207,"description":8170,"extension":208,"meta":14535,"navigation":96,"path":8374,"pinned":211,"publishedAt":212,"seo":14536,"slug":8376,"stem":8377,"summary":8378,"tags":14537,"updatedAt":212,"visible":96,"__hash__":8382},{"type":7,"value":14373,"toc":14523},[14374,14376,14378,14380,14382,14386,14390,14392,14408,14410,14412,14456,14458,14463,14465,14467,14481,14483,14487,14491,14495,14497,14503,14505,14515,14517,14519,14521],[10,14375,8170],{},[14,14377,16],{"id":16},[10,14379,8175],{},[14,14381,22],{"id":22},[10,14383,14384],{},[26,14385],{"alt":8182,"src":8183},[10,14387,8186,14388,8190],{},[34,14389,8189],{},[14,14391,44],{"id":44},[46,14393,14394,14400,14406],{},[49,14395,14396,8200,14398,8204],{},[34,14397,8199],{},[34,14399,8203],{},[49,14401,8207,14402,8211,14404,8214],{},[34,14403,8210],{},[34,14405,4276],{},[49,14407,8217],{},[14,14409,64],{"id":64},[10,14411,67],{},[69,14413,14414],{"className":71,"code":8224,"language":73,"meta":74,"style":74},[34,14415,14416,14420,14424,14428,14432,14436,14440,14444,14448,14452],{"__ignoreMap":74},[78,14417,14418],{"class":80,"line":81},[78,14419,8231],{},[78,14421,14422],{"class":80,"line":87},[78,14423,8236],{},[78,14425,14426],{"class":80,"line":93},[78,14427,8241],{},[78,14429,14430],{"class":80,"line":100},[78,14431,8246],{},[78,14433,14434],{"class":80,"line":106},[78,14435,8251],{},[78,14437,14438],{"class":80,"line":112},[78,14439,97],{"emptyLinePlaceholder":96},[78,14441,14442],{"class":80,"line":2467},[78,14443,8260],{},[78,14445,14446],{"class":80,"line":2473},[78,14447,8265],{},[78,14449,14450],{"class":80,"line":3890},[78,14451,8265],{},[78,14453,14454],{"class":80,"line":4102},[78,14455,8265],{},[10,14457,118],{},[69,14459,14461],{"className":14460,"code":8279,"language":124,"meta":74},[122],[34,14462,8279],{"__ignoreMap":74},[10,14464,129],{},[14,14466,132],{"id":132},[134,14468,14469,14473],{},[49,14470,7870,14471,8293],{},[34,14472,8292],{},[49,14474,8296,14475,8299,14477,8302,14479,8306],{},[34,14476,8203],{},[34,14478,8189],{},[34,14480,8305],{},[309,14482,2677],{"id":2677},[10,14484,8311,14485,8314],{},[34,14486,8203],{},[10,14488,14489],{},[26,14490],{"alt":8319,"src":8320},[10,14492,8323,14493,8326],{},[34,14494,8189],{},[14,14496,151],{"id":151},[46,14498,14499,14501],{},[49,14500,8333],{},[49,14502,8336],{},[14,14504,174],{"id":174},[134,14506,14507,14509],{},[49,14508,8343],{},[49,14510,3948,14511,8348,14513,8351],{},[34,14512,4276],{},[34,14514,8203],{},[10,14516,185],{},[14,14518,188],{"id":188},[10,14520,8358],{},[193,14522,195],{},{"title":74,"searchDepth":87,"depth":87,"links":14524},[14525,14526,14527,14528,14529,14532,14533,14534],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":14530},[14531],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":8165,"description":8170},[206,8380,8381],{"id":8384,"title":8385,"body":14539,"category":206,"cover":207,"description":8390,"extension":208,"meta":14722,"navigation":96,"path":8615,"pinned":211,"publishedAt":212,"seo":14723,"slug":8617,"stem":8618,"summary":8619,"tags":14724,"updatedAt":212,"visible":96,"__hash__":8622},{"type":7,"value":14540,"toc":14710},[14541,14543,14545,14547,14549,14553,14555,14557,14571,14573,14575,14643,14645,14650,14652,14654,14668,14670,14672,14676,14682,14684,14692,14694,14702,14704,14706,14708],[10,14542,8390],{},[14,14544,16],{"id":16},[10,14546,8395],{},[14,14548,22],{"id":22},[10,14550,14551],{},[26,14552],{"alt":8402,"src":8403},[10,14554,8406],{},[14,14556,44],{"id":44},[46,14558,14559,14565,14567],{},[49,14560,14561,8416,14563,171],{},[34,14562,8415],{},[34,14564,8419],{},[49,14566,8422],{},[49,14568,14569,8428],{},[34,14570,8427],{},[14,14572,64],{"id":64},[10,14574,67],{},[69,14576,14577],{"className":71,"code":8435,"language":73,"meta":74,"style":74},[34,14578,14579,14583,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639],{"__ignoreMap":74},[78,14580,14581],{"class":80,"line":81},[78,14582,8442],{},[78,14584,14585],{"class":80,"line":87},[78,14586,97],{"emptyLinePlaceholder":96},[78,14588,14589],{"class":80,"line":93},[78,14590,8451],{},[78,14592,14593],{"class":80,"line":100},[78,14594,8456],{},[78,14596,14597],{"class":80,"line":106},[78,14598,8461],{},[78,14600,14601],{"class":80,"line":112},[78,14602,8466],{},[78,14604,14605],{"class":80,"line":2467},[78,14606,8471],{},[78,14608,14609],{"class":80,"line":2473},[78,14610,8476],{},[78,14612,14613],{"class":80,"line":3890},[78,14614,8481],{},[78,14616,14617],{"class":80,"line":4102},[78,14618,8486],{},[78,14620,14621],{"class":80,"line":5767},[78,14622,97],{"emptyLinePlaceholder":96},[78,14624,14625],{"class":80,"line":5772},[78,14626,8495],{},[78,14628,14629],{"class":80,"line":7377},[78,14630,6120],{},[78,14632,14633],{"class":80,"line":7383},[78,14634,6125],{},[78,14636,14637],{"class":80,"line":8506},[78,14638,97],{"emptyLinePlaceholder":96},[78,14640,14641],{"class":80,"line":8511},[78,14642,8514],{},[10,14644,118],{},[69,14646,14648],{"className":14647,"code":8520,"language":124,"meta":74},[122],[34,14649,8520],{"__ignoreMap":74},[10,14651,129],{},[14,14653,132],{"id":132},[134,14655,14656,14666],{},[49,14657,8531,14658,8535,14660,8539,14662,8543,14664,171],{},[34,14659,8534],{},[34,14661,8538],{},[34,14663,8542],{},[34,14665,8534],{},[49,14667,8548],{},[309,14669,2677],{"id":2677},[10,14671,8553],{},[10,14673,14674],{},[26,14675],{"alt":8558,"src":8559},[10,14677,14678,8564,14680,171],{},[34,14679,8415],{},[34,14681,8419],{},[14,14683,151],{"id":151},[46,14685,14686,14690],{},[49,14687,8573,14688,171],{},[34,14689,5318],{},[49,14691,8578],{},[14,14693,174],{"id":174},[134,14695,14696,14698],{},[49,14697,8585],{},[49,14699,8588,14700,8592],{},[34,14701,8591],{},[10,14703,185],{},[14,14705,188],{"id":188},[10,14707,8599],{},[193,14709,195],{},{"title":74,"searchDepth":87,"depth":87,"links":14711},[14712,14713,14714,14715,14716,14719,14720,14721],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":14717},[14718],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":8385,"description":8390},[206,8621,5269],{"id":8624,"title":8625,"body":14726,"category":206,"cover":207,"description":8630,"extension":208,"meta":14885,"navigation":96,"path":8818,"pinned":211,"publishedAt":212,"seo":14886,"slug":8820,"stem":8821,"summary":8822,"tags":14887,"updatedAt":212,"visible":96,"__hash__":8826},{"type":7,"value":14727,"toc":14873},[14728,14730,14732,14734,14736,14740,14742,14744,14752,14754,14756,14820,14822,14827,14829,14831,14839,14841,14843,14847,14849,14851,14857,14859,14865,14867,14869,14871],[10,14729,8630],{},[14,14731,16],{"id":16},[10,14733,8635],{},[14,14735,22],{"id":22},[10,14737,14738],{},[26,14739],{"alt":8642,"src":8643},[10,14741,8646],{},[14,14743,44],{"id":44},[46,14745,14746,14748,14750],{},[49,14747,8653],{},[49,14749,8656],{},[49,14751,8659],{},[14,14753,64],{"id":64},[10,14755,67],{},[69,14757,14758],{"className":71,"code":8666,"language":73,"meta":74,"style":74},[34,14759,14760,14764,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816],{"__ignoreMap":74},[78,14761,14762],{"class":80,"line":81},[78,14763,8673],{},[78,14765,14766],{"class":80,"line":87},[78,14767,8678],{},[78,14769,14770],{"class":80,"line":93},[78,14771,97],{"emptyLinePlaceholder":96},[78,14773,14774],{"class":80,"line":100},[78,14775,8687],{},[78,14777,14778],{"class":80,"line":106},[78,14779,97],{"emptyLinePlaceholder":96},[78,14781,14782],{"class":80,"line":112},[78,14783,8696],{},[78,14785,14786],{"class":80,"line":2467},[78,14787,8701],{},[78,14789,14790],{"class":80,"line":2473},[78,14791,8706],{},[78,14793,14794],{"class":80,"line":3890},[78,14795,97],{"emptyLinePlaceholder":96},[78,14797,14798],{"class":80,"line":4102},[78,14799,8715],{},[78,14801,14802],{"class":80,"line":5767},[78,14803,8720],{},[78,14805,14806],{"class":80,"line":5772},[78,14807,8725],{},[78,14809,14810],{"class":80,"line":7377},[78,14811,97],{"emptyLinePlaceholder":96},[78,14813,14814],{"class":80,"line":7383},[78,14815,6134],{},[78,14817,14818],{"class":80,"line":8506},[78,14819,8738],{},[10,14821,118],{},[69,14823,14825],{"className":14824,"code":8744,"language":124,"meta":74},[122],[34,14826,8744],{"__ignoreMap":74},[10,14828,129],{},[14,14830,132],{"id":132},[134,14832,14833,14837],{},[49,14834,14835,8758],{},[34,14836,8757],{},[49,14838,8761],{},[309,14840,2677],{"id":2677},[10,14842,8766],{},[10,14844,14845],{},[26,14846],{"alt":8771,"src":8772},[10,14848,8775],{},[14,14850,151],{"id":151},[46,14852,14853,14855],{},[49,14854,8782],{},[49,14856,8785],{},[14,14858,174],{"id":174},[134,14860,14861,14863],{},[49,14862,8792],{},[49,14864,8795],{},[10,14866,185],{},[14,14868,188],{"id":188},[10,14870,8802],{},[193,14872,195],{},{"title":74,"searchDepth":87,"depth":87,"links":14874},[14875,14876,14877,14878,14879,14882,14883,14884],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":14880},[14881],{"id":2677,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":8625,"description":8630},[206,8824,8825],{"id":8828,"title":8829,"body":14889,"category":206,"cover":207,"description":8834,"extension":208,"meta":15127,"navigation":96,"path":9135,"pinned":211,"publishedAt":212,"seo":15128,"slug":9137,"stem":9138,"summary":9139,"tags":15129,"updatedAt":212,"visible":96,"__hash__":9143},{"type":7,"value":14890,"toc":15114},[14891,14893,14895,14897,14899,14903,14905,14907,14917,14919,14921,15037,15039,15044,15046,15048,15058,15060,15062,15066,15068,15070,15072,15076,15080,15082,15090,15092,15106,15108,15110,15112],[10,14892,8834],{},[14,14894,16],{"id":16},[10,14896,8839],{},[14,14898,22],{"id":22},[10,14900,14901],{},[26,14902],{"alt":8846,"src":8847},[10,14904,8850],{},[14,14906,44],{"id":44},[46,14908,14909,14911,14913],{},[49,14910,8857],{},[49,14912,8860],{},[49,14914,8863,14915,8867],{},[34,14916,8866],{},[14,14918,64],{"id":64},[10,14920,67],{},[69,14922,14923],{"className":71,"code":8874,"language":73,"meta":74,"style":74},[34,14924,14925,14929,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033],{"__ignoreMap":74},[78,14926,14927],{"class":80,"line":81},[78,14928,6932],{},[78,14930,14931],{"class":80,"line":87},[78,14932,6541],{},[78,14934,14935],{"class":80,"line":93},[78,14936,97],{"emptyLinePlaceholder":96},[78,14938,14939],{"class":80,"line":100},[78,14940,8893],{},[78,14942,14943],{"class":80,"line":106},[78,14944,8898],{},[78,14946,14947],{"class":80,"line":112},[78,14948,8903],{},[78,14950,14951],{"class":80,"line":2467},[78,14952,8908],{},[78,14954,14955],{"class":80,"line":2473},[78,14956,97],{"emptyLinePlaceholder":96},[78,14958,14959],{"class":80,"line":3890},[78,14960,8917],{},[78,14962,14963],{"class":80,"line":4102},[78,14964,8922],{},[78,14966,14967],{"class":80,"line":5767},[78,14968,8927],{},[78,14970,14971],{"class":80,"line":5772},[78,14972,8932],{},[78,14974,14975],{"class":80,"line":7377},[78,14976,8937],{},[78,14978,14979],{"class":80,"line":7383},[78,14980,97],{"emptyLinePlaceholder":96},[78,14982,14983],{"class":80,"line":8506},[78,14984,8946],{},[78,14986,14987],{"class":80,"line":8511},[78,14988,8951],{},[78,14990,14991],{"class":80,"line":8954},[78,14992,8957],{},[78,14994,14995],{"class":80,"line":8960},[78,14996,97],{"emptyLinePlaceholder":96},[78,14998,14999],{"class":80,"line":8965},[78,15000,8968],{},[78,15002,15003],{"class":80,"line":8971},[78,15004,97],{"emptyLinePlaceholder":96},[78,15006,15007],{"class":80,"line":8976},[78,15008,7350],{},[78,15010,15011],{"class":80,"line":8981},[78,15012,8984],{},[78,15014,15015],{"class":80,"line":8987},[78,15016,8990],{},[78,15018,15019],{"class":80,"line":8993},[78,15020,8996],{},[78,15022,15023],{"class":80,"line":8999},[78,15024,7360],{},[78,15026,15027],{"class":80,"line":9004},[78,15028,9007],{},[78,15030,15031],{"class":80,"line":9010},[78,15032,1126],{},[78,15034,15035],{"class":80,"line":9015},[78,15036,9018],{},[10,15038,118],{},[69,15040,15042],{"className":15041,"code":9024,"language":124,"meta":74},[122],[34,15043,9024],{"__ignoreMap":74},[10,15045,129],{},[14,15047,132],{"id":132},[134,15049,15050,15054],{},[49,15051,9035,15052,9038],{},[34,15053,8866],{},[49,15055,15056,9043],{},[34,15057,8098],{},[309,15059,2677],{"id":2677},[10,15061,9048],{},[10,15063,15064],{},[26,15065],{"alt":9053,"src":9054},[10,15067,9057],{},[309,15069,2677],{"id":4157},[10,15071,9062],{},[10,15073,15074],{},[26,15075],{"alt":9067,"src":9068},[10,15077,9071,15078,9075],{},[34,15079,9074],{},[14,15081,151],{"id":151},[46,15083,15084,15086],{},[49,15085,9082],{},[49,15087,9085,15088,9088],{},[34,15089,9074],{},[14,15091,174],{"id":174},[134,15093,15094,15098,15100],{},[49,15095,9095,15096,9098],{},[34,15097,9074],{},[49,15099,9101],{},[49,15101,9104,15102,9108,15104,9111],{},[34,15103,9107],{},[34,15105,6076],{},[10,15107,185],{},[14,15109,188],{"id":188},[10,15111,9118],{},[193,15113,195],{},{"title":74,"searchDepth":87,"depth":87,"links":15115},[15116,15117,15118,15119,15120,15124,15125,15126],{"id":16,"depth":87,"text":16},{"id":22,"depth":87,"text":22},{"id":44,"depth":87,"text":44},{"id":64,"depth":87,"text":64},{"id":132,"depth":87,"text":132,"children":15121},[15122,15123],{"id":2677,"depth":93,"text":2677},{"id":4157,"depth":93,"text":2677},{"id":151,"depth":87,"text":151},{"id":174,"depth":87,"text":174},{"id":188,"depth":87,"text":188},{},{"title":8829,"description":8834},[206,9141,9142],{"id":1036,"title":1037,"body":15131,"category":206,"cover":1045,"description":74,"extension":208,"meta":15367,"navigation":96,"path":1362,"pinned":211,"publishedAt":1363,"seo":15368,"slug":1365,"stem":1366,"summary":1367,"tags":15369,"updatedAt":1363,"visible":96,"__hash__":1371},{"type":7,"value":15132,"toc":15352},[15133,15137,15139,15141,15143,15145,15165,15167,15172,15174,15176,15204,15210,15212,15216,15218,15238,15240,15250,15252,15254,15256,15258,15260,15262,15264,15266,15268,15288,15290,15292,15296,15298,15300,15302,15304,15308,15310,15328,15330,15332,15334,15336,15338,15340,15342,15344,15346,15348,15350],[10,15134,15135],{},[26,15136],{"alt":1044,"src":1045},[10,15138,1048],{},[10,15140,1051],{},[14,15142,1055],{"id":1054},[10,15144,1058],{},[69,15146,15147],{"className":71,"code":1061,"language":73,"meta":74,"style":74},[34,15148,15149,15153,15157,15161],{"__ignoreMap":74},[78,15150,15151],{"class":80,"line":81},[78,15152,1068],{},[78,15154,15155],{"class":80,"line":87},[78,15156,1073],{},[78,15158,15159],{"class":80,"line":93},[78,15160,97],{"emptyLinePlaceholder":96},[78,15162,15163],{"class":80,"line":100},[78,15164,1082],{},[10,15166,1085],{},[69,15168,15170],{"className":15169,"code":1089,"language":124,"meta":74},[122],[34,15171,1089],{"__ignoreMap":74},[10,15173,1094],{},[10,15175,1097],{},[69,15177,15178],{"className":71,"code":1100,"language":73,"meta":74,"style":74},[34,15179,15180,15184,15188,15192,15196,15200],{"__ignoreMap":74},[78,15181,15182],{"class":80,"line":81},[78,15183,1107],{},[78,15185,15186],{"class":80,"line":87},[78,15187,97],{"emptyLinePlaceholder":96},[78,15189,15190],{"class":80,"line":93},[78,15191,1116],{},[78,15193,15194],{"class":80,"line":100},[78,15195,1121],{},[78,15197,15198],{"class":80,"line":106},[78,15199,1126],{},[78,15201,15202],{"class":80,"line":112},[78,15203,1131],{},[10,15205,15206,1137,15208,1141],{},[34,15207,1136],{},[34,15209,1140],{},[14,15211,1145],{"id":1144},[10,15213,1148,15214,1152],{},[34,15215,1151],{},[10,15217,1155],{},[69,15219,15220],{"className":71,"code":1158,"language":73,"meta":74,"style":74},[34,15221,15222,15226,15230,15234],{"__ignoreMap":74},[78,15223,15224],{"class":80,"line":81},[78,15225,1165],{},[78,15227,15228],{"class":80,"line":87},[78,15229,1170],{},[78,15231,15232],{"class":80,"line":93},[78,15233,1175],{},[78,15235,15236],{"class":80,"line":100},[78,15237,1180],{},[10,15239,1183],{},[69,15241,15242],{"className":571,"code":1186,"language":573,"meta":74,"style":74},[34,15243,15244],{"__ignoreMap":74},[78,15245,15246,15248],{"class":80,"line":81},[78,15247,671],{"class":580},[78,15249,1195],{"class":616},[10,15251,1198],{},[14,15253,1202],{"id":1201},[309,15255,1205],{"id":1205},[10,15257,1208],{},[309,15259,1211],{"id":1211},[10,15261,1214],{},[309,15263,1217],{"id":1217},[10,15265,1220],{},[10,15267,1223],{},[69,15269,15270],{"className":71,"code":1226,"language":73,"meta":74,"style":74},[34,15271,15272,15276,15280,15284],{"__ignoreMap":74},[78,15273,15274],{"class":80,"line":81},[78,15275,1233],{},[78,15277,15278],{"class":80,"line":87},[78,15279,97],{"emptyLinePlaceholder":96},[78,15281,15282],{"class":80,"line":93},[78,15283,1242],{},[78,15285,15286],{"class":80,"line":100},[78,15287,1247],{},[10,15289,1250],{},[309,15291,1253],{"id":1253},[10,15293,1256,15294,1259],{},[34,15295,241],{},[10,15297,1262],{},[309,15299,1265],{"id":1265},[10,15301,1268],{},[14,15303,1272],{"id":1271},[10,15305,15306],{},[26,15307],{"alt":1277,"src":1278},[10,15309,1281],{},[46,15311,15312,15314,15316,15318,15320,15322,15324,15326],{},[49,15313,1286],{},[49,15315,1289],{},[49,15317,1292],{},[49,15319,1295],{},[49,15321,1298],{},[49,15323,1301],{},[49,15325,1304],{},[49,15327,1307],{},[10,15329,1310],{},[14,15331,1314],{"id":1313},[10,15333,1317],{},[10,15335,1320],{},[14,15337,1324],{"id":1323},[10,15339,1327],{},[10,15341,1330],{},[10,15343,1333],{},[14,15345,1336],{"id":1336},[10,15347,1339],{},[10,15349,1342],{},[193,15351,1345],{},{"title":74,"searchDepth":87,"depth":87,"links":15353},[15354,15355,15356,15363,15364,15365,15366],{"id":1054,"depth":87,"text":1055},{"id":1144,"depth":87,"text":1145},{"id":1201,"depth":87,"text":1202,"children":15357},[15358,15359,15360,15361,15362],{"id":1205,"depth":93,"text":1205},{"id":1211,"depth":93,"text":1211},{"id":1217,"depth":93,"text":1217},{"id":1253,"depth":93,"text":1253},{"id":1265,"depth":93,"text":1265},{"id":1271,"depth":87,"text":1272},{"id":1313,"depth":87,"text":1314},{"id":1323,"depth":87,"text":1324},{"id":1336,"depth":87,"text":1336},{},{"title":1037,"description":74},[206,1369,1370],{"id":223,"title":224,"body":15371,"category":206,"cover":207,"description":74,"extension":208,"meta":15950,"navigation":96,"path":1025,"pinned":211,"publishedAt":1026,"seo":15951,"slug":1028,"stem":1029,"summary":1030,"tags":15952,"updatedAt":1026,"visible":96,"__hash__":1034},{"type":7,"value":15372,"toc":15926},[15373,15375,15377,15379,15383,15385,15387,15411,15423,15425,15427,15432,15436,15440,15452,15456,15460,15464,15466,15500,15502,15506,15510,15512,15534,15564,15576,15586,15594,15596,15602,15612,15614,15619,15623,15625,15639,15645,15665,15667,15669,15671,15681,15685,15687,15696,15700,15702,15704,15724,15728,15730,15732,15734,15736,15756,15758,15760,15762,15788,15790,15806,15808,15824,15828,15830,15832,15852,15854,15856,15858,15862,15872,15874,15876,15878,15888,15896,15898,15900,15914,15924],[14,15374,229],{"id":229},[10,15376,232],{},[10,15378,235],{},[10,15380,238,15381,242],{},[34,15382,241],{},[14,15384,245],{"id":245},[10,15386,248],{},[250,15388,15389,15391],{},[10,15390,254],{},[250,15392,15393,15399,15401,15405,15407],{},[10,15394,259,15395,263,15397,267],{},[34,15396,262],{},[34,15398,266],{},[10,15400,270],{},[10,15402,273,15403,278],{},[275,15404,277],{},[10,15406,281],{},[10,15408,15409],{},[26,15410],{"alt":286,"src":287},[250,15412,15413,15415],{},[10,15414,292],{},[250,15416,15417,15419],{},[10,15418,297],{},[10,15420,15421],{},[26,15422],{"alt":302,"src":303},[14,15424,307],{"id":306},[309,15426,312],{"id":311},[10,15428,315,15429,323],{},[317,15430,322],{"href":319,"rel":15431},[321],[250,15433,15434],{},[10,15435,328],{},[10,15437,15438],{},[26,15439],{"alt":333,"src":334},[46,15441,15442,15446,15450],{},[49,15443,339,15444,171],{},[275,15445,342],{},[49,15447,345,15448,171],{},[275,15449,348],{},[49,15451,351],{},[10,15453,15454],{},[26,15455],{"alt":356,"src":357},[250,15457,15458],{},[10,15459,362],{},[10,15461,15462],{},[26,15463],{"alt":367,"src":368},[309,15465,372],{"id":371},[250,15467,15468,15472,15476,15496],{},[250,15469,15470],{},[10,15471,379],{},[10,15473,382,15474,386],{},[275,15475,385],{},[69,15477,15478],{"className":71,"code":389,"language":73,"meta":74,"style":74},[34,15479,15480,15484,15488,15492],{"__ignoreMap":74},[78,15481,15482],{"class":80,"line":81},[78,15483,396],{},[78,15485,15486],{"class":80,"line":87},[78,15487,401],{},[78,15489,15490],{"class":80,"line":93},[78,15491,406],{},[78,15493,15494],{"class":80,"line":100},[78,15495,411],{},[10,15497,414,15498,418],{},[275,15499,417],{},[10,15501,421],{},[10,15503,424,15504,427],{},[34,15505,73],{},[10,15507,15508],{},[26,15509],{"alt":432,"src":433},[10,15511,436],{},[250,15513,15514,15516,15520],{},[10,15515,441],{},[10,15517,15518],{},[275,15519,446],{},[250,15521,15522,15526,15530],{},[10,15523,451,15524,454],{},[34,15525,73],{},[10,15527,457,15528,460],{},[34,15529,73],{},[10,15531,463,15532,467],{},[275,15533,466],{},[250,15535,15536,15538,15542],{},[10,15537,472],{},[10,15539,15540],{},[275,15541,477],{},[250,15543,15544,15550,15558,15560],{},[10,15545,15546,485,15548,489],{},[34,15547,484],{},[34,15549,488],{},[10,15551,492,15552,495,15554,499,15556,503],{},[34,15553,484],{},[275,15555,498],{},[275,15557,502],{},[10,15559,506],{},[10,15561,15562,512],{},[275,15563,511],{},[250,15565,15566,15568],{},[10,15567,517],{},[250,15569,15570,15574],{},[10,15571,522,15572,526],{},[275,15573,525],{},[10,15575,529],{},[250,15577,15578,15582],{},[10,15579,534,15580],{},[275,15581,537],{},[10,15583,15584],{},[26,15585],{"alt":542,"src":543},[250,15587,15588,15590],{},[10,15589,548],{},[10,15591,15592],{},[26,15593],{"alt":542,"src":553},[309,15595,557],{"id":556},[10,15597,560,15598,564,15600,568],{},[34,15599,563],{},[34,15601,567],{},[69,15603,15604],{"className":571,"code":572,"language":573,"meta":74,"style":74},[34,15605,15606],{"__ignoreMap":74},[78,15607,15608,15610],{"class":80,"line":81},[78,15609,73],{"class":580},[78,15611,584],{"class":583},[10,15613,587],{},[69,15615,15617],{"className":15616,"code":591,"language":124,"meta":74},[122],[34,15618,591],{"__ignoreMap":74},[10,15620,15621],{},[26,15622],{"alt":542,"src":598},[10,15624,601],{},[69,15626,15627],{"className":571,"code":604,"language":573,"meta":74,"style":74},[34,15628,15629],{"__ignoreMap":74},[78,15630,15631,15633,15635,15637],{"class":80,"line":81},[78,15632,73],{"class":580},[78,15634,613],{"class":583},[78,15636,617],{"class":616},[78,15638,584],{"class":583},[10,15640,622,15641,625,15643,629],{},[34,15642,73],{},[34,15644,628],{},[69,15646,15647],{"className":571,"code":632,"language":573,"meta":74,"style":74},[34,15648,15649,15655],{"__ignoreMap":74},[78,15650,15651,15653],{"class":80,"line":81},[78,15652,488],{"class":580},[78,15654,584],{"class":583},[78,15656,15657,15659,15661,15663],{"class":80,"line":87},[78,15658,488],{"class":580},[78,15660,613],{"class":583},[78,15662,617],{"class":616},[78,15664,584],{"class":583},[14,15666,654],{"id":653},[309,15668,658],{"id":657},[10,15670,661],{},[69,15672,15673],{"className":571,"code":664,"language":573,"meta":74,"style":74},[34,15674,15675],{"__ignoreMap":74},[78,15676,15677,15679],{"class":80,"line":81},[78,15678,671],{"class":580},[78,15680,584],{"class":583},[10,15682,676,15683,680],{},[34,15684,679],{},[309,15686,684],{"id":683},[10,15688,315,15689,692,15692,171,15694,699],{},[317,15690,691],{"href":689,"rel":15691},[321],[275,15693,695],{},[34,15695,698],{},[10,15697,702,15698,706],{},[34,15699,705],{},[309,15701,710],{"id":709},[10,15703,713],{},[69,15705,15706],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,15707,15708,15714],{"__ignoreMap":74},[78,15709,15710,15712],{"class":80,"line":81},[78,15711,671],{"class":580},[78,15713,584],{"class":583},[78,15715,15716,15718,15720,15722],{"class":80,"line":87},[78,15717,671],{"class":580},[78,15719,613],{"class":583},[78,15721,617],{"class":616},[78,15723,584],{"class":583},[10,15725,737,15726,740],{},[34,15727,671],{},[14,15729,744],{"id":743},[10,15731,747],{},[309,15733,751],{"id":750},[10,15735,754],{},[69,15737,15738],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,15739,15740,15746],{"__ignoreMap":74},[78,15741,15742,15744],{"class":80,"line":81},[78,15743,671],{"class":580},[78,15745,584],{"class":583},[78,15747,15748,15750,15752,15754],{"class":80,"line":87},[78,15749,671],{"class":580},[78,15751,613],{"class":583},[78,15753,617],{"class":616},[78,15755,584],{"class":583},[10,15757,777],{},[309,15759,781],{"id":780},[10,15761,784],{},[69,15763,15764],{"className":571,"code":787,"language":573,"meta":74,"style":74},[34,15765,15766,15774],{"__ignoreMap":74},[78,15767,15768,15770,15772],{"class":80,"line":81},[78,15769,794],{"class":580},[78,15771,797],{"class":616},[78,15773,800],{"class":616},[78,15775,15776,15778,15780,15782,15784,15786],{"class":80,"line":87},[78,15777,794],{"class":580},[78,15779,797],{"class":616},[78,15781,809],{"class":616},[78,15783,812],{"class":616},[78,15785,815],{"class":616},[78,15787,818],{"class":616},[10,15789,821],{},[69,15791,15792],{"className":571,"code":824,"language":573,"meta":74,"style":74},[34,15793,15794],{"__ignoreMap":74},[78,15795,15796,15798,15800,15802,15804],{"class":80,"line":81},[78,15797,794],{"class":580},[78,15799,833],{"class":616},[78,15801,809],{"class":616},[78,15803,812],{"class":616},[78,15805,840],{"class":616},[10,15807,843],{},[69,15809,15810],{"className":571,"code":846,"language":573,"meta":74,"style":74},[34,15811,15812],{"__ignoreMap":74},[78,15813,15814,15816,15818,15820,15822],{"class":80,"line":81},[78,15815,794],{"class":580},[78,15817,855],{"class":616},[78,15819,858],{"class":583},[78,15821,861],{"class":616},[78,15823,864],{"class":616},[10,15825,15826,869],{},[34,15827,794],{},[309,15829,873],{"id":872},[10,15831,876],{},[69,15833,15834],{"className":571,"code":716,"language":573,"meta":74,"style":74},[34,15835,15836,15842],{"__ignoreMap":74},[78,15837,15838,15840],{"class":80,"line":81},[78,15839,671],{"class":580},[78,15841,584],{"class":583},[78,15843,15844,15846,15848,15850],{"class":80,"line":87},[78,15845,671],{"class":580},[78,15847,613],{"class":583},[78,15849,617],{"class":616},[78,15851,584],{"class":583},[10,15853,899],{},[14,15855,902],{"id":902},[309,15857,906],{"id":905},[10,15859,909,15860,913],{},[34,15861,912],{},[134,15863,15864,15868,15870],{},[49,15865,918,15866,921],{},[34,15867,628],{},[49,15869,924],{},[49,15871,927],{},[10,15873,930],{},[309,15875,934],{"id":933},[10,15877,937],{},[69,15879,15880],{"className":571,"code":664,"language":573,"meta":74,"style":74},[34,15881,15882],{"__ignoreMap":74},[78,15883,15884,15886],{"class":80,"line":81},[78,15885,671],{"class":580},[78,15887,584],{"class":583},[10,15889,950,15890,953,15892,956,15894,171],{},[34,15891,671],{},[34,15893,73],{},[34,15895,671],{},[309,15897,962],{"id":961},[10,15899,965],{},[69,15901,15902],{"className":571,"code":968,"language":573,"meta":74,"style":74},[34,15903,15904],{"__ignoreMap":74},[78,15905,15906,15908,15910,15912],{"class":80,"line":81},[78,15907,671],{"class":580},[78,15909,613],{"class":583},[78,15911,617],{"class":616},[78,15913,584],{"class":583},[10,15915,983,15916,986,15918,989,15920,992,15922,996],{},[34,15917,671],{},[34,15919,73],{},[34,15921,488],{},[34,15923,995],{},[193,15925,999],{},{"title":74,"searchDepth":87,"depth":87,"links":15927},[15928,15929,15930,15935,15940,15945],{"id":229,"depth":87,"text":229},{"id":245,"depth":87,"text":245},{"id":306,"depth":87,"text":307,"children":15931},[15932,15933,15934],{"id":311,"depth":93,"text":312},{"id":371,"depth":93,"text":372},{"id":556,"depth":93,"text":557},{"id":653,"depth":87,"text":654,"children":15936},[15937,15938,15939],{"id":657,"depth":93,"text":658},{"id":683,"depth":93,"text":684},{"id":709,"depth":93,"text":710},{"id":743,"depth":87,"text":744,"children":15941},[15942,15943,15944],{"id":750,"depth":93,"text":751},{"id":780,"depth":93,"text":781},{"id":872,"depth":93,"text":873},{"id":902,"depth":87,"text":902,"children":15946},[15947,15948,15949],{"id":905,"depth":93,"text":906},{"id":933,"depth":93,"text":934},{"id":961,"depth":93,"text":962},{},{"title":224,"description":74},[206,1032,1033],1786973364585]