[{"data":1,"prerenderedAt":15961},["ShallowReactive",2],{"post-python-input-and-conversion":3,"sidebar-posts":232,"post-related-source":9152},{"id":4,"title":5,"body":6,"category":217,"cover":218,"description":12,"extension":219,"meta":220,"navigation":107,"path":221,"pinned":222,"publishedAt":223,"seo":224,"slug":225,"stem":226,"summary":227,"tags":228,"updatedAt":223,"visible":107,"__hash__":231},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":8,"toc":207},"minimark",[9,13,17,20,23,30,49,52,67,70,73,121,124,132,135,138,161,164,176,179,194,197,200,203],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,31,32,36,37,40,41,44,45,48],{},[33,34,35],"code",{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,38,39],{},"18","，程序首先得到的也是 ",[33,42,43],{},"\"18\"","，需要 ",[33,46,47],{},"int()"," 后才能按整数参与计算。",[14,50,51],{"id":51},"核心概念",[53,54,55,59,64],"ul",{},[56,57,58],"li",{},"提示文字应告诉用户需要输入什么。",[56,60,61,63],{},[33,62,47],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[56,65,66],{},"输入转换和业务计算分开写，定位问题更直接。",[14,68,69],{"id":69},"跟着示例运行",[10,71,72],{},"把下面代码保存到本课脚本并运行：",[74,75,80],"pre",{"className":76,"code":77,"language":78,"meta":79,"style":79},"language-python shiki shiki-themes github-dark","name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n","python","",[33,81,82,90,96,102,109,115],{"__ignoreMap":79},[83,84,87],"span",{"class":85,"line":86},"line",1,[83,88,89],{},"name = input(\"请输入姓名：\")\n",[83,91,93],{"class":85,"line":92},2,[83,94,95],{},"age_text = input(\"请输入年龄：\")\n",[83,97,99],{"class":85,"line":98},3,[83,100,101],{},"age = int(age_text)\n",[83,103,105],{"class":85,"line":104},4,[83,106,108],{"emptyLinePlaceholder":107},true,"\n",[83,110,112],{"class":85,"line":111},5,[83,113,114],{},"print(\"你好，\" + name)\n",[83,116,118],{"class":85,"line":117},6,[83,119,120],{},"print(age + 1)\n",[10,122,123],{},"预期结果：",[74,125,130],{"className":126,"code":128,"language":129,"meta":79},[127],"language-text","根据输入显示姓名，并输出下一年的年龄\n","text",[33,131,128],{"__ignoreMap":79},[10,133,134],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,136,137],{"id":137},"按执行顺序拆开看",[139,140,141,151],"ol",{},[56,142,143,144,146,147,150],{},"两次 ",[33,145,35],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,148,149],{},"age_text"," 用来提醒这仍是文本。",[56,152,153,156,157,160],{},[33,154,155],{},"int(age_text)"," 创建整数对象，后面的 ",[33,158,159],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,162,163],{"id":163},"初学者容易混淆的地方",[53,165,166,173],{},[56,167,168,169,172],{},"直接计算 ",[33,170,171],{},"input(...) + 1","，忽略输入结果是字符串。",[56,174,175],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,177,178],{"id":178},"练习",[139,180,181,184],{},[56,182,183],{},"接收两个整数并输出它们的和。",[56,185,186,187,190,191,193],{},"输入 ",[33,188,189],{},"18.5"," 给 ",[33,192,47],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,195,196],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,198,199],{"id":199},"本篇边界",[10,201,202],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,205,206],"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":79,"searchDepth":92,"depth":92,"links":208},[209,210,211,212,213,214,215,216],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",false,"2026-08-17",{"title":5,"description":12},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[217,229,230],"input","类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",[233,1047,1384,1518,1670,1848,2036,2201,2384,2567,2760,2991,3128,3305,3462,3633,3798,4013,4242,4424,4588,4777,4965,5120,5280,5477,5674,5888,6055,6299,6480,6685,6880,7064,7265,7555,7747,7976,8171,8391,8631,8835],{"id":234,"title":235,"body":236,"category":217,"cover":218,"description":79,"extension":219,"meta":1036,"navigation":107,"path":1037,"pinned":222,"publishedAt":1038,"seo":1039,"slug":1040,"stem":1041,"summary":1042,"tags":1043,"updatedAt":1038,"visible":107,"__hash__":1046},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":237,"toc":1012},[238,241,244,247,254,257,260,299,315,319,324,335,340,346,364,370,375,381,385,431,434,440,446,449,480,525,542,556,566,570,581,597,600,606,611,614,632,642,663,667,671,674,686,693,697,712,719,723,726,747,753,757,760,764,767,787,790,794,797,831,834,853,856,877,882,886,889,909,912,915,919,926,940,943,947,950,960,971,975,978,993,1009],[14,239,240],{"id":240},"引言",[10,242,243],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,245,246],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,248,249,250,253],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,251,252],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,255,256],{"id":256},"扫盲",[10,258,259],{},"那么这里有几个概念：",[261,262,263,266],"blockquote",{},[10,264,265],{},"为什么需要安装python解释器？",[261,267,268,279,282,290,293],{},[10,269,270,271,274,275,278],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,272,273],{},"0","和",[33,276,277],{},"1","组成的机器指令。",[10,280,281],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,283,284,285,289],{},"这样，我们就能用",[286,287,288],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,291,292],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,294,295],{},[26,296],{"alt":297,"src":298},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[261,300,301,304],{},[10,302,303],{},"pip又是什么？",[261,305,306,309],{},[10,307,308],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,310,311],{},[26,312],{"alt":313,"src":314},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,316,318],{"id":317},"windows-安装","Windows 安装",[320,321,323],"h3",{"id":322},"_1-下载官方安装程序","1. 下载官方安装程序",[10,325,326,327,334],{},"打开 ",[328,329,333],"a",{"href":330,"rel":331},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[332],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[261,336,337],{},[10,338,339],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,341,342],{},[26,343],{"alt":344,"src":345},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[53,347,348,355,361],{},[56,349,350,351,354],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[286,352,353],{},"Windows installer (64-bit)","。",[56,356,357,358,354],{},"搭载 ARM 处理器的 Windows 设备选择 ",[286,359,360],{},"Windows installer (ARM64)",[56,362,363],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,365,366],{},[26,367],{"alt":368,"src":369},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[261,371,372],{},[10,373,374],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,376,377],{},[26,378],{"alt":379,"src":380},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[320,382,384],{"id":383},"_2-安装并加入-path","2. 安装并加入 PATH",[261,386,387,392,399,424],{},[261,388,389],{},[10,390,391],{},"PATH 环境变量",[10,393,394,395,398],{},"Windows 有一个特殊的变量叫 ",[286,396,397],{},"PATH","，它里面存了一串文件夹路径，比如：",[74,400,402],{"className":76,"code":401,"language":78,"meta":79,"style":79},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,403,404,409,414,419],{"__ignoreMap":79},[83,405,406],{"class":85,"line":86},[83,407,408],{},"D:\\Python313\\\n",[83,410,411],{"class":85,"line":92},[83,412,413],{},"D:\\Python313\\Scripts\\\n",[83,415,416],{"class":85,"line":98},[83,417,418],{},"C:\\Windows\\System32\\\n",[83,420,421],{"class":85,"line":104},[83,422,423],{},"...\n",[10,425,426,427,430],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[286,428,429],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,432,433],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,435,436,437,439],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,438,78],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,441,442],{},[26,443],{"alt":444,"src":445},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,447,448],{},"对安装界面最底部的两个勾选项分别解释 :",[261,450,451,454,459],{},[10,452,453],{},"Add python.exe to PATH",[10,455,456],{},[286,457,458],{},"把 Python 添加到系统环境变量",[261,460,461,467,473],{},[10,462,463,464,466],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,465,78],{}," 就能运行",[10,468,469,470,472],{},"不勾选的话，命令行输入 ",[33,471,78],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,474,475,476,479],{},"必须",[286,477,478],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[261,481,482,485,490],{},[10,483,484],{},"Use admin privileges when installing py.exe",[10,486,487],{},[286,488,489],{},"使用管理员权限安装 py.exe（Python 启动器）",[261,491,492,502,516,519],{},[10,493,494,497,498,501],{},[33,495,496],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,499,500],{},"py"," 来启动 Python。",[10,503,504,505,507,508,511,512,515],{},"勾选后，",[33,506,496],{}," 会安装到",[286,509,510],{},"系统级目录","，电脑上",[286,513,514],{},"所有用户账户","都能用",[10,517,518],{},"不勾选，只有当前用户能用",[10,520,521,524],{},[286,522,523],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[261,526,527,530],{},[10,528,529],{},"操作建议",[261,531,532,539],{},[10,533,534,535,538],{},"两个都勾上之后，再点 ",[286,536,537],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,540,541],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[261,543,544,550],{},[10,545,546,547],{},"Python 安装的",[286,548,549],{},"可选功能页",[10,551,552],{},[26,553],{"alt":554,"src":555},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[261,557,558,561],{},[10,559,560],{},"高级选项页",[10,562,563],{},[26,564],{"alt":554,"src":565},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[320,567,569],{"id":568},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,571,572,573,576,577,580],{},"按 ",[33,574,575],{},"Win + R","，输入 ",[33,578,579],{},"cmd"," 并回车，然后执行：",[74,582,586],{"className":583,"code":584,"language":585,"meta":79,"style":79},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,587,588],{"__ignoreMap":79},[83,589,590,593],{"class":85,"line":86},[83,591,78],{"class":592},"svObZ",[83,594,596],{"class":595},"sDLfK"," --version\n",[10,598,599],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[74,601,604],{"className":602,"code":603,"language":129,"meta":79},[127],"Python 3.x.x\n",[33,605,603],{"__ignoreMap":79},[10,607,608],{},[26,609],{"alt":554,"src":610},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,612,613],{},"继续检查 pip：",[74,615,617],{"className":583,"code":616,"language":585,"meta":79,"style":79},"python -m pip --version\n",[33,618,619],{"__ignoreMap":79},[83,620,621,623,626,630],{"class":85,"line":86},[83,622,78],{"class":592},[83,624,625],{"class":595}," -m",[83,627,629],{"class":628},"sU2Wk"," pip",[83,631,596],{"class":595},[10,633,634,635,637,638,641],{},"如果 ",[33,636,78],{}," 无法识别，但 ",[33,639,640],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[74,643,645],{"className":583,"code":644,"language":585,"meta":79,"style":79},"py --version\npy -m pip --version\n",[33,646,647,653],{"__ignoreMap":79},[83,648,649,651],{"class":85,"line":86},[83,650,500],{"class":592},[83,652,596],{"class":595},[83,654,655,657,659,661],{"class":85,"line":92},[83,656,500],{"class":592},[83,658,625],{"class":595},[83,660,629],{"class":628},[83,662,596],{"class":595},[14,664,666],{"id":665},"macos-安装","macOS 安装",[320,668,670],{"id":669},"_1-先检查现有环境","1. 先检查现有环境",[10,672,673],{},"打开“终端”应用，执行：",[74,675,677],{"className":583,"code":676,"language":585,"meta":79,"style":79},"python3 --version\n",[33,678,679],{"__ignoreMap":79},[83,680,681,684],{"class":85,"line":86},[83,682,683],{"class":592},"python3",[83,685,596],{"class":595},[10,687,688,689,692],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,690,691],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[320,694,696],{"id":695},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,698,326,699,704,705,354,708,711],{},[328,700,703],{"href":701,"rel":702},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[332],"Python macOS 下载页","，下载当前稳定版的 ",[286,706,707],{},"macOS 64-bit universal2 installer",[33,709,710],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,713,714,715,718],{},"下载完成后打开 ",[33,716,717],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[320,720,722],{"id":721},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,724,725],{},"安装完成后重新打开终端，执行：",[74,727,729],{"className":583,"code":728,"language":585,"meta":79,"style":79},"python3 --version\npython3 -m pip --version\n",[33,730,731,737],{"__ignoreMap":79},[83,732,733,735],{"class":85,"line":86},[83,734,683],{"class":592},[83,736,596],{"class":595},[83,738,739,741,743,745],{"class":85,"line":92},[83,740,683],{"class":592},[83,742,625],{"class":595},[83,744,629],{"class":628},[83,746,596],{"class":595},[10,748,749,750,752],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,751,683],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,754,756],{"id":755},"linux-安装","Linux 安装",[10,758,759],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[320,761,763],{"id":762},"_1-检查是否已经安装","1. 检查是否已经安装",[10,765,766],{},"打开终端，执行：",[74,768,769],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,770,771,777],{"__ignoreMap":79},[83,772,773,775],{"class":85,"line":86},[83,774,683],{"class":592},[83,776,596],{"class":595},[83,778,779,781,783,785],{"class":85,"line":92},[83,780,683],{"class":592},[83,782,625],{"class":595},[83,784,629],{"class":628},[83,786,596],{"class":595},[10,788,789],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[320,791,793],{"id":792},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,795,796],{},"Ubuntu 或 Debian：",[74,798,800],{"className":583,"code":799,"language":585,"meta":79,"style":79},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,801,802,813],{"__ignoreMap":79},[83,803,804,807,810],{"class":85,"line":86},[83,805,806],{"class":592},"sudo",[83,808,809],{"class":628}," apt",[83,811,812],{"class":628}," update\n",[83,814,815,817,819,822,825,828],{"class":85,"line":92},[83,816,806],{"class":592},[83,818,809],{"class":628},[83,820,821],{"class":628}," install",[83,823,824],{"class":628}," python3",[83,826,827],{"class":628}," python3-pip",[83,829,830],{"class":628}," python3-venv\n",[10,832,833],{},"Fedora：",[74,835,837],{"className":583,"code":836,"language":585,"meta":79,"style":79},"sudo dnf install python3 python3-pip\n",[33,838,839],{"__ignoreMap":79},[83,840,841,843,846,848,850],{"class":85,"line":86},[83,842,806],{"class":592},[83,844,845],{"class":628}," dnf",[83,847,821],{"class":628},[83,849,824],{"class":628},[83,851,852],{"class":628}," python3-pip\n",[10,854,855],{},"Arch Linux：",[74,857,859],{"className":583,"code":858,"language":585,"meta":79,"style":79},"sudo pacman -S python python-pip\n",[33,860,861],{"__ignoreMap":79},[83,862,863,865,868,871,874],{"class":85,"line":86},[83,864,806],{"class":592},[83,866,867],{"class":628}," pacman",[83,869,870],{"class":595}," -S",[83,872,873],{"class":628}," python",[83,875,876],{"class":628}," python-pip\n",[10,878,879,881],{},[33,880,806],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[320,883,885],{"id":884},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,887,888],{},"安装结束后执行：",[74,890,891],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,892,893,899],{"__ignoreMap":79},[83,894,895,897],{"class":85,"line":86},[83,896,683],{"class":592},[83,898,596],{"class":595},[83,900,901,903,905,907],{"class":85,"line":92},[83,902,683],{"class":592},[83,904,625],{"class":595},[83,906,629],{"class":628},[83,908,596],{"class":595},[10,910,911],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,913,914],{"id":914},"常见问题",[320,916,918],{"id":917},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,920,921,922,925],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,923,924],{},"python --version","。如果仍然失败，按下面的顺序检查：",[139,927,928,934,937],{},[56,929,930,931,933],{},"执行 ",[33,932,640],{},"，确认 Python Launcher 是否可用。",[56,935,936],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[56,938,939],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,941,942],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[320,944,946],{"id":945},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,948,949],{},"先尝试：",[74,951,952],{"className":583,"code":676,"language":585,"meta":79,"style":79},[33,953,954],{"__ignoreMap":79},[83,955,956,958],{"class":85,"line":86},[83,957,683],{"class":592},[83,959,596],{"class":595},[10,961,962,963,965,966,968,969,354],{},"在这两个系统中，只有 ",[33,964,683],{}," 命令而没有 ",[33,967,78],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,970,683],{},[320,972,974],{"id":973},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,976,977],{},"先使用模块方式检查：",[74,979,981],{"className":583,"code":980,"language":585,"meta":79,"style":79},"python3 -m pip --version\n",[33,982,983],{"__ignoreMap":79},[83,984,985,987,989,991],{"class":85,"line":86},[83,986,683],{"class":592},[83,988,625],{"class":595},[83,990,629],{"class":628},[83,992,596],{"class":595},[10,994,995,996,998,999,1001,1002,1004,1005,1008],{},"Windows 用户将命令中的 ",[33,997,683],{}," 换成 ",[33,1000,78],{}," 或 ",[33,1003,500],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1006,1007],{},"python3-pip","；不要直接使用其他系统的安装命令。",[204,1010,1011],{},"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":79,"searchDepth":92,"depth":92,"links":1013},[1014,1015,1016,1021,1026,1031],{"id":240,"depth":92,"text":240},{"id":256,"depth":92,"text":256},{"id":317,"depth":92,"text":318,"children":1017},[1018,1019,1020],{"id":322,"depth":98,"text":323},{"id":383,"depth":98,"text":384},{"id":568,"depth":98,"text":569},{"id":665,"depth":92,"text":666,"children":1022},[1023,1024,1025],{"id":669,"depth":98,"text":670},{"id":695,"depth":98,"text":696},{"id":721,"depth":98,"text":722},{"id":755,"depth":92,"text":756,"children":1027},[1028,1029,1030],{"id":762,"depth":98,"text":763},{"id":792,"depth":98,"text":793},{"id":884,"depth":98,"text":885},{"id":914,"depth":92,"text":914,"children":1032},[1033,1034,1035],{"id":917,"depth":98,"text":918},{"id":945,"depth":98,"text":946},{"id":973,"depth":98,"text":974},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":235,"description":79},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[217,1044,1045],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1048,"title":1049,"body":1050,"category":217,"cover":1057,"description":79,"extension":219,"meta":1373,"navigation":107,"path":1374,"pinned":222,"publishedAt":1375,"seo":1376,"slug":1377,"stem":1378,"summary":1379,"tags":1380,"updatedAt":1375,"visible":107,"__hash__":1383},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1051,"toc":1358},[1052,1058,1061,1064,1068,1071,1095,1098,1104,1107,1110,1144,1154,1158,1165,1168,1193,1196,1208,1211,1215,1218,1221,1224,1227,1230,1233,1236,1260,1263,1266,1272,1275,1278,1281,1285,1291,1294,1320,1323,1327,1330,1333,1337,1340,1343,1346,1349,1352,1355],[10,1053,1054],{},[26,1055],{"alt":1056,"src":1057},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1059,1060],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1062,1063],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1065,1067],{"id":1066},"python-代码是什么样的","Python 代码是什么样的",[10,1069,1070],{},"下面是一段简单的 Python 代码：",[74,1072,1074],{"className":76,"code":1073,"language":78,"meta":79,"style":79},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1075,1076,1081,1086,1090],{"__ignoreMap":79},[83,1077,1078],{"class":85,"line":86},[83,1079,1080],{},"name = \"Python\"\n",[83,1082,1083],{"class":85,"line":92},[83,1084,1085],{},"year = 2026\n",[83,1087,1088],{"class":85,"line":98},[83,1089,108],{"emptyLinePlaceholder":107},[83,1091,1092],{"class":85,"line":104},[83,1093,1094],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1096,1097],{},"运行结果：",[74,1099,1102],{"className":1100,"code":1101,"language":129,"meta":79},[127],"正在学习 Python，当前年份是 2026\n",[33,1103,1101],{"__ignoreMap":79},[10,1105,1106],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1108,1109],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[74,1111,1113],{"className":76,"code":1112,"language":78,"meta":79,"style":79},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1114,1115,1120,1124,1129,1134,1139],{"__ignoreMap":79},[83,1116,1117],{"class":85,"line":86},[83,1118,1119],{},"score = 85\n",[83,1121,1122],{"class":85,"line":92},[83,1123,108],{"emptyLinePlaceholder":107},[83,1125,1126],{"class":85,"line":98},[83,1127,1128],{},"if score >= 60:\n",[83,1130,1131],{"class":85,"line":104},[83,1132,1133],{},"    print(\"成绩合格\")\n",[83,1135,1136],{"class":85,"line":111},[83,1137,1138],{},"else:\n",[83,1140,1141],{"class":85,"line":117},[83,1142,1143],{},"    print(\"需要继续学习\")\n",[10,1145,1146,1149,1150,1153],{},[33,1147,1148],{},"if"," 和 ",[33,1151,1152],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1155,1157],{"id":1156},"python-如何运行代码","Python 如何运行代码",[10,1159,1160,1161,1164],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1162,1163],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1166,1167],{},"交互式环境适合快速验证一个表达式：",[74,1169,1171],{"className":76,"code":1170,"language":78,"meta":79,"style":79},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1172,1173,1178,1183,1188],{"__ignoreMap":79},[83,1174,1175],{"class":85,"line":86},[83,1176,1177],{},">>> 10 + 20\n",[83,1179,1180],{"class":85,"line":92},[83,1181,1182],{},"30\n",[83,1184,1185],{"class":85,"line":98},[83,1186,1187],{},">>> \"Python\".lower()\n",[83,1189,1190],{"class":85,"line":104},[83,1191,1192],{},"'python'\n",[10,1194,1195],{},"需要保存和重复运行的程序，则可以写入文件：",[74,1197,1199],{"className":583,"code":1198,"language":585,"meta":79,"style":79},"python3 hello.py\n",[33,1200,1201],{"__ignoreMap":79},[83,1202,1203,1205],{"class":85,"line":86},[83,1204,683],{"class":592},[83,1206,1207],{"class":628}," hello.py\n",[10,1209,1210],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1212,1214],{"id":1213},"python-的特点","Python 的特点",[320,1216,1217],{"id":1217},"语法相对简洁",[10,1219,1220],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[320,1222,1223],{"id":1223},"支持多种编程方式",[10,1225,1226],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[320,1228,1229],{"id":1229},"标准库比较完整",[10,1231,1232],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1234,1235],{},"例如，获取当前时间：",[74,1237,1239],{"className":76,"code":1238,"language":78,"meta":79,"style":79},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1240,1241,1246,1250,1255],{"__ignoreMap":79},[83,1242,1243],{"class":85,"line":86},[83,1244,1245],{},"from datetime import datetime\n",[83,1247,1248],{"class":85,"line":92},[83,1249,108],{"emptyLinePlaceholder":107},[83,1251,1252],{"class":85,"line":98},[83,1253,1254],{},"now = datetime.now()\n",[83,1256,1257],{"class":85,"line":104},[83,1258,1259],{},"print(now)\n",[10,1261,1262],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[320,1264,1265],{"id":1265},"第三方工具丰富",[10,1267,1268,1269,1271],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1270,252],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1273,1274],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[320,1276,1277],{"id":1277},"支持多个操作系统",[10,1279,1280],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1282,1284],{"id":1283},"python-可以做什么","Python 可以做什么",[10,1286,1287],{},[26,1288],{"alt":1289,"src":1290},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1292,1293],{},"Python 的应用范围比较广，常见方向包括：",[53,1295,1296,1299,1302,1305,1308,1311,1314,1317],{},[56,1297,1298],{},"编写自动化脚本，批量处理文件和重复任务；",[56,1300,1301],{},"开发网站后端和 API 服务；",[56,1303,1304],{},"进行数据清洗、统计分析和图表展示；",[56,1306,1307],{},"编写网络爬虫和信息采集工具；",[56,1309,1310],{},"开发自动化测试程序；",[56,1312,1313],{},"进行机器学习和人工智能开发；",[56,1315,1316],{},"编写运维、监控和辅助开发工具；",[56,1318,1319],{},"开发部分桌面应用和插件。",[10,1321,1322],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1324,1326],{"id":1325},"python-的发展","Python 的发展",[10,1328,1329],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1331,1332],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1334,1336],{"id":1335},"python-也有局限","Python 也有局限",[10,1338,1339],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1341,1342],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1344,1345],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1347,1348],{"id":1348},"写在最后",[10,1350,1351],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1353,1354],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[204,1356,1357],{},"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":79,"searchDepth":92,"depth":92,"links":1359},[1360,1361,1362,1369,1370,1371,1372],{"id":1066,"depth":92,"text":1067},{"id":1156,"depth":92,"text":1157},{"id":1213,"depth":92,"text":1214,"children":1363},[1364,1365,1366,1367,1368],{"id":1217,"depth":98,"text":1217},{"id":1223,"depth":98,"text":1223},{"id":1229,"depth":98,"text":1229},{"id":1265,"depth":98,"text":1265},{"id":1277,"depth":98,"text":1277},{"id":1283,"depth":92,"text":1284},{"id":1325,"depth":92,"text":1326},{"id":1335,"depth":92,"text":1336},{"id":1348,"depth":92,"text":1348},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1049,"description":79},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[217,1381,1382],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1385,"title":1386,"body":1387,"category":217,"cover":218,"description":1391,"extension":219,"meta":1509,"navigation":107,"path":1510,"pinned":222,"publishedAt":223,"seo":1511,"slug":1512,"stem":1513,"summary":1514,"tags":1515,"updatedAt":223,"visible":107,"__hash__":1517},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1388,"toc":1499},[1389,1392,1394,1397,1399,1405,1410,1412,1426,1428,1430,1439,1441,1447,1449,1451,1467,1469,1480,1482,1490,1492,1494,1497],[10,1390,1391],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1393,16],{"id":16},[10,1395,1396],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1398,22],{"id":22},[10,1400,1401],{},[26,1402],{"alt":1403,"src":1404},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1406,1407,1409],{},[33,1408,1163],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1411,51],{"id":51},[53,1413,1414,1420,1423],{},[56,1415,1416,1417,1419],{},"源代码是人编写的文本，通常保存在 ",[33,1418,1163],{}," 文件中。",[56,1421,1422],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[56,1424,1425],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1427,69],{"id":69},[10,1429,72],{},[74,1431,1433],{"className":76,"code":1432,"language":78,"meta":79,"style":79},"print(\"你好，Python\")\n",[33,1434,1435],{"__ignoreMap":79},[83,1436,1437],{"class":85,"line":86},[83,1438,1432],{},[10,1440,123],{},[74,1442,1445],{"className":1443,"code":1444,"language":129,"meta":79},[127],"你好，Python\n",[33,1446,1444],{"__ignoreMap":79},[10,1448,134],{},[14,1450,137],{"id":137},[139,1452,1453,1460],{},[56,1454,1455,1456,1459],{},"终端启动解释器后，解释器读取 ",[33,1457,1458],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[56,1461,1462,1463,1466],{},"字符串对象先准备好，再交给 ",[33,1464,1465],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1468,163],{"id":163},[53,1470,1471,1474],{},[56,1472,1473],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[56,1475,1476,1477,1479],{},"认为 ",[33,1478,1163],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1481,178],{"id":178},[139,1483,1484,1487],{},[56,1485,1486],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[56,1488,1489],{},"把示例文字改成自己的学习目标并重新运行。",[10,1491,196],{},[14,1493,199],{"id":199},[10,1495,1496],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,1498,206],{},{"title":79,"searchDepth":92,"depth":92,"links":1500},[1501,1502,1503,1504,1505,1506,1507,1508],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1386,"description":1391},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[217,1381,1516],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1519,"title":1520,"body":1521,"category":217,"cover":218,"description":1525,"extension":219,"meta":1661,"navigation":107,"path":1662,"pinned":222,"publishedAt":223,"seo":1663,"slug":1664,"stem":1665,"summary":1666,"tags":1667,"updatedAt":223,"visible":107,"__hash__":1669},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1522,"toc":1651},[1523,1526,1528,1531,1533,1539,1545,1547,1562,1564,1567,1587,1589,1595,1597,1599,1612,1614,1628,1630,1641,1643,1645,1648],[10,1524,1525],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1527,16],{"id":16},[10,1529,1530],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1532,22],{"id":22},[10,1534,1535],{},[26,1536],{"alt":1537,"src":1538},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1540,1541,1542,1544],{},"终端收到 ",[33,1543,683],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1546,51],{"id":51},[53,1548,1549,1552,1555],{},[56,1550,1551],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[56,1553,1554],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[56,1556,1557,1558,1561],{},"检查 pip 时使用 ",[33,1559,1560],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1563,69],{"id":69},[10,1565,1566],{},"在 macOS 终端执行：",[74,1568,1569],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,1570,1571,1577],{"__ignoreMap":79},[83,1572,1573,1575],{"class":85,"line":86},[83,1574,683],{"class":592},[83,1576,596],{"class":595},[83,1578,1579,1581,1583,1585],{"class":85,"line":92},[83,1580,683],{"class":592},[83,1582,625],{"class":595},[83,1584,629],{"class":628},[83,1586,596],{"class":595},[10,1588,123],{},[74,1590,1593],{"className":1591,"code":1592,"language":129,"meta":79},[127],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1594,1592],{"__ignoreMap":79},[10,1596,134],{},[14,1598,137],{"id":137},[139,1600,1601,1607],{},[56,1602,1603,1606],{},[33,1604,1605],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[56,1608,1609,1611],{},[33,1610,691],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1613,163],{"id":163},[53,1615,1616,1622],{},[56,1617,1618,1619,1621],{},"看到系统已有 ",[33,1620,683],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[56,1623,1624,1625,1627],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1626,683],{},"，不修改系统自带工具。",[14,1629,178],{"id":178},[139,1631,1632,1638],{},[56,1633,930,1634,1637],{},[33,1635,1636],{},"which python3","，记录当前解释器路径。",[56,1639,1640],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1642,196],{},[14,1644,199],{"id":199},[10,1646,1647],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,1649,1650],{},"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":79,"searchDepth":92,"depth":92,"links":1652},[1653,1654,1655,1656,1657,1658,1659,1660],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1520,"description":1525},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[217,1668,1044],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1671,"title":1672,"body":1673,"category":217,"cover":218,"description":1837,"extension":219,"meta":1838,"navigation":107,"path":1839,"pinned":222,"publishedAt":223,"seo":1840,"slug":1841,"stem":1842,"summary":1843,"tags":1844,"updatedAt":223,"visible":107,"__hash__":1847},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1674,"toc":1827},[1675,1681,1683,1686,1688,1694,1697,1699,1722,1724,1726,1753,1755,1761,1763,1765,1783,1785,1799,1801,1815,1817,1819,1825],[10,1676,1677,1678,1680],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1679,1163],{}," 脚本。",[14,1682,16],{"id":16},[10,1684,1685],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1687,22],{"id":22},[10,1689,1690],{},[26,1691],{"alt":1692,"src":1693},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1695,1696],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1698,51],{"id":51},[53,1700,1701,1710,1716],{},[56,1702,1703,1704,1706,1707,354],{},"在终端输入 ",[33,1705,683],{}," 进入 REPL，提示符通常是 ",[33,1708,1709],{},">>>",[56,1711,186,1712,1715],{},[33,1713,1714],{},"exit()"," 或按 Control-D 退出 REPL。",[56,1717,1718,1719,1721],{},"需要保存、复查或多次运行的代码应写入 ",[33,1720,1163],{}," 文件。",[14,1723,69],{"id":69},[10,1725,72],{},[74,1727,1731],{"className":1728,"code":1729,"language":1730,"meta":79,"style":79},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1732,1733,1738,1743,1748],{"__ignoreMap":79},[83,1734,1735],{"class":85,"line":86},[83,1736,1737],{},">>> 2 + 3\n",[83,1739,1740],{"class":85,"line":92},[83,1741,1742],{},"5\n",[83,1744,1745],{"class":85,"line":98},[83,1746,1747],{},">>> \"python\".upper()\n",[83,1749,1750],{"class":85,"line":104},[83,1751,1752],{},"'PYTHON'\n",[10,1754,123],{},[74,1756,1759],{"className":1757,"code":1758,"language":129,"meta":79},[127],"REPL 会直接显示表达式结果\n",[33,1760,1758],{"__ignoreMap":79},[10,1762,134],{},[14,1764,137],{"id":137},[139,1766,1767,1777],{},[56,1768,1769,1770,1773,1774,354],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1771,1772],{},"2 + 3"," 能直接看到 ",[33,1775,1776],{},"5",[56,1778,1779,1780,1782],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1781,1465],{}," 才会写到标准输出。",[14,1784,163],{"id":163},[53,1786,1787,1796],{},[56,1788,1789,1790,1792,1793,1795],{},"把提示符 ",[33,1791,1709],{}," 复制进 ",[33,1794,1163],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[56,1797,1798],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1800,178],{"id":178},[139,1802,1803,1809],{},[56,1804,1805,1806,354],{},"在 REPL 计算 ",[33,1807,1808],{},"12 * 8",[56,1810,1811,1812,1814],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1813,1465],{}," 时是否显示结果。",[10,1816,196],{},[14,1818,199],{"id":199},[10,1820,1821,1822,1824],{},"本篇目标是根据任务选择 REPL 或 ",[33,1823,1163],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,1826,206],{},{"title":79,"searchDepth":92,"depth":92,"links":1828},[1829,1830,1831,1832,1833,1834,1835,1836],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1672,"description":1837},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[217,1845,1846],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1849,"title":1850,"body":1851,"category":217,"cover":218,"description":1855,"extension":219,"meta":2026,"navigation":107,"path":2027,"pinned":222,"publishedAt":223,"seo":2028,"slug":2029,"stem":2030,"summary":2031,"tags":2032,"updatedAt":223,"visible":107,"__hash__":2035},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1852,"toc":2016},[1853,1856,1858,1861,1863,1869,1875,1877,1895,1897,1899,1944,1946,1952,1954,1956,1978,1980,1992,1994,2006,2008,2010,2013],[10,1854,1855],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1857,16],{"id":16},[10,1859,1860],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1862,22],{"id":22},[10,1864,1865],{},[26,1866],{"alt":1867,"src":1868},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1870,1871,1874],{},[33,1872,1873],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1876,51],{"id":51},[53,1878,1879,1882,1892],{},[56,1880,1881],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[56,1883,1884,1887,1888,1891],{},[33,1885,1886],{},"pwd"," 显示当前目录，",[33,1889,1890],{},"ls"," 显示目录里的文件。",[56,1893,1894],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1896,69],{"id":69},[10,1898,1566],{},[74,1900,1902],{"className":583,"code":1901,"language":585,"meta":79,"style":79},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1903,1904,1912,1919,1924,1938],{"__ignoreMap":79},[83,1905,1906,1909],{"class":85,"line":86},[83,1907,1908],{"class":592},"mkdir",[83,1910,1911],{"class":628}," python-study\n",[83,1913,1914,1917],{"class":85,"line":92},[83,1915,1916],{"class":595},"cd",[83,1918,1911],{"class":628},[83,1920,1921],{"class":85,"line":98},[83,1922,1923],{"class":595},"pwd\n",[83,1925,1926,1929,1932,1936],{"class":85,"line":104},[83,1927,1928],{"class":595},"printf",[83,1930,1931],{"class":628}," 'print(\"项目已经运行\")\\n'",[83,1933,1935],{"class":1934},"snl16"," >",[83,1937,1207],{"class":628},[83,1939,1940,1942],{"class":85,"line":111},[83,1941,683],{"class":592},[83,1943,1207],{"class":628},[10,1945,123],{},[74,1947,1950],{"className":1948,"code":1949,"language":129,"meta":79},[127],"项目已经运行\n",[33,1951,1949],{"__ignoreMap":79},[10,1953,134],{},[14,1955,137],{"id":137},[139,1957,1958,1969],{},[56,1959,1960,1962,1963,1965,1966,1968],{},[33,1961,1908],{}," 创建目录，",[33,1964,1916],{}," 改变终端当前目录，",[33,1967,1886],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[56,1970,1971,1973,1974,1977],{},[33,1972,1873],{}," 会在当前目录寻找 ",[33,1975,1976],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1979,163],{"id":163},[53,1981,1982,1989],{},[56,1983,1984,1985,1149,1987,354],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,1986,1886],{},[33,1988,1890],{},[56,1990,1991],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1993,178],{"id":178},[139,1995,1996,2003],{},[56,1997,1998,1999,2002],{},"新建 ",[33,2000,2001],{},"lesson01.py"," 并输出课程编号。",[56,2004,2005],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2007,196],{},[14,2009,199],{"id":199},[10,2011,2012],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,2014,2015],{},"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":79,"searchDepth":92,"depth":92,"links":2017},[2018,2019,2020,2021,2022,2023,2024,2025],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1850,"description":1855},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[217,2033,2034],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2037,"title":2038,"body":2039,"category":217,"cover":218,"description":2043,"extension":219,"meta":2191,"navigation":107,"path":2192,"pinned":222,"publishedAt":223,"seo":2193,"slug":2194,"stem":2195,"summary":2196,"tags":2197,"updatedAt":223,"visible":107,"__hash__":2200},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2040,"toc":2181},[2041,2044,2046,2049,2051,2057,2068,2070,2090,2092,2094,2114,2116,2122,2124,2126,2145,2147,2155,2157,2172,2174,2176,2179],[10,2042,2043],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2045,16],{"id":16},[10,2047,2048],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2050,22],{"id":22},[10,2052,2053],{},[26,2054],{"alt":2055,"src":2056},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2058,2059,2060,354,2062,2065,2066,354],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2061,1465],{},[33,2063,2064],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2067,1772],{},[14,2069,51],{"id":51},[53,2071,2072,2078,2087],{},[56,2073,2074,2077],{},[33,2075,2076],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[56,2079,2080,2083,2084,354],{},[33,2081,2082],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2085,2086],{},"12",[56,2088,2089],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2091,69],{"id":69},[10,2093,72],{},[74,2095,2097],{"className":76,"code":2096,"language":78,"meta":79,"style":79},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2098,2099,2104,2109],{"__ignoreMap":79},[83,2100,2101],{"class":85,"line":86},[83,2102,2103],{},"print(42)\n",[83,2105,2106],{"class":85,"line":92},[83,2107,2108],{},"print(7 + 5)\n",[83,2110,2111],{"class":85,"line":98},[83,2112,2113],{},"print(\"Python 基础课\")\n",[10,2115,123],{},[74,2117,2120],{"className":2118,"code":2119,"language":129,"meta":79},[127],"42\n12\nPython 基础课\n",[33,2121,2119],{"__ignoreMap":79},[10,2123,134],{},[14,2125,137],{"id":137},[139,2127,2128,2136],{},[56,2129,2130,2133,2134,354],{},[33,2131,2132],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2135,2086],{},[56,2137,2138,2140,2141,2144],{},[33,2139,1465],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2142,2143],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2146,163],{"id":163},[53,2148,2149,2152],{},[56,2150,2151],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[56,2153,2154],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2156,178],{"id":178},[139,2158,2159,2162],{},[56,2160,2161],{},"分别输出一个整数、一个小数和一段文本。",[56,2163,2164,2165,2167,2168,2171],{},"比较 ",[33,2166,2064],{}," 与 ",[33,2169,2170],{},"print(\"2 + 3\")"," 的结果。",[10,2173,196],{},[14,2175,199],{"id":199},[10,2177,2178],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,2180,206],{},{"title":79,"searchDepth":92,"depth":92,"links":2182},[2183,2184,2185,2186,2187,2188,2189,2190],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2038,"description":2043},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[217,2198,2199],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2202,"title":2203,"body":2204,"category":217,"cover":218,"description":2208,"extension":219,"meta":2374,"navigation":107,"path":2375,"pinned":222,"publishedAt":223,"seo":2376,"slug":2377,"stem":2378,"summary":2379,"tags":2380,"updatedAt":223,"visible":107,"__hash__":2383},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2205,"toc":2364},[2206,2209,2211,2214,2216,2222,2225,2227,2253,2255,2257,2285,2287,2293,2295,2297,2321,2323,2338,2340,2355,2357,2359,2362],[10,2207,2208],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2210,16],{"id":16},[10,2212,2213],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2215,22],{"id":22},[10,2217,2218],{},[26,2219],{"alt":2220,"src":2221},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2223,2224],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2226,51],{"id":51},[53,2228,2229,2232,2242],{},[56,2230,2231],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[56,2233,2234,2235,2167,2238,2241],{},"变量名区分大小写，",[33,2236,2237],{},"score",[33,2239,2240],{},"Score"," 是两个名字。",[56,2243,2244,2245,2248,2249,2252],{},"使用能表达含义的名称；不要用 ",[33,2246,2247],{},"list","、",[33,2250,2251],{},"str"," 等内置名称作为普通变量名。",[14,2254,69],{"id":69},[10,2256,72],{},[74,2258,2260],{"className":76,"code":2259,"language":78,"meta":79,"style":79},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2261,2262,2267,2272,2276,2281],{"__ignoreMap":79},[83,2263,2264],{"class":85,"line":86},[83,2265,2266],{},"score = 90\n",[83,2268,2269],{"class":85,"line":92},[83,2270,2271],{},"print(score)\n",[83,2273,2274],{"class":85,"line":98},[83,2275,108],{"emptyLinePlaceholder":107},[83,2277,2278],{"class":85,"line":104},[83,2279,2280],{},"score = 95\n",[83,2282,2283],{"class":85,"line":111},[83,2284,2271],{},[10,2286,123],{},[74,2288,2291],{"className":2289,"code":2290,"language":129,"meta":79},[127],"90\n95\n",[33,2292,2290],{"__ignoreMap":79},[10,2294,134],{},[14,2296,137],{"id":137},[139,2298,2299,2308],{},[56,2300,930,2301,2304,2305,2307],{},[33,2302,2303],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2306,2237],{}," 再绑定到它。",[56,2309,930,2310,2313,2314,2317,2318,354],{},[33,2311,2312],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2315,2316],{},"90"," 没有被改造成 ",[33,2319,2320],{},"95",[14,2322,163],{"id":163},[53,2324,2325,2328],{},[56,2326,2327],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[56,2329,2330,2331,2248,2333,2248,2335,2337],{},"使用 ",[33,2332,2247],{},[33,2334,2251],{},[33,2336,229],{}," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2339,178],{"id":178},[139,2341,2342,2352],{},[56,2343,2344,2345,1149,2348,2351],{},"创建 ",[33,2346,2347],{},"course_name",[33,2349,2350],{},"lesson_count"," 两个变量并输出。",[56,2353,2354],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2356,196],{},[14,2358,199],{"id":199},[10,2360,2361],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,2363,206],{},{"title":79,"searchDepth":92,"depth":92,"links":2365},[2366,2367,2368,2369,2370,2371,2372,2373],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2203,"description":2208},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[217,2381,2382],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2385,"title":2386,"body":2387,"category":217,"cover":218,"description":2391,"extension":219,"meta":2557,"navigation":107,"path":2558,"pinned":222,"publishedAt":223,"seo":2559,"slug":2560,"stem":2561,"summary":2562,"tags":2563,"updatedAt":223,"visible":107,"__hash__":2566},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2388,"toc":2547},[2389,2392,2394,2397,2399,2405,2408,2410,2439,2441,2443,2489,2491,2497,2499,2501,2515,2517,2528,2530,2538,2540,2542,2545],[10,2390,2391],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2393,16],{"id":16},[10,2395,2396],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2398,22],{"id":22},[10,2400,2401],{},[26,2402],{"alt":2403,"src":2404},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2406,2407],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2409,51],{"id":51},[53,2411,2412,2422,2436],{},[56,2413,2414,2417,2418,2421],{},[33,2415,2416],{},"int"," 表示整数，",[33,2419,2420],{},"float"," 表示浮点数。",[56,2423,2424,2427,2428,2431,2432,2435],{},[33,2425,2426],{},"\u002F"," 总是进行真除法；",[33,2429,2430],{},"\u002F\u002F"," 是向下取整除法，",[33,2433,2434],{},"%"," 得到余数。",[56,2437,2438],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2440,69],{"id":69},[10,2442,72],{},[74,2444,2446],{"className":76,"code":2445,"language":78,"meta":79,"style":79},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2447,2448,2453,2458,2463,2467,2472,2477,2483],{"__ignoreMap":79},[83,2449,2450],{"class":85,"line":86},[83,2451,2452],{},"price = 25\n",[83,2454,2455],{"class":85,"line":92},[83,2456,2457],{},"count = 4\n",[83,2459,2460],{"class":85,"line":98},[83,2461,2462],{},"discount = 0.9\n",[83,2464,2465],{"class":85,"line":104},[83,2466,108],{"emptyLinePlaceholder":107},[83,2468,2469],{"class":85,"line":111},[83,2470,2471],{},"total = price * count * discount\n",[83,2473,2474],{"class":85,"line":117},[83,2475,2476],{},"average = total \u002F count\n",[83,2478,2480],{"class":85,"line":2479},7,[83,2481,2482],{},"print(total)\n",[83,2484,2486],{"class":85,"line":2485},8,[83,2487,2488],{},"print(average)\n",[10,2490,123],{},[74,2492,2495],{"className":2493,"code":2494,"language":129,"meta":79},[127],"90.0\n22.5\n",[33,2496,2494],{"__ignoreMap":79},[10,2498,134],{},[14,2500,137],{"id":137},[139,2502,2503,2509],{},[56,2504,2505,2508],{},[33,2506,2507],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[56,2510,2511,2514],{},[33,2512,2513],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2516,163],{"id":163},[53,2518,2519,2525],{},[56,2520,2521,2522,354],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2523,2524],{},"decimal.Decimal",[56,2526,2527],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2529,178],{"id":178},[139,2531,2532,2535],{},[56,2533,2534],{},"计算 137 除以 10 的商和余数。",[56,2536,2537],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2539,196],{},[14,2541,199],{"id":199},[10,2543,2544],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,2546,206],{},{"title":79,"searchDepth":92,"depth":92,"links":2548},[2549,2550,2551,2552,2553,2554,2555,2556],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2386,"description":2391},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[217,2564,2565],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2568,"title":2569,"body":2570,"category":217,"cover":218,"description":2574,"extension":219,"meta":2750,"navigation":107,"path":2751,"pinned":222,"publishedAt":223,"seo":2752,"slug":2753,"stem":2754,"summary":2755,"tags":2756,"updatedAt":223,"visible":107,"__hash__":2759},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2571,"toc":2738},[2572,2575,2577,2580,2582,2588,2598,2600,2611,2613,2615,2645,2647,2653,2655,2657,2687,2690,2693,2699,2702,2704,2712,2714,2729,2731,2733,2736],[10,2573,2574],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2576,16],{"id":16},[10,2578,2579],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2581,22],{"id":22},[10,2583,2584],{},[26,2585],{"alt":2586,"src":2587},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2589,2590,2591,2594,2595,354],{},"切片 ",[33,2592,2593],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2596,2597],{},"stop - start",[14,2599,51],{"id":51},[53,2601,2602,2605,2608],{},[56,2603,2604],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[56,2606,2607],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[56,2609,2610],{},"切片会创建新的字符串，不会修改原字符串。",[14,2612,69],{"id":69},[10,2614,72],{},[74,2616,2618],{"className":76,"code":2617,"language":78,"meta":79,"style":79},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2619,2620,2625,2630,2635,2640],{"__ignoreMap":79},[83,2621,2622],{"class":85,"line":86},[83,2623,2624],{},"language = \"Python\"\n",[83,2626,2627],{"class":85,"line":92},[83,2628,2629],{},"print(language[0])\n",[83,2631,2632],{"class":85,"line":98},[83,2633,2634],{},"print(language[-1])\n",[83,2636,2637],{"class":85,"line":104},[83,2638,2639],{},"print(language[0:3])\n",[83,2641,2642],{"class":85,"line":111},[83,2643,2644],{},"print(language + \" 3.14\")\n",[10,2646,123],{},[74,2648,2651],{"className":2649,"code":2650,"language":129,"meta":79},[127],"P\nn\nPyt\nPython 3.14\n",[33,2652,2650],{"__ignoreMap":79},[10,2654,134],{},[14,2656,137],{"id":137},[139,2658,2659,2673],{},[56,2660,2661,2662,2664,2665,2668,2669,2672],{},"字符串 ",[33,2663,217],{}," 的正索引从 ",[33,2666,2667],{},"P"," 的 0 开始，负索引从末尾 ",[33,2670,2671],{},"n"," 的 -1 开始。",[56,2674,2675,2678,2679,2682,2683,2686],{},[33,2676,2677],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2680,2681],{},"Pyt","；索引 3 的 ",[33,2684,2685],{},"h"," 不在结果中。",[320,2688,2689],{"id":2689},"再看一个具体细节",[10,2691,2692],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2694,2695],{},[26,2696],{"alt":2697,"src":2698},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2700,2701],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2703,163],{"id":163},[53,2705,2706,2709],{},[56,2707,2708],{},"把第一个字符写成索引 1，造成整体偏移一位。",[56,2710,2711],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2713,178],{"id":178},[139,2715,2716,2726],{},[56,2717,2718,2719,2722,2723,354],{},"从 ",[33,2720,2721],{},"\"programming\""," 中切出 ",[33,2724,2725],{},"\"gram\"",[56,2727,2728],{},"使用负索引取得字符串倒数第二个字符。",[10,2730,196],{},[14,2732,199],{"id":199},[10,2734,2735],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,2737,206],{},{"title":79,"searchDepth":92,"depth":92,"links":2739},[2740,2741,2742,2743,2744,2747,2748,2749],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":2745},[2746],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2569,"description":2574},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[217,2757,2758],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2761,"title":2762,"body":2763,"category":217,"cover":218,"description":2767,"extension":219,"meta":2981,"navigation":107,"path":2982,"pinned":222,"publishedAt":223,"seo":2983,"slug":2984,"stem":2985,"summary":2986,"tags":2987,"updatedAt":223,"visible":107,"__hash__":2990},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2764,"toc":2969},[2765,2768,2770,2773,2775,2781,2791,2793,2826,2828,2830,2874,2876,2882,2884,2886,2907,2909,2912,2918,2926,2928,2942,2944,2960,2962,2964,2967],[10,2766,2767],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2769,16],{"id":16},[10,2771,2772],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2774,22],{"id":22},[10,2776,2777],{},[26,2778],{"alt":2779,"src":2780},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2782,2783,2784,1001,2787,2790],{},"比较表达式先产生 ",[33,2785,2786],{},"True",[33,2788,2789],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2792,51],{"id":51},[53,2794,2795,2809,2823],{},[56,2796,2797,2800,2801,2804,2805,2808],{},[33,2798,2799],{},"=="," 判断是否相等，",[33,2802,2803],{},"!="," 判断是否不等；单个 ",[33,2806,2807],{},"="," 是赋值。",[56,2810,2811,2814,2815,2818,2819,2822],{},[33,2812,2813],{},"and"," 要求两侧都为真，",[33,2816,2817],{},"or"," 只需一侧为真，",[33,2820,2821],{},"not"," 取反。",[56,2824,2825],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2827,69],{"id":69},[10,2829,72],{},[74,2831,2833],{"className":76,"code":2832,"language":78,"meta":79,"style":79},"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",[33,2834,2835,2840,2845,2849,2854,2859,2864,2869],{"__ignoreMap":79},[83,2836,2837],{"class":85,"line":86},[83,2838,2839],{},"age = 20\n",[83,2841,2842],{"class":85,"line":92},[83,2843,2844],{},"has_ticket = True\n",[83,2846,2847],{"class":85,"line":98},[83,2848,108],{"emptyLinePlaceholder":107},[83,2850,2851],{"class":85,"line":104},[83,2852,2853],{},"is_adult = age >= 18\n",[83,2855,2856],{"class":85,"line":111},[83,2857,2858],{},"can_enter = is_adult and has_ticket\n",[83,2860,2861],{"class":85,"line":117},[83,2862,2863],{},"print(is_adult)\n",[83,2865,2866],{"class":85,"line":2479},[83,2867,2868],{},"print(can_enter)\n",[83,2870,2871],{"class":85,"line":2485},[83,2872,2873],{},"print(not has_ticket)\n",[10,2875,123],{},[74,2877,2880],{"className":2878,"code":2879,"language":129,"meta":79},[127],"True\nTrue\nFalse\n",[33,2881,2879],{"__ignoreMap":79},[10,2883,134],{},[14,2885,137],{"id":137},[139,2887,2888,2898],{},[56,2889,2890,2893,2894,2897],{},[33,2891,2892],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2895,2896],{},"is_adult","，这一步没有任何分支跳转。",[56,2899,2900,2903,2904,2906],{},[33,2901,2902],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2905,2821],{}," 只对紧随其后的值取反。",[320,2908,2689],{"id":2689},[10,2910,2911],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2913,2914],{},[26,2915],{"alt":2916,"src":2917},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2919,2920,2922,2923,2925],{},[33,2921,2813],{}," 只有“真、真”得到真；",[33,2924,2817],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2927,163],{"id":163},[53,2929,2930,2939],{},[56,2931,2932,2933,2935,2936,2938],{},"用单个等号判断相等。",[33,2934,2807],{}," 是赋值，",[33,2937,2799],{}," 才是相等比较。",[56,2940,2941],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2943,178],{"id":178},[139,2945,2946,2953],{},[56,2947,2948,2949,2952],{},"判断数字 ",[33,2950,2951],{},"15"," 是否同时大于 10 且小于 20。",[56,2954,2955,2956,2959],{},"分别修改年龄和票据状态，记录 ",[33,2957,2958],{},"can_enter"," 的四种组合结果。",[10,2961,196],{},[14,2963,199],{"id":199},[10,2965,2966],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,2968,206],{},{"title":79,"searchDepth":92,"depth":92,"links":2970},[2971,2972,2973,2974,2975,2978,2979,2980],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":2976},[2977],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2762,"description":2767},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[217,2988,2989],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":4,"title":5,"body":2992,"category":217,"cover":218,"description":12,"extension":219,"meta":3125,"navigation":107,"path":221,"pinned":222,"publishedAt":223,"seo":3126,"slug":225,"stem":226,"summary":227,"tags":3127,"updatedAt":223,"visible":107,"__hash__":231},{"type":7,"value":2993,"toc":3115},[2994,2996,2998,3000,3002,3006,3016,3018,3028,3030,3032,3060,3062,3067,3069,3071,3085,3087,3095,3097,3107,3109,3111,3113],[10,2995,12],{},[14,2997,16],{"id":16},[10,2999,19],{},[14,3001,22],{"id":22},[10,3003,3004],{},[26,3005],{"alt":28,"src":29},[10,3007,3008,36,3010,40,3012,44,3014,48],{},[33,3009,35],{},[33,3011,39],{},[33,3013,43],{},[33,3015,47],{},[14,3017,51],{"id":51},[53,3019,3020,3022,3026],{},[56,3021,58],{},[56,3023,3024,63],{},[33,3025,47],{},[56,3027,66],{},[14,3029,69],{"id":69},[10,3031,72],{},[74,3033,3034],{"className":76,"code":77,"language":78,"meta":79,"style":79},[33,3035,3036,3040,3044,3048,3052,3056],{"__ignoreMap":79},[83,3037,3038],{"class":85,"line":86},[83,3039,89],{},[83,3041,3042],{"class":85,"line":92},[83,3043,95],{},[83,3045,3046],{"class":85,"line":98},[83,3047,101],{},[83,3049,3050],{"class":85,"line":104},[83,3051,108],{"emptyLinePlaceholder":107},[83,3053,3054],{"class":85,"line":111},[83,3055,114],{},[83,3057,3058],{"class":85,"line":117},[83,3059,120],{},[10,3061,123],{},[74,3063,3065],{"className":3064,"code":128,"language":129,"meta":79},[127],[33,3066,128],{"__ignoreMap":79},[10,3068,134],{},[14,3070,137],{"id":137},[139,3072,3073,3079],{},[56,3074,143,3075,146,3077,150],{},[33,3076,35],{},[33,3078,149],{},[56,3080,3081,156,3083,160],{},[33,3082,155],{},[33,3084,159],{},[14,3086,163],{"id":163},[53,3088,3089,3093],{},[56,3090,168,3091,172],{},[33,3092,171],{},[56,3094,175],{},[14,3096,178],{"id":178},[139,3098,3099,3101],{},[56,3100,183],{},[56,3102,186,3103,190,3105,193],{},[33,3104,189],{},[33,3106,47],{},[10,3108,196],{},[14,3110,199],{"id":199},[10,3112,202],{},[204,3114,206],{},{"title":79,"searchDepth":92,"depth":92,"links":3116},[3117,3118,3119,3120,3121,3122,3123,3124],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5,"description":12},[217,229,230],{"id":3129,"title":3130,"body":3131,"category":217,"cover":218,"description":3135,"extension":219,"meta":3295,"navigation":107,"path":3296,"pinned":222,"publishedAt":223,"seo":3297,"slug":3298,"stem":3299,"summary":3300,"tags":3301,"updatedAt":223,"visible":107,"__hash__":3304},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3132,"toc":3285},[3133,3136,3138,3141,3143,3149,3156,3158,3172,3174,3176,3215,3217,3223,3225,3227,3246,3248,3263,3265,3276,3278,3280,3283],[10,3134,3135],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3137,16],{"id":16},[10,3139,3140],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3142,22],{"id":22},[10,3144,3145],{},[26,3146],{"alt":3147,"src":3148},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3150,3151,3152,3155],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3153,3154],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3157,51],{"id":51},[53,3159,3160,3163,3166],{},[56,3161,3162],{},"列表使用方括号，元素之间用逗号分隔。",[56,3164,3165],{},"列表可变，可以替换、追加和删除元素。",[56,3167,3168,3169,354],{},"访问不存在的索引会产生 ",[33,3170,3171],{},"IndexError",[14,3173,69],{"id":69},[10,3175,72],{},[74,3177,3179],{"className":76,"code":3178,"language":78,"meta":79,"style":79},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3180,3181,3186,3191,3195,3200,3205,3210],{"__ignoreMap":79},[83,3182,3183],{"class":85,"line":86},[83,3184,3185],{},"scores = [82, 90, 76]\n",[83,3187,3188],{"class":85,"line":92},[83,3189,3190],{},"print(scores[0])\n",[83,3192,3193],{"class":85,"line":98},[83,3194,108],{"emptyLinePlaceholder":107},[83,3196,3197],{"class":85,"line":104},[83,3198,3199],{},"scores[1] = 95\n",[83,3201,3202],{"class":85,"line":111},[83,3203,3204],{},"scores.append(88)\n",[83,3206,3207],{"class":85,"line":117},[83,3208,3209],{},"print(scores)\n",[83,3211,3212],{"class":85,"line":2479},[83,3213,3214],{},"print(len(scores))\n",[10,3216,123],{},[74,3218,3221],{"className":3219,"code":3220,"language":129,"meta":79},[127],"82\n[82, 95, 76, 88]\n4\n",[33,3222,3220],{"__ignoreMap":79},[10,3224,134],{},[14,3226,137],{"id":137},[139,3228,3229,3232],{},[56,3230,3231],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[56,3233,3234,3237,3238,3241,3242,3245],{},[33,3235,3236],{},"scores[1] = 95"," 替换第二个位置，",[33,3239,3240],{},"append(88)"," 在末尾增加新位置，",[33,3243,3244],{},"len()"," 因而从 3 变为 4。",[14,3247,163],{"id":163},[53,3249,3250,3260],{},[56,3251,3252,3253,3256,3257,354],{},"访问 ",[33,3254,3255],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3258,3259],{},"len(scores) - 1",[56,3261,3262],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3264,178],{"id":178},[139,3266,3267,3270],{},[56,3268,3269],{},"建立三项学习任务列表，再追加第四项。",[56,3271,3272,3273,3275],{},"修改第二项，并用 ",[33,3274,3244],{}," 检查元素数量。",[10,3277,196],{},[14,3279,199],{"id":199},[10,3281,3282],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,3284,206],{},{"title":79,"searchDepth":92,"depth":92,"links":3286},[3287,3288,3289,3290,3291,3292,3293,3294],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3130,"description":3135},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[217,3302,3303],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3306,"title":3307,"body":3308,"category":217,"cover":218,"description":3312,"extension":219,"meta":3453,"navigation":107,"path":3454,"pinned":222,"publishedAt":223,"seo":3455,"slug":3456,"stem":3457,"summary":3458,"tags":3459,"updatedAt":223,"visible":107,"__hash__":3461},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3309,"toc":3443},[3310,3313,3315,3318,3320,3326,3329,3331,3342,3344,3346,3380,3382,3388,3390,3392,3406,3408,3420,3422,3434,3436,3438,3441],[10,3311,3312],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3314,16],{"id":16},[10,3316,3317],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3319,22],{"id":22},[10,3321,3322],{},[26,3323],{"alt":3324,"src":3325},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3327,3328],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3330,51],{"id":51},[53,3332,3333,3336,3339],{},[56,3334,3335],{},"元组常用来表达固定数量、固定含义的一组值。",[56,3337,3338],{},"只有一个元素的元组必须保留尾随逗号。",[56,3340,3341],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3343,69],{"id":69},[10,3345,72],{},[74,3347,3349],{"className":76,"code":3348,"language":78,"meta":79,"style":79},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3350,3351,3356,3361,3366,3370,3375],{"__ignoreMap":79},[83,3352,3353],{"class":85,"line":86},[83,3354,3355],{},"point = (120, 80)\n",[83,3357,3358],{"class":85,"line":92},[83,3359,3360],{},"print(point[0])\n",[83,3362,3363],{"class":85,"line":98},[83,3364,3365],{},"print(point[1])\n",[83,3367,3368],{"class":85,"line":104},[83,3369,108],{"emptyLinePlaceholder":107},[83,3371,3372],{"class":85,"line":111},[83,3373,3374],{},"single = (5,)\n",[83,3376,3377],{"class":85,"line":117},[83,3378,3379],{},"print(single)\n",[10,3381,123],{},[74,3383,3386],{"className":3384,"code":3385,"language":129,"meta":79},[127],"120\n80\n(5,)\n",[33,3387,3385],{"__ignoreMap":79},[10,3389,134],{},[14,3391,137],{"id":137},[139,3393,3394,3400],{},[56,3395,3396,3399],{},[33,3397,3398],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[56,3401,3402,3405],{},[33,3403,3404],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3407,163],{"id":163},[53,3409,3410,3417],{},[56,3411,3412,3413,3416],{},"把 ",[33,3414,3415],{},"(5)"," 当作元组，实际它仍是整数。",[56,3418,3419],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3421,178],{"id":178},[139,3423,3424,3427],{},[56,3425,3426],{},"用元组表示宽度和高度。",[56,3428,2164,3429,2167,3431,3433],{},[33,3430,3415],{},[33,3432,3404],{}," 的类型。",[10,3435,196],{},[14,3437,199],{"id":199},[10,3439,3440],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,3442,206],{},{"title":79,"searchDepth":92,"depth":92,"links":3444},[3445,3446,3447,3448,3449,3450,3451,3452],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3307,"description":3312},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[217,3460,3303],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3463,"title":3464,"body":3465,"category":217,"cover":218,"description":3469,"extension":219,"meta":3624,"navigation":107,"path":3625,"pinned":222,"publishedAt":223,"seo":3626,"slug":3627,"stem":3628,"summary":3629,"tags":3630,"updatedAt":223,"visible":107,"__hash__":3632},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3466,"toc":3614},[3467,3470,3472,3475,3477,3483,3493,3495,3509,3511,3513,3547,3549,3555,3557,3559,3574,3576,3595,3597,3605,3607,3609,3612],[10,3468,3469],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3471,16],{"id":16},[10,3473,3474],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3476,22],{"id":22},[10,3478,3479],{},[26,3480],{"alt":3481,"src":3482},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3484,3485,3486,3489,3490,3492],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3487,3488],{},"student[\"score\"]"," 读取的是键 ",[33,3491,2237],{}," 对应的值，而不是“第几个元素”。",[14,3494,51],{"id":51},[53,3496,3497,3500,3506],{},[56,3498,3499],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[56,3501,2330,3502,3505],{},[33,3503,3504],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[56,3507,3508],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3510,69],{"id":69},[10,3512,72],{},[74,3514,3516],{"className":76,"code":3515,"language":78,"meta":79,"style":79},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3517,3518,3523,3528,3532,3537,3542],{"__ignoreMap":79},[83,3519,3520],{"class":85,"line":86},[83,3521,3522],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[83,3524,3525],{"class":85,"line":92},[83,3526,3527],{},"print(student[\"name\"])\n",[83,3529,3530],{"class":85,"line":98},[83,3531,108],{"emptyLinePlaceholder":107},[83,3533,3534],{"class":85,"line":104},[83,3535,3536],{},"student[\"score\"] = 95\n",[83,3538,3539],{"class":85,"line":111},[83,3540,3541],{},"student[\"city\"] = \"郑州\"\n",[83,3543,3544],{"class":85,"line":117},[83,3545,3546],{},"print(student)\n",[10,3548,123],{},[74,3550,3553],{"className":3551,"code":3552,"language":129,"meta":79},[127],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3554,3552],{"__ignoreMap":79},[10,3556,134],{},[14,3558,137],{"id":137},[139,3560,3561,3564],{},[56,3562,3563],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[56,3565,3566,3567,3569,3570,3573],{},"给已有键 ",[33,3568,2237],{}," 赋值会更新映射，给新键 ",[33,3571,3572],{},"city"," 赋值会增加映射。",[14,3575,163],{"id":163},[53,3577,3578,3585],{},[56,3579,3580,3581,3584],{},"按位置理解字典并尝试 ",[33,3582,3583],{},"student[0]","，而实际键是字符串。",[56,3586,3587,3588,3591,3592,354],{},"直接读取不确定存在的键并忽略 ",[33,3589,3590],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3593,3594],{},"get()",[14,3596,178],{"id":178},[139,3598,3599,3602],{},[56,3600,3601],{},"建立一本书的标题、作者和页数字典。",[56,3603,3604],{},"添加分类键，再修改页数。",[10,3606,196],{},[14,3608,199],{"id":199},[10,3610,3611],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,3613,206],{},{"title":79,"searchDepth":92,"depth":92,"links":3615},[3616,3617,3618,3619,3620,3621,3622,3623],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3464,"description":3469},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[217,3631,3303],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3634,"title":3635,"body":3636,"category":217,"cover":218,"description":3640,"extension":219,"meta":3789,"navigation":107,"path":3790,"pinned":222,"publishedAt":223,"seo":3791,"slug":3792,"stem":3793,"summary":3794,"tags":3795,"updatedAt":223,"visible":107,"__hash__":3797},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3637,"toc":3779},[3638,3641,3643,3646,3648,3654,3657,3659,3678,3680,3682,3716,3718,3724,3726,3728,3743,3745,3757,3759,3770,3772,3774,3777],[10,3639,3640],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3642,16],{"id":16},[10,3644,3645],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3647,22],{"id":22},[10,3649,3650],{},[26,3651],{"alt":3652,"src":3653},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3655,3656],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3658,51],{"id":51},[53,3660,3661,3664,3667],{},[56,3662,3663],{},"集合中的元素不重复。",[56,3665,3666],{},"集合是无序容器，不要依赖打印顺序或索引。",[56,3668,3669,3670,3673,3674,3677],{},"创建空集合必须写 ",[33,3671,3672],{},"set()","；",[33,3675,3676],{},"{}"," 创建的是空字典。",[14,3679,69],{"id":69},[10,3681,72],{},[74,3683,3685],{"className":76,"code":3684,"language":78,"meta":79,"style":79},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3686,3687,3692,3697,3701,3706,3711],{"__ignoreMap":79},[83,3688,3689],{"class":85,"line":86},[83,3690,3691],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[83,3693,3694],{"class":85,"line":92},[83,3695,3696],{},"right = {\"Python\", \"Docker\"}\n",[83,3698,3699],{"class":85,"line":98},[83,3700,108],{"emptyLinePlaceholder":107},[83,3702,3703],{"class":85,"line":104},[83,3704,3705],{},"print(left & right)\n",[83,3707,3708],{"class":85,"line":111},[83,3709,3710],{},"print(left | right)\n",[83,3712,3713],{"class":85,"line":117},[83,3714,3715],{},"print(\"Git\" in left)\n",[10,3717,123],{},[74,3719,3722],{"className":3720,"code":3721,"language":129,"meta":79},[127],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3723,3721],{"__ignoreMap":79},[10,3725,134],{},[14,3727,137],{"id":137},[139,3729,3730,3733],{},[56,3731,3732],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[56,3734,3735,3738,3739,3742],{},[33,3736,3737],{},"&"," 计算交集，",[33,3740,3741],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3744,163],{"id":163},[53,3746,3747,3754],{},[56,3748,2330,3749,3751,3752,354],{},[33,3750,3676],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3753,3672],{},[56,3755,3756],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3758,178],{"id":178},[139,3760,3761,3767],{},[56,3762,3763,3764,3766],{},"把包含重复标签的列表交给 ",[33,3765,3672],{}," 去重。",[56,3768,3769],{},"计算两组课程标签的交集和差集。",[10,3771,196],{},[14,3773,199],{"id":199},[10,3775,3776],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,3778,206],{},{"title":79,"searchDepth":92,"depth":92,"links":3780},[3781,3782,3783,3784,3785,3786,3787,3788],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3635,"description":3640},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[217,3796,3303],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3799,"title":3800,"body":3801,"category":217,"cover":218,"description":3805,"extension":219,"meta":4003,"navigation":107,"path":4004,"pinned":222,"publishedAt":223,"seo":4005,"slug":4006,"stem":4007,"summary":4008,"tags":4009,"updatedAt":223,"visible":107,"__hash__":4012},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3802,"toc":3991},[3803,3806,3808,3811,3813,3819,3829,3831,3848,3850,3852,3902,3904,3910,3912,3914,3936,3938,3941,3947,3950,3952,3965,3967,3982,3984,3986,3989],[10,3804,3805],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3807,16],{"id":16},[10,3809,3810],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3812,22],{"id":22},[10,3814,3815],{},[26,3816],{"alt":3817,"src":3818},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3820,3821,3824,3825,3828],{},[33,3822,3823],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3826,3827],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3830,51],{"id":51},[53,3832,3833,3842,3845],{},[56,3834,3835,3837,3838,3841],{},[33,3836,2799],{}," 比较内容是否相等，",[33,3839,3840],{},"is"," 比较是否为同一个对象。",[56,3843,3844],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[56,3846,3847],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3849,69],{"id":69},[10,3851,72],{},[74,3853,3855],{"className":76,"code":3854,"language":78,"meta":79,"style":79},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3856,3857,3862,3867,3872,3876,3881,3886,3891,3896],{"__ignoreMap":79},[83,3858,3859],{"class":85,"line":86},[83,3860,3861],{},"tasks = [\"变量\", \"字符串\"]\n",[83,3863,3864],{"class":85,"line":92},[83,3865,3866],{},"shared = tasks\n",[83,3868,3869],{"class":85,"line":98},[83,3870,3871],{},"backup = tasks.copy()\n",[83,3873,3874],{"class":85,"line":104},[83,3875,108],{"emptyLinePlaceholder":107},[83,3877,3878],{"class":85,"line":111},[83,3879,3880],{},"tasks.append(\"列表\")\n",[83,3882,3883],{"class":85,"line":117},[83,3884,3885],{},"print(shared)\n",[83,3887,3888],{"class":85,"line":2479},[83,3889,3890],{},"print(backup)\n",[83,3892,3893],{"class":85,"line":2485},[83,3894,3895],{},"print(tasks is shared)\n",[83,3897,3899],{"class":85,"line":3898},9,[83,3900,3901],{},"print(tasks is backup)\n",[10,3903,123],{},[74,3905,3908],{"className":3906,"code":3907,"language":129,"meta":79},[127],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3909,3907],{"__ignoreMap":79},[10,3911,134],{},[14,3913,137],{"id":137},[139,3915,3916,3922],{},[56,3917,3918,3921],{},[33,3919,3920],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[56,3923,3924,3927,3928,3931,3932,3935],{},[33,3925,3926],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3929,3930],{},"shared"," 能观察到变化，",[33,3933,3934],{},"backup"," 不会。",[320,3937,2689],{"id":2689},[10,3939,3940],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3942,3943],{},[26,3944],{"alt":3945,"src":3946},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3948,3949],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3951,163],{"id":163},[53,3953,3954,3962],{},[56,3955,3956,3957,3959,3960,354],{},"用 ",[33,3958,2799],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,3961,3840],{},[56,3963,3964],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3966,178],{"id":178},[139,3968,3969,3972],{},[56,3970,3971],{},"让两个变量引用同一个字典并修改其中一个。",[56,3973,2330,3974,3977,3978,1149,3980,354],{},[33,3975,3976],{},"copy()"," 创建外层副本，再比较 ",[33,3979,3840],{},[33,3981,2799],{},[10,3983,196],{},[14,3985,199],{"id":199},[10,3987,3988],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,3990,206],{},{"title":79,"searchDepth":92,"depth":92,"links":3992},[3993,3994,3995,3996,3997,4000,4001,4002],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":3998},[3999],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3800,"description":3805},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[217,4010,4011],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4014,"title":4015,"body":4016,"category":217,"cover":218,"description":4020,"extension":219,"meta":4233,"navigation":107,"path":4234,"pinned":222,"publishedAt":223,"seo":4235,"slug":4236,"stem":4237,"summary":4238,"tags":4239,"updatedAt":223,"visible":107,"__hash__":4241},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4017,"toc":4220},[4018,4021,4023,4026,4028,4034,4044,4046,4057,4059,4061,4114,4116,4122,4124,4126,4144,4146,4149,4155,4163,4166,4169,4175,4181,4183,4201,4203,4211,4213,4215,4218],[10,4019,4020],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4022,16],{"id":16},[10,4024,4025],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4027,22],{"id":22},[10,4029,4030],{},[26,4031],{"alt":4032,"src":4033},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4035,4036,2248,4038,2248,4041,4043],{},[33,4037,1148],{},[33,4039,4040],{},"elif",[33,4042,1152],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4045,51],{"id":51},[53,4047,4048,4051,4054],{},[56,4049,4050],{},"冒号表示接下来开始一个代码块。",[56,4052,4053],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[56,4055,4056],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4058,69],{"id":69},[10,4060,72],{},[74,4062,4064],{"className":76,"code":4063,"language":78,"meta":79,"style":79},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4065,4066,4071,4075,4080,4085,4090,4095,4099,4104,4108],{"__ignoreMap":79},[83,4067,4068],{"class":85,"line":86},[83,4069,4070],{},"score = int(input(\"请输入分数：\"))\n",[83,4072,4073],{"class":85,"line":92},[83,4074,108],{"emptyLinePlaceholder":107},[83,4076,4077],{"class":85,"line":98},[83,4078,4079],{},"if score >= 90:\n",[83,4081,4082],{"class":85,"line":104},[83,4083,4084],{},"    level = \"优秀\"\n",[83,4086,4087],{"class":85,"line":111},[83,4088,4089],{},"elif score >= 60:\n",[83,4091,4092],{"class":85,"line":117},[83,4093,4094],{},"    level = \"合格\"\n",[83,4096,4097],{"class":85,"line":2479},[83,4098,1138],{},[83,4100,4101],{"class":85,"line":2485},[83,4102,4103],{},"    level = \"需要继续学习\"\n",[83,4105,4106],{"class":85,"line":3898},[83,4107,108],{"emptyLinePlaceholder":107},[83,4109,4111],{"class":85,"line":4110},10,[83,4112,4113],{},"print(level)\n",[10,4115,123],{},[74,4117,4120],{"className":4118,"code":4119,"language":129,"meta":79},[127],"输入 85 时输出：合格\n",[33,4121,4119],{"__ignoreMap":79},[10,4123,134],{},[14,4125,137],{"id":137},[139,4127,4128,4135],{},[56,4129,4130,4131,4134],{},"输入先转换为整数，程序从 ",[33,4132,4133],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[56,4136,4137,4140,4141,4143],{},[33,4138,4139],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4142,1152],{}," 被跳过；最终三个分支只会选择一个。",[320,4145,2689],{"id":2689},[10,4147,4148],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4150,4151],{},[26,4152],{"alt":4153,"src":4154},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4156,4157,4159,4160,4162],{},[33,4158,4133],{}," 必须放在 ",[33,4161,4139],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[320,4164,2689],{"id":4165},"再看一个具体细节-1",[10,4167,4168],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4170,4171],{},[26,4172],{"alt":4173,"src":4174},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4176,4177,4178,4180],{},"同一缩进层级属于同一个代码块；回到 ",[33,4179,1148],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4182,163],{"id":163},[53,4184,4185,4191],{},[56,4186,4187,4188,4190],{},"先写 ",[33,4189,4139],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[56,4192,4193,4194,4196,4197,4200],{},"混用多个独立 ",[33,4195,1148],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4198,4199],{},"if\u002Felif\u002Felse"," 链。",[14,4202,178],{"id":178},[139,4204,4205,4208],{},[56,4206,4207],{},"根据温度输出“冷、适中、热”三个等级。",[56,4209,4210],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4212,196],{},[14,4214,199],{"id":199},[10,4216,4217],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,4219,206],{},{"title":79,"searchDepth":92,"depth":92,"links":4221},[4222,4223,4224,4225,4226,4230,4231,4232],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":4227},[4228,4229],{"id":2689,"depth":98,"text":2689},{"id":4165,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4015,"description":4020},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[217,1148,4240],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4243,"title":4244,"body":4245,"category":217,"cover":218,"description":4249,"extension":219,"meta":4415,"navigation":107,"path":4416,"pinned":222,"publishedAt":223,"seo":4417,"slug":4418,"stem":4419,"summary":4420,"tags":4421,"updatedAt":223,"visible":107,"__hash__":4423},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4246,"toc":4403},[4247,4250,4252,4255,4257,4263,4269,4271,4286,4288,4290,4328,4330,4336,4338,4340,4355,4357,4360,4366,4372,4374,4382,4384,4394,4396,4398,4401],[10,4248,4249],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4251,16],{"id":16},[10,4253,4254],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4256,22],{"id":22},[10,4258,4259],{},[26,4260],{"alt":4261,"src":4262},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4264,4265,4268],{},[33,4266,4267],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4270,51],{"id":51},[53,4272,4273,4276,4279],{},[56,4274,4275],{},"进入循环前先准备参与条件判断的状态。",[56,4277,4278],{},"循环体中必须有机会让条件变为假。",[56,4280,4281,4282,4285],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4283,4284],{},"for"," 通常更直接。",[14,4287,69],{"id":69},[10,4289,72],{},[74,4291,4293],{"className":76,"code":4292,"language":78,"meta":79,"style":79},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4294,4295,4300,4304,4309,4314,4319,4323],{"__ignoreMap":79},[83,4296,4297],{"class":85,"line":86},[83,4298,4299],{},"count = 1\n",[83,4301,4302],{"class":85,"line":92},[83,4303,108],{"emptyLinePlaceholder":107},[83,4305,4306],{"class":85,"line":98},[83,4307,4308],{},"while count \u003C= 3:\n",[83,4310,4311],{"class":85,"line":104},[83,4312,4313],{},"    print(\"第\", count, \"次练习\")\n",[83,4315,4316],{"class":85,"line":111},[83,4317,4318],{},"    count = count + 1\n",[83,4320,4321],{"class":85,"line":117},[83,4322,108],{"emptyLinePlaceholder":107},[83,4324,4325],{"class":85,"line":2479},[83,4326,4327],{},"print(\"练习结束\")\n",[10,4329,123],{},[74,4331,4334],{"className":4332,"code":4333,"language":129,"meta":79},[127],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4335,4333],{"__ignoreMap":79},[10,4337,134],{},[14,4339,137],{"id":137},[139,4341,4342,4349],{},[56,4343,4344,4345,4348],{},"进入循环前 ",[33,4346,4347],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[56,4350,4351,4352,4354],{},"循环体末尾把 ",[33,4353,4347],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[320,4356,2689],{"id":2689},[10,4358,4359],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4361,4362],{},[26,4363],{"alt":4364,"src":4365},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4367,4368,4369,4371],{},"第4次检查时 ",[33,4370,4347],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4373,163],{"id":163},[53,4375,4376,4379],{},[56,4377,4378],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[56,4380,4381],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4383,178],{"id":178},[139,4385,4386,4391],{},[56,4387,2330,4388,4390],{},[33,4389,4267],{}," 输出 1 到 5。",[56,4392,4393],{},"计算 1 到 10 的累加和。",[10,4395,196],{},[14,4397,199],{"id":199},[10,4399,4400],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,4402,206],{},{"title":79,"searchDepth":92,"depth":92,"links":4404},[4405,4406,4407,4408,4409,4412,4413,4414],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":4410},[4411],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4244,"description":4249},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[217,4267,4422],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4425,"title":4426,"body":4427,"category":217,"cover":218,"description":4431,"extension":219,"meta":4579,"navigation":107,"path":4580,"pinned":222,"publishedAt":223,"seo":4581,"slug":4582,"stem":4583,"summary":4584,"tags":4585,"updatedAt":223,"visible":107,"__hash__":4587},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4428,"toc":4569},[4429,4432,4434,4437,4439,4445,4450,4452,4466,4468,4470,4508,4510,4516,4518,4520,4537,4539,4547,4549,4560,4562,4564,4567],[10,4430,4431],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4433,16],{"id":16},[10,4435,4436],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4438,22],{"id":22},[10,4440,4441],{},[26,4442],{"alt":4443,"src":4444},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4446,4447,4449],{},[33,4448,4284],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4451,51],{"id":51},[53,4453,4454,4460,4463],{},[56,4455,4456,4459],{},[33,4457,4458],{},"range(1, 4)"," 包含 1，不包含 4。",[56,4461,4462],{},"只需要元素时直接遍历元素，不必手工维护索引。",[56,4464,4465],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4467,69],{"id":69},[10,4469,72],{},[74,4471,4473],{"className":76,"code":4472,"language":78,"meta":79,"style":79},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4474,4475,4480,4484,4489,4494,4498,4503],{"__ignoreMap":79},[83,4476,4477],{"class":85,"line":86},[83,4478,4479],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[83,4481,4482],{"class":85,"line":92},[83,4483,108],{"emptyLinePlaceholder":107},[83,4485,4486],{"class":85,"line":98},[83,4487,4488],{},"for course in courses:\n",[83,4490,4491],{"class":85,"line":104},[83,4492,4493],{},"    print(course)\n",[83,4495,4496],{"class":85,"line":111},[83,4497,108],{"emptyLinePlaceholder":107},[83,4499,4500],{"class":85,"line":117},[83,4501,4502],{},"for number in range(1, 4):\n",[83,4504,4505],{"class":85,"line":2479},[83,4506,4507],{},"    print(number)\n",[10,4509,123],{},[74,4511,4514],{"className":4512,"code":4513,"language":129,"meta":79},[127],"变量\n字符串\n列表\n1\n2\n3\n",[33,4515,4513],{"__ignoreMap":79},[10,4517,134],{},[14,4519,137],{"id":137},[139,4521,4522,4532],{},[56,4523,4524,4525,4527,4528,4531],{},"第一个 ",[33,4526,4284],{}," 依次从列表取得字符串，循环变量 ",[33,4529,4530],{},"course"," 每轮重新绑定。",[56,4533,4534,4536],{},[33,4535,4458],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4538,163],{"id":163},[53,4540,4541,4544],{},[56,4542,4543],{},"只需要元素却手工维护索引，增加越界风险。",[56,4545,4546],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4548,178],{"id":178},[139,4550,4551,4554],{},[56,4552,4553],{},"逐项输出一个字符串中的字符。",[56,4555,2330,4556,4559],{},[33,4557,4558],{},"range()"," 输出 2、4、6、8。",[10,4561,196],{},[14,4563,199],{"id":199},[10,4565,4566],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,4568,206],{},{"title":79,"searchDepth":92,"depth":92,"links":4570},[4571,4572,4573,4574,4575,4576,4577,4578],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4426,"description":4431},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[217,4284,4586],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4589,"title":4590,"body":4591,"category":217,"cover":218,"description":4595,"extension":219,"meta":4769,"navigation":107,"path":4770,"pinned":222,"publishedAt":223,"seo":4771,"slug":4772,"stem":4773,"summary":4774,"tags":4775,"updatedAt":223,"visible":107,"__hash__":4776},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4592,"toc":4759},[4593,4596,4598,4601,4603,4609,4619,4621,4640,4642,4644,4696,4698,4704,4706,4708,4722,4724,4740,4742,4750,4752,4754,4757],[10,4594,4595],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4597,16],{"id":16},[10,4599,4600],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4602,22],{"id":22},[10,4604,4605],{},[26,4606],{"alt":4607,"src":4608},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4610,4611,4614,4615,4618],{},[33,4612,4613],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4616,4617],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4620,51],{"id":51},[53,4622,4623,4626,4634],{},[56,4624,4625],{},"先写普通循环，再在确有需要时加入流程控制语句。",[56,4627,4628,4630,4631,4633],{},[33,4629,4613],{}," 前要确认不会跳过 ",[33,4632,4267],{}," 循环中的状态更新。",[56,4635,4636,4637,4639],{},"多层嵌套中 ",[33,4638,4617],{}," 只结束它所在的最内层循环。",[14,4641,69],{"id":69},[10,4643,72],{},[74,4645,4647],{"className":76,"code":4646,"language":78,"meta":79,"style":79},"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",[33,4648,4649,4654,4658,4663,4668,4673,4678,4683,4687,4691],{"__ignoreMap":79},[83,4650,4651],{"class":85,"line":86},[83,4652,4653],{},"numbers = [3, -1, 0, 8, 12]\n",[83,4655,4656],{"class":85,"line":92},[83,4657,108],{"emptyLinePlaceholder":107},[83,4659,4660],{"class":85,"line":98},[83,4661,4662],{},"for number in numbers:\n",[83,4664,4665],{"class":85,"line":104},[83,4666,4667],{},"    if number \u003C 0:\n",[83,4669,4670],{"class":85,"line":111},[83,4671,4672],{},"        continue\n",[83,4674,4675],{"class":85,"line":117},[83,4676,4677],{},"    if number == 0:\n",[83,4679,4680],{"class":85,"line":2479},[83,4681,4682],{},"        break\n",[83,4684,4685],{"class":85,"line":2485},[83,4686,4507],{},[83,4688,4689],{"class":85,"line":3898},[83,4690,108],{"emptyLinePlaceholder":107},[83,4692,4693],{"class":85,"line":4110},[83,4694,4695],{},"print(\"循环结束\")\n",[10,4697,123],{},[74,4699,4702],{"className":4700,"code":4701,"language":129,"meta":79},[127],"3\n循环结束\n",[33,4703,4701],{"__ignoreMap":79},[10,4705,134],{},[14,4707,137],{"id":137},[139,4709,4710,4716],{},[56,4711,4712,4713,4715],{},"遇到 -1 时 ",[33,4714,4613],{}," 立即结束本轮，后面的判断和输出都不执行。",[56,4717,4718,4719,4721],{},"遇到 0 时 ",[33,4720,4617],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4723,163],{"id":163},[53,4725,4726,4731],{},[56,4727,3412,4728,4730],{},[33,4729,4613],{}," 当作结束循环，实际它只跳到下一轮。",[56,4732,4733,4734,4736,4737,4739],{},"在 ",[33,4735,4267],{}," 中把状态更新放在可能被 ",[33,4738,4613],{}," 跳过的位置，造成无限循环。",[14,4741,178],{"id":178},[139,4743,4744,4747],{},[56,4745,4746],{},"跳过列表中的空字符串并输出其他内容。",[56,4748,4749],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4751,196],{},[14,4753,199],{"id":199},[10,4755,4756],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,4758,206],{},{"title":79,"searchDepth":92,"depth":92,"links":4760},[4761,4762,4763,4764,4765,4766,4767,4768],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4590,"description":4595},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[217,4617,4613],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4778,"title":4779,"body":4780,"category":217,"cover":218,"description":4784,"extension":219,"meta":4955,"navigation":107,"path":4956,"pinned":222,"publishedAt":223,"seo":4957,"slug":4958,"stem":4959,"summary":4960,"tags":4961,"updatedAt":223,"visible":107,"__hash__":4964},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4781,"toc":4943},[4782,4785,4787,4790,4792,4798,4801,4803,4827,4829,4831,4865,4867,4873,4875,4877,4894,4896,4899,4905,4908,4910,4924,4926,4934,4936,4938,4941],[10,4783,4784],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4786,16],{"id":16},[10,4788,4789],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4791,22],{"id":22},[10,4793,4794],{},[26,4795],{"alt":4796,"src":4797},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4799,4800],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4802,51],{"id":51},[53,4804,4805,4808,4811],{},[56,4806,4807],{},"每增加一层嵌套，阅读成本都会上升。",[56,4809,4810],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[56,4812,4813,4814,2248,4817,4820,4821,2248,4824,354],{},"变量名使用 ",[33,4815,4816],{},"row",[33,4818,4819],{},"cell"," 等层级含义，避免全部写成 ",[33,4822,4823],{},"i",[33,4825,4826],{},"j",[14,4828,69],{"id":69},[10,4830,72],{},[74,4832,4834],{"className":76,"code":4833,"language":78,"meta":79,"style":79},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4835,4836,4841,4845,4850,4855,4860],{"__ignoreMap":79},[83,4837,4838],{"class":85,"line":86},[83,4839,4840],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[83,4842,4843],{"class":85,"line":92},[83,4844,108],{"emptyLinePlaceholder":107},[83,4846,4847],{"class":85,"line":98},[83,4848,4849],{},"for row in table:\n",[83,4851,4852],{"class":85,"line":104},[83,4853,4854],{},"    for cell in row:\n",[83,4856,4857],{"class":85,"line":111},[83,4858,4859],{},"        print(cell)\n",[83,4861,4862],{"class":85,"line":117},[83,4863,4864],{},"    print(\"一行结束\")\n",[10,4866,123],{},[74,4868,4871],{"className":4869,"code":4870,"language":129,"meta":79},[127],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4872,4870],{"__ignoreMap":79},[10,4874,134],{},[14,4876,137],{"id":137},[139,4878,4879,4891],{},[56,4880,4881,4882,4884,4885,1149,4888,354],{},"外层变量 ",[33,4883,4816],{}," 先引用第一行列表，内层才依次处理 ",[33,4886,4887],{},"A1",[33,4889,4890],{},"A2",[56,4892,4893],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[320,4895,2689],{"id":2689},[10,4897,4898],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4900,4901],{},[26,4902],{"alt":4903,"src":4904},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4906,4907],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4909,163],{"id":163},[53,4911,4912,4921],{},[56,4913,4914,4915,1001,4918,4920],{},"把两层循环变量都叫 ",[33,4916,4917],{},"item",[33,4919,4823],{},"，难以确认当前层级。",[56,4922,4923],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4925,178],{"id":178},[139,4927,4928,4931],{},[56,4929,4930],{},"打印一个 2×3 数字表。",[56,4932,4933],{},"在内层增加条件，只输出大于 3 的元素。",[10,4935,196],{},[14,4937,199],{"id":199},[10,4939,4940],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,4942,206],{},{"title":79,"searchDepth":92,"depth":92,"links":4944},[4945,4946,4947,4948,4949,4952,4953,4954],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":4950},[4951],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4779,"description":4784},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[217,4962,4963],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4966,"title":4967,"body":4968,"category":217,"cover":218,"description":4972,"extension":219,"meta":5110,"navigation":107,"path":5111,"pinned":222,"publishedAt":223,"seo":5112,"slug":5113,"stem":5114,"summary":5115,"tags":5116,"updatedAt":223,"visible":107,"__hash__":5119},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4969,"toc":5100},[4970,4973,4975,4978,4980,4986,4989,4991,5002,5004,5006,5044,5046,5052,5054,5056,5068,5070,5081,5083,5091,5093,5095,5098],[10,4971,4972],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4974,16],{"id":16},[10,4976,4977],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4979,22],{"id":22},[10,4981,4982],{},[26,4983],{"alt":4984,"src":4985},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4987,4988],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4990,51],{"id":51},[53,4992,4993,4996,4999],{},[56,4994,4995],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[56,4997,4998],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[56,5000,5001],{},"推导式创建新列表，不修改输入列表。",[14,5003,69],{"id":69},[10,5005,72],{},[74,5007,5009],{"className":76,"code":5008,"language":78,"meta":79,"style":79},"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",[33,5010,5011,5016,5020,5025,5030,5034,5039],{"__ignoreMap":79},[83,5012,5013],{"class":85,"line":86},[83,5014,5015],{},"numbers = [1, 2, 3, 4, 5]\n",[83,5017,5018],{"class":85,"line":92},[83,5019,108],{"emptyLinePlaceholder":107},[83,5021,5022],{"class":85,"line":98},[83,5023,5024],{},"squares = [number * number for number in numbers]\n",[83,5026,5027],{"class":85,"line":104},[83,5028,5029],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[83,5031,5032],{"class":85,"line":111},[83,5033,108],{"emptyLinePlaceholder":107},[83,5035,5036],{"class":85,"line":117},[83,5037,5038],{},"print(squares)\n",[83,5040,5041],{"class":85,"line":2479},[83,5042,5043],{},"print(even_squares)\n",[10,5045,123],{},[74,5047,5050],{"className":5048,"code":5049,"language":129,"meta":79},[127],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5051,5049],{"__ignoreMap":79},[10,5053,134],{},[14,5055,137],{"id":137},[139,5057,5058,5061],{},[56,5059,5060],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[56,5062,5063,5064,5067],{},"第二条先用 ",[33,5065,5066],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5069,163],{"id":163},[53,5071,5072,5078],{},[56,5073,5074,5075,5077],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5076,4284],{}," 开始找输入。",[56,5079,5080],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5082,178],{"id":178},[139,5084,5085,5088],{},[56,5086,5087],{},"把字符串列表转换为长度列表。",[56,5089,5090],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5092,196],{},[14,5094,199],{"id":199},[10,5096,5097],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,5099,206],{},{"title":79,"searchDepth":92,"depth":92,"links":5101},[5102,5103,5104,5105,5106,5107,5108,5109],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4967,"description":4972},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[217,5117,5118],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5121,"title":5122,"body":5123,"category":217,"cover":218,"description":5127,"extension":219,"meta":5270,"navigation":107,"path":5271,"pinned":222,"publishedAt":223,"seo":5272,"slug":5273,"stem":5274,"summary":5275,"tags":5276,"updatedAt":223,"visible":107,"__hash__":5279},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5124,"toc":5260},[5125,5128,5130,5133,5135,5141,5144,5146,5157,5159,5161,5200,5202,5208,5210,5212,5227,5229,5237,5239,5251,5253,5255,5258],[10,5126,5127],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5129,16],{"id":16},[10,5131,5132],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5134,22],{"id":22},[10,5136,5137],{},[26,5138],{"alt":5139,"src":5140},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5142,5143],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5145,51],{"id":51},[53,5147,5148,5151,5154],{},[56,5149,5150],{},"函数名描述动作，使用小写字母和下划线。",[56,5152,5153],{},"函数定义要先执行，之后才能调用。",[56,5155,5156],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5158,69],{"id":69},[10,5160,72],{},[74,5162,5164],{"className":76,"code":5163,"language":78,"meta":79,"style":79},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5165,5166,5171,5176,5181,5185,5190,5195],{"__ignoreMap":79},[83,5167,5168],{"class":85,"line":86},[83,5169,5170],{},"def show_progress():\n",[83,5172,5173],{"class":85,"line":92},[83,5174,5175],{},"    print(\"正在学习函数\")\n",[83,5177,5178],{"class":85,"line":98},[83,5179,5180],{},"    print(\"本节完成 50%\")\n",[83,5182,5183],{"class":85,"line":104},[83,5184,108],{"emptyLinePlaceholder":107},[83,5186,5187],{"class":85,"line":111},[83,5188,5189],{},"print(\"调用前\")\n",[83,5191,5192],{"class":85,"line":117},[83,5193,5194],{},"show_progress()\n",[83,5196,5197],{"class":85,"line":2479},[83,5198,5199],{},"print(\"调用后\")\n",[10,5201,123],{},[74,5203,5206],{"className":5204,"code":5205,"language":129,"meta":79},[127],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5207,5205],{"__ignoreMap":79},[10,5209,134],{},[14,5211,137],{"id":137},[139,5213,5214,5220],{},[56,5215,930,5216,5219],{},[33,5217,5218],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[56,5221,5222,5223,5226],{},"运行到 ",[33,5224,5225],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5228,163],{"id":163},[53,5230,5231,5234],{},[56,5232,5233],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[56,5235,5236],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5238,178],{"id":178},[139,5240,5241,5248],{},[56,5242,5243,5244,5247],{},"定义 ",[33,5245,5246],{},"show_plan()"," 输出两行学习计划。",[56,5249,5250],{},"连续调用同一个函数两次，观察执行顺序。",[10,5252,196],{},[14,5254,199],{"id":199},[10,5256,5257],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,5259,206],{},{"title":79,"searchDepth":92,"depth":92,"links":5261},[5262,5263,5264,5265,5266,5267,5268,5269],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5122,"description":5127},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[217,5277,5278],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5281,"title":5282,"body":5283,"category":217,"cover":218,"description":5287,"extension":219,"meta":5467,"navigation":107,"path":5468,"pinned":222,"publishedAt":223,"seo":5469,"slug":5470,"stem":5471,"summary":5472,"tags":5473,"updatedAt":223,"visible":107,"__hash__":5476},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5284,"toc":5455},[5285,5288,5290,5293,5295,5301,5308,5310,5327,5329,5331,5365,5367,5373,5375,5377,5398,5400,5403,5409,5419,5421,5436,5438,5446,5448,5450,5453],[10,5286,5287],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5289,16],{"id":16},[10,5291,5292],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5294,22],{"id":22},[10,5296,5297],{},[26,5298],{"alt":5299,"src":5300},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5302,5303,5304,5307],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5305,5306],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5309,51],{"id":51},[53,5311,5312,5315,5318],{},[56,5313,5314],{},"形参出现在函数定义中，实参出现在函数调用中。",[56,5316,5317],{},"局部变量默认只在函数内部可见。",[56,5319,5320,5321,5323,5324,354],{},"没有显式 ",[33,5322,5306],{}," 的函数会返回 ",[33,5325,5326],{},"None",[14,5328,69],{"id":69},[10,5330,72],{},[74,5332,5334],{"className":76,"code":5333,"language":78,"meta":79,"style":79},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5335,5336,5341,5346,5351,5355,5360],{"__ignoreMap":79},[83,5337,5338],{"class":85,"line":86},[83,5339,5340],{},"def calculate_total(price, count):\n",[83,5342,5343],{"class":85,"line":92},[83,5344,5345],{},"    total = price * count\n",[83,5347,5348],{"class":85,"line":98},[83,5349,5350],{},"    return total\n",[83,5352,5353],{"class":85,"line":104},[83,5354,108],{"emptyLinePlaceholder":107},[83,5356,5357],{"class":85,"line":111},[83,5358,5359],{},"result = calculate_total(25, 4)\n",[83,5361,5362],{"class":85,"line":117},[83,5363,5364],{},"print(result)\n",[10,5366,123],{},[74,5368,5371],{"className":5369,"code":5370,"language":129,"meta":79},[127],"100\n",[33,5372,5370],{"__ignoreMap":79},[10,5374,134],{},[14,5376,137],{"id":137},[139,5378,5379,5388],{},[56,5380,5381,5382,2248,5385,5387],{},"调用时 25 和 4 分别绑定到 ",[33,5383,5384],{},"price",[33,5386,4347],{},"，它们只在本次函数调用的局部范围中使用。",[56,5389,5390,5393,5394,5397],{},[33,5391,5392],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5395,5396],{},"result"," 并输出。",[320,5399,2689],{"id":2689},[10,5401,5402],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5404,5405],{},[26,5406],{"alt":5407,"src":5408},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5410,5411,2248,5413,1149,5415,5418],{},[33,5412,5384],{},[33,5414,4347],{},[33,5416,5417],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5420,163],{"id":163},[53,5422,5423,5430],{},[56,5424,5425,5426,5429],{},"在函数内部只 ",[33,5427,5428],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[56,5431,5432,5433,5435],{},"试图在函数外直接访问局部变量 ",[33,5434,5417],{},"，它的名字只在调用期间的局部作用域存在。",[14,5437,178],{"id":178},[139,5439,5440,5443],{},[56,5441,5442],{},"编写计算长方形面积的函数。",[56,5444,5445],{},"让函数返回结果后在调用方加上单位再输出。",[10,5447,196],{},[14,5449,199],{"id":199},[10,5451,5452],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,5454,206],{},{"title":79,"searchDepth":92,"depth":92,"links":5456},[5457,5458,5459,5460,5461,5464,5465,5466],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":5462},[5463],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5282,"description":5287},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[217,5474,5475],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5478,"title":5479,"body":5480,"category":217,"cover":218,"description":5484,"extension":219,"meta":5664,"navigation":107,"path":5665,"pinned":222,"publishedAt":223,"seo":5666,"slug":5667,"stem":5668,"summary":5669,"tags":5670,"updatedAt":223,"visible":107,"__hash__":5673},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5481,"toc":5652},[5482,5485,5487,5490,5492,5498,5501,5503,5520,5522,5524,5576,5578,5584,5586,5588,5606,5608,5611,5617,5620,5622,5633,5635,5643,5645,5647,5650],[10,5483,5484],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5486,16],{"id":16},[10,5488,5489],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5491,22],{"id":22},[10,5493,5494],{},[26,5495],{"alt":5496,"src":5497},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5499,5500],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5502,51],{"id":51},[53,5504,5505,5508,5514],{},[56,5506,5507],{},"必需参数应放在有默认值的参数之前。",[56,5509,5510,5513],{},[33,5511,5512],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[56,5515,5516,5519],{},[33,5517,5518],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5521,69],{"id":69},[10,5523,72],{},[74,5525,5527],{"className":76,"code":5526,"language":78,"meta":79,"style":79},"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",[33,5528,5529,5534,5539,5543,5548,5553,5557,5562,5567,5571],{"__ignoreMap":79},[83,5530,5531],{"class":85,"line":86},[83,5532,5533],{},"def build_title(name, level=\"基础\"):\n",[83,5535,5536],{"class":85,"line":92},[83,5537,5538],{},"    return name + \"｜\" + level\n",[83,5540,5541],{"class":85,"line":98},[83,5542,108],{"emptyLinePlaceholder":107},[83,5544,5545],{"class":85,"line":104},[83,5546,5547],{},"print(build_title(\"Python\"))\n",[83,5549,5550],{"class":85,"line":111},[83,5551,5552],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[83,5554,5555],{"class":85,"line":117},[83,5556,108],{"emptyLinePlaceholder":107},[83,5558,5559],{"class":85,"line":2479},[83,5560,5561],{},"def total(*numbers):\n",[83,5563,5564],{"class":85,"line":2485},[83,5565,5566],{},"    return sum(numbers)\n",[83,5568,5569],{"class":85,"line":3898},[83,5570,108],{"emptyLinePlaceholder":107},[83,5572,5573],{"class":85,"line":4110},[83,5574,5575],{},"print(total(10, 20, 30))\n",[10,5577,123],{},[74,5579,5582],{"className":5580,"code":5581,"language":129,"meta":79},[127],"Python｜基础\n异常处理｜进阶\n60\n",[33,5583,5581],{"__ignoreMap":79},[10,5585,134],{},[14,5587,137],{"id":137},[139,5589,5590,5597],{},[56,5591,5592,5593,5596],{},"第一次调用只提供必需参数，",[33,5594,5595],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[56,5598,5599,5602,5603,354],{},[33,5600,5601],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5604,5605],{},"sum()",[320,5607,2689],{"id":2689},[10,5609,5610],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5612,5613],{},[26,5614],{"alt":5615,"src":5616},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5618,5619],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5621,163],{"id":163},[53,5623,5624,5630],{},[56,5625,5626,5627,5629],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5628,5326],{}," 再在函数内创建。",[56,5631,5632],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5634,178],{"id":178},[139,5636,5637,5640],{},[56,5638,5639],{},"给问候函数增加默认称呼。",[56,5641,5642],{},"编写接收任意数量分数并返回总分的函数。",[10,5644,196],{},[14,5646,199],{"id":199},[10,5648,5649],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,5651,206],{},{"title":79,"searchDepth":92,"depth":92,"links":5653},[5654,5655,5656,5657,5658,5661,5662,5663],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":5659},[5660],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5479,"description":5484},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[217,5671,5672],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5675,"title":5676,"body":5677,"category":217,"cover":218,"description":5681,"extension":219,"meta":5878,"navigation":107,"path":5879,"pinned":222,"publishedAt":223,"seo":5880,"slug":5881,"stem":5882,"summary":5883,"tags":5884,"updatedAt":223,"visible":107,"__hash__":5887},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5678,"toc":5866},[5679,5682,5684,5687,5689,5695,5698,5700,5717,5719,5721,5784,5786,5792,5794,5796,5823,5825,5828,5834,5837,5839,5847,5849,5857,5859,5861,5864],[10,5680,5681],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5683,16],{"id":16},[10,5685,5686],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5688,22],{"id":22},[10,5690,5691],{},[26,5692],{"alt":5693,"src":5694},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5696,5697],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5699,51],{"id":51},[53,5701,5702,5705,5708],{},[56,5703,5704],{},"函数内部赋值默认创建局部变量。",[56,5706,5707],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[56,5709,5710,2167,5713,5716],{},[33,5711,5712],{},"global",[33,5714,5715],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5718,69],{"id":69},[10,5720,72],{},[74,5722,5724],{"className":76,"code":5723,"language":78,"meta":79,"style":79},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[33,5725,5726,5731,5735,5740,5745,5749,5754,5759,5764,5768,5773,5778],{"__ignoreMap":79},[83,5727,5728],{"class":85,"line":86},[83,5729,5730],{},"course = \"Python\"\n",[83,5732,5733],{"class":85,"line":92},[83,5734,108],{"emptyLinePlaceholder":107},[83,5736,5737],{"class":85,"line":98},[83,5738,5739],{},"def outer():\n",[83,5741,5742],{"class":85,"line":104},[83,5743,5744],{},"    level = \"基础\"\n",[83,5746,5747],{"class":85,"line":111},[83,5748,108],{"emptyLinePlaceholder":107},[83,5750,5751],{"class":85,"line":117},[83,5752,5753],{},"    def show():\n",[83,5755,5756],{"class":85,"line":2479},[83,5757,5758],{},"        lesson = \"作用域\"\n",[83,5760,5761],{"class":85,"line":2485},[83,5762,5763],{},"        print(course, level, lesson)\n",[83,5765,5766],{"class":85,"line":3898},[83,5767,108],{"emptyLinePlaceholder":107},[83,5769,5770],{"class":85,"line":4110},[83,5771,5772],{},"    show()\n",[83,5774,5776],{"class":85,"line":5775},11,[83,5777,108],{"emptyLinePlaceholder":107},[83,5779,5781],{"class":85,"line":5780},12,[83,5782,5783],{},"outer()\n",[10,5785,123],{},[74,5787,5790],{"className":5788,"code":5789,"language":129,"meta":79},[127],"Python 基础 作用域\n",[33,5791,5789],{"__ignoreMap":79},[10,5793,134],{},[14,5795,137],{"id":137},[139,5797,5798,5815],{},[56,5799,5800,5803,5804,5807,5808,5810,5811,5814],{},[33,5801,5802],{},"show()"," 中查找 ",[33,5805,5806],{},"lesson"," 时先在局部找到，查找 ",[33,5809,5595],{}," 时到外层 ",[33,5812,5813],{},"outer()"," 找到。",[56,5816,5817,5819,5820,5822],{},[33,5818,4530],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5821,2199],{}," 最后在内置作用域找到。",[320,5824,2689],{"id":2689},[10,5826,5827],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5829,5830],{},[26,5831],{"alt":5832,"src":5833},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5835,5836],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5838,163],{"id":163},[53,5840,5841,5844],{},[56,5842,5843],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[56,5845,5846],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5848,178],{"id":178},[139,5850,5851,5854],{},[56,5852,5853],{},"在内外层定义同名变量，观察最近作用域优先。",[56,5855,5856],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5858,196],{},[14,5860,199],{"id":199},[10,5862,5863],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,5865,206],{},{"title":79,"searchDepth":92,"depth":92,"links":5867},[5868,5869,5870,5871,5872,5875,5876,5877],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":5873},[5874],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5676,"description":5681},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[217,5885,5886],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5889,"title":5890,"body":5891,"category":217,"cover":218,"description":5895,"extension":219,"meta":6045,"navigation":107,"path":6046,"pinned":222,"publishedAt":223,"seo":6047,"slug":6048,"stem":6049,"summary":6050,"tags":6051,"updatedAt":223,"visible":107,"__hash__":6054},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5892,"toc":6035},[5893,5896,5898,5901,5903,5909,5912,5914,5933,5935,5937,5971,5973,5979,5981,5983,5998,6000,6012,6014,6026,6028,6030,6033],[10,5894,5895],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5897,16],{"id":16},[10,5899,5900],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5902,22],{"id":22},[10,5904,5905],{},[26,5906],{"alt":5907,"src":5908},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5910,5911],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5913,51],{"id":51},[53,5915,5916,5919,5922],{},[56,5917,5918],{},"文档字符串紧跟在函数定义后的第一条语句。",[56,5920,5921],{},"注解表达接口意图，不代替输入校验和测试。",[56,5923,5924,5925,2248,5927,2248,5929,5932],{},"基础注解优先使用 ",[33,5926,2251],{},[33,5928,2416],{},[33,5930,5931],{},"list[str]"," 等直接写法。",[14,5934,69],{"id":69},[10,5936,72],{},[74,5938,5940],{"className":76,"code":5939,"language":78,"meta":79,"style":79},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[33,5941,5942,5947,5952,5957,5961,5966],{"__ignoreMap":79},[83,5943,5944],{"class":85,"line":86},[83,5945,5946],{},"def format_score(name: str, score: int) -> str:\n",[83,5948,5949],{"class":85,"line":92},[83,5950,5951],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[83,5953,5954],{"class":85,"line":98},[83,5955,5956],{},"    return name + \"：\" + str(score)\n",[83,5958,5959],{"class":85,"line":104},[83,5960,108],{"emptyLinePlaceholder":107},[83,5962,5963],{"class":85,"line":111},[83,5964,5965],{},"print(format_score(\"小郑\", 95))\n",[83,5967,5968],{"class":85,"line":117},[83,5969,5970],{},"print(format_score.__doc__)\n",[10,5972,123],{},[74,5974,5977],{"className":5975,"code":5976,"language":129,"meta":79},[127],"小郑：95\n返回带姓名的分数文本。\n",[33,5978,5976],{"__ignoreMap":79},[10,5980,134],{},[14,5982,137],{"id":137},[139,5984,5985,5995],{},[56,5986,5987,5988,5991,5992,5994],{},"函数签名说明 ",[33,5989,5990],{},"name"," 预期为字符串、",[33,5993,2237],{}," 预期为整数，返回值预期为字符串。",[56,5996,5997],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5999,163],{"id":163},[53,6001,6002,6009],{},[56,6003,6004,6005,6008],{},"认为加了 ",[33,6006,6007],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[56,6010,6011],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6013,178],{"id":178},[139,6015,6016,6019],{},[56,6017,6018],{},"为面积函数补充参数和返回值注解。",[56,6020,6021,6022,6025],{},"通过 ",[33,6023,6024],{},"函数名.__doc__"," 查看文档字符串。",[10,6027,196],{},[14,6029,199],{"id":199},[10,6031,6032],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,6034,206],{},{"title":79,"searchDepth":92,"depth":92,"links":6036},[6037,6038,6039,6040,6041,6042,6043,6044],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5890,"description":5895},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[217,6052,6053],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6056,"title":6057,"body":6058,"category":217,"cover":218,"description":6062,"extension":219,"meta":6289,"navigation":107,"path":6290,"pinned":222,"publishedAt":223,"seo":6291,"slug":6292,"stem":6293,"summary":6294,"tags":6295,"updatedAt":223,"visible":107,"__hash__":6298},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6059,"toc":6277},[6060,6063,6065,6071,6073,6079,6090,6092,6110,6112,6119,6148,6155,6174,6183,6185,6191,6193,6195,6218,6220,6223,6229,6235,6237,6253,6255,6268,6270,6272,6275],[10,6061,6062],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6064,16],{"id":16},[10,6066,6067,6068,6070],{},"本篇只处理“模块、import 与 ",[286,6069,5990],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6072,22],{"id":22},[10,6074,6075],{},[26,6076],{"alt":6077,"src":6078},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6080,6081,6082,6085,6086,6089],{},"同一个文件直接运行时 ",[33,6083,6084],{},"__name__"," 等于 ",[33,6087,6088],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6091,51],{"id":51},[53,6093,6094,6100,6103],{},[56,6095,6096,6097,6099],{},"一个 ",[33,6098,1163],{}," 文件就是一个模块。",[56,6101,6102],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[56,6104,6105,6106,6109],{},"避免使用 ",[33,6107,6108],{},"from module import *","，它会让名字来源不清楚。",[14,6111,69],{"id":69},[10,6113,6114,6115,6118],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6116,6117],{},"calculator.py","：",[74,6120,6122],{"className":76,"code":6121,"language":78,"meta":79,"style":79},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6123,6124,6129,6134,6138,6143],{"__ignoreMap":79},[83,6125,6126],{"class":85,"line":86},[83,6127,6128],{},"def add(left, right):\n",[83,6130,6131],{"class":85,"line":92},[83,6132,6133],{},"    return left + right\n",[83,6135,6136],{"class":85,"line":98},[83,6137,108],{"emptyLinePlaceholder":107},[83,6139,6140],{"class":85,"line":104},[83,6141,6142],{},"if __name__ == \"__main__\":\n",[83,6144,6145],{"class":85,"line":111},[83,6146,6147],{},"    print(add(2, 3))\n",[10,6149,6150,6151,6154],{},"再创建 ",[33,6152,6153],{},"app.py","，从模块中导入函数：",[74,6156,6158],{"className":76,"code":6157,"language":78,"meta":79,"style":79},"from calculator import add\n\nprint(add(10, 20))\n",[33,6159,6160,6165,6169],{"__ignoreMap":79},[83,6161,6162],{"class":85,"line":86},[83,6163,6164],{},"from calculator import add\n",[83,6166,6167],{"class":85,"line":92},[83,6168,108],{"emptyLinePlaceholder":107},[83,6170,6171],{"class":85,"line":98},[83,6172,6173],{},"print(add(10, 20))\n",[10,6175,6176,6177,1149,6180,354],{},"分别执行 ",[33,6178,6179],{},"python3 calculator.py",[33,6181,6182],{},"python3 app.py",[10,6184,123],{},[74,6186,6189],{"className":6187,"code":6188,"language":129,"meta":79},[127],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6190,6188],{"__ignoreMap":79},[10,6192,134],{},[14,6194,137],{"id":137},[139,6196,6197,6207],{},[56,6198,6199,6200,6202,6203,6206],{},"直接运行 ",[33,6201,6117],{}," 时，模块名是 ",[33,6204,6205],{},"__main__","，入口代码输出 5。",[56,6208,6209,6211,6212,6214,6215,6217],{},[33,6210,6153],{}," 导入模块时，",[33,6213,6117],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6216,6153],{}," 调用函数输出 30。",[320,6219,2689],{"id":2689},[10,6221,6222],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6224,6225],{},[26,6226],{"alt":6227,"src":6228},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6230,6231,6232,6234],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6233,6205],{}," 保护下的演示代码。",[14,6236,163],{"id":163},[53,6238,6239,6246],{},[56,6240,6241,6242,1149,6244,354],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6243,6117],{},[33,6245,6153],{},[56,6247,6248,6249,6252],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6250,6251],{},"json.py","，导致导入目标被遮蔽。",[14,6254,178],{"id":178},[139,6256,6257,6263],{},[56,6258,2344,6259,6262],{},[33,6260,6261],{},"text_tools.py"," 并导出一个格式化函数。",[56,6264,6265,6266,354],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6267,6084],{},[10,6269,196],{},[14,6271,199],{"id":199},[10,6273,6274],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,6276,206],{},{"title":79,"searchDepth":92,"depth":92,"links":6278},[6279,6280,6281,6282,6283,6286,6287,6288],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":6284},[6285],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6057,"description":6062},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[217,6296,6297],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6300,"title":6301,"body":6302,"category":217,"cover":218,"description":6306,"extension":219,"meta":6471,"navigation":107,"path":6472,"pinned":222,"publishedAt":223,"seo":6473,"slug":6474,"stem":6475,"summary":6476,"tags":6477,"updatedAt":223,"visible":107,"__hash__":6479},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6303,"toc":6461},[6304,6307,6309,6312,6314,6320,6323,6325,6339,6341,6343,6389,6391,6397,6399,6401,6427,6429,6439,6441,6452,6454,6456,6459],[10,6305,6306],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6308,16],{"id":16},[10,6310,6311],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6313,22],{"id":22},[10,6315,6316],{},[26,6317],{"alt":6318,"src":6319},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6321,6322],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6324,51],{"id":51},[53,6326,6327,6333,6336],{},[56,6328,6329,6332],{},[33,6330,6331],{},".venv"," 是常见目录名，不应提交到 Git。",[56,6334,6335],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[56,6337,6338],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6340,69],{"id":69},[10,6342,1566],{},[74,6344,6346],{"className":583,"code":6345,"language":585,"meta":79,"style":79},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6347,6348,6360,6368,6374,6384],{"__ignoreMap":79},[83,6349,6350,6352,6354,6357],{"class":85,"line":86},[83,6351,683],{"class":592},[83,6353,625],{"class":595},[83,6355,6356],{"class":628}," venv",[83,6358,6359],{"class":628}," .venv\n",[83,6361,6362,6365],{"class":85,"line":92},[83,6363,6364],{"class":595},"source",[83,6366,6367],{"class":628}," .venv\u002Fbin\u002Factivate\n",[83,6369,6370,6372],{"class":85,"line":98},[83,6371,78],{"class":592},[83,6373,596],{"class":595},[83,6375,6376,6378,6380,6382],{"class":85,"line":104},[83,6377,78],{"class":592},[83,6379,625],{"class":595},[83,6381,629],{"class":628},[83,6383,596],{"class":595},[83,6385,6386],{"class":85,"line":111},[83,6387,6388],{"class":592},"deactivate\n",[10,6390,123],{},[74,6392,6395],{"className":6393,"code":6394,"language":129,"meta":79},[127],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6396,6394],{"__ignoreMap":79},[10,6398,134],{},[14,6400,137],{"id":137},[139,6402,6403,6412],{},[56,6404,6405,6408,6409,6411],{},[33,6406,6407],{},"venv"," 根据当前 ",[33,6410,683],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[56,6413,6414,6415,2167,6417,6420,6421,3673,6423,6426],{},"激活后 ",[33,6416,78],{},[33,6418,6419],{},"python -m pip"," 优先指向 ",[33,6422,6331],{},[33,6424,6425],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6428,163],{"id":163},[53,6430,6431,6434],{},[56,6432,6433],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[56,6435,3412,6436,6438],{},[33,6437,6331],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6440,178],{"id":178},[139,6442,6443,6449],{},[56,6444,6445,6446,354],{},"创建虚拟环境并记录激活前后的 ",[33,6447,6448],{},"which python",[56,6450,6451],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6453,196],{},[14,6455,199],{"id":199},[10,6457,6458],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,6460,1650],{},{"title":79,"searchDepth":92,"depth":92,"links":6462},[6463,6464,6465,6466,6467,6468,6469,6470],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6301,"description":6306},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[217,6478,252],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6481,"title":6482,"body":6483,"category":217,"cover":218,"description":6487,"extension":219,"meta":6675,"navigation":107,"path":6676,"pinned":222,"publishedAt":223,"seo":6677,"slug":6678,"stem":6679,"summary":6680,"tags":6681,"updatedAt":223,"visible":107,"__hash__":6684},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6484,"toc":6665},[6485,6488,6490,6493,6495,6501,6510,6512,6536,6538,6540,6593,6595,6601,6603,6605,6621,6623,6642,6644,6656,6658,6660,6663],[10,6486,6487],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6489,16],{"id":16},[10,6491,6492],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6494,22],{"id":22},[10,6496,6497],{},[26,6498],{"alt":6499,"src":6500},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6502,6503,6506,6507,6509],{},[33,6504,6505],{},"Path"," 使用 ",[33,6508,2426],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6511,51],{"id":51},[53,6513,6514,6517,6529],{},[56,6515,6516],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[56,6518,6519,2248,6522,2248,6525,6528],{},[33,6520,6521],{},"exists()",[33,6523,6524],{},"is_file()",[33,6526,6527],{},"is_dir()"," 检查真实文件系统状态。",[56,6530,6531,6532,6535],{},"创建目录前明确目标；",[33,6533,6534],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6537,69],{"id":69},[10,6539,72],{},[74,6541,6543],{"className":76,"code":6542,"language":78,"meta":79,"style":79},"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",[33,6544,6545,6550,6554,6559,6564,6569,6573,6578,6583,6588],{"__ignoreMap":79},[83,6546,6547],{"class":85,"line":86},[83,6548,6549],{},"from pathlib import Path\n",[83,6551,6552],{"class":85,"line":92},[83,6553,108],{"emptyLinePlaceholder":107},[83,6555,6556],{"class":85,"line":98},[83,6557,6558],{},"project = Path.cwd()\n",[83,6560,6561],{"class":85,"line":104},[83,6562,6563],{},"data_dir = project \u002F \"data\"\n",[83,6565,6566],{"class":85,"line":111},[83,6567,6568],{},"file_path = data_dir \u002F \"records.json\"\n",[83,6570,6571],{"class":85,"line":117},[83,6572,108],{"emptyLinePlaceholder":107},[83,6574,6575],{"class":85,"line":2479},[83,6576,6577],{},"print(project)\n",[83,6579,6580],{"class":85,"line":2485},[83,6581,6582],{},"print(file_path.name)\n",[83,6584,6585],{"class":85,"line":3898},[83,6586,6587],{},"print(file_path.suffix)\n",[83,6589,6590],{"class":85,"line":4110},[83,6591,6592],{},"print(file_path.exists())\n",[10,6594,123],{},[74,6596,6599],{"className":6597,"code":6598,"language":129,"meta":79},[127],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6600,6598],{"__ignoreMap":79},[10,6602,134],{},[14,6604,137],{"id":137},[139,6606,6607,6613],{},[56,6608,6609,6612],{},[33,6610,6611],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[56,6614,2330,6615,6617,6618,6620],{},[33,6616,2426],{}," 组合路径片段只创建新的 ",[33,6619,6505],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6622,163],{"id":163},[53,6624,6625,6633],{},[56,6626,3412,6627,6629,6630,6632],{},[33,6628,6505],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6631,6521],{}," 等方法确认。",[56,6634,6635,6636,1001,6638,6641],{},"手工拼接 ",[33,6637,2426],{},[33,6639,6640],{},"\\"," 分隔符，降低跨平台可读性。",[14,6643,178],{"id":178},[139,6645,6646,6653],{},[56,6647,6648,6649,6652],{},"组合 ",[33,6650,6651],{},"output\u002Freport.txt"," 路径但先不创建文件。",[56,6654,6655],{},"输出路径的父目录、文件名和扩展名。",[10,6657,196],{},[14,6659,199],{"id":199},[10,6661,6662],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,6664,206],{},{"title":79,"searchDepth":92,"depth":92,"links":6666},[6667,6668,6669,6670,6671,6672,6673,6674],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6482,"description":6487},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[217,6682,6683],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6686,"title":6687,"body":6688,"category":217,"cover":218,"description":6692,"extension":219,"meta":6870,"navigation":107,"path":6871,"pinned":222,"publishedAt":223,"seo":6872,"slug":6873,"stem":6874,"summary":6875,"tags":6876,"updatedAt":223,"visible":107,"__hash__":6879},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6689,"toc":6860},[6690,6693,6695,6698,6700,6706,6709,6711,6739,6741,6743,6800,6802,6808,6810,6812,6823,6825,6838,6840,6851,6853,6855,6858],[10,6691,6692],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6694,16],{"id":16},[10,6696,6697],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6699,22],{"id":22},[10,6701,6702],{},[26,6703],{"alt":6704,"src":6705},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6707,6708],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6710,51],{"id":51},[53,6712,6713,6719,6728],{},[56,6714,6715,6718],{},[33,6716,6717],{},"w"," 模式会截断原文件，写入前必须确认目标。",[56,6720,6721,6724,6725,354],{},[33,6722,6723],{},"r"," 模式读取不存在文件会产生 ",[33,6726,6727],{},"FileNotFoundError",[56,6729,6730,6731,6734,6735,6738],{},"本篇显式调用 ",[33,6732,6733],{},"close()","；第 34 篇会用 ",[33,6736,6737],{},"with"," 更可靠地管理关闭动作。",[14,6740,69],{"id":69},[10,6742,72],{},[74,6744,6746],{"className":76,"code":6745,"language":78,"meta":79,"style":79},"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",[33,6747,6748,6752,6756,6761,6766,6771,6776,6780,6785,6790,6795],{"__ignoreMap":79},[83,6749,6750],{"class":85,"line":86},[83,6751,6549],{},[83,6753,6754],{"class":85,"line":92},[83,6755,108],{"emptyLinePlaceholder":107},[83,6757,6758],{"class":85,"line":98},[83,6759,6760],{},"file_path = Path(\"notes.txt\")\n",[83,6762,6763],{"class":85,"line":104},[83,6764,6765],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[83,6767,6768],{"class":85,"line":111},[83,6769,6770],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[83,6772,6773],{"class":85,"line":117},[83,6774,6775],{},"writer.close()\n",[83,6777,6778],{"class":85,"line":2479},[83,6779,108],{"emptyLinePlaceholder":107},[83,6781,6782],{"class":85,"line":2485},[83,6783,6784],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[83,6786,6787],{"class":85,"line":3898},[83,6788,6789],{},"content = reader.read()\n",[83,6791,6792],{"class":85,"line":4110},[83,6793,6794],{},"reader.close()\n",[83,6796,6797],{"class":85,"line":5775},[83,6798,6799],{},"print(content)\n",[10,6801,123],{},[74,6803,6806],{"className":6804,"code":6805,"language":129,"meta":79},[127],"变量\n循环\n函数\n",[33,6807,6805],{"__ignoreMap":79},[10,6809,134],{},[14,6811,137],{"id":137},[139,6813,6814,6820],{},[56,6815,6816,6817,6819],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6818,6733],{}," 确保缓冲内容交给文件系统。",[56,6821,6822],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6824,163],{"id":163},[53,6826,6827,6832],{},[56,6828,2330,6829,6831],{},[33,6830,6717],{}," 模式打开重要文件却未确认覆盖风险。",[56,6833,6834,6835,354],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6836,6837],{},"encoding=\"utf-8\"",[14,6839,178],{"id":178},[139,6841,6842,6845],{},[56,6843,6844],{},"写入三行学习记录并读取。",[56,6846,6847,6848,6850],{},"改用 ",[33,6849,328],{}," 模式追加一行，确认原内容仍保留。",[10,6852,196],{},[14,6854,199],{"id":199},[10,6856,6857],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,6859,206],{},{"title":79,"searchDepth":92,"depth":92,"links":6861},[6862,6863,6864,6865,6866,6867,6868,6869],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6687,"description":6692},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[217,6877,6878],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6881,"title":6882,"body":6883,"category":217,"cover":218,"description":6887,"extension":219,"meta":7054,"navigation":107,"path":7055,"pinned":222,"publishedAt":223,"seo":7056,"slug":7057,"stem":7058,"summary":7059,"tags":7060,"updatedAt":223,"visible":107,"__hash__":7063},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6884,"toc":7044},[6885,6888,6890,6893,6895,6901,6911,6913,6927,6929,6931,6991,6993,6999,7001,7003,7015,7017,7025,7027,7035,7037,7039,7042],[10,6886,6887],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6889,16],{"id":16},[10,6891,6892],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6894,22],{"id":22},[10,6896,6897],{},[26,6898],{"alt":6899,"src":6900},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6902,6903,6906,6907,6910],{},[33,6904,6905],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6908,6909],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6912,51],{"id":51},[53,6914,6915,6918,6924],{},[56,6916,6917],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[56,6919,6920,6923],{},[33,6921,6922],{},"ensure_ascii=False"," 让中文以可读字符写入。",[56,6925,6926],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6928,69],{"id":69},[10,6930,72],{},[74,6932,6934],{"className":76,"code":6933,"language":78,"meta":79,"style":79},"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",[33,6935,6936,6941,6945,6950,6954,6959,6964,6968,6972,6977,6982,6986],{"__ignoreMap":79},[83,6937,6938],{"class":85,"line":86},[83,6939,6940],{},"import json\n",[83,6942,6943],{"class":85,"line":92},[83,6944,108],{"emptyLinePlaceholder":107},[83,6946,6947],{"class":85,"line":98},[83,6948,6949],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[83,6951,6952],{"class":85,"line":104},[83,6953,108],{"emptyLinePlaceholder":107},[83,6955,6956],{"class":85,"line":111},[83,6957,6958],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[83,6960,6961],{"class":85,"line":117},[83,6962,6963],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[83,6965,6966],{"class":85,"line":2479},[83,6967,6775],{},[83,6969,6970],{"class":85,"line":2485},[83,6971,108],{"emptyLinePlaceholder":107},[83,6973,6974],{"class":85,"line":3898},[83,6975,6976],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[83,6978,6979],{"class":85,"line":4110},[83,6980,6981],{},"loaded = json.load(reader)\n",[83,6983,6984],{"class":85,"line":5775},[83,6985,6794],{},[83,6987,6988],{"class":85,"line":5780},[83,6989,6990],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6992,123],{},[74,6994,6997],{"className":6995,"code":6996,"language":129,"meta":79},[127],"Python 60\n",[33,6998,6996],{"__ignoreMap":79},[10,7000,134],{},[14,7002,137],{"id":137},[139,7004,7005,7010],{},[56,7006,7007,7009],{},[33,7008,6905],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[56,7011,7012,7014],{},[33,7013,6909],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7016,163],{"id":163},[53,7018,7019,7022],{},[56,7020,7021],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[56,7023,7024],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7026,178],{"id":178},[139,7028,7029,7032],{},[56,7030,7031],{},"保存包含两条学习记录的列表。",[56,7033,7034],{},"读取后修改进度，再重新写回文件。",[10,7036,196],{},[14,7038,199],{"id":199},[10,7040,7041],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,7043,206],{},{"title":79,"searchDepth":92,"depth":92,"links":7045},[7046,7047,7048,7049,7050,7051,7052,7053],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6882,"description":6887},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[217,7061,7062],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7065,"title":7066,"body":7067,"category":217,"cover":218,"description":7071,"extension":219,"meta":7255,"navigation":107,"path":7256,"pinned":222,"publishedAt":223,"seo":7257,"slug":7258,"stem":7259,"summary":7260,"tags":7261,"updatedAt":223,"visible":107,"__hash__":7264},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7068,"toc":7245},[7069,7072,7074,7077,7079,7085,7091,7093,7115,7117,7119,7182,7184,7190,7192,7194,7210,7212,7226,7228,7236,7238,7240,7243],[10,7070,7071],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7073,16],{"id":16},[10,7075,7076],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7078,22],{"id":22},[10,7080,7081],{},[26,7082],{"alt":7083,"src":7084},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7086,7087,7090],{},[33,7088,7089],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7092,51],{"id":51},[53,7094,7095,7105,7112],{},[56,7096,2330,7097,7100,7101,7104],{},[33,7098,7099],{},"newline=\"\""," 让 ",[33,7102,7103],{},"csv"," 模块正确处理换行。",[56,7106,7107,7108,7111],{},"字段顺序由 ",[33,7109,7110],{},"fieldnames"," 决定，字典键需要与字段名一致。",[56,7113,7114],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7116,69],{"id":69},[10,7118,72],{},[74,7120,7122],{"className":76,"code":7121,"language":78,"meta":79,"style":79},"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",[33,7123,7124,7129,7133,7138,7143,7148,7153,7158,7162,7167,7172,7177],{"__ignoreMap":79},[83,7125,7126],{"class":85,"line":86},[83,7127,7128],{},"import csv\n",[83,7130,7131],{"class":85,"line":92},[83,7132,108],{"emptyLinePlaceholder":107},[83,7134,7135],{"class":85,"line":98},[83,7136,7137],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[83,7139,7140],{"class":85,"line":104},[83,7141,7142],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[83,7144,7145],{"class":85,"line":111},[83,7146,7147],{},"writer.writeheader()\n",[83,7149,7150],{"class":85,"line":117},[83,7151,7152],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[83,7154,7155],{"class":85,"line":2479},[83,7156,7157],{},"writer_file.close()\n",[83,7159,7160],{"class":85,"line":2485},[83,7161,108],{"emptyLinePlaceholder":107},[83,7163,7164],{"class":85,"line":3898},[83,7165,7166],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[83,7168,7169],{"class":85,"line":4110},[83,7170,7171],{},"for row in csv.DictReader(reader_file):\n",[83,7173,7174],{"class":85,"line":5775},[83,7175,7176],{},"    print(row[\"name\"], row[\"score\"])\n",[83,7178,7179],{"class":85,"line":5780},[83,7180,7181],{},"reader_file.close()\n",[10,7183,123],{},[74,7185,7188],{"className":7186,"code":7187,"language":129,"meta":79},[127],"小郑 95\n",[33,7189,7187],{"__ignoreMap":79},[10,7191,134],{},[14,7193,137],{"id":137},[139,7195,7196,7205],{},[56,7197,7198,7201,7202,7204],{},[33,7199,7200],{},"DictWriter"," 按 ",[33,7203,7110],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[56,7206,7207,7209],{},[33,7208,7089],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7211,163],{"id":163},[53,7213,7214,7217],{},[56,7215,7216],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[56,7218,7219,7220,7222,7223,7225],{},"在 macOS 以外环境忽略 ",[33,7221,7099],{}," 可能出现额外空行；统一交给 ",[33,7224,7103],{}," 模块管理换行。",[14,7227,178],{"id":178},[139,7229,7230,7233],{},[56,7231,7232],{},"写入三名学习者的课程和分数。",[56,7234,7235],{},"读取 CSV 后把分数字符串转换为整数。",[10,7237,196],{},[14,7239,199],{"id":199},[10,7241,7242],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,7244,206],{},{"title":79,"searchDepth":92,"depth":92,"links":7246},[7247,7248,7249,7250,7251,7252,7253,7254],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7066,"description":7071},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[217,7262,7263],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7266,"title":7267,"body":7268,"category":217,"cover":218,"description":7272,"extension":219,"meta":7545,"navigation":107,"path":7546,"pinned":222,"publishedAt":223,"seo":7547,"slug":7548,"stem":7549,"summary":7550,"tags":7551,"updatedAt":223,"visible":107,"__hash__":7554},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7269,"toc":7532},[7270,7273,7275,7278,7280,7286,7297,7299,7316,7318,7320,7395,7397,7403,7405,7407,7432,7434,7443,7449,7460,7462,7468,7474,7483,7485,7500,7502,7523,7525,7527,7530],[10,7271,7272],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7274,16],{"id":16},[10,7276,7277],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7279,22],{"id":22},[10,7281,7282],{},[26,7283],{"alt":7284,"src":7285},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7287,7288,7289,7292,7293,7296],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7290,7291],{},"except","；无论是否异常，",[33,7294,7295],{},"finally"," 都会在离开结构前执行。",[14,7298,51],{"id":51},[53,7300,7301,7307,7313],{},[56,7302,7303,7304,7306],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7305,7291],{}," 吞掉全部错误。",[56,7308,7309,7312],{},[33,7310,7311],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[56,7314,7315],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7317,69],{"id":69},[10,7319,72],{},[74,7321,7323],{"className":76,"code":7322,"language":78,"meta":79,"style":79},"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",[33,7324,7325,7330,7335,7340,7345,7350,7354,7359,7364,7369,7374,7378,7383,7389],{"__ignoreMap":79},[83,7326,7327],{"class":85,"line":86},[83,7328,7329],{},"def parse_age(text):\n",[83,7331,7332],{"class":85,"line":92},[83,7333,7334],{},"    age = int(text)\n",[83,7336,7337],{"class":85,"line":98},[83,7338,7339],{},"    if age \u003C 0:\n",[83,7341,7342],{"class":85,"line":104},[83,7343,7344],{},"        raise ValueError(\"年龄不能为负数\")\n",[83,7346,7347],{"class":85,"line":111},[83,7348,7349],{},"    return age\n",[83,7351,7352],{"class":85,"line":117},[83,7353,108],{"emptyLinePlaceholder":107},[83,7355,7356],{"class":85,"line":2479},[83,7357,7358],{},"try:\n",[83,7360,7361],{"class":85,"line":2485},[83,7362,7363],{},"    age = parse_age(\"18\")\n",[83,7365,7366],{"class":85,"line":3898},[83,7367,7368],{},"except ValueError as error:\n",[83,7370,7371],{"class":85,"line":4110},[83,7372,7373],{},"    print(\"输入错误：\", error)\n",[83,7375,7376],{"class":85,"line":5775},[83,7377,1138],{},[83,7379,7380],{"class":85,"line":5780},[83,7381,7382],{},"    print(\"年龄：\", age)\n",[83,7384,7386],{"class":85,"line":7385},13,[83,7387,7388],{},"finally:\n",[83,7390,7392],{"class":85,"line":7391},14,[83,7393,7394],{},"    print(\"处理结束\")\n",[10,7396,123],{},[74,7398,7401],{"className":7399,"code":7400,"language":129,"meta":79},[127],"年龄： 18\n处理结束\n",[33,7402,7400],{"__ignoreMap":79},[10,7404,134],{},[14,7406,137],{"id":137},[139,7408,7409,7421],{},[56,7410,7411,7413,7414,7416,7417,7420],{},[33,7412,47],{}," 或主动 ",[33,7415,7311],{}," 都可能产生 ",[33,7418,7419],{},"ValueError","，控制流立即离开当前正常路径。",[56,7422,7423,7424,7426,7427,7429,7430,354],{},"有异常时进入匹配的 ",[33,7425,7291],{},"；没有异常时执行 ",[33,7428,1152],{},"；两种情况最后都会执行 ",[33,7431,7295],{},[320,7433,2689],{"id":2689},[10,7435,7436,2248,7438,1149,7440,7442],{},[33,7437,7291],{},[33,7439,1152],{},[33,7441,7295],{}," 的职责不同，不能只看它们出现的顺序。",[10,7444,7445],{},[26,7446],{"alt":7447,"src":7448},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7450,7451,7453,7454,7456,7457,7459],{},[33,7452,7291],{}," 处理匹配异常，",[33,7455,1152],{}," 只在无异常时运行，",[33,7458,7295],{}," 负责两条路径都需要的清理动作。",[320,7461,2689],{"id":4165},[10,7463,7464,7467],{},[33,7465,7466],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7469,7470],{},[26,7471],{"alt":7472,"src":7473},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7475,7476,7477,7479,7480,7482],{},"只把可能产生预期异常的操作放进 ",[33,7478,7466],{},"，后续正常业务放进 ",[33,7481,1152],{},"，错误边界会更清楚。",[14,7484,163],{"id":163},[53,7486,7487,7494],{},[56,7488,7489,7490,7493],{},"使用裸 ",[33,7491,7492],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[56,7495,7496,7497,7499],{},"把整个程序包在一个巨大 ",[33,7498,7466],{}," 中，无法判断究竟哪一步允许失败。",[14,7501,178],{"id":178},[139,7503,7504,7517],{},[56,7505,7506,7507,7510,7511,1149,7514,354],{},"让 ",[33,7508,7509],{},"parse_age"," 分别处理 ",[33,7512,7513],{},"\"abc\"",[33,7515,7516],{},"\"-1\"",[56,7518,7519,7520,7522],{},"为文件读取捕获 ",[33,7521,6727],{}," 并给出清晰提示。",[10,7524,196],{},[14,7526,199],{"id":199},[10,7528,7529],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,7531,206],{},{"title":79,"searchDepth":92,"depth":92,"links":7533},[7534,7535,7536,7537,7538,7542,7543,7544],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":7539},[7540,7541],{"id":2689,"depth":98,"text":2689},{"id":4165,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7267,"description":7272},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[217,7552,7553],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7556,"title":7557,"body":7558,"category":217,"cover":218,"description":7562,"extension":219,"meta":7738,"navigation":107,"path":7739,"pinned":222,"publishedAt":223,"seo":7740,"slug":7741,"stem":7742,"summary":7743,"tags":7744,"updatedAt":223,"visible":107,"__hash__":7746},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7559,"toc":7728},[7560,7563,7565,7568,7570,7576,7582,7584,7600,7602,7604,7658,7660,7666,7668,7670,7683,7685,7698,7700,7719,7721,7723,7726],[10,7561,7562],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7564,16],{"id":16},[10,7566,7567],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7569,22],{"id":22},[10,7571,7572],{},[26,7573],{"alt":7574,"src":7575},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7577,7578,7579,7581],{},"进入 ",[33,7580,6737],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7583,51],{"id":51},[53,7585,7586,7591,7597],{},[56,7587,7588,7590],{},[33,7589,6737],{}," 把资源获取和释放配成一个清晰边界。",[56,7592,7593,7596],{},[33,7594,7595],{},"as file"," 得到的是上下文返回的资源对象。",[56,7598,7599],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7601,69],{"id":69},[10,7603,72],{},[74,7605,7607],{"className":76,"code":7606,"language":78,"meta":79,"style":79},"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",[33,7608,7609,7613,7617,7621,7625,7630,7635,7639,7644,7649,7653],{"__ignoreMap":79},[83,7610,7611],{"class":85,"line":86},[83,7612,6549],{},[83,7614,7615],{"class":85,"line":92},[83,7616,108],{"emptyLinePlaceholder":107},[83,7618,7619],{"class":85,"line":98},[83,7620,6760],{},[83,7622,7623],{"class":85,"line":104},[83,7624,108],{"emptyLinePlaceholder":107},[83,7626,7627],{"class":85,"line":111},[83,7628,7629],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[83,7631,7632],{"class":85,"line":117},[83,7633,7634],{},"    file.write(\"上下文管理器\\n\")\n",[83,7636,7637],{"class":85,"line":2479},[83,7638,108],{"emptyLinePlaceholder":107},[83,7640,7641],{"class":85,"line":2485},[83,7642,7643],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[83,7645,7646],{"class":85,"line":3898},[83,7647,7648],{},"    print(file.read())\n",[83,7650,7651],{"class":85,"line":4110},[83,7652,108],{"emptyLinePlaceholder":107},[83,7654,7655],{"class":85,"line":5775},[83,7656,7657],{},"print(file.closed)\n",[10,7659,123],{},[74,7661,7664],{"className":7662,"code":7663,"language":129,"meta":79},[127],"上下文管理器\n\nTrue\n",[33,7665,7663],{"__ignoreMap":79},[10,7667,134],{},[14,7669,137],{"id":137},[139,7671,7672,7680],{},[56,7673,7578,7674,7676,7677,354],{},[33,7675,6737],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7678,7679],{},"file",[56,7681,7682],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7684,163],{"id":163},[53,7686,7687,7692],{},[56,7688,4733,7689,7691],{},[33,7690,6737],{}," 代码块外继续读写已经关闭的文件对象。",[56,7693,7694,7695,7697],{},"误以为 ",[33,7696,6737],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7699,178],{"id":178},[139,7701,7702,7711],{},[56,7703,7704,7705,7708,7709,354],{},"把第 30 篇的手动 ",[33,7706,7707],{},"open\u002Fclose"," 改写为 ",[33,7710,6737],{},[56,7712,4733,7713,7715,7716,354],{},[33,7714,6737],{}," 块后检查 ",[33,7717,7718],{},"file.closed",[10,7720,196],{},[14,7722,199],{"id":199},[10,7724,7725],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,7727,206],{},{"title":79,"searchDepth":92,"depth":92,"links":7729},[7730,7731,7732,7733,7734,7735,7736,7737],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7557,"description":7562},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[217,6737,7745],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7748,"title":7749,"body":7750,"category":217,"cover":218,"description":7754,"extension":219,"meta":7966,"navigation":107,"path":7967,"pinned":222,"publishedAt":223,"seo":7968,"slug":7969,"stem":7970,"summary":7971,"tags":7972,"updatedAt":223,"visible":107,"__hash__":7975},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7751,"toc":7954},[7752,7755,7757,7760,7762,7768,7771,7773,7790,7792,7794,7862,7864,7870,7872,7874,7899,7901,7904,7910,7919,7921,7932,7934,7945,7947,7949,7952],[10,7753,7754],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7756,16],{"id":16},[10,7758,7759],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7761,22],{"id":22},[10,7763,7764],{},[26,7765],{"alt":7766,"src":7767},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7769,7770],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7772,51],{"id":51},[53,7774,7775,7781,7787],{},[56,7776,7777,7780],{},[33,7778,7779],{},"self"," 表示当前实例，由方法调用自动传入。",[56,7782,7783,7786],{},[33,7784,7785],{},"__init__"," 在实例创建过程中初始化属性。",[56,7788,7789],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7791,69],{"id":69},[10,7793,72],{},[74,7795,7797],{"className":76,"code":7796,"language":78,"meta":79,"style":79},"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",[33,7798,7799,7804,7809,7814,7819,7823,7828,7833,7838,7843,7847,7852,7857],{"__ignoreMap":79},[83,7800,7801],{"class":85,"line":86},[83,7802,7803],{},"class LearningRecord:\n",[83,7805,7806],{"class":85,"line":92},[83,7807,7808],{},"    def __init__(self, course, progress=0):\n",[83,7810,7811],{"class":85,"line":98},[83,7812,7813],{},"        self.course = course\n",[83,7815,7816],{"class":85,"line":104},[83,7817,7818],{},"        self.progress = progress\n",[83,7820,7821],{"class":85,"line":111},[83,7822,108],{"emptyLinePlaceholder":107},[83,7824,7825],{"class":85,"line":117},[83,7826,7827],{},"    def advance(self, amount):\n",[83,7829,7830],{"class":85,"line":2479},[83,7831,7832],{},"        self.progress = self.progress + amount\n",[83,7834,7835],{"class":85,"line":2485},[83,7836,7837],{},"        if self.progress > 100:\n",[83,7839,7840],{"class":85,"line":3898},[83,7841,7842],{},"            self.progress = 100\n",[83,7844,7845],{"class":85,"line":4110},[83,7846,108],{"emptyLinePlaceholder":107},[83,7848,7849],{"class":85,"line":5775},[83,7850,7851],{},"record = LearningRecord(\"Python\", 40)\n",[83,7853,7854],{"class":85,"line":5780},[83,7855,7856],{},"record.advance(15)\n",[83,7858,7859],{"class":85,"line":7385},[83,7860,7861],{},"print(record.course, record.progress)\n",[10,7863,123],{},[74,7865,7868],{"className":7866,"code":7867,"language":129,"meta":79},[127],"Python 55\n",[33,7869,7867],{"__ignoreMap":79},[10,7871,134],{},[14,7873,137],{"id":137},[139,7875,7876,7886],{},[56,7877,7878,7879,7882,7883,7885],{},"调用 ",[33,7880,7881],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7884,7785],{}," 把课程和进度保存在该实例属性中。",[56,7887,7888,7891,7892,7895,7896,7898],{},[33,7889,7890],{},"record.advance(15)"," 自动把 ",[33,7893,7894],{},"record"," 作为 ",[33,7897,7779],{},"，方法更新同一实例的进度并限制上限。",[320,7900,2689],{"id":2689},[10,7902,7903],{},"类是共同定义，实例则各自保存状态。",[10,7905,7906],{},[26,7907],{"alt":7908,"src":7909},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7911,7912,7913,1149,7915,7918],{},"两个实例共享同一套方法定义，但 ",[33,7914,4530],{},[33,7916,7917],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7920,163],{"id":163},[53,7922,7923,7929],{},[56,7924,7925,7926,7928],{},"调用实例方法时手工再传一次 ",[33,7927,7779],{},"。通过实例调用时 Python 会自动绑定。",[56,7930,7931],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7933,178],{"id":178},[139,7935,7936,7942],{},[56,7937,5243,7938,7941],{},[33,7939,7940],{},"Book"," 类，保存标题和阅读页数。",[56,7943,7944],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7946,196],{},[14,7948,199],{"id":199},[10,7950,7951],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,7953,206],{},{"title":79,"searchDepth":92,"depth":92,"links":7955},[7956,7957,7958,7959,7960,7963,7964,7965],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":7961},[7962],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7749,"description":7754},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[217,7973,7974],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7977,"title":7978,"body":7979,"category":217,"cover":218,"description":7983,"extension":219,"meta":8161,"navigation":107,"path":8162,"pinned":222,"publishedAt":223,"seo":8163,"slug":8164,"stem":8165,"summary":8166,"tags":8167,"updatedAt":223,"visible":107,"__hash__":8170},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7980,"toc":8151},[7981,7984,7986,7989,7991,7997,8000,8002,8013,8015,8017,8084,8086,8092,8094,8096,8115,8117,8125,8127,8142,8144,8146,8149],[10,7982,7983],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7985,16],{"id":16},[10,7987,7988],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7990,22],{"id":22},[10,7992,7993],{},[26,7994],{"alt":7995,"src":7996},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7998,7999],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8001,51],{"id":51},[53,8003,8004,8007,8010],{},[56,8005,8006],{},"封装让对象通过方法维护自己的有效状态。",[56,8008,8009],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[56,8011,8012],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8014,69],{"id":69},[10,8016,72],{},[74,8018,8020],{"className":76,"code":8019,"language":78,"meta":79,"style":79},"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",[33,8021,8022,8027,8032,8037,8041,8046,8051,8056,8060,8065,8070,8074,8079],{"__ignoreMap":79},[83,8023,8024],{"class":85,"line":86},[83,8025,8026],{},"class Storage:\n",[83,8028,8029],{"class":85,"line":92},[83,8030,8031],{},"    def save(self, text):\n",[83,8033,8034],{"class":85,"line":98},[83,8035,8036],{},"        print(\"保存：\", text)\n",[83,8038,8039],{"class":85,"line":104},[83,8040,108],{"emptyLinePlaceholder":107},[83,8042,8043],{"class":85,"line":111},[83,8044,8045],{},"class LearningService:\n",[83,8047,8048],{"class":85,"line":117},[83,8049,8050],{},"    def __init__(self, storage):\n",[83,8052,8053],{"class":85,"line":2479},[83,8054,8055],{},"        self.storage = storage\n",[83,8057,8058],{"class":85,"line":2485},[83,8059,108],{"emptyLinePlaceholder":107},[83,8061,8062],{"class":85,"line":3898},[83,8063,8064],{},"    def finish_lesson(self, title):\n",[83,8066,8067],{"class":85,"line":4110},[83,8068,8069],{},"        self.storage.save(title)\n",[83,8071,8072],{"class":85,"line":5775},[83,8073,108],{"emptyLinePlaceholder":107},[83,8075,8076],{"class":85,"line":5780},[83,8077,8078],{},"service = LearningService(Storage())\n",[83,8080,8081],{"class":85,"line":7385},[83,8082,8083],{},"service.finish_lesson(\"异常处理\")\n",[10,8085,123],{},[74,8087,8090],{"className":8088,"code":8089,"language":129,"meta":79},[127],"保存： 异常处理\n",[33,8091,8089],{"__ignoreMap":79},[10,8093,134],{},[14,8095,137],{"id":137},[139,8097,8098,8108],{},[56,8099,8100,8103,8104,8107],{},[33,8101,8102],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8105,8106],{},"save()"," 的协作对象。",[56,8109,8110,8111,8114],{},"调用业务方法时，服务把保存动作委托给 ",[33,8112,8113],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8116,163],{"id":163},[53,8118,8119,8122],{},[56,8120,8121],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[56,8123,8124],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8126,178],{"id":178},[139,8128,8129,8139],{},[56,8130,8131,8132,8135,8136,354],{},"用组合让 ",[33,8133,8134],{},"OrderService"," 使用一个 ",[33,8137,8138],{},"Notifier",[56,8140,8141],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8143,196],{},[14,8145,199],{"id":199},[10,8147,8148],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,8150,206],{},{"title":79,"searchDepth":92,"depth":92,"links":8152},[8153,8154,8155,8156,8157,8158,8159,8160],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7978,"description":7983},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[217,8168,8169],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8172,"title":8173,"body":8174,"category":217,"cover":218,"description":8178,"extension":219,"meta":8381,"navigation":107,"path":8382,"pinned":222,"publishedAt":223,"seo":8383,"slug":8384,"stem":8385,"summary":8386,"tags":8387,"updatedAt":223,"visible":107,"__hash__":8390},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8175,"toc":8369},[8176,8179,8181,8184,8186,8192,8199,8201,8226,8228,8230,8282,8284,8290,8292,8294,8315,8317,8323,8329,8335,8337,8345,8347,8360,8362,8364,8367],[10,8177,8178],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8180,16],{"id":16},[10,8182,8183],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8185,22],{"id":22},[10,8187,8188],{},[26,8189],{"alt":8190,"src":8191},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8193,8194,8195,8198],{},"生成器运行到 ",[33,8196,8197],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8200,51],{"id":51},[53,8202,8203,8213,8223],{},[56,8204,8205,8208,8209,8212],{},[33,8206,8207],{},"iter()"," 从可迭代对象取得迭代器，",[33,8210,8211],{},"next()"," 请求下一个值。",[56,8214,8215,8216,8219,8220,8222],{},"没有更多值时迭代器抛出 ",[33,8217,8218],{},"StopIteration","，",[33,8221,4284],{}," 会自动处理。",[56,8224,8225],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8227,69],{"id":69},[10,8229,72],{},[74,8231,8233],{"className":76,"code":8232,"language":78,"meta":79,"style":79},"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",[33,8234,8235,8240,8245,8250,8255,8260,8264,8269,8274,8278],{"__ignoreMap":79},[83,8236,8237],{"class":85,"line":86},[83,8238,8239],{},"def countdown(start):\n",[83,8241,8242],{"class":85,"line":92},[83,8243,8244],{},"    current = start\n",[83,8246,8247],{"class":85,"line":98},[83,8248,8249],{},"    while current > 0:\n",[83,8251,8252],{"class":85,"line":104},[83,8253,8254],{},"        yield current\n",[83,8256,8257],{"class":85,"line":111},[83,8258,8259],{},"        current = current - 1\n",[83,8261,8262],{"class":85,"line":117},[83,8263,108],{"emptyLinePlaceholder":107},[83,8265,8266],{"class":85,"line":2479},[83,8267,8268],{},"iterator = countdown(3)\n",[83,8270,8271],{"class":85,"line":2485},[83,8272,8273],{},"print(next(iterator))\n",[83,8275,8276],{"class":85,"line":3898},[83,8277,8273],{},[83,8279,8280],{"class":85,"line":4110},[83,8281,8273],{},[10,8283,123],{},[74,8285,8288],{"className":8286,"code":8287,"language":129,"meta":79},[127],"3\n2\n1\n",[33,8289,8287],{"__ignoreMap":79},[10,8291,134],{},[14,8293,137],{"id":137},[139,8295,8296,8302],{},[56,8297,7878,8298,8301],{},[33,8299,8300],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[56,8303,8304,8305,8307,8308,8310,8311,8314],{},"每次 ",[33,8306,8211],{}," 运行到下一个 ",[33,8309,8197],{}," 并暂停，局部变量 ",[33,8312,8313],{},"current"," 和执行位置被保留。",[320,8316,2689],{"id":2689},[10,8318,8319,8320,8322],{},"生成器的暂停位置可以展开成多次 ",[33,8321,8211],{}," 的时间线。",[10,8324,8325],{},[26,8326],{"alt":8327,"src":8328},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8330,8331,8332,8334],{},"每次请求只推进到下一个 ",[33,8333,8197],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8336,163],{"id":163},[53,8338,8339,8342],{},[56,8340,8341],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[56,8343,8344],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8346,178],{"id":178},[139,8348,8349,8352],{},[56,8350,8351],{},"编写产生 1 到指定上限偶数的生成器。",[56,8353,3956,8354,8356,8357,8359],{},[33,8355,4284],{}," 遍历生成器，比较手动 ",[33,8358,8211],{}," 的差异。",[10,8361,196],{},[14,8363,199],{"id":199},[10,8365,8366],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,8368,206],{},{"title":79,"searchDepth":92,"depth":92,"links":8370},[8371,8372,8373,8374,8375,8378,8379,8380],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":8376},[8377],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8173,"description":8178},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[217,8388,8389],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8392,"title":8393,"body":8394,"category":217,"cover":218,"description":8398,"extension":219,"meta":8622,"navigation":107,"path":8623,"pinned":222,"publishedAt":223,"seo":8624,"slug":8625,"stem":8626,"summary":8627,"tags":8628,"updatedAt":223,"visible":107,"__hash__":8630},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8395,"toc":8610},[8396,8399,8401,8404,8406,8412,8415,8417,8437,8439,8441,8523,8525,8531,8533,8535,8557,8559,8562,8568,8575,8577,8587,8589,8601,8603,8605,8608],[10,8397,8398],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8400,16],{"id":16},[10,8402,8403],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8405,22],{"id":22},[10,8407,8408],{},[26,8409],{"alt":8410,"src":8411},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8413,8414],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8416,51],{"id":51},[53,8418,8419,8428,8431],{},[56,8420,8421,8424,8425,354],{},[33,8422,8423],{},"@trace"," 等价于 ",[33,8426,8427],{},"add = trace(add)",[56,8429,8430],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[56,8432,8433,8436],{},[33,8434,8435],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8438,69],{"id":69},[10,8440,72],{},[74,8442,8444],{"className":76,"code":8443,"language":78,"meta":79,"style":79},"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",[33,8445,8446,8451,8455,8460,8465,8470,8475,8480,8485,8490,8495,8499,8504,8508,8512,8517],{"__ignoreMap":79},[83,8447,8448],{"class":85,"line":86},[83,8449,8450],{},"from functools import wraps\n",[83,8452,8453],{"class":85,"line":92},[83,8454,108],{"emptyLinePlaceholder":107},[83,8456,8457],{"class":85,"line":98},[83,8458,8459],{},"def trace(function):\n",[83,8461,8462],{"class":85,"line":104},[83,8463,8464],{},"    @wraps(function)\n",[83,8466,8467],{"class":85,"line":111},[83,8468,8469],{},"    def wrapper(*args, **kwargs):\n",[83,8471,8472],{"class":85,"line":117},[83,8473,8474],{},"        print(\"开始：\", function.__name__)\n",[83,8476,8477],{"class":85,"line":2479},[83,8478,8479],{},"        result = function(*args, **kwargs)\n",[83,8481,8482],{"class":85,"line":2485},[83,8483,8484],{},"        print(\"结束：\", function.__name__)\n",[83,8486,8487],{"class":85,"line":3898},[83,8488,8489],{},"        return result\n",[83,8491,8492],{"class":85,"line":4110},[83,8493,8494],{},"    return wrapper\n",[83,8496,8497],{"class":85,"line":5775},[83,8498,108],{"emptyLinePlaceholder":107},[83,8500,8501],{"class":85,"line":5780},[83,8502,8503],{},"@trace\n",[83,8505,8506],{"class":85,"line":7385},[83,8507,6128],{},[83,8509,8510],{"class":85,"line":7391},[83,8511,6133],{},[83,8513,8515],{"class":85,"line":8514},15,[83,8516,108],{"emptyLinePlaceholder":107},[83,8518,8520],{"class":85,"line":8519},16,[83,8521,8522],{},"print(add(2, 3))\n",[10,8524,123],{},[74,8526,8529],{"className":8527,"code":8528,"language":129,"meta":79},[127],"开始： add\n结束： add\n5\n",[33,8530,8528],{"__ignoreMap":79},[10,8532,134],{},[14,8534,137],{"id":137},[139,8536,8537,8554],{},[56,8538,8539,8540,8543,8544,8547,8548,8551,8552,354],{},"解释器执行定义时，把原 ",[33,8541,8542],{},"add"," 函数交给 ",[33,8545,8546],{},"trace","，返回的 ",[33,8549,8550],{},"wrapper"," 重新绑定到名字 ",[33,8553,8542],{},[56,8555,8556],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[320,8558,2689],{"id":2689},[10,8560,8561],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8563,8564],{},[26,8565],{"alt":8566,"src":8567},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8569,8570,8572,8573,354],{},[33,8571,8423],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8574,8427],{},[14,8576,163],{"id":163},[53,8578,8579,8584],{},[56,8580,8581,8582,354],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8583,5326],{},[56,8585,8586],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8588,178],{"id":178},[139,8590,8591,8594],{},[56,8592,8593],{},"编写只记录调用次数的简单装饰器。",[56,8595,8596,8597,8600],{},"删除包装函数的 ",[33,8598,8599],{},"return result","，观察调用方得到什么。",[10,8602,196],{},[14,8604,199],{"id":199},[10,8606,8607],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,8609,206],{},{"title":79,"searchDepth":92,"depth":92,"links":8611},[8612,8613,8614,8615,8616,8619,8620,8621],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":8617},[8618],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8393,"description":8398},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[217,8629,5277],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8632,"title":8633,"body":8634,"category":217,"cover":218,"description":8638,"extension":219,"meta":8825,"navigation":107,"path":8826,"pinned":222,"publishedAt":223,"seo":8827,"slug":8828,"stem":8829,"summary":8830,"tags":8831,"updatedAt":223,"visible":107,"__hash__":8834},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8635,"toc":8813},[8636,8639,8641,8644,8646,8652,8655,8657,8668,8670,8672,8747,8749,8755,8757,8759,8770,8772,8775,8781,8784,8786,8794,8796,8804,8806,8808,8811],[10,8637,8638],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8640,16],{"id":16},[10,8642,8643],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8645,22],{"id":22},[10,8647,8648],{},[26,8649],{"alt":8650,"src":8651},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8653,8654],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8656,51],{"id":51},[53,8658,8659,8662,8665],{},[56,8660,8661],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[56,8663,8664],{},"日志记录运行状态，测试判断结果是否符合约定。",[56,8666,8667],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8669,69],{"id":69},[10,8671,72],{},[74,8673,8675],{"className":76,"code":8674,"language":78,"meta":79,"style":79},"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",[33,8676,8677,8682,8687,8691,8696,8700,8705,8710,8715,8719,8724,8729,8734,8738,8742],{"__ignoreMap":79},[83,8678,8679],{"class":85,"line":86},[83,8680,8681],{},"import logging\n",[83,8683,8684],{"class":85,"line":92},[83,8685,8686],{},"import unittest\n",[83,8688,8689],{"class":85,"line":98},[83,8690,108],{"emptyLinePlaceholder":107},[83,8692,8693],{"class":85,"line":104},[83,8694,8695],{},"logging.basicConfig(level=logging.INFO)\n",[83,8697,8698],{"class":85,"line":111},[83,8699,108],{"emptyLinePlaceholder":107},[83,8701,8702],{"class":85,"line":117},[83,8703,8704],{},"def clamp_progress(value):\n",[83,8706,8707],{"class":85,"line":2479},[83,8708,8709],{},"    logging.info(\"检查进度：%s\", value)\n",[83,8711,8712],{"class":85,"line":2485},[83,8713,8714],{},"    return max(0, min(100, value))\n",[83,8716,8717],{"class":85,"line":3898},[83,8718,108],{"emptyLinePlaceholder":107},[83,8720,8721],{"class":85,"line":4110},[83,8722,8723],{},"class ProgressTest(unittest.TestCase):\n",[83,8725,8726],{"class":85,"line":5775},[83,8727,8728],{},"    def test_upper_limit(self):\n",[83,8730,8731],{"class":85,"line":5780},[83,8732,8733],{},"        self.assertEqual(clamp_progress(120), 100)\n",[83,8735,8736],{"class":85,"line":7385},[83,8737,108],{"emptyLinePlaceholder":107},[83,8739,8740],{"class":85,"line":7391},[83,8741,6142],{},[83,8743,8744],{"class":85,"line":8514},[83,8745,8746],{},"    unittest.main()\n",[10,8748,123],{},[74,8750,8753],{"className":8751,"code":8752,"language":129,"meta":79},[127],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8754,8752],{"__ignoreMap":79},[10,8756,134],{},[14,8758,137],{"id":137},[139,8760,8761,8767],{},[56,8762,8763,8766],{},[33,8764,8765],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[56,8768,8769],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[320,8771,2689],{"id":2689},[10,8773,8774],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8776,8777],{},[26,8778],{"alt":8779,"src":8780},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8782,8783],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8785,163],{"id":163},[53,8787,8788,8791],{},[56,8789,8790],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[56,8792,8793],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8795,178],{"id":178},[139,8797,8798,8801],{},[56,8799,8800],{},"为负数进度增加测试。",[56,8802,8803],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8805,196],{},[14,8807,199],{"id":199},[10,8809,8810],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,8812,206],{},{"title":79,"searchDepth":92,"depth":92,"links":8814},[8815,8816,8817,8818,8819,8822,8823,8824],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":8820},[8821],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8633,"description":8638},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[217,8832,8833],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8836,"title":8837,"body":8838,"category":217,"cover":218,"description":8842,"extension":219,"meta":9142,"navigation":107,"path":9143,"pinned":222,"publishedAt":223,"seo":9144,"slug":9145,"stem":9146,"summary":9147,"tags":9148,"updatedAt":223,"visible":107,"__hash__":9151},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8839,"toc":9129},[8840,8843,8845,8848,8850,8856,8859,8861,8876,8878,8880,9027,9029,9035,9037,9039,9052,9054,9057,9063,9066,9068,9071,9077,9084,9086,9097,9099,9120,9122,9124,9127],[10,8841,8842],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8844,16],{"id":16},[10,8846,8847],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8849,22],{"id":22},[10,8851,8852],{},[26,8853],{"alt":8854,"src":8855},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8857,8858],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8860,51],{"id":51},[53,8862,8863,8866,8869],{},[56,8864,8865],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[56,8867,8868],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[56,8870,8871,8872,8875],{},"实际扩展前先为 ",[33,8873,8874],{},"add()"," 和存储边界补充测试。",[14,8877,69],{"id":69},[10,8879,72],{},[74,8881,8883],{"className":76,"code":8882,"language":78,"meta":79,"style":79},"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",[33,8884,8885,8889,8893,8897,8902,8907,8912,8917,8921,8926,8931,8936,8941,8946,8950,8955,8960,8966,8971,8977,8982,8987,8993,8999,9005,9010,9016,9021],{"__ignoreMap":79},[83,8886,8887],{"class":85,"line":86},[83,8888,6940],{},[83,8890,8891],{"class":85,"line":92},[83,8892,6549],{},[83,8894,8895],{"class":85,"line":98},[83,8896,108],{"emptyLinePlaceholder":107},[83,8898,8899],{"class":85,"line":104},[83,8900,8901],{},"class LearningRecords:\n",[83,8903,8904],{"class":85,"line":111},[83,8905,8906],{},"    def __init__(self, file_path):\n",[83,8908,8909],{"class":85,"line":117},[83,8910,8911],{},"        self.file_path = Path(file_path)\n",[83,8913,8914],{"class":85,"line":2479},[83,8915,8916],{},"        self.items = []\n",[83,8918,8919],{"class":85,"line":2485},[83,8920,108],{"emptyLinePlaceholder":107},[83,8922,8923],{"class":85,"line":3898},[83,8924,8925],{},"    def add(self, title):\n",[83,8927,8928],{"class":85,"line":4110},[83,8929,8930],{},"        title = title.strip()\n",[83,8932,8933],{"class":85,"line":5775},[83,8934,8935],{},"        if not title:\n",[83,8937,8938],{"class":85,"line":5780},[83,8939,8940],{},"            raise ValueError(\"课程名称不能为空\")\n",[83,8942,8943],{"class":85,"line":7385},[83,8944,8945],{},"        self.items.append({\"title\": title, \"done\": False})\n",[83,8947,8948],{"class":85,"line":7391},[83,8949,108],{"emptyLinePlaceholder":107},[83,8951,8952],{"class":85,"line":8514},[83,8953,8954],{},"    def save(self):\n",[83,8956,8957],{"class":85,"line":8519},[83,8958,8959],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[83,8961,8963],{"class":85,"line":8962},17,[83,8964,8965],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[83,8967,8969],{"class":85,"line":8968},18,[83,8970,108],{"emptyLinePlaceholder":107},[83,8972,8974],{"class":85,"line":8973},19,[83,8975,8976],{},"records = LearningRecords(\"learning-records.json\")\n",[83,8978,8980],{"class":85,"line":8979},20,[83,8981,108],{"emptyLinePlaceholder":107},[83,8983,8985],{"class":85,"line":8984},21,[83,8986,7358],{},[83,8988,8990],{"class":85,"line":8989},22,[83,8991,8992],{},"    title = input(\"输入已学习课程：\")\n",[83,8994,8996],{"class":85,"line":8995},23,[83,8997,8998],{},"    records.add(title)\n",[83,9000,9002],{"class":85,"line":9001},24,[83,9003,9004],{},"    records.save()\n",[83,9006,9008],{"class":85,"line":9007},25,[83,9009,7368],{},[83,9011,9013],{"class":85,"line":9012},26,[83,9014,9015],{},"    print(\"无法保存：\", error)\n",[83,9017,9019],{"class":85,"line":9018},27,[83,9020,1138],{},[83,9022,9024],{"class":85,"line":9023},28,[83,9025,9026],{},"    print(\"已保存 1 条学习记录\")\n",[10,9028,123],{},[74,9030,9033],{"className":9031,"code":9032,"language":129,"meta":79},[127],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9034,9032],{"__ignoreMap":79},[10,9036,134],{},[14,9038,137],{"id":137},[139,9040,9041,9047],{},[56,9042,9043,9044,9046],{},"输入层取得课程名后，",[33,9045,8874],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[56,9048,9049,9051],{},[33,9050,8106],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[320,9053,2689],{"id":2689},[10,9055,9056],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9058,9059],{},[26,9060],{"alt":9061,"src":9062},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9064,9065],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[320,9067,2689],{"id":4165},[10,9069,9070],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9072,9073],{},[26,9074],{"alt":9075,"src":9076},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9078,9079,9080,9083],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9081,9082],{},"load()"," 把文件状态恢复到内存。",[14,9085,163],{"id":163},[53,9087,9088,9091],{},[56,9089,9090],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[56,9092,9093,9094,9096],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9095,9082],{}," 是下一项必要扩展。",[14,9098,178],{"id":178},[139,9100,9101,9107,9110],{},[56,9102,9103,9104,9106],{},"增加 ",[33,9105,9082],{},"，文件不存在时从空列表开始。",[56,9108,9109],{},"增加按序号标记完成的功能，并校验序号范围。",[56,9111,9112,9113,9116,9117,9119],{},"把输入循环放进 ",[33,9114,9115],{},"main()","，通过 ",[33,9118,6084],{}," 控制程序入口。",[10,9121,196],{},[14,9123,199],{"id":199},[10,9125,9126],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[204,9128,206],{},{"title":79,"searchDepth":92,"depth":92,"links":9130},[9131,9132,9133,9134,9135,9139,9140,9141],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":9136},[9137,9138],{"id":2689,"depth":98,"text":2689},{"id":4165,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8837,"description":8842},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[217,9149,9150],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9153,9256,9375,9506,9649,9774,9911,10048,10189,10358,10495,10628,10751,10880,11007,11170,11346,11487,11616,11765,11908,12029,12152,12301,12454,12619,12746,12927,13070,13227,13378,13525,13680,13898,14053,14228,14379,14546,14733,14896,15138,15378],{"id":1385,"title":1386,"body":9154,"category":217,"cover":218,"description":1391,"extension":219,"meta":9253,"navigation":107,"path":1510,"pinned":222,"publishedAt":223,"seo":9254,"slug":1512,"stem":1513,"summary":1514,"tags":9255,"updatedAt":223,"visible":107,"__hash__":1517},{"type":7,"value":9155,"toc":9243},[9156,9158,9160,9162,9164,9168,9172,9174,9184,9186,9188,9196,9198,9203,9205,9207,9217,9219,9227,9229,9235,9237,9239,9241],[10,9157,1391],{},[14,9159,16],{"id":16},[10,9161,1396],{},[14,9163,22],{"id":22},[10,9165,9166],{},[26,9167],{"alt":1403,"src":1404},[10,9169,9170,1409],{},[33,9171,1163],{},[14,9173,51],{"id":51},[53,9175,9176,9180,9182],{},[56,9177,1416,9178,1419],{},[33,9179,1163],{},[56,9181,1422],{},[56,9183,1425],{},[14,9185,69],{"id":69},[10,9187,72],{},[74,9189,9190],{"className":76,"code":1432,"language":78,"meta":79,"style":79},[33,9191,9192],{"__ignoreMap":79},[83,9193,9194],{"class":85,"line":86},[83,9195,1432],{},[10,9197,123],{},[74,9199,9201],{"className":9200,"code":1444,"language":129,"meta":79},[127],[33,9202,1444],{"__ignoreMap":79},[10,9204,134],{},[14,9206,137],{"id":137},[139,9208,9209,9213],{},[56,9210,1455,9211,1459],{},[33,9212,1458],{},[56,9214,1462,9215,1466],{},[33,9216,1465],{},[14,9218,163],{"id":163},[53,9220,9221,9223],{},[56,9222,1473],{},[56,9224,1476,9225,1479],{},[33,9226,1163],{},[14,9228,178],{"id":178},[139,9230,9231,9233],{},[56,9232,1486],{},[56,9234,1489],{},[10,9236,196],{},[14,9238,199],{"id":199},[10,9240,1496],{},[204,9242,206],{},{"title":79,"searchDepth":92,"depth":92,"links":9244},[9245,9246,9247,9248,9249,9250,9251,9252],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":1386,"description":1391},[217,1381,1516],{"id":1519,"title":1520,"body":9257,"category":217,"cover":218,"description":1525,"extension":219,"meta":9372,"navigation":107,"path":1662,"pinned":222,"publishedAt":223,"seo":9373,"slug":1664,"stem":1665,"summary":1666,"tags":9374,"updatedAt":223,"visible":107,"__hash__":1669},{"type":7,"value":9258,"toc":9362},[9259,9261,9263,9265,9267,9271,9275,9277,9287,9289,9291,9311,9313,9318,9320,9322,9332,9334,9344,9346,9354,9356,9358,9360],[10,9260,1525],{},[14,9262,16],{"id":16},[10,9264,1530],{},[14,9266,22],{"id":22},[10,9268,9269],{},[26,9270],{"alt":1537,"src":1538},[10,9272,1541,9273,1544],{},[33,9274,683],{},[14,9276,51],{"id":51},[53,9278,9279,9281,9283],{},[56,9280,1551],{},[56,9282,1554],{},[56,9284,1557,9285,1561],{},[33,9286,1560],{},[14,9288,69],{"id":69},[10,9290,1566],{},[74,9292,9293],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,9294,9295,9301],{"__ignoreMap":79},[83,9296,9297,9299],{"class":85,"line":86},[83,9298,683],{"class":592},[83,9300,596],{"class":595},[83,9302,9303,9305,9307,9309],{"class":85,"line":92},[83,9304,683],{"class":592},[83,9306,625],{"class":595},[83,9308,629],{"class":628},[83,9310,596],{"class":595},[10,9312,123],{},[74,9314,9316],{"className":9315,"code":1592,"language":129,"meta":79},[127],[33,9317,1592],{"__ignoreMap":79},[10,9319,134],{},[14,9321,137],{"id":137},[139,9323,9324,9328],{},[56,9325,9326,1606],{},[33,9327,1605],{},[56,9329,9330,1611],{},[33,9331,691],{},[14,9333,163],{"id":163},[53,9335,9336,9340],{},[56,9337,1618,9338,1621],{},[33,9339,683],{},[56,9341,1624,9342,1627],{},[33,9343,683],{},[14,9345,178],{"id":178},[139,9347,9348,9352],{},[56,9349,930,9350,1637],{},[33,9351,1636],{},[56,9353,1640],{},[10,9355,196],{},[14,9357,199],{"id":199},[10,9359,1647],{},[204,9361,1650],{},{"title":79,"searchDepth":92,"depth":92,"links":9363},[9364,9365,9366,9367,9368,9369,9370,9371],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":1520,"description":1525},[217,1668,1044],{"id":1671,"title":1672,"body":9376,"category":217,"cover":218,"description":1837,"extension":219,"meta":9503,"navigation":107,"path":1839,"pinned":222,"publishedAt":223,"seo":9504,"slug":1841,"stem":1842,"summary":1843,"tags":9505,"updatedAt":223,"visible":107,"__hash__":1847},{"type":7,"value":9377,"toc":9493},[9378,9382,9384,9386,9388,9392,9394,9396,9412,9414,9416,9436,9438,9443,9445,9447,9459,9461,9471,9473,9483,9485,9487,9491],[10,9379,1677,9380,1680],{},[33,9381,1163],{},[14,9383,16],{"id":16},[10,9385,1685],{},[14,9387,22],{"id":22},[10,9389,9390],{},[26,9391],{"alt":1692,"src":1693},[10,9393,1696],{},[14,9395,51],{"id":51},[53,9397,9398,9404,9408],{},[56,9399,1703,9400,1706,9402,354],{},[33,9401,683],{},[33,9403,1709],{},[56,9405,186,9406,1715],{},[33,9407,1714],{},[56,9409,1718,9410,1721],{},[33,9411,1163],{},[14,9413,69],{"id":69},[10,9415,72],{},[74,9417,9418],{"className":1728,"code":1729,"language":1730,"meta":79,"style":79},[33,9419,9420,9424,9428,9432],{"__ignoreMap":79},[83,9421,9422],{"class":85,"line":86},[83,9423,1737],{},[83,9425,9426],{"class":85,"line":92},[83,9427,1742],{},[83,9429,9430],{"class":85,"line":98},[83,9431,1747],{},[83,9433,9434],{"class":85,"line":104},[83,9435,1752],{},[10,9437,123],{},[74,9439,9441],{"className":9440,"code":1758,"language":129,"meta":79},[127],[33,9442,1758],{"__ignoreMap":79},[10,9444,134],{},[14,9446,137],{"id":137},[139,9448,9449,9455],{},[56,9450,1769,9451,1773,9453,354],{},[33,9452,1772],{},[33,9454,1776],{},[56,9456,1779,9457,1782],{},[33,9458,1465],{},[14,9460,163],{"id":163},[53,9462,9463,9469],{},[56,9464,1789,9465,1792,9467,1795],{},[33,9466,1709],{},[33,9468,1163],{},[56,9470,1798],{},[14,9472,178],{"id":178},[139,9474,9475,9479],{},[56,9476,1805,9477,354],{},[33,9478,1808],{},[56,9480,1811,9481,1814],{},[33,9482,1465],{},[10,9484,196],{},[14,9486,199],{"id":199},[10,9488,1821,9489,1824],{},[33,9490,1163],{},[204,9492,206],{},{"title":79,"searchDepth":92,"depth":92,"links":9494},[9495,9496,9497,9498,9499,9500,9501,9502],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":1672,"description":1837},[217,1845,1846],{"id":1849,"title":1850,"body":9507,"category":217,"cover":218,"description":1855,"extension":219,"meta":9646,"navigation":107,"path":2027,"pinned":222,"publishedAt":223,"seo":9647,"slug":2029,"stem":2030,"summary":2031,"tags":9648,"updatedAt":223,"visible":107,"__hash__":2035},{"type":7,"value":9508,"toc":9636},[9509,9511,9513,9515,9517,9521,9525,9527,9539,9541,9543,9579,9581,9586,9588,9590,9606,9608,9618,9620,9628,9630,9632,9634],[10,9510,1855],{},[14,9512,16],{"id":16},[10,9514,1860],{},[14,9516,22],{"id":22},[10,9518,9519],{},[26,9520],{"alt":1867,"src":1868},[10,9522,9523,1874],{},[33,9524,1873],{},[14,9526,51],{"id":51},[53,9528,9529,9531,9537],{},[56,9530,1881],{},[56,9532,9533,1887,9535,1891],{},[33,9534,1886],{},[33,9536,1890],{},[56,9538,1894],{},[14,9540,69],{"id":69},[10,9542,1566],{},[74,9544,9545],{"className":583,"code":1901,"language":585,"meta":79,"style":79},[33,9546,9547,9553,9559,9563,9573],{"__ignoreMap":79},[83,9548,9549,9551],{"class":85,"line":86},[83,9550,1908],{"class":592},[83,9552,1911],{"class":628},[83,9554,9555,9557],{"class":85,"line":92},[83,9556,1916],{"class":595},[83,9558,1911],{"class":628},[83,9560,9561],{"class":85,"line":98},[83,9562,1923],{"class":595},[83,9564,9565,9567,9569,9571],{"class":85,"line":104},[83,9566,1928],{"class":595},[83,9568,1931],{"class":628},[83,9570,1935],{"class":1934},[83,9572,1207],{"class":628},[83,9574,9575,9577],{"class":85,"line":111},[83,9576,683],{"class":592},[83,9578,1207],{"class":628},[10,9580,123],{},[74,9582,9584],{"className":9583,"code":1949,"language":129,"meta":79},[127],[33,9585,1949],{"__ignoreMap":79},[10,9587,134],{},[14,9589,137],{"id":137},[139,9591,9592,9600],{},[56,9593,9594,1962,9596,1965,9598,1968],{},[33,9595,1908],{},[33,9597,1916],{},[33,9599,1886],{},[56,9601,9602,1973,9604,1977],{},[33,9603,1873],{},[33,9605,1976],{},[14,9607,163],{"id":163},[53,9609,9610,9616],{},[56,9611,1984,9612,1149,9614,354],{},[33,9613,1886],{},[33,9615,1890],{},[56,9617,1991],{},[14,9619,178],{"id":178},[139,9621,9622,9626],{},[56,9623,1998,9624,2002],{},[33,9625,2001],{},[56,9627,2005],{},[10,9629,196],{},[14,9631,199],{"id":199},[10,9633,2012],{},[204,9635,2015],{},{"title":79,"searchDepth":92,"depth":92,"links":9637},[9638,9639,9640,9641,9642,9643,9644,9645],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":1850,"description":1855},[217,2033,2034],{"id":2037,"title":2038,"body":9650,"category":217,"cover":218,"description":2043,"extension":219,"meta":9771,"navigation":107,"path":2192,"pinned":222,"publishedAt":223,"seo":9772,"slug":2194,"stem":2195,"summary":2196,"tags":9773,"updatedAt":223,"visible":107,"__hash__":2200},{"type":7,"value":9651,"toc":9761},[9652,9654,9656,9658,9660,9664,9672,9674,9688,9690,9692,9708,9710,9715,9717,9719,9733,9735,9741,9743,9753,9755,9757,9759],[10,9653,2043],{},[14,9655,16],{"id":16},[10,9657,2048],{},[14,9659,22],{"id":22},[10,9661,9662],{},[26,9663],{"alt":2055,"src":2056},[10,9665,2059,9666,354,9668,2065,9670,354],{},[33,9667,1465],{},[33,9669,2064],{},[33,9671,1772],{},[14,9673,51],{"id":51},[53,9675,9676,9680,9686],{},[56,9677,9678,2077],{},[33,9679,2076],{},[56,9681,9682,2083,9684,354],{},[33,9683,2082],{},[33,9685,2086],{},[56,9687,2089],{},[14,9689,69],{"id":69},[10,9691,72],{},[74,9693,9694],{"className":76,"code":2096,"language":78,"meta":79,"style":79},[33,9695,9696,9700,9704],{"__ignoreMap":79},[83,9697,9698],{"class":85,"line":86},[83,9699,2103],{},[83,9701,9702],{"class":85,"line":92},[83,9703,2108],{},[83,9705,9706],{"class":85,"line":98},[83,9707,2113],{},[10,9709,123],{},[74,9711,9713],{"className":9712,"code":2119,"language":129,"meta":79},[127],[33,9714,2119],{"__ignoreMap":79},[10,9716,134],{},[14,9718,137],{"id":137},[139,9720,9721,9727],{},[56,9722,9723,2133,9725,354],{},[33,9724,2132],{},[33,9726,2086],{},[56,9728,9729,2140,9731,2144],{},[33,9730,1465],{},[33,9732,2143],{},[14,9734,163],{"id":163},[53,9736,9737,9739],{},[56,9738,2151],{},[56,9740,2154],{},[14,9742,178],{"id":178},[139,9744,9745,9747],{},[56,9746,2161],{},[56,9748,2164,9749,2167,9751,2171],{},[33,9750,2064],{},[33,9752,2170],{},[10,9754,196],{},[14,9756,199],{"id":199},[10,9758,2178],{},[204,9760,206],{},{"title":79,"searchDepth":92,"depth":92,"links":9762},[9763,9764,9765,9766,9767,9768,9769,9770],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":2038,"description":2043},[217,2198,2199],{"id":2202,"title":2203,"body":9775,"category":217,"cover":218,"description":2208,"extension":219,"meta":9908,"navigation":107,"path":2375,"pinned":222,"publishedAt":223,"seo":9909,"slug":2377,"stem":2378,"summary":2379,"tags":9910,"updatedAt":223,"visible":107,"__hash__":2383},{"type":7,"value":9776,"toc":9898},[9777,9779,9781,9783,9785,9789,9791,9793,9809,9811,9813,9837,9839,9844,9846,9848,9864,9866,9878,9880,9890,9892,9894,9896],[10,9778,2208],{},[14,9780,16],{"id":16},[10,9782,2213],{},[14,9784,22],{"id":22},[10,9786,9787],{},[26,9788],{"alt":2220,"src":2221},[10,9790,2224],{},[14,9792,51],{"id":51},[53,9794,9795,9797,9803],{},[56,9796,2231],{},[56,9798,2234,9799,2167,9801,2241],{},[33,9800,2237],{},[33,9802,2240],{},[56,9804,2244,9805,2248,9807,2252],{},[33,9806,2247],{},[33,9808,2251],{},[14,9810,69],{"id":69},[10,9812,72],{},[74,9814,9815],{"className":76,"code":2259,"language":78,"meta":79,"style":79},[33,9816,9817,9821,9825,9829,9833],{"__ignoreMap":79},[83,9818,9819],{"class":85,"line":86},[83,9820,2266],{},[83,9822,9823],{"class":85,"line":92},[83,9824,2271],{},[83,9826,9827],{"class":85,"line":98},[83,9828,108],{"emptyLinePlaceholder":107},[83,9830,9831],{"class":85,"line":104},[83,9832,2280],{},[83,9834,9835],{"class":85,"line":111},[83,9836,2271],{},[10,9838,123],{},[74,9840,9842],{"className":9841,"code":2290,"language":129,"meta":79},[127],[33,9843,2290],{"__ignoreMap":79},[10,9845,134],{},[14,9847,137],{"id":137},[139,9849,9850,9856],{},[56,9851,930,9852,2304,9854,2307],{},[33,9853,2303],{},[33,9855,2237],{},[56,9857,930,9858,2313,9860,2317,9862,354],{},[33,9859,2312],{},[33,9861,2316],{},[33,9863,2320],{},[14,9865,163],{"id":163},[53,9867,9868,9870],{},[56,9869,2327],{},[56,9871,2330,9872,2248,9874,2248,9876,2337],{},[33,9873,2247],{},[33,9875,2251],{},[33,9877,229],{},[14,9879,178],{"id":178},[139,9881,9882,9888],{},[56,9883,2344,9884,1149,9886,2351],{},[33,9885,2347],{},[33,9887,2350],{},[56,9889,2354],{},[10,9891,196],{},[14,9893,199],{"id":199},[10,9895,2361],{},[204,9897,206],{},{"title":79,"searchDepth":92,"depth":92,"links":9899},[9900,9901,9902,9903,9904,9905,9906,9907],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":2203,"description":2208},[217,2381,2382],{"id":2385,"title":2386,"body":9912,"category":217,"cover":218,"description":2391,"extension":219,"meta":10045,"navigation":107,"path":2558,"pinned":222,"publishedAt":223,"seo":10046,"slug":2560,"stem":2561,"summary":2562,"tags":10047,"updatedAt":223,"visible":107,"__hash__":2566},{"type":7,"value":9913,"toc":10035},[9914,9916,9918,9920,9922,9926,9928,9930,9948,9950,9952,9988,9990,9995,9997,9999,10009,10011,10019,10021,10027,10029,10031,10033],[10,9915,2391],{},[14,9917,16],{"id":16},[10,9919,2396],{},[14,9921,22],{"id":22},[10,9923,9924],{},[26,9925],{"alt":2403,"src":2404},[10,9927,2407],{},[14,9929,51],{"id":51},[53,9931,9932,9938,9946],{},[56,9933,9934,2417,9936,2421],{},[33,9935,2416],{},[33,9937,2420],{},[56,9939,9940,2427,9942,2431,9944,2435],{},[33,9941,2426],{},[33,9943,2430],{},[33,9945,2434],{},[56,9947,2438],{},[14,9949,69],{"id":69},[10,9951,72],{},[74,9953,9954],{"className":76,"code":2445,"language":78,"meta":79,"style":79},[33,9955,9956,9960,9964,9968,9972,9976,9980,9984],{"__ignoreMap":79},[83,9957,9958],{"class":85,"line":86},[83,9959,2452],{},[83,9961,9962],{"class":85,"line":92},[83,9963,2457],{},[83,9965,9966],{"class":85,"line":98},[83,9967,2462],{},[83,9969,9970],{"class":85,"line":104},[83,9971,108],{"emptyLinePlaceholder":107},[83,9973,9974],{"class":85,"line":111},[83,9975,2471],{},[83,9977,9978],{"class":85,"line":117},[83,9979,2476],{},[83,9981,9982],{"class":85,"line":2479},[83,9983,2482],{},[83,9985,9986],{"class":85,"line":2485},[83,9987,2488],{},[10,9989,123],{},[74,9991,9993],{"className":9992,"code":2494,"language":129,"meta":79},[127],[33,9994,2494],{"__ignoreMap":79},[10,9996,134],{},[14,9998,137],{"id":137},[139,10000,10001,10005],{},[56,10002,10003,2508],{},[33,10004,2507],{},[56,10006,10007,2514],{},[33,10008,2513],{},[14,10010,163],{"id":163},[53,10012,10013,10017],{},[56,10014,2521,10015,354],{},[33,10016,2524],{},[56,10018,2527],{},[14,10020,178],{"id":178},[139,10022,10023,10025],{},[56,10024,2534],{},[56,10026,2537],{},[10,10028,196],{},[14,10030,199],{"id":199},[10,10032,2544],{},[204,10034,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10036},[10037,10038,10039,10040,10041,10042,10043,10044],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":2386,"description":2391},[217,2564,2565],{"id":2568,"title":2569,"body":10049,"category":217,"cover":218,"description":2574,"extension":219,"meta":10186,"navigation":107,"path":2751,"pinned":222,"publishedAt":223,"seo":10187,"slug":2753,"stem":2754,"summary":2755,"tags":10188,"updatedAt":223,"visible":107,"__hash__":2759},{"type":7,"value":10050,"toc":10174},[10051,10053,10055,10057,10059,10063,10069,10071,10079,10081,10083,10107,10109,10114,10116,10118,10136,10138,10140,10144,10146,10148,10154,10156,10166,10168,10170,10172],[10,10052,2574],{},[14,10054,16],{"id":16},[10,10056,2579],{},[14,10058,22],{"id":22},[10,10060,10061],{},[26,10062],{"alt":2586,"src":2587},[10,10064,2590,10065,2594,10067,354],{},[33,10066,2593],{},[33,10068,2597],{},[14,10070,51],{"id":51},[53,10072,10073,10075,10077],{},[56,10074,2604],{},[56,10076,2607],{},[56,10078,2610],{},[14,10080,69],{"id":69},[10,10082,72],{},[74,10084,10085],{"className":76,"code":2617,"language":78,"meta":79,"style":79},[33,10086,10087,10091,10095,10099,10103],{"__ignoreMap":79},[83,10088,10089],{"class":85,"line":86},[83,10090,2624],{},[83,10092,10093],{"class":85,"line":92},[83,10094,2629],{},[83,10096,10097],{"class":85,"line":98},[83,10098,2634],{},[83,10100,10101],{"class":85,"line":104},[83,10102,2639],{},[83,10104,10105],{"class":85,"line":111},[83,10106,2644],{},[10,10108,123],{},[74,10110,10112],{"className":10111,"code":2650,"language":129,"meta":79},[127],[33,10113,2650],{"__ignoreMap":79},[10,10115,134],{},[14,10117,137],{"id":137},[139,10119,10120,10128],{},[56,10121,2661,10122,2664,10124,2668,10126,2672],{},[33,10123,217],{},[33,10125,2667],{},[33,10127,2671],{},[56,10129,10130,2678,10132,2682,10134,2686],{},[33,10131,2677],{},[33,10133,2681],{},[33,10135,2685],{},[320,10137,2689],{"id":2689},[10,10139,2692],{},[10,10141,10142],{},[26,10143],{"alt":2697,"src":2698},[10,10145,2701],{},[14,10147,163],{"id":163},[53,10149,10150,10152],{},[56,10151,2708],{},[56,10153,2711],{},[14,10155,178],{"id":178},[139,10157,10158,10164],{},[56,10159,2718,10160,2722,10162,354],{},[33,10161,2721],{},[33,10163,2725],{},[56,10165,2728],{},[10,10167,196],{},[14,10169,199],{"id":199},[10,10171,2735],{},[204,10173,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10175},[10176,10177,10178,10179,10180,10183,10184,10185],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":10181},[10182],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":2569,"description":2574},[217,2757,2758],{"id":2761,"title":2762,"body":10190,"category":217,"cover":218,"description":2767,"extension":219,"meta":10355,"navigation":107,"path":2982,"pinned":222,"publishedAt":223,"seo":10356,"slug":2984,"stem":2985,"summary":2986,"tags":10357,"updatedAt":223,"visible":107,"__hash__":2990},{"type":7,"value":10191,"toc":10343},[10192,10194,10196,10198,10200,10204,10210,10212,10232,10234,10236,10272,10274,10279,10281,10283,10297,10299,10301,10305,10311,10313,10323,10325,10335,10337,10339,10341],[10,10193,2767],{},[14,10195,16],{"id":16},[10,10197,2772],{},[14,10199,22],{"id":22},[10,10201,10202],{},[26,10203],{"alt":2779,"src":2780},[10,10205,2783,10206,1001,10208,2790],{},[33,10207,2786],{},[33,10209,2789],{},[14,10211,51],{"id":51},[53,10213,10214,10222,10230],{},[56,10215,10216,2800,10218,2804,10220,2808],{},[33,10217,2799],{},[33,10219,2803],{},[33,10221,2807],{},[56,10223,10224,2814,10226,2818,10228,2822],{},[33,10225,2813],{},[33,10227,2817],{},[33,10229,2821],{},[56,10231,2825],{},[14,10233,69],{"id":69},[10,10235,72],{},[74,10237,10238],{"className":76,"code":2832,"language":78,"meta":79,"style":79},[33,10239,10240,10244,10248,10252,10256,10260,10264,10268],{"__ignoreMap":79},[83,10241,10242],{"class":85,"line":86},[83,10243,2839],{},[83,10245,10246],{"class":85,"line":92},[83,10247,2844],{},[83,10249,10250],{"class":85,"line":98},[83,10251,108],{"emptyLinePlaceholder":107},[83,10253,10254],{"class":85,"line":104},[83,10255,2853],{},[83,10257,10258],{"class":85,"line":111},[83,10259,2858],{},[83,10261,10262],{"class":85,"line":117},[83,10263,2863],{},[83,10265,10266],{"class":85,"line":2479},[83,10267,2868],{},[83,10269,10270],{"class":85,"line":2485},[83,10271,2873],{},[10,10273,123],{},[74,10275,10277],{"className":10276,"code":2879,"language":129,"meta":79},[127],[33,10278,2879],{"__ignoreMap":79},[10,10280,134],{},[14,10282,137],{"id":137},[139,10284,10285,10291],{},[56,10286,10287,2893,10289,2897],{},[33,10288,2892],{},[33,10290,2896],{},[56,10292,10293,2903,10295,2906],{},[33,10294,2902],{},[33,10296,2821],{},[320,10298,2689],{"id":2689},[10,10300,2911],{},[10,10302,10303],{},[26,10304],{"alt":2916,"src":2917},[10,10306,10307,2922,10309,2925],{},[33,10308,2813],{},[33,10310,2817],{},[14,10312,163],{"id":163},[53,10314,10315,10321],{},[56,10316,2932,10317,2935,10319,2938],{},[33,10318,2807],{},[33,10320,2799],{},[56,10322,2941],{},[14,10324,178],{"id":178},[139,10326,10327,10331],{},[56,10328,2948,10329,2952],{},[33,10330,2951],{},[56,10332,2955,10333,2959],{},[33,10334,2958],{},[10,10336,196],{},[14,10338,199],{"id":199},[10,10340,2966],{},[204,10342,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10344},[10345,10346,10347,10348,10349,10352,10353,10354],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":10350},[10351],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":2762,"description":2767},[217,2988,2989],{"id":4,"title":5,"body":10359,"category":217,"cover":218,"description":12,"extension":219,"meta":10492,"navigation":107,"path":221,"pinned":222,"publishedAt":223,"seo":10493,"slug":225,"stem":226,"summary":227,"tags":10494,"updatedAt":223,"visible":107,"__hash__":231},{"type":7,"value":10360,"toc":10482},[10361,10363,10365,10367,10369,10373,10383,10385,10395,10397,10399,10427,10429,10434,10436,10438,10452,10454,10462,10464,10474,10476,10478,10480],[10,10362,12],{},[14,10364,16],{"id":16},[10,10366,19],{},[14,10368,22],{"id":22},[10,10370,10371],{},[26,10372],{"alt":28,"src":29},[10,10374,10375,36,10377,40,10379,44,10381,48],{},[33,10376,35],{},[33,10378,39],{},[33,10380,43],{},[33,10382,47],{},[14,10384,51],{"id":51},[53,10386,10387,10389,10393],{},[56,10388,58],{},[56,10390,10391,63],{},[33,10392,47],{},[56,10394,66],{},[14,10396,69],{"id":69},[10,10398,72],{},[74,10400,10401],{"className":76,"code":77,"language":78,"meta":79,"style":79},[33,10402,10403,10407,10411,10415,10419,10423],{"__ignoreMap":79},[83,10404,10405],{"class":85,"line":86},[83,10406,89],{},[83,10408,10409],{"class":85,"line":92},[83,10410,95],{},[83,10412,10413],{"class":85,"line":98},[83,10414,101],{},[83,10416,10417],{"class":85,"line":104},[83,10418,108],{"emptyLinePlaceholder":107},[83,10420,10421],{"class":85,"line":111},[83,10422,114],{},[83,10424,10425],{"class":85,"line":117},[83,10426,120],{},[10,10428,123],{},[74,10430,10432],{"className":10431,"code":128,"language":129,"meta":79},[127],[33,10433,128],{"__ignoreMap":79},[10,10435,134],{},[14,10437,137],{"id":137},[139,10439,10440,10446],{},[56,10441,143,10442,146,10444,150],{},[33,10443,35],{},[33,10445,149],{},[56,10447,10448,156,10450,160],{},[33,10449,155],{},[33,10451,159],{},[14,10453,163],{"id":163},[53,10455,10456,10460],{},[56,10457,168,10458,172],{},[33,10459,171],{},[56,10461,175],{},[14,10463,178],{"id":178},[139,10465,10466,10468],{},[56,10467,183],{},[56,10469,186,10470,190,10472,193],{},[33,10471,189],{},[33,10473,47],{},[10,10475,196],{},[14,10477,199],{"id":199},[10,10479,202],{},[204,10481,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10483},[10484,10485,10486,10487,10488,10489,10490,10491],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5,"description":12},[217,229,230],{"id":3129,"title":3130,"body":10496,"category":217,"cover":218,"description":3135,"extension":219,"meta":10625,"navigation":107,"path":3296,"pinned":222,"publishedAt":223,"seo":10626,"slug":3298,"stem":3299,"summary":3300,"tags":10627,"updatedAt":223,"visible":107,"__hash__":3304},{"type":7,"value":10497,"toc":10615},[10498,10500,10502,10504,10506,10510,10514,10516,10526,10528,10530,10562,10564,10569,10571,10573,10585,10587,10597,10599,10607,10609,10611,10613],[10,10499,3135],{},[14,10501,16],{"id":16},[10,10503,3140],{},[14,10505,22],{"id":22},[10,10507,10508],{},[26,10509],{"alt":3147,"src":3148},[10,10511,3151,10512,3155],{},[33,10513,3154],{},[14,10515,51],{"id":51},[53,10517,10518,10520,10522],{},[56,10519,3162],{},[56,10521,3165],{},[56,10523,3168,10524,354],{},[33,10525,3171],{},[14,10527,69],{"id":69},[10,10529,72],{},[74,10531,10532],{"className":76,"code":3178,"language":78,"meta":79,"style":79},[33,10533,10534,10538,10542,10546,10550,10554,10558],{"__ignoreMap":79},[83,10535,10536],{"class":85,"line":86},[83,10537,3185],{},[83,10539,10540],{"class":85,"line":92},[83,10541,3190],{},[83,10543,10544],{"class":85,"line":98},[83,10545,108],{"emptyLinePlaceholder":107},[83,10547,10548],{"class":85,"line":104},[83,10549,3199],{},[83,10551,10552],{"class":85,"line":111},[83,10553,3204],{},[83,10555,10556],{"class":85,"line":117},[83,10557,3209],{},[83,10559,10560],{"class":85,"line":2479},[83,10561,3214],{},[10,10563,123],{},[74,10565,10567],{"className":10566,"code":3220,"language":129,"meta":79},[127],[33,10568,3220],{"__ignoreMap":79},[10,10570,134],{},[14,10572,137],{"id":137},[139,10574,10575,10577],{},[56,10576,3231],{},[56,10578,10579,3237,10581,3241,10583,3245],{},[33,10580,3236],{},[33,10582,3240],{},[33,10584,3244],{},[14,10586,163],{"id":163},[53,10588,10589,10595],{},[56,10590,3252,10591,3256,10593,354],{},[33,10592,3255],{},[33,10594,3259],{},[56,10596,3262],{},[14,10598,178],{"id":178},[139,10600,10601,10603],{},[56,10602,3269],{},[56,10604,3272,10605,3275],{},[33,10606,3244],{},[10,10608,196],{},[14,10610,199],{"id":199},[10,10612,3282],{},[204,10614,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10616},[10617,10618,10619,10620,10621,10622,10623,10624],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":3130,"description":3135},[217,3302,3303],{"id":3306,"title":3307,"body":10629,"category":217,"cover":218,"description":3312,"extension":219,"meta":10748,"navigation":107,"path":3454,"pinned":222,"publishedAt":223,"seo":10749,"slug":3456,"stem":3457,"summary":3458,"tags":10750,"updatedAt":223,"visible":107,"__hash__":3461},{"type":7,"value":10630,"toc":10738},[10631,10633,10635,10637,10639,10643,10645,10647,10655,10657,10659,10687,10689,10694,10696,10698,10708,10710,10718,10720,10730,10732,10734,10736],[10,10632,3312],{},[14,10634,16],{"id":16},[10,10636,3317],{},[14,10638,22],{"id":22},[10,10640,10641],{},[26,10642],{"alt":3324,"src":3325},[10,10644,3328],{},[14,10646,51],{"id":51},[53,10648,10649,10651,10653],{},[56,10650,3335],{},[56,10652,3338],{},[56,10654,3341],{},[14,10656,69],{"id":69},[10,10658,72],{},[74,10660,10661],{"className":76,"code":3348,"language":78,"meta":79,"style":79},[33,10662,10663,10667,10671,10675,10679,10683],{"__ignoreMap":79},[83,10664,10665],{"class":85,"line":86},[83,10666,3355],{},[83,10668,10669],{"class":85,"line":92},[83,10670,3360],{},[83,10672,10673],{"class":85,"line":98},[83,10674,3365],{},[83,10676,10677],{"class":85,"line":104},[83,10678,108],{"emptyLinePlaceholder":107},[83,10680,10681],{"class":85,"line":111},[83,10682,3374],{},[83,10684,10685],{"class":85,"line":117},[83,10686,3379],{},[10,10688,123],{},[74,10690,10692],{"className":10691,"code":3385,"language":129,"meta":79},[127],[33,10693,3385],{"__ignoreMap":79},[10,10695,134],{},[14,10697,137],{"id":137},[139,10699,10700,10704],{},[56,10701,10702,3399],{},[33,10703,3398],{},[56,10705,10706,3405],{},[33,10707,3404],{},[14,10709,163],{"id":163},[53,10711,10712,10716],{},[56,10713,3412,10714,3416],{},[33,10715,3415],{},[56,10717,3419],{},[14,10719,178],{"id":178},[139,10721,10722,10724],{},[56,10723,3426],{},[56,10725,2164,10726,2167,10728,3433],{},[33,10727,3415],{},[33,10729,3404],{},[10,10731,196],{},[14,10733,199],{"id":199},[10,10735,3440],{},[204,10737,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10739},[10740,10741,10742,10743,10744,10745,10746,10747],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":3307,"description":3312},[217,3460,3303],{"id":3463,"title":3464,"body":10752,"category":217,"cover":218,"description":3469,"extension":219,"meta":10877,"navigation":107,"path":3625,"pinned":222,"publishedAt":223,"seo":10878,"slug":3627,"stem":3628,"summary":3629,"tags":10879,"updatedAt":223,"visible":107,"__hash__":3632},{"type":7,"value":10753,"toc":10867},[10754,10756,10758,10760,10762,10766,10772,10774,10784,10786,10788,10816,10818,10823,10825,10827,10837,10839,10851,10853,10859,10861,10863,10865],[10,10755,3469],{},[14,10757,16],{"id":16},[10,10759,3474],{},[14,10761,22],{"id":22},[10,10763,10764],{},[26,10765],{"alt":3481,"src":3482},[10,10767,3485,10768,3489,10770,3492],{},[33,10769,3488],{},[33,10771,2237],{},[14,10773,51],{"id":51},[53,10775,10776,10778,10782],{},[56,10777,3499],{},[56,10779,2330,10780,3505],{},[33,10781,3504],{},[56,10783,3508],{},[14,10785,69],{"id":69},[10,10787,72],{},[74,10789,10790],{"className":76,"code":3515,"language":78,"meta":79,"style":79},[33,10791,10792,10796,10800,10804,10808,10812],{"__ignoreMap":79},[83,10793,10794],{"class":85,"line":86},[83,10795,3522],{},[83,10797,10798],{"class":85,"line":92},[83,10799,3527],{},[83,10801,10802],{"class":85,"line":98},[83,10803,108],{"emptyLinePlaceholder":107},[83,10805,10806],{"class":85,"line":104},[83,10807,3536],{},[83,10809,10810],{"class":85,"line":111},[83,10811,3541],{},[83,10813,10814],{"class":85,"line":117},[83,10815,3546],{},[10,10817,123],{},[74,10819,10821],{"className":10820,"code":3552,"language":129,"meta":79},[127],[33,10822,3552],{"__ignoreMap":79},[10,10824,134],{},[14,10826,137],{"id":137},[139,10828,10829,10831],{},[56,10830,3563],{},[56,10832,3566,10833,3569,10835,3573],{},[33,10834,2237],{},[33,10836,3572],{},[14,10838,163],{"id":163},[53,10840,10841,10845],{},[56,10842,3580,10843,3584],{},[33,10844,3583],{},[56,10846,3587,10847,3591,10849,354],{},[33,10848,3590],{},[33,10850,3594],{},[14,10852,178],{"id":178},[139,10854,10855,10857],{},[56,10856,3601],{},[56,10858,3604],{},[10,10860,196],{},[14,10862,199],{"id":199},[10,10864,3611],{},[204,10866,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10868},[10869,10870,10871,10872,10873,10874,10875,10876],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":3464,"description":3469},[217,3631,3303],{"id":3634,"title":3635,"body":10881,"category":217,"cover":218,"description":3640,"extension":219,"meta":11004,"navigation":107,"path":3790,"pinned":222,"publishedAt":223,"seo":11005,"slug":3792,"stem":3793,"summary":3794,"tags":11006,"updatedAt":223,"visible":107,"__hash__":3797},{"type":7,"value":10882,"toc":10994},[10883,10885,10887,10889,10891,10895,10897,10899,10911,10913,10915,10943,10945,10950,10952,10954,10964,10966,10976,10978,10986,10988,10990,10992],[10,10884,3640],{},[14,10886,16],{"id":16},[10,10888,3645],{},[14,10890,22],{"id":22},[10,10892,10893],{},[26,10894],{"alt":3652,"src":3653},[10,10896,3656],{},[14,10898,51],{"id":51},[53,10900,10901,10903,10905],{},[56,10902,3663],{},[56,10904,3666],{},[56,10906,3669,10907,3673,10909,3677],{},[33,10908,3672],{},[33,10910,3676],{},[14,10912,69],{"id":69},[10,10914,72],{},[74,10916,10917],{"className":76,"code":3684,"language":78,"meta":79,"style":79},[33,10918,10919,10923,10927,10931,10935,10939],{"__ignoreMap":79},[83,10920,10921],{"class":85,"line":86},[83,10922,3691],{},[83,10924,10925],{"class":85,"line":92},[83,10926,3696],{},[83,10928,10929],{"class":85,"line":98},[83,10930,108],{"emptyLinePlaceholder":107},[83,10932,10933],{"class":85,"line":104},[83,10934,3705],{},[83,10936,10937],{"class":85,"line":111},[83,10938,3710],{},[83,10940,10941],{"class":85,"line":117},[83,10942,3715],{},[10,10944,123],{},[74,10946,10948],{"className":10947,"code":3721,"language":129,"meta":79},[127],[33,10949,3721],{"__ignoreMap":79},[10,10951,134],{},[14,10953,137],{"id":137},[139,10955,10956,10958],{},[56,10957,3732],{},[56,10959,10960,3738,10962,3742],{},[33,10961,3737],{},[33,10963,3741],{},[14,10965,163],{"id":163},[53,10967,10968,10974],{},[56,10969,2330,10970,3751,10972,354],{},[33,10971,3676],{},[33,10973,3672],{},[56,10975,3756],{},[14,10977,178],{"id":178},[139,10979,10980,10984],{},[56,10981,3763,10982,3766],{},[33,10983,3672],{},[56,10985,3769],{},[10,10987,196],{},[14,10989,199],{"id":199},[10,10991,3776],{},[204,10993,206],{},{"title":79,"searchDepth":92,"depth":92,"links":10995},[10996,10997,10998,10999,11000,11001,11002,11003],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":3635,"description":3640},[217,3796,3303],{"id":3799,"title":3800,"body":11008,"category":217,"cover":218,"description":3805,"extension":219,"meta":11167,"navigation":107,"path":4004,"pinned":222,"publishedAt":223,"seo":11168,"slug":4006,"stem":4007,"summary":4008,"tags":11169,"updatedAt":223,"visible":107,"__hash__":4012},{"type":7,"value":11009,"toc":11155},[11010,11012,11014,11016,11018,11022,11028,11030,11042,11044,11046,11086,11088,11093,11095,11097,11111,11113,11115,11119,11121,11123,11133,11135,11147,11149,11151,11153],[10,11011,3805],{},[14,11013,16],{"id":16},[10,11015,3810],{},[14,11017,22],{"id":22},[10,11019,11020],{},[26,11021],{"alt":3817,"src":3818},[10,11023,11024,3824,11026,3828],{},[33,11025,3823],{},[33,11027,3827],{},[14,11029,51],{"id":51},[53,11031,11032,11038,11040],{},[56,11033,11034,3837,11036,3841],{},[33,11035,2799],{},[33,11037,3840],{},[56,11039,3844],{},[56,11041,3847],{},[14,11043,69],{"id":69},[10,11045,72],{},[74,11047,11048],{"className":76,"code":3854,"language":78,"meta":79,"style":79},[33,11049,11050,11054,11058,11062,11066,11070,11074,11078,11082],{"__ignoreMap":79},[83,11051,11052],{"class":85,"line":86},[83,11053,3861],{},[83,11055,11056],{"class":85,"line":92},[83,11057,3866],{},[83,11059,11060],{"class":85,"line":98},[83,11061,3871],{},[83,11063,11064],{"class":85,"line":104},[83,11065,108],{"emptyLinePlaceholder":107},[83,11067,11068],{"class":85,"line":111},[83,11069,3880],{},[83,11071,11072],{"class":85,"line":117},[83,11073,3885],{},[83,11075,11076],{"class":85,"line":2479},[83,11077,3890],{},[83,11079,11080],{"class":85,"line":2485},[83,11081,3895],{},[83,11083,11084],{"class":85,"line":3898},[83,11085,3901],{},[10,11087,123],{},[74,11089,11091],{"className":11090,"code":3907,"language":129,"meta":79},[127],[33,11092,3907],{"__ignoreMap":79},[10,11094,134],{},[14,11096,137],{"id":137},[139,11098,11099,11103],{},[56,11100,11101,3921],{},[33,11102,3920],{},[56,11104,11105,3927,11107,3931,11109,3935],{},[33,11106,3926],{},[33,11108,3930],{},[33,11110,3934],{},[320,11112,2689],{"id":2689},[10,11114,3940],{},[10,11116,11117],{},[26,11118],{"alt":3945,"src":3946},[10,11120,3949],{},[14,11122,163],{"id":163},[53,11124,11125,11131],{},[56,11126,3956,11127,3959,11129,354],{},[33,11128,2799],{},[33,11130,3840],{},[56,11132,3964],{},[14,11134,178],{"id":178},[139,11136,11137,11139],{},[56,11138,3971],{},[56,11140,2330,11141,3977,11143,1149,11145,354],{},[33,11142,3976],{},[33,11144,3840],{},[33,11146,2799],{},[10,11148,196],{},[14,11150,199],{"id":199},[10,11152,3988],{},[204,11154,206],{},{"title":79,"searchDepth":92,"depth":92,"links":11156},[11157,11158,11159,11160,11161,11164,11165,11166],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":11162},[11163],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":3800,"description":3805},[217,4010,4011],{"id":4014,"title":4015,"body":11171,"category":217,"cover":218,"description":4020,"extension":219,"meta":11343,"navigation":107,"path":4234,"pinned":222,"publishedAt":223,"seo":11344,"slug":4236,"stem":4237,"summary":4238,"tags":11345,"updatedAt":223,"visible":107,"__hash__":4241},{"type":7,"value":11172,"toc":11330},[11173,11175,11177,11179,11181,11185,11193,11195,11203,11205,11207,11251,11253,11258,11260,11262,11274,11276,11278,11282,11288,11290,11292,11296,11300,11302,11314,11316,11322,11324,11326,11328],[10,11174,4020],{},[14,11176,16],{"id":16},[10,11178,4025],{},[14,11180,22],{"id":22},[10,11182,11183],{},[26,11184],{"alt":4032,"src":4033},[10,11186,11187,2248,11189,2248,11191,4043],{},[33,11188,1148],{},[33,11190,4040],{},[33,11192,1152],{},[14,11194,51],{"id":51},[53,11196,11197,11199,11201],{},[56,11198,4050],{},[56,11200,4053],{},[56,11202,4056],{},[14,11204,69],{"id":69},[10,11206,72],{},[74,11208,11209],{"className":76,"code":4063,"language":78,"meta":79,"style":79},[33,11210,11211,11215,11219,11223,11227,11231,11235,11239,11243,11247],{"__ignoreMap":79},[83,11212,11213],{"class":85,"line":86},[83,11214,4070],{},[83,11216,11217],{"class":85,"line":92},[83,11218,108],{"emptyLinePlaceholder":107},[83,11220,11221],{"class":85,"line":98},[83,11222,4079],{},[83,11224,11225],{"class":85,"line":104},[83,11226,4084],{},[83,11228,11229],{"class":85,"line":111},[83,11230,4089],{},[83,11232,11233],{"class":85,"line":117},[83,11234,4094],{},[83,11236,11237],{"class":85,"line":2479},[83,11238,1138],{},[83,11240,11241],{"class":85,"line":2485},[83,11242,4103],{},[83,11244,11245],{"class":85,"line":3898},[83,11246,108],{"emptyLinePlaceholder":107},[83,11248,11249],{"class":85,"line":4110},[83,11250,4113],{},[10,11252,123],{},[74,11254,11256],{"className":11255,"code":4119,"language":129,"meta":79},[127],[33,11257,4119],{"__ignoreMap":79},[10,11259,134],{},[14,11261,137],{"id":137},[139,11263,11264,11268],{},[56,11265,4130,11266,4134],{},[33,11267,4133],{},[56,11269,11270,4140,11272,4143],{},[33,11271,4139],{},[33,11273,1152],{},[320,11275,2689],{"id":2689},[10,11277,4148],{},[10,11279,11280],{},[26,11281],{"alt":4153,"src":4154},[10,11283,11284,4159,11286,4162],{},[33,11285,4133],{},[33,11287,4139],{},[320,11289,2689],{"id":4165},[10,11291,4168],{},[10,11293,11294],{},[26,11295],{"alt":4173,"src":4174},[10,11297,4177,11298,4180],{},[33,11299,1148],{},[14,11301,163],{"id":163},[53,11303,11304,11308],{},[56,11305,4187,11306,4190],{},[33,11307,4139],{},[56,11309,4193,11310,4196,11312,4200],{},[33,11311,1148],{},[33,11313,4199],{},[14,11315,178],{"id":178},[139,11317,11318,11320],{},[56,11319,4207],{},[56,11321,4210],{},[10,11323,196],{},[14,11325,199],{"id":199},[10,11327,4217],{},[204,11329,206],{},{"title":79,"searchDepth":92,"depth":92,"links":11331},[11332,11333,11334,11335,11336,11340,11341,11342],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":11337},[11338,11339],{"id":2689,"depth":98,"text":2689},{"id":4165,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":4015,"description":4020},[217,1148,4240],{"id":4243,"title":4244,"body":11347,"category":217,"cover":218,"description":4249,"extension":219,"meta":11484,"navigation":107,"path":4416,"pinned":222,"publishedAt":223,"seo":11485,"slug":4418,"stem":4419,"summary":4420,"tags":11486,"updatedAt":223,"visible":107,"__hash__":4423},{"type":7,"value":11348,"toc":11472},[11349,11351,11353,11355,11357,11361,11365,11367,11377,11379,11381,11413,11415,11420,11422,11424,11434,11436,11438,11442,11446,11448,11454,11456,11464,11466,11468,11470],[10,11350,4249],{},[14,11352,16],{"id":16},[10,11354,4254],{},[14,11356,22],{"id":22},[10,11358,11359],{},[26,11360],{"alt":4261,"src":4262},[10,11362,11363,4268],{},[33,11364,4267],{},[14,11366,51],{"id":51},[53,11368,11369,11371,11373],{},[56,11370,4275],{},[56,11372,4278],{},[56,11374,4281,11375,4285],{},[33,11376,4284],{},[14,11378,69],{"id":69},[10,11380,72],{},[74,11382,11383],{"className":76,"code":4292,"language":78,"meta":79,"style":79},[33,11384,11385,11389,11393,11397,11401,11405,11409],{"__ignoreMap":79},[83,11386,11387],{"class":85,"line":86},[83,11388,4299],{},[83,11390,11391],{"class":85,"line":92},[83,11392,108],{"emptyLinePlaceholder":107},[83,11394,11395],{"class":85,"line":98},[83,11396,4308],{},[83,11398,11399],{"class":85,"line":104},[83,11400,4313],{},[83,11402,11403],{"class":85,"line":111},[83,11404,4318],{},[83,11406,11407],{"class":85,"line":117},[83,11408,108],{"emptyLinePlaceholder":107},[83,11410,11411],{"class":85,"line":2479},[83,11412,4327],{},[10,11414,123],{},[74,11416,11418],{"className":11417,"code":4333,"language":129,"meta":79},[127],[33,11419,4333],{"__ignoreMap":79},[10,11421,134],{},[14,11423,137],{"id":137},[139,11425,11426,11430],{},[56,11427,4344,11428,4348],{},[33,11429,4347],{},[56,11431,4351,11432,4354],{},[33,11433,4347],{},[320,11435,2689],{"id":2689},[10,11437,4359],{},[10,11439,11440],{},[26,11441],{"alt":4364,"src":4365},[10,11443,4368,11444,4371],{},[33,11445,4347],{},[14,11447,163],{"id":163},[53,11449,11450,11452],{},[56,11451,4378],{},[56,11453,4381],{},[14,11455,178],{"id":178},[139,11457,11458,11462],{},[56,11459,2330,11460,4390],{},[33,11461,4267],{},[56,11463,4393],{},[10,11465,196],{},[14,11467,199],{"id":199},[10,11469,4400],{},[204,11471,206],{},{"title":79,"searchDepth":92,"depth":92,"links":11473},[11474,11475,11476,11477,11478,11481,11482,11483],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":11479},[11480],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":4244,"description":4249},[217,4267,4422],{"id":4425,"title":4426,"body":11488,"category":217,"cover":218,"description":4431,"extension":219,"meta":11613,"navigation":107,"path":4580,"pinned":222,"publishedAt":223,"seo":11614,"slug":4582,"stem":4583,"summary":4584,"tags":11615,"updatedAt":223,"visible":107,"__hash__":4587},{"type":7,"value":11489,"toc":11603},[11490,11492,11494,11496,11498,11502,11506,11508,11518,11520,11522,11554,11556,11561,11563,11565,11577,11579,11585,11587,11595,11597,11599,11601],[10,11491,4431],{},[14,11493,16],{"id":16},[10,11495,4436],{},[14,11497,22],{"id":22},[10,11499,11500],{},[26,11501],{"alt":4443,"src":4444},[10,11503,11504,4449],{},[33,11505,4284],{},[14,11507,51],{"id":51},[53,11509,11510,11514,11516],{},[56,11511,11512,4459],{},[33,11513,4458],{},[56,11515,4462],{},[56,11517,4465],{},[14,11519,69],{"id":69},[10,11521,72],{},[74,11523,11524],{"className":76,"code":4472,"language":78,"meta":79,"style":79},[33,11525,11526,11530,11534,11538,11542,11546,11550],{"__ignoreMap":79},[83,11527,11528],{"class":85,"line":86},[83,11529,4479],{},[83,11531,11532],{"class":85,"line":92},[83,11533,108],{"emptyLinePlaceholder":107},[83,11535,11536],{"class":85,"line":98},[83,11537,4488],{},[83,11539,11540],{"class":85,"line":104},[83,11541,4493],{},[83,11543,11544],{"class":85,"line":111},[83,11545,108],{"emptyLinePlaceholder":107},[83,11547,11548],{"class":85,"line":117},[83,11549,4502],{},[83,11551,11552],{"class":85,"line":2479},[83,11553,4507],{},[10,11555,123],{},[74,11557,11559],{"className":11558,"code":4513,"language":129,"meta":79},[127],[33,11560,4513],{"__ignoreMap":79},[10,11562,134],{},[14,11564,137],{"id":137},[139,11566,11567,11573],{},[56,11568,4524,11569,4527,11571,4531],{},[33,11570,4284],{},[33,11572,4530],{},[56,11574,11575,4536],{},[33,11576,4458],{},[14,11578,163],{"id":163},[53,11580,11581,11583],{},[56,11582,4543],{},[56,11584,4546],{},[14,11586,178],{"id":178},[139,11588,11589,11591],{},[56,11590,4553],{},[56,11592,2330,11593,4559],{},[33,11594,4558],{},[10,11596,196],{},[14,11598,199],{"id":199},[10,11600,4566],{},[204,11602,206],{},{"title":79,"searchDepth":92,"depth":92,"links":11604},[11605,11606,11607,11608,11609,11610,11611,11612],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":4426,"description":4431},[217,4284,4586],{"id":4589,"title":4590,"body":11617,"category":217,"cover":218,"description":4595,"extension":219,"meta":11762,"navigation":107,"path":4770,"pinned":222,"publishedAt":223,"seo":11763,"slug":4772,"stem":4773,"summary":4774,"tags":11764,"updatedAt":223,"visible":107,"__hash__":4776},{"type":7,"value":11618,"toc":11752},[11619,11621,11623,11625,11627,11631,11637,11639,11653,11655,11657,11701,11703,11708,11710,11712,11722,11724,11736,11738,11744,11746,11748,11750],[10,11620,4595],{},[14,11622,16],{"id":16},[10,11624,4600],{},[14,11626,22],{"id":22},[10,11628,11629],{},[26,11630],{"alt":4607,"src":4608},[10,11632,11633,4614,11635,4618],{},[33,11634,4613],{},[33,11636,4617],{},[14,11638,51],{"id":51},[53,11640,11641,11643,11649],{},[56,11642,4625],{},[56,11644,11645,4630,11647,4633],{},[33,11646,4613],{},[33,11648,4267],{},[56,11650,4636,11651,4639],{},[33,11652,4617],{},[14,11654,69],{"id":69},[10,11656,72],{},[74,11658,11659],{"className":76,"code":4646,"language":78,"meta":79,"style":79},[33,11660,11661,11665,11669,11673,11677,11681,11685,11689,11693,11697],{"__ignoreMap":79},[83,11662,11663],{"class":85,"line":86},[83,11664,4653],{},[83,11666,11667],{"class":85,"line":92},[83,11668,108],{"emptyLinePlaceholder":107},[83,11670,11671],{"class":85,"line":98},[83,11672,4662],{},[83,11674,11675],{"class":85,"line":104},[83,11676,4667],{},[83,11678,11679],{"class":85,"line":111},[83,11680,4672],{},[83,11682,11683],{"class":85,"line":117},[83,11684,4677],{},[83,11686,11687],{"class":85,"line":2479},[83,11688,4682],{},[83,11690,11691],{"class":85,"line":2485},[83,11692,4507],{},[83,11694,11695],{"class":85,"line":3898},[83,11696,108],{"emptyLinePlaceholder":107},[83,11698,11699],{"class":85,"line":4110},[83,11700,4695],{},[10,11702,123],{},[74,11704,11706],{"className":11705,"code":4701,"language":129,"meta":79},[127],[33,11707,4701],{"__ignoreMap":79},[10,11709,134],{},[14,11711,137],{"id":137},[139,11713,11714,11718],{},[56,11715,4712,11716,4715],{},[33,11717,4613],{},[56,11719,4718,11720,4721],{},[33,11721,4617],{},[14,11723,163],{"id":163},[53,11725,11726,11730],{},[56,11727,3412,11728,4730],{},[33,11729,4613],{},[56,11731,4733,11732,4736,11734,4739],{},[33,11733,4267],{},[33,11735,4613],{},[14,11737,178],{"id":178},[139,11739,11740,11742],{},[56,11741,4746],{},[56,11743,4749],{},[10,11745,196],{},[14,11747,199],{"id":199},[10,11749,4756],{},[204,11751,206],{},{"title":79,"searchDepth":92,"depth":92,"links":11753},[11754,11755,11756,11757,11758,11759,11760,11761],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":4590,"description":4595},[217,4617,4613],{"id":4778,"title":4779,"body":11766,"category":217,"cover":218,"description":4784,"extension":219,"meta":11905,"navigation":107,"path":4956,"pinned":222,"publishedAt":223,"seo":11906,"slug":4958,"stem":4959,"summary":4960,"tags":11907,"updatedAt":223,"visible":107,"__hash__":4964},{"type":7,"value":11767,"toc":11893},[11768,11770,11772,11774,11776,11780,11782,11784,11800,11802,11804,11832,11834,11839,11841,11843,11855,11857,11859,11863,11865,11867,11877,11879,11885,11887,11889,11891],[10,11769,4784],{},[14,11771,16],{"id":16},[10,11773,4789],{},[14,11775,22],{"id":22},[10,11777,11778],{},[26,11779],{"alt":4796,"src":4797},[10,11781,4800],{},[14,11783,51],{"id":51},[53,11785,11786,11788,11790],{},[56,11787,4807],{},[56,11789,4810],{},[56,11791,4813,11792,2248,11794,4820,11796,2248,11798,354],{},[33,11793,4816],{},[33,11795,4819],{},[33,11797,4823],{},[33,11799,4826],{},[14,11801,69],{"id":69},[10,11803,72],{},[74,11805,11806],{"className":76,"code":4833,"language":78,"meta":79,"style":79},[33,11807,11808,11812,11816,11820,11824,11828],{"__ignoreMap":79},[83,11809,11810],{"class":85,"line":86},[83,11811,4840],{},[83,11813,11814],{"class":85,"line":92},[83,11815,108],{"emptyLinePlaceholder":107},[83,11817,11818],{"class":85,"line":98},[83,11819,4849],{},[83,11821,11822],{"class":85,"line":104},[83,11823,4854],{},[83,11825,11826],{"class":85,"line":111},[83,11827,4859],{},[83,11829,11830],{"class":85,"line":117},[83,11831,4864],{},[10,11833,123],{},[74,11835,11837],{"className":11836,"code":4870,"language":129,"meta":79},[127],[33,11838,4870],{"__ignoreMap":79},[10,11840,134],{},[14,11842,137],{"id":137},[139,11844,11845,11853],{},[56,11846,4881,11847,4884,11849,1149,11851,354],{},[33,11848,4816],{},[33,11850,4887],{},[33,11852,4890],{},[56,11854,4893],{},[320,11856,2689],{"id":2689},[10,11858,4898],{},[10,11860,11861],{},[26,11862],{"alt":4903,"src":4904},[10,11864,4907],{},[14,11866,163],{"id":163},[53,11868,11869,11875],{},[56,11870,4914,11871,1001,11873,4920],{},[33,11872,4917],{},[33,11874,4823],{},[56,11876,4923],{},[14,11878,178],{"id":178},[139,11880,11881,11883],{},[56,11882,4930],{},[56,11884,4933],{},[10,11886,196],{},[14,11888,199],{"id":199},[10,11890,4940],{},[204,11892,206],{},{"title":79,"searchDepth":92,"depth":92,"links":11894},[11895,11896,11897,11898,11899,11902,11903,11904],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":11900},[11901],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":4779,"description":4784},[217,4962,4963],{"id":4966,"title":4967,"body":11909,"category":217,"cover":218,"description":4972,"extension":219,"meta":12026,"navigation":107,"path":5111,"pinned":222,"publishedAt":223,"seo":12027,"slug":5113,"stem":5114,"summary":5115,"tags":12028,"updatedAt":223,"visible":107,"__hash__":5119},{"type":7,"value":11910,"toc":12016},[11911,11913,11915,11917,11919,11923,11925,11927,11935,11937,11939,11971,11973,11978,11980,11982,11990,11992,12000,12002,12008,12010,12012,12014],[10,11912,4972],{},[14,11914,16],{"id":16},[10,11916,4977],{},[14,11918,22],{"id":22},[10,11920,11921],{},[26,11922],{"alt":4984,"src":4985},[10,11924,4988],{},[14,11926,51],{"id":51},[53,11928,11929,11931,11933],{},[56,11930,4995],{},[56,11932,4998],{},[56,11934,5001],{},[14,11936,69],{"id":69},[10,11938,72],{},[74,11940,11941],{"className":76,"code":5008,"language":78,"meta":79,"style":79},[33,11942,11943,11947,11951,11955,11959,11963,11967],{"__ignoreMap":79},[83,11944,11945],{"class":85,"line":86},[83,11946,5015],{},[83,11948,11949],{"class":85,"line":92},[83,11950,108],{"emptyLinePlaceholder":107},[83,11952,11953],{"class":85,"line":98},[83,11954,5024],{},[83,11956,11957],{"class":85,"line":104},[83,11958,5029],{},[83,11960,11961],{"class":85,"line":111},[83,11962,108],{"emptyLinePlaceholder":107},[83,11964,11965],{"class":85,"line":117},[83,11966,5038],{},[83,11968,11969],{"class":85,"line":2479},[83,11970,5043],{},[10,11972,123],{},[74,11974,11976],{"className":11975,"code":5049,"language":129,"meta":79},[127],[33,11977,5049],{"__ignoreMap":79},[10,11979,134],{},[14,11981,137],{"id":137},[139,11983,11984,11986],{},[56,11985,5060],{},[56,11987,5063,11988,5067],{},[33,11989,5066],{},[14,11991,163],{"id":163},[53,11993,11994,11998],{},[56,11995,5074,11996,5077],{},[33,11997,4284],{},[56,11999,5080],{},[14,12001,178],{"id":178},[139,12003,12004,12006],{},[56,12005,5087],{},[56,12007,5090],{},[10,12009,196],{},[14,12011,199],{"id":199},[10,12013,5097],{},[204,12015,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12017},[12018,12019,12020,12021,12022,12023,12024,12025],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":4967,"description":4972},[217,5117,5118],{"id":5121,"title":5122,"body":12030,"category":217,"cover":218,"description":5127,"extension":219,"meta":12149,"navigation":107,"path":5271,"pinned":222,"publishedAt":223,"seo":12150,"slug":5273,"stem":5274,"summary":5275,"tags":12151,"updatedAt":223,"visible":107,"__hash__":5279},{"type":7,"value":12031,"toc":12139},[12032,12034,12036,12038,12040,12044,12046,12048,12056,12058,12060,12092,12094,12099,12101,12103,12113,12115,12121,12123,12131,12133,12135,12137],[10,12033,5127],{},[14,12035,16],{"id":16},[10,12037,5132],{},[14,12039,22],{"id":22},[10,12041,12042],{},[26,12043],{"alt":5139,"src":5140},[10,12045,5143],{},[14,12047,51],{"id":51},[53,12049,12050,12052,12054],{},[56,12051,5150],{},[56,12053,5153],{},[56,12055,5156],{},[14,12057,69],{"id":69},[10,12059,72],{},[74,12061,12062],{"className":76,"code":5163,"language":78,"meta":79,"style":79},[33,12063,12064,12068,12072,12076,12080,12084,12088],{"__ignoreMap":79},[83,12065,12066],{"class":85,"line":86},[83,12067,5170],{},[83,12069,12070],{"class":85,"line":92},[83,12071,5175],{},[83,12073,12074],{"class":85,"line":98},[83,12075,5180],{},[83,12077,12078],{"class":85,"line":104},[83,12079,108],{"emptyLinePlaceholder":107},[83,12081,12082],{"class":85,"line":111},[83,12083,5189],{},[83,12085,12086],{"class":85,"line":117},[83,12087,5194],{},[83,12089,12090],{"class":85,"line":2479},[83,12091,5199],{},[10,12093,123],{},[74,12095,12097],{"className":12096,"code":5205,"language":129,"meta":79},[127],[33,12098,5205],{"__ignoreMap":79},[10,12100,134],{},[14,12102,137],{"id":137},[139,12104,12105,12109],{},[56,12106,930,12107,5219],{},[33,12108,5218],{},[56,12110,5222,12111,5226],{},[33,12112,5225],{},[14,12114,163],{"id":163},[53,12116,12117,12119],{},[56,12118,5233],{},[56,12120,5236],{},[14,12122,178],{"id":178},[139,12124,12125,12129],{},[56,12126,5243,12127,5247],{},[33,12128,5246],{},[56,12130,5250],{},[10,12132,196],{},[14,12134,199],{"id":199},[10,12136,5257],{},[204,12138,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12140},[12141,12142,12143,12144,12145,12146,12147,12148],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5122,"description":5127},[217,5277,5278],{"id":5281,"title":5282,"body":12153,"category":217,"cover":218,"description":5287,"extension":219,"meta":12298,"navigation":107,"path":5468,"pinned":222,"publishedAt":223,"seo":12299,"slug":5470,"stem":5471,"summary":5472,"tags":12300,"updatedAt":223,"visible":107,"__hash__":5476},{"type":7,"value":12154,"toc":12286},[12155,12157,12159,12161,12163,12167,12171,12173,12185,12187,12189,12217,12219,12224,12226,12228,12242,12244,12246,12250,12258,12260,12270,12272,12278,12280,12282,12284],[10,12156,5287],{},[14,12158,16],{"id":16},[10,12160,5292],{},[14,12162,22],{"id":22},[10,12164,12165],{},[26,12166],{"alt":5299,"src":5300},[10,12168,5303,12169,5307],{},[33,12170,5306],{},[14,12172,51],{"id":51},[53,12174,12175,12177,12179],{},[56,12176,5314],{},[56,12178,5317],{},[56,12180,5320,12181,5323,12183,354],{},[33,12182,5306],{},[33,12184,5326],{},[14,12186,69],{"id":69},[10,12188,72],{},[74,12190,12191],{"className":76,"code":5333,"language":78,"meta":79,"style":79},[33,12192,12193,12197,12201,12205,12209,12213],{"__ignoreMap":79},[83,12194,12195],{"class":85,"line":86},[83,12196,5340],{},[83,12198,12199],{"class":85,"line":92},[83,12200,5345],{},[83,12202,12203],{"class":85,"line":98},[83,12204,5350],{},[83,12206,12207],{"class":85,"line":104},[83,12208,108],{"emptyLinePlaceholder":107},[83,12210,12211],{"class":85,"line":111},[83,12212,5359],{},[83,12214,12215],{"class":85,"line":117},[83,12216,5364],{},[10,12218,123],{},[74,12220,12222],{"className":12221,"code":5370,"language":129,"meta":79},[127],[33,12223,5370],{"__ignoreMap":79},[10,12225,134],{},[14,12227,137],{"id":137},[139,12229,12230,12236],{},[56,12231,5381,12232,2248,12234,5387],{},[33,12233,5384],{},[33,12235,4347],{},[56,12237,12238,5393,12240,5397],{},[33,12239,5392],{},[33,12241,5396],{},[320,12243,2689],{"id":2689},[10,12245,5402],{},[10,12247,12248],{},[26,12249],{"alt":5407,"src":5408},[10,12251,12252,2248,12254,1149,12256,5418],{},[33,12253,5384],{},[33,12255,4347],{},[33,12257,5417],{},[14,12259,163],{"id":163},[53,12261,12262,12266],{},[56,12263,5425,12264,5429],{},[33,12265,5428],{},[56,12267,5432,12268,5435],{},[33,12269,5417],{},[14,12271,178],{"id":178},[139,12273,12274,12276],{},[56,12275,5442],{},[56,12277,5445],{},[10,12279,196],{},[14,12281,199],{"id":199},[10,12283,5452],{},[204,12285,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12287},[12288,12289,12290,12291,12292,12295,12296,12297],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":12293},[12294],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5282,"description":5287},[217,5474,5475],{"id":5478,"title":5479,"body":12302,"category":217,"cover":218,"description":5484,"extension":219,"meta":12451,"navigation":107,"path":5665,"pinned":222,"publishedAt":223,"seo":12452,"slug":5667,"stem":5668,"summary":5669,"tags":12453,"updatedAt":223,"visible":107,"__hash__":5673},{"type":7,"value":12303,"toc":12439},[12304,12306,12308,12310,12312,12316,12318,12320,12332,12334,12336,12380,12382,12387,12389,12391,12403,12405,12407,12411,12413,12415,12423,12425,12431,12433,12435,12437],[10,12305,5484],{},[14,12307,16],{"id":16},[10,12309,5489],{},[14,12311,22],{"id":22},[10,12313,12314],{},[26,12315],{"alt":5496,"src":5497},[10,12317,5500],{},[14,12319,51],{"id":51},[53,12321,12322,12324,12328],{},[56,12323,5507],{},[56,12325,12326,5513],{},[33,12327,5512],{},[56,12329,12330,5519],{},[33,12331,5518],{},[14,12333,69],{"id":69},[10,12335,72],{},[74,12337,12338],{"className":76,"code":5526,"language":78,"meta":79,"style":79},[33,12339,12340,12344,12348,12352,12356,12360,12364,12368,12372,12376],{"__ignoreMap":79},[83,12341,12342],{"class":85,"line":86},[83,12343,5533],{},[83,12345,12346],{"class":85,"line":92},[83,12347,5538],{},[83,12349,12350],{"class":85,"line":98},[83,12351,108],{"emptyLinePlaceholder":107},[83,12353,12354],{"class":85,"line":104},[83,12355,5547],{},[83,12357,12358],{"class":85,"line":111},[83,12359,5552],{},[83,12361,12362],{"class":85,"line":117},[83,12363,108],{"emptyLinePlaceholder":107},[83,12365,12366],{"class":85,"line":2479},[83,12367,5561],{},[83,12369,12370],{"class":85,"line":2485},[83,12371,5566],{},[83,12373,12374],{"class":85,"line":3898},[83,12375,108],{"emptyLinePlaceholder":107},[83,12377,12378],{"class":85,"line":4110},[83,12379,5575],{},[10,12381,123],{},[74,12383,12385],{"className":12384,"code":5581,"language":129,"meta":79},[127],[33,12386,5581],{"__ignoreMap":79},[10,12388,134],{},[14,12390,137],{"id":137},[139,12392,12393,12397],{},[56,12394,5592,12395,5596],{},[33,12396,5595],{},[56,12398,12399,5602,12401,354],{},[33,12400,5601],{},[33,12402,5605],{},[320,12404,2689],{"id":2689},[10,12406,5610],{},[10,12408,12409],{},[26,12410],{"alt":5615,"src":5616},[10,12412,5619],{},[14,12414,163],{"id":163},[53,12416,12417,12421],{},[56,12418,5626,12419,5629],{},[33,12420,5326],{},[56,12422,5632],{},[14,12424,178],{"id":178},[139,12426,12427,12429],{},[56,12428,5639],{},[56,12430,5642],{},[10,12432,196],{},[14,12434,199],{"id":199},[10,12436,5649],{},[204,12438,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12440},[12441,12442,12443,12444,12445,12448,12449,12450],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":12446},[12447],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5479,"description":5484},[217,5671,5672],{"id":5675,"title":5676,"body":12455,"category":217,"cover":218,"description":5681,"extension":219,"meta":12616,"navigation":107,"path":5879,"pinned":222,"publishedAt":223,"seo":12617,"slug":5881,"stem":5882,"summary":5883,"tags":12618,"updatedAt":223,"visible":107,"__hash__":5887},{"type":7,"value":12456,"toc":12604},[12457,12459,12461,12463,12465,12469,12471,12473,12485,12487,12489,12541,12543,12548,12550,12552,12570,12572,12574,12578,12580,12582,12588,12590,12596,12598,12600,12602],[10,12458,5681],{},[14,12460,16],{"id":16},[10,12462,5686],{},[14,12464,22],{"id":22},[10,12466,12467],{},[26,12468],{"alt":5693,"src":5694},[10,12470,5697],{},[14,12472,51],{"id":51},[53,12474,12475,12477,12479],{},[56,12476,5704],{},[56,12478,5707],{},[56,12480,12481,2167,12483,5716],{},[33,12482,5712],{},[33,12484,5715],{},[14,12486,69],{"id":69},[10,12488,72],{},[74,12490,12491],{"className":76,"code":5723,"language":78,"meta":79,"style":79},[33,12492,12493,12497,12501,12505,12509,12513,12517,12521,12525,12529,12533,12537],{"__ignoreMap":79},[83,12494,12495],{"class":85,"line":86},[83,12496,5730],{},[83,12498,12499],{"class":85,"line":92},[83,12500,108],{"emptyLinePlaceholder":107},[83,12502,12503],{"class":85,"line":98},[83,12504,5739],{},[83,12506,12507],{"class":85,"line":104},[83,12508,5744],{},[83,12510,12511],{"class":85,"line":111},[83,12512,108],{"emptyLinePlaceholder":107},[83,12514,12515],{"class":85,"line":117},[83,12516,5753],{},[83,12518,12519],{"class":85,"line":2479},[83,12520,5758],{},[83,12522,12523],{"class":85,"line":2485},[83,12524,5763],{},[83,12526,12527],{"class":85,"line":3898},[83,12528,108],{"emptyLinePlaceholder":107},[83,12530,12531],{"class":85,"line":4110},[83,12532,5772],{},[83,12534,12535],{"class":85,"line":5775},[83,12536,108],{"emptyLinePlaceholder":107},[83,12538,12539],{"class":85,"line":5780},[83,12540,5783],{},[10,12542,123],{},[74,12544,12546],{"className":12545,"code":5789,"language":129,"meta":79},[127],[33,12547,5789],{"__ignoreMap":79},[10,12549,134],{},[14,12551,137],{"id":137},[139,12553,12554,12564],{},[56,12555,12556,5803,12558,5807,12560,5810,12562,5814],{},[33,12557,5802],{},[33,12559,5806],{},[33,12561,5595],{},[33,12563,5813],{},[56,12565,12566,5819,12568,5822],{},[33,12567,4530],{},[33,12569,2199],{},[320,12571,2689],{"id":2689},[10,12573,5827],{},[10,12575,12576],{},[26,12577],{"alt":5832,"src":5833},[10,12579,5836],{},[14,12581,163],{"id":163},[53,12583,12584,12586],{},[56,12585,5843],{},[56,12587,5846],{},[14,12589,178],{"id":178},[139,12591,12592,12594],{},[56,12593,5853],{},[56,12595,5856],{},[10,12597,196],{},[14,12599,199],{"id":199},[10,12601,5863],{},[204,12603,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12605},[12606,12607,12608,12609,12610,12613,12614,12615],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":12611},[12612],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5676,"description":5681},[217,5885,5886],{"id":5889,"title":5890,"body":12620,"category":217,"cover":218,"description":5895,"extension":219,"meta":12743,"navigation":107,"path":6046,"pinned":222,"publishedAt":223,"seo":12744,"slug":6048,"stem":6049,"summary":6050,"tags":12745,"updatedAt":223,"visible":107,"__hash__":6054},{"type":7,"value":12621,"toc":12733},[12622,12624,12626,12628,12630,12634,12636,12638,12652,12654,12656,12684,12686,12691,12693,12695,12705,12707,12715,12717,12725,12727,12729,12731],[10,12623,5895],{},[14,12625,16],{"id":16},[10,12627,5900],{},[14,12629,22],{"id":22},[10,12631,12632],{},[26,12633],{"alt":5907,"src":5908},[10,12635,5911],{},[14,12637,51],{"id":51},[53,12639,12640,12642,12644],{},[56,12641,5918],{},[56,12643,5921],{},[56,12645,5924,12646,2248,12648,2248,12650,5932],{},[33,12647,2251],{},[33,12649,2416],{},[33,12651,5931],{},[14,12653,69],{"id":69},[10,12655,72],{},[74,12657,12658],{"className":76,"code":5939,"language":78,"meta":79,"style":79},[33,12659,12660,12664,12668,12672,12676,12680],{"__ignoreMap":79},[83,12661,12662],{"class":85,"line":86},[83,12663,5946],{},[83,12665,12666],{"class":85,"line":92},[83,12667,5951],{},[83,12669,12670],{"class":85,"line":98},[83,12671,5956],{},[83,12673,12674],{"class":85,"line":104},[83,12675,108],{"emptyLinePlaceholder":107},[83,12677,12678],{"class":85,"line":111},[83,12679,5965],{},[83,12681,12682],{"class":85,"line":117},[83,12683,5970],{},[10,12685,123],{},[74,12687,12689],{"className":12688,"code":5976,"language":129,"meta":79},[127],[33,12690,5976],{"__ignoreMap":79},[10,12692,134],{},[14,12694,137],{"id":137},[139,12696,12697,12703],{},[56,12698,5987,12699,5991,12701,5994],{},[33,12700,5990],{},[33,12702,2237],{},[56,12704,5997],{},[14,12706,163],{"id":163},[53,12708,12709,12713],{},[56,12710,6004,12711,6008],{},[33,12712,6007],{},[56,12714,6011],{},[14,12716,178],{"id":178},[139,12718,12719,12721],{},[56,12720,6018],{},[56,12722,6021,12723,6025],{},[33,12724,6024],{},[10,12726,196],{},[14,12728,199],{"id":199},[10,12730,6032],{},[204,12732,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12734},[12735,12736,12737,12738,12739,12740,12741,12742],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":5890,"description":5895},[217,6052,6053],{"id":6056,"title":6057,"body":12747,"category":217,"cover":218,"description":6062,"extension":219,"meta":12924,"navigation":107,"path":6290,"pinned":222,"publishedAt":223,"seo":12925,"slug":6292,"stem":6293,"summary":6294,"tags":12926,"updatedAt":223,"visible":107,"__hash__":6298},{"type":7,"value":12748,"toc":12912},[12749,12751,12753,12757,12759,12763,12769,12771,12783,12785,12789,12813,12817,12833,12839,12841,12846,12848,12850,12866,12868,12870,12874,12878,12880,12892,12894,12904,12906,12908,12910],[10,12750,6062],{},[14,12752,16],{"id":16},[10,12754,6067,12755,6070],{},[286,12756,5990],{},[14,12758,22],{"id":22},[10,12760,12761],{},[26,12762],{"alt":6077,"src":6078},[10,12764,6081,12765,6085,12767,6089],{},[33,12766,6084],{},[33,12768,6088],{},[14,12770,51],{"id":51},[53,12772,12773,12777,12779],{},[56,12774,6096,12775,6099],{},[33,12776,1163],{},[56,12778,6102],{},[56,12780,6105,12781,6109],{},[33,12782,6108],{},[14,12784,69],{"id":69},[10,12786,6114,12787,6118],{},[33,12788,6117],{},[74,12790,12791],{"className":76,"code":6121,"language":78,"meta":79,"style":79},[33,12792,12793,12797,12801,12805,12809],{"__ignoreMap":79},[83,12794,12795],{"class":85,"line":86},[83,12796,6128],{},[83,12798,12799],{"class":85,"line":92},[83,12800,6133],{},[83,12802,12803],{"class":85,"line":98},[83,12804,108],{"emptyLinePlaceholder":107},[83,12806,12807],{"class":85,"line":104},[83,12808,6142],{},[83,12810,12811],{"class":85,"line":111},[83,12812,6147],{},[10,12814,6150,12815,6154],{},[33,12816,6153],{},[74,12818,12819],{"className":76,"code":6157,"language":78,"meta":79,"style":79},[33,12820,12821,12825,12829],{"__ignoreMap":79},[83,12822,12823],{"class":85,"line":86},[83,12824,6164],{},[83,12826,12827],{"class":85,"line":92},[83,12828,108],{"emptyLinePlaceholder":107},[83,12830,12831],{"class":85,"line":98},[83,12832,6173],{},[10,12834,6176,12835,1149,12837,354],{},[33,12836,6179],{},[33,12838,6182],{},[10,12840,123],{},[74,12842,12844],{"className":12843,"code":6188,"language":129,"meta":79},[127],[33,12845,6188],{"__ignoreMap":79},[10,12847,134],{},[14,12849,137],{"id":137},[139,12851,12852,12858],{},[56,12853,6199,12854,6202,12856,6206],{},[33,12855,6117],{},[33,12857,6205],{},[56,12859,12860,6211,12862,6214,12864,6217],{},[33,12861,6153],{},[33,12863,6117],{},[33,12865,6153],{},[320,12867,2689],{"id":2689},[10,12869,6222],{},[10,12871,12872],{},[26,12873],{"alt":6227,"src":6228},[10,12875,6231,12876,6234],{},[33,12877,6205],{},[14,12879,163],{"id":163},[53,12881,12882,12888],{},[56,12883,6241,12884,1149,12886,354],{},[33,12885,6117],{},[33,12887,6153],{},[56,12889,6248,12890,6252],{},[33,12891,6251],{},[14,12893,178],{"id":178},[139,12895,12896,12900],{},[56,12897,2344,12898,6262],{},[33,12899,6261],{},[56,12901,6265,12902,354],{},[33,12903,6084],{},[10,12905,196],{},[14,12907,199],{"id":199},[10,12909,6274],{},[204,12911,206],{},{"title":79,"searchDepth":92,"depth":92,"links":12913},[12914,12915,12916,12917,12918,12921,12922,12923],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":12919},[12920],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":6057,"description":6062},[217,6296,6297],{"id":6300,"title":6301,"body":12928,"category":217,"cover":218,"description":6306,"extension":219,"meta":13067,"navigation":107,"path":6472,"pinned":222,"publishedAt":223,"seo":13068,"slug":6474,"stem":6475,"summary":6476,"tags":13069,"updatedAt":223,"visible":107,"__hash__":6479},{"type":7,"value":12929,"toc":13057},[12930,12932,12934,12936,12938,12942,12944,12946,12956,12958,12960,13000,13002,13007,13009,13011,13029,13031,13039,13041,13049,13051,13053,13055],[10,12931,6306],{},[14,12933,16],{"id":16},[10,12935,6311],{},[14,12937,22],{"id":22},[10,12939,12940],{},[26,12941],{"alt":6318,"src":6319},[10,12943,6322],{},[14,12945,51],{"id":51},[53,12947,12948,12952,12954],{},[56,12949,12950,6332],{},[33,12951,6331],{},[56,12953,6335],{},[56,12955,6338],{},[14,12957,69],{"id":69},[10,12959,1566],{},[74,12961,12962],{"className":583,"code":6345,"language":585,"meta":79,"style":79},[33,12963,12964,12974,12980,12986,12996],{"__ignoreMap":79},[83,12965,12966,12968,12970,12972],{"class":85,"line":86},[83,12967,683],{"class":592},[83,12969,625],{"class":595},[83,12971,6356],{"class":628},[83,12973,6359],{"class":628},[83,12975,12976,12978],{"class":85,"line":92},[83,12977,6364],{"class":595},[83,12979,6367],{"class":628},[83,12981,12982,12984],{"class":85,"line":98},[83,12983,78],{"class":592},[83,12985,596],{"class":595},[83,12987,12988,12990,12992,12994],{"class":85,"line":104},[83,12989,78],{"class":592},[83,12991,625],{"class":595},[83,12993,629],{"class":628},[83,12995,596],{"class":595},[83,12997,12998],{"class":85,"line":111},[83,12999,6388],{"class":592},[10,13001,123],{},[74,13003,13005],{"className":13004,"code":6394,"language":129,"meta":79},[127],[33,13006,6394],{"__ignoreMap":79},[10,13008,134],{},[14,13010,137],{"id":137},[139,13012,13013,13019],{},[56,13014,13015,6408,13017,6411],{},[33,13016,6407],{},[33,13018,683],{},[56,13020,6414,13021,2167,13023,6420,13025,3673,13027,6426],{},[33,13022,78],{},[33,13024,6419],{},[33,13026,6331],{},[33,13028,6425],{},[14,13030,163],{"id":163},[53,13032,13033,13035],{},[56,13034,6433],{},[56,13036,3412,13037,6438],{},[33,13038,6331],{},[14,13040,178],{"id":178},[139,13042,13043,13047],{},[56,13044,6445,13045,354],{},[33,13046,6448],{},[56,13048,6451],{},[10,13050,196],{},[14,13052,199],{"id":199},[10,13054,6458],{},[204,13056,1650],{},{"title":79,"searchDepth":92,"depth":92,"links":13058},[13059,13060,13061,13062,13063,13064,13065,13066],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":6301,"description":6306},[217,6478,252],{"id":6481,"title":6482,"body":13071,"category":217,"cover":218,"description":6487,"extension":219,"meta":13224,"navigation":107,"path":6676,"pinned":222,"publishedAt":223,"seo":13225,"slug":6678,"stem":6679,"summary":6680,"tags":13226,"updatedAt":223,"visible":107,"__hash__":6684},{"type":7,"value":13072,"toc":13214},[13073,13075,13077,13079,13081,13085,13091,13093,13109,13111,13113,13157,13159,13164,13166,13168,13180,13182,13196,13198,13206,13208,13210,13212],[10,13074,6487],{},[14,13076,16],{"id":16},[10,13078,6492],{},[14,13080,22],{"id":22},[10,13082,13083],{},[26,13084],{"alt":6499,"src":6500},[10,13086,13087,6506,13089,6509],{},[33,13088,6505],{},[33,13090,2426],{},[14,13092,51],{"id":51},[53,13094,13095,13097,13105],{},[56,13096,6516],{},[56,13098,13099,2248,13101,2248,13103,6528],{},[33,13100,6521],{},[33,13102,6524],{},[33,13104,6527],{},[56,13106,6531,13107,6535],{},[33,13108,6534],{},[14,13110,69],{"id":69},[10,13112,72],{},[74,13114,13115],{"className":76,"code":6542,"language":78,"meta":79,"style":79},[33,13116,13117,13121,13125,13129,13133,13137,13141,13145,13149,13153],{"__ignoreMap":79},[83,13118,13119],{"class":85,"line":86},[83,13120,6549],{},[83,13122,13123],{"class":85,"line":92},[83,13124,108],{"emptyLinePlaceholder":107},[83,13126,13127],{"class":85,"line":98},[83,13128,6558],{},[83,13130,13131],{"class":85,"line":104},[83,13132,6563],{},[83,13134,13135],{"class":85,"line":111},[83,13136,6568],{},[83,13138,13139],{"class":85,"line":117},[83,13140,108],{"emptyLinePlaceholder":107},[83,13142,13143],{"class":85,"line":2479},[83,13144,6577],{},[83,13146,13147],{"class":85,"line":2485},[83,13148,6582],{},[83,13150,13151],{"class":85,"line":3898},[83,13152,6587],{},[83,13154,13155],{"class":85,"line":4110},[83,13156,6592],{},[10,13158,123],{},[74,13160,13162],{"className":13161,"code":6598,"language":129,"meta":79},[127],[33,13163,6598],{"__ignoreMap":79},[10,13165,134],{},[14,13167,137],{"id":137},[139,13169,13170,13174],{},[56,13171,13172,6612],{},[33,13173,6611],{},[56,13175,2330,13176,6617,13178,6620],{},[33,13177,2426],{},[33,13179,6505],{},[14,13181,163],{"id":163},[53,13183,13184,13190],{},[56,13185,3412,13186,6629,13188,6632],{},[33,13187,6505],{},[33,13189,6521],{},[56,13191,6635,13192,1001,13194,6641],{},[33,13193,2426],{},[33,13195,6640],{},[14,13197,178],{"id":178},[139,13199,13200,13204],{},[56,13201,6648,13202,6652],{},[33,13203,6651],{},[56,13205,6655],{},[10,13207,196],{},[14,13209,199],{"id":199},[10,13211,6662],{},[204,13213,206],{},{"title":79,"searchDepth":92,"depth":92,"links":13215},[13216,13217,13218,13219,13220,13221,13222,13223],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":6482,"description":6487},[217,6682,6683],{"id":6686,"title":6687,"body":13228,"category":217,"cover":218,"description":6692,"extension":219,"meta":13375,"navigation":107,"path":6871,"pinned":222,"publishedAt":223,"seo":13376,"slug":6873,"stem":6874,"summary":6875,"tags":13377,"updatedAt":223,"visible":107,"__hash__":6879},{"type":7,"value":13229,"toc":13365},[13230,13232,13234,13236,13238,13242,13244,13246,13264,13266,13268,13316,13318,13323,13325,13327,13335,13337,13347,13349,13357,13359,13361,13363],[10,13231,6692],{},[14,13233,16],{"id":16},[10,13235,6697],{},[14,13237,22],{"id":22},[10,13239,13240],{},[26,13241],{"alt":6704,"src":6705},[10,13243,6708],{},[14,13245,51],{"id":51},[53,13247,13248,13252,13258],{},[56,13249,13250,6718],{},[33,13251,6717],{},[56,13253,13254,6724,13256,354],{},[33,13255,6723],{},[33,13257,6727],{},[56,13259,6730,13260,6734,13262,6738],{},[33,13261,6733],{},[33,13263,6737],{},[14,13265,69],{"id":69},[10,13267,72],{},[74,13269,13270],{"className":76,"code":6745,"language":78,"meta":79,"style":79},[33,13271,13272,13276,13280,13284,13288,13292,13296,13300,13304,13308,13312],{"__ignoreMap":79},[83,13273,13274],{"class":85,"line":86},[83,13275,6549],{},[83,13277,13278],{"class":85,"line":92},[83,13279,108],{"emptyLinePlaceholder":107},[83,13281,13282],{"class":85,"line":98},[83,13283,6760],{},[83,13285,13286],{"class":85,"line":104},[83,13287,6765],{},[83,13289,13290],{"class":85,"line":111},[83,13291,6770],{},[83,13293,13294],{"class":85,"line":117},[83,13295,6775],{},[83,13297,13298],{"class":85,"line":2479},[83,13299,108],{"emptyLinePlaceholder":107},[83,13301,13302],{"class":85,"line":2485},[83,13303,6784],{},[83,13305,13306],{"class":85,"line":3898},[83,13307,6789],{},[83,13309,13310],{"class":85,"line":4110},[83,13311,6794],{},[83,13313,13314],{"class":85,"line":5775},[83,13315,6799],{},[10,13317,123],{},[74,13319,13321],{"className":13320,"code":6805,"language":129,"meta":79},[127],[33,13322,6805],{"__ignoreMap":79},[10,13324,134],{},[14,13326,137],{"id":137},[139,13328,13329,13333],{},[56,13330,6816,13331,6819],{},[33,13332,6733],{},[56,13334,6822],{},[14,13336,163],{"id":163},[53,13338,13339,13343],{},[56,13340,2330,13341,6831],{},[33,13342,6717],{},[56,13344,6834,13345,354],{},[33,13346,6837],{},[14,13348,178],{"id":178},[139,13350,13351,13353],{},[56,13352,6844],{},[56,13354,6847,13355,6850],{},[33,13356,328],{},[10,13358,196],{},[14,13360,199],{"id":199},[10,13362,6857],{},[204,13364,206],{},{"title":79,"searchDepth":92,"depth":92,"links":13366},[13367,13368,13369,13370,13371,13372,13373,13374],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":6687,"description":6692},[217,6877,6878],{"id":6881,"title":6882,"body":13379,"category":217,"cover":218,"description":6887,"extension":219,"meta":13522,"navigation":107,"path":7055,"pinned":222,"publishedAt":223,"seo":13523,"slug":7057,"stem":7058,"summary":7059,"tags":13524,"updatedAt":223,"visible":107,"__hash__":7063},{"type":7,"value":13380,"toc":13512},[13381,13383,13385,13387,13389,13393,13399,13401,13411,13413,13415,13467,13469,13474,13476,13478,13488,13490,13496,13498,13504,13506,13508,13510],[10,13382,6887],{},[14,13384,16],{"id":16},[10,13386,6892],{},[14,13388,22],{"id":22},[10,13390,13391],{},[26,13392],{"alt":6899,"src":6900},[10,13394,13395,6906,13397,6910],{},[33,13396,6905],{},[33,13398,6909],{},[14,13400,51],{"id":51},[53,13402,13403,13405,13409],{},[56,13404,6917],{},[56,13406,13407,6923],{},[33,13408,6922],{},[56,13410,6926],{},[14,13412,69],{"id":69},[10,13414,72],{},[74,13416,13417],{"className":76,"code":6933,"language":78,"meta":79,"style":79},[33,13418,13419,13423,13427,13431,13435,13439,13443,13447,13451,13455,13459,13463],{"__ignoreMap":79},[83,13420,13421],{"class":85,"line":86},[83,13422,6940],{},[83,13424,13425],{"class":85,"line":92},[83,13426,108],{"emptyLinePlaceholder":107},[83,13428,13429],{"class":85,"line":98},[83,13430,6949],{},[83,13432,13433],{"class":85,"line":104},[83,13434,108],{"emptyLinePlaceholder":107},[83,13436,13437],{"class":85,"line":111},[83,13438,6958],{},[83,13440,13441],{"class":85,"line":117},[83,13442,6963],{},[83,13444,13445],{"class":85,"line":2479},[83,13446,6775],{},[83,13448,13449],{"class":85,"line":2485},[83,13450,108],{"emptyLinePlaceholder":107},[83,13452,13453],{"class":85,"line":3898},[83,13454,6976],{},[83,13456,13457],{"class":85,"line":4110},[83,13458,6981],{},[83,13460,13461],{"class":85,"line":5775},[83,13462,6794],{},[83,13464,13465],{"class":85,"line":5780},[83,13466,6990],{},[10,13468,123],{},[74,13470,13472],{"className":13471,"code":6996,"language":129,"meta":79},[127],[33,13473,6996],{"__ignoreMap":79},[10,13475,134],{},[14,13477,137],{"id":137},[139,13479,13480,13484],{},[56,13481,13482,7009],{},[33,13483,6905],{},[56,13485,13486,7014],{},[33,13487,6909],{},[14,13489,163],{"id":163},[53,13491,13492,13494],{},[56,13493,7021],{},[56,13495,7024],{},[14,13497,178],{"id":178},[139,13499,13500,13502],{},[56,13501,7031],{},[56,13503,7034],{},[10,13505,196],{},[14,13507,199],{"id":199},[10,13509,7041],{},[204,13511,206],{},{"title":79,"searchDepth":92,"depth":92,"links":13513},[13514,13515,13516,13517,13518,13519,13520,13521],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":6882,"description":6887},[217,7061,7062],{"id":7065,"title":7066,"body":13526,"category":217,"cover":218,"description":7071,"extension":219,"meta":13677,"navigation":107,"path":7256,"pinned":222,"publishedAt":223,"seo":13678,"slug":7258,"stem":7259,"summary":7260,"tags":13679,"updatedAt":223,"visible":107,"__hash__":7264},{"type":7,"value":13527,"toc":13667},[13528,13530,13532,13534,13536,13540,13544,13546,13560,13562,13564,13616,13618,13623,13625,13627,13639,13641,13651,13653,13659,13661,13663,13665],[10,13529,7071],{},[14,13531,16],{"id":16},[10,13533,7076],{},[14,13535,22],{"id":22},[10,13537,13538],{},[26,13539],{"alt":7083,"src":7084},[10,13541,13542,7090],{},[33,13543,7089],{},[14,13545,51],{"id":51},[53,13547,13548,13554,13558],{},[56,13549,2330,13550,7100,13552,7104],{},[33,13551,7099],{},[33,13553,7103],{},[56,13555,7107,13556,7111],{},[33,13557,7110],{},[56,13559,7114],{},[14,13561,69],{"id":69},[10,13563,72],{},[74,13565,13566],{"className":76,"code":7121,"language":78,"meta":79,"style":79},[33,13567,13568,13572,13576,13580,13584,13588,13592,13596,13600,13604,13608,13612],{"__ignoreMap":79},[83,13569,13570],{"class":85,"line":86},[83,13571,7128],{},[83,13573,13574],{"class":85,"line":92},[83,13575,108],{"emptyLinePlaceholder":107},[83,13577,13578],{"class":85,"line":98},[83,13579,7137],{},[83,13581,13582],{"class":85,"line":104},[83,13583,7142],{},[83,13585,13586],{"class":85,"line":111},[83,13587,7147],{},[83,13589,13590],{"class":85,"line":117},[83,13591,7152],{},[83,13593,13594],{"class":85,"line":2479},[83,13595,7157],{},[83,13597,13598],{"class":85,"line":2485},[83,13599,108],{"emptyLinePlaceholder":107},[83,13601,13602],{"class":85,"line":3898},[83,13603,7166],{},[83,13605,13606],{"class":85,"line":4110},[83,13607,7171],{},[83,13609,13610],{"class":85,"line":5775},[83,13611,7176],{},[83,13613,13614],{"class":85,"line":5780},[83,13615,7181],{},[10,13617,123],{},[74,13619,13621],{"className":13620,"code":7187,"language":129,"meta":79},[127],[33,13622,7187],{"__ignoreMap":79},[10,13624,134],{},[14,13626,137],{"id":137},[139,13628,13629,13635],{},[56,13630,13631,7201,13633,7204],{},[33,13632,7200],{},[33,13634,7110],{},[56,13636,13637,7209],{},[33,13638,7089],{},[14,13640,163],{"id":163},[53,13642,13643,13645],{},[56,13644,7216],{},[56,13646,7219,13647,7222,13649,7225],{},[33,13648,7099],{},[33,13650,7103],{},[14,13652,178],{"id":178},[139,13654,13655,13657],{},[56,13656,7232],{},[56,13658,7235],{},[10,13660,196],{},[14,13662,199],{"id":199},[10,13664,7242],{},[204,13666,206],{},{"title":79,"searchDepth":92,"depth":92,"links":13668},[13669,13670,13671,13672,13673,13674,13675,13676],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":7066,"description":7071},[217,7262,7263],{"id":7266,"title":7267,"body":13681,"category":217,"cover":218,"description":7272,"extension":219,"meta":13895,"navigation":107,"path":7546,"pinned":222,"publishedAt":223,"seo":13896,"slug":7548,"stem":7549,"summary":7550,"tags":13897,"updatedAt":223,"visible":107,"__hash__":7554},{"type":7,"value":13682,"toc":13882},[13683,13685,13687,13689,13691,13695,13701,13703,13715,13717,13719,13779,13781,13786,13788,13790,13808,13810,13818,13822,13830,13832,13836,13840,13846,13848,13858,13860,13874,13876,13878,13880],[10,13684,7272],{},[14,13686,16],{"id":16},[10,13688,7277],{},[14,13690,22],{"id":22},[10,13692,13693],{},[26,13694],{"alt":7284,"src":7285},[10,13696,7288,13697,7292,13699,7296],{},[33,13698,7291],{},[33,13700,7295],{},[14,13702,51],{"id":51},[53,13704,13705,13709,13713],{},[56,13706,7303,13707,7306],{},[33,13708,7291],{},[56,13710,13711,7312],{},[33,13712,7311],{},[56,13714,7315],{},[14,13716,69],{"id":69},[10,13718,72],{},[74,13720,13721],{"className":76,"code":7322,"language":78,"meta":79,"style":79},[33,13722,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775],{"__ignoreMap":79},[83,13724,13725],{"class":85,"line":86},[83,13726,7329],{},[83,13728,13729],{"class":85,"line":92},[83,13730,7334],{},[83,13732,13733],{"class":85,"line":98},[83,13734,7339],{},[83,13736,13737],{"class":85,"line":104},[83,13738,7344],{},[83,13740,13741],{"class":85,"line":111},[83,13742,7349],{},[83,13744,13745],{"class":85,"line":117},[83,13746,108],{"emptyLinePlaceholder":107},[83,13748,13749],{"class":85,"line":2479},[83,13750,7358],{},[83,13752,13753],{"class":85,"line":2485},[83,13754,7363],{},[83,13756,13757],{"class":85,"line":3898},[83,13758,7368],{},[83,13760,13761],{"class":85,"line":4110},[83,13762,7373],{},[83,13764,13765],{"class":85,"line":5775},[83,13766,1138],{},[83,13768,13769],{"class":85,"line":5780},[83,13770,7382],{},[83,13772,13773],{"class":85,"line":7385},[83,13774,7388],{},[83,13776,13777],{"class":85,"line":7391},[83,13778,7394],{},[10,13780,123],{},[74,13782,13784],{"className":13783,"code":7400,"language":129,"meta":79},[127],[33,13785,7400],{"__ignoreMap":79},[10,13787,134],{},[14,13789,137],{"id":137},[139,13791,13792,13800],{},[56,13793,13794,7413,13796,7416,13798,7420],{},[33,13795,47],{},[33,13797,7311],{},[33,13799,7419],{},[56,13801,7423,13802,7426,13804,7429,13806,354],{},[33,13803,7291],{},[33,13805,1152],{},[33,13807,7295],{},[320,13809,2689],{"id":2689},[10,13811,13812,2248,13814,1149,13816,7442],{},[33,13813,7291],{},[33,13815,1152],{},[33,13817,7295],{},[10,13819,13820],{},[26,13821],{"alt":7447,"src":7448},[10,13823,13824,7453,13826,7456,13828,7459],{},[33,13825,7291],{},[33,13827,1152],{},[33,13829,7295],{},[320,13831,2689],{"id":4165},[10,13833,13834,7467],{},[33,13835,7466],{},[10,13837,13838],{},[26,13839],{"alt":7472,"src":7473},[10,13841,7476,13842,7479,13844,7482],{},[33,13843,7466],{},[33,13845,1152],{},[14,13847,163],{"id":163},[53,13849,13850,13854],{},[56,13851,7489,13852,7493],{},[33,13853,7492],{},[56,13855,7496,13856,7499],{},[33,13857,7466],{},[14,13859,178],{"id":178},[139,13861,13862,13870],{},[56,13863,7506,13864,7510,13866,1149,13868,354],{},[33,13865,7509],{},[33,13867,7513],{},[33,13869,7516],{},[56,13871,7519,13872,7522],{},[33,13873,6727],{},[10,13875,196],{},[14,13877,199],{"id":199},[10,13879,7529],{},[204,13881,206],{},{"title":79,"searchDepth":92,"depth":92,"links":13883},[13884,13885,13886,13887,13888,13892,13893,13894],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":13889},[13890,13891],{"id":2689,"depth":98,"text":2689},{"id":4165,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":7267,"description":7272},[217,7552,7553],{"id":7556,"title":7557,"body":13899,"category":217,"cover":218,"description":7562,"extension":219,"meta":14050,"navigation":107,"path":7739,"pinned":222,"publishedAt":223,"seo":14051,"slug":7741,"stem":7742,"summary":7743,"tags":14052,"updatedAt":223,"visible":107,"__hash__":7746},{"type":7,"value":13900,"toc":14040},[13901,13903,13905,13907,13909,13913,13917,13919,13931,13933,13935,13983,13985,13990,13992,13994,14004,14006,14016,14018,14032,14034,14036,14038],[10,13902,7562],{},[14,13904,16],{"id":16},[10,13906,7567],{},[14,13908,22],{"id":22},[10,13910,13911],{},[26,13912],{"alt":7574,"src":7575},[10,13914,7578,13915,7581],{},[33,13916,6737],{},[14,13918,51],{"id":51},[53,13920,13921,13925,13929],{},[56,13922,13923,7590],{},[33,13924,6737],{},[56,13926,13927,7596],{},[33,13928,7595],{},[56,13930,7599],{},[14,13932,69],{"id":69},[10,13934,72],{},[74,13936,13937],{"className":76,"code":7606,"language":78,"meta":79,"style":79},[33,13938,13939,13943,13947,13951,13955,13959,13963,13967,13971,13975,13979],{"__ignoreMap":79},[83,13940,13941],{"class":85,"line":86},[83,13942,6549],{},[83,13944,13945],{"class":85,"line":92},[83,13946,108],{"emptyLinePlaceholder":107},[83,13948,13949],{"class":85,"line":98},[83,13950,6760],{},[83,13952,13953],{"class":85,"line":104},[83,13954,108],{"emptyLinePlaceholder":107},[83,13956,13957],{"class":85,"line":111},[83,13958,7629],{},[83,13960,13961],{"class":85,"line":117},[83,13962,7634],{},[83,13964,13965],{"class":85,"line":2479},[83,13966,108],{"emptyLinePlaceholder":107},[83,13968,13969],{"class":85,"line":2485},[83,13970,7643],{},[83,13972,13973],{"class":85,"line":3898},[83,13974,7648],{},[83,13976,13977],{"class":85,"line":4110},[83,13978,108],{"emptyLinePlaceholder":107},[83,13980,13981],{"class":85,"line":5775},[83,13982,7657],{},[10,13984,123],{},[74,13986,13988],{"className":13987,"code":7663,"language":129,"meta":79},[127],[33,13989,7663],{"__ignoreMap":79},[10,13991,134],{},[14,13993,137],{"id":137},[139,13995,13996,14002],{},[56,13997,7578,13998,7676,14000,354],{},[33,13999,6737],{},[33,14001,7679],{},[56,14003,7682],{},[14,14005,163],{"id":163},[53,14007,14008,14012],{},[56,14009,4733,14010,7691],{},[33,14011,6737],{},[56,14013,7694,14014,7697],{},[33,14015,6737],{},[14,14017,178],{"id":178},[139,14019,14020,14026],{},[56,14021,7704,14022,7708,14024,354],{},[33,14023,7707],{},[33,14025,6737],{},[56,14027,4733,14028,7715,14030,354],{},[33,14029,6737],{},[33,14031,7718],{},[10,14033,196],{},[14,14035,199],{"id":199},[10,14037,7725],{},[204,14039,206],{},{"title":79,"searchDepth":92,"depth":92,"links":14041},[14042,14043,14044,14045,14046,14047,14048,14049],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":7557,"description":7562},[217,6737,7745],{"id":7748,"title":7749,"body":14054,"category":217,"cover":218,"description":7754,"extension":219,"meta":14225,"navigation":107,"path":7967,"pinned":222,"publishedAt":223,"seo":14226,"slug":7969,"stem":7970,"summary":7971,"tags":14227,"updatedAt":223,"visible":107,"__hash__":7975},{"type":7,"value":14055,"toc":14213},[14056,14058,14060,14062,14064,14068,14070,14072,14084,14086,14088,14144,14146,14151,14153,14155,14171,14173,14175,14179,14185,14187,14195,14197,14205,14207,14209,14211],[10,14057,7754],{},[14,14059,16],{"id":16},[10,14061,7759],{},[14,14063,22],{"id":22},[10,14065,14066],{},[26,14067],{"alt":7766,"src":7767},[10,14069,7770],{},[14,14071,51],{"id":51},[53,14073,14074,14078,14082],{},[56,14075,14076,7780],{},[33,14077,7779],{},[56,14079,14080,7786],{},[33,14081,7785],{},[56,14083,7789],{},[14,14085,69],{"id":69},[10,14087,72],{},[74,14089,14090],{"className":76,"code":7796,"language":78,"meta":79,"style":79},[33,14091,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140],{"__ignoreMap":79},[83,14093,14094],{"class":85,"line":86},[83,14095,7803],{},[83,14097,14098],{"class":85,"line":92},[83,14099,7808],{},[83,14101,14102],{"class":85,"line":98},[83,14103,7813],{},[83,14105,14106],{"class":85,"line":104},[83,14107,7818],{},[83,14109,14110],{"class":85,"line":111},[83,14111,108],{"emptyLinePlaceholder":107},[83,14113,14114],{"class":85,"line":117},[83,14115,7827],{},[83,14117,14118],{"class":85,"line":2479},[83,14119,7832],{},[83,14121,14122],{"class":85,"line":2485},[83,14123,7837],{},[83,14125,14126],{"class":85,"line":3898},[83,14127,7842],{},[83,14129,14130],{"class":85,"line":4110},[83,14131,108],{"emptyLinePlaceholder":107},[83,14133,14134],{"class":85,"line":5775},[83,14135,7851],{},[83,14137,14138],{"class":85,"line":5780},[83,14139,7856],{},[83,14141,14142],{"class":85,"line":7385},[83,14143,7861],{},[10,14145,123],{},[74,14147,14149],{"className":14148,"code":7867,"language":129,"meta":79},[127],[33,14150,7867],{"__ignoreMap":79},[10,14152,134],{},[14,14154,137],{"id":137},[139,14156,14157,14163],{},[56,14158,7878,14159,7882,14161,7885],{},[33,14160,7881],{},[33,14162,7785],{},[56,14164,14165,7891,14167,7895,14169,7898],{},[33,14166,7890],{},[33,14168,7894],{},[33,14170,7779],{},[320,14172,2689],{"id":2689},[10,14174,7903],{},[10,14176,14177],{},[26,14178],{"alt":7908,"src":7909},[10,14180,7912,14181,1149,14183,7918],{},[33,14182,4530],{},[33,14184,7917],{},[14,14186,163],{"id":163},[53,14188,14189,14193],{},[56,14190,7925,14191,7928],{},[33,14192,7779],{},[56,14194,7931],{},[14,14196,178],{"id":178},[139,14198,14199,14203],{},[56,14200,5243,14201,7941],{},[33,14202,7940],{},[56,14204,7944],{},[10,14206,196],{},[14,14208,199],{"id":199},[10,14210,7951],{},[204,14212,206],{},{"title":79,"searchDepth":92,"depth":92,"links":14214},[14215,14216,14217,14218,14219,14222,14223,14224],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":14220},[14221],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":7749,"description":7754},[217,7973,7974],{"id":7977,"title":7978,"body":14229,"category":217,"cover":218,"description":7983,"extension":219,"meta":14376,"navigation":107,"path":8162,"pinned":222,"publishedAt":223,"seo":14377,"slug":8164,"stem":8165,"summary":8166,"tags":14378,"updatedAt":223,"visible":107,"__hash__":8170},{"type":7,"value":14230,"toc":14366},[14231,14233,14235,14237,14239,14243,14245,14247,14255,14257,14259,14315,14317,14322,14324,14326,14338,14340,14346,14348,14358,14360,14362,14364],[10,14232,7983],{},[14,14234,16],{"id":16},[10,14236,7988],{},[14,14238,22],{"id":22},[10,14240,14241],{},[26,14242],{"alt":7995,"src":7996},[10,14244,7999],{},[14,14246,51],{"id":51},[53,14248,14249,14251,14253],{},[56,14250,8006],{},[56,14252,8009],{},[56,14254,8012],{},[14,14256,69],{"id":69},[10,14258,72],{},[74,14260,14261],{"className":76,"code":8019,"language":78,"meta":79,"style":79},[33,14262,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311],{"__ignoreMap":79},[83,14264,14265],{"class":85,"line":86},[83,14266,8026],{},[83,14268,14269],{"class":85,"line":92},[83,14270,8031],{},[83,14272,14273],{"class":85,"line":98},[83,14274,8036],{},[83,14276,14277],{"class":85,"line":104},[83,14278,108],{"emptyLinePlaceholder":107},[83,14280,14281],{"class":85,"line":111},[83,14282,8045],{},[83,14284,14285],{"class":85,"line":117},[83,14286,8050],{},[83,14288,14289],{"class":85,"line":2479},[83,14290,8055],{},[83,14292,14293],{"class":85,"line":2485},[83,14294,108],{"emptyLinePlaceholder":107},[83,14296,14297],{"class":85,"line":3898},[83,14298,8064],{},[83,14300,14301],{"class":85,"line":4110},[83,14302,8069],{},[83,14304,14305],{"class":85,"line":5775},[83,14306,108],{"emptyLinePlaceholder":107},[83,14308,14309],{"class":85,"line":5780},[83,14310,8078],{},[83,14312,14313],{"class":85,"line":7385},[83,14314,8083],{},[10,14316,123],{},[74,14318,14320],{"className":14319,"code":8089,"language":129,"meta":79},[127],[33,14321,8089],{"__ignoreMap":79},[10,14323,134],{},[14,14325,137],{"id":137},[139,14327,14328,14334],{},[56,14329,14330,8103,14332,8107],{},[33,14331,8102],{},[33,14333,8106],{},[56,14335,8110,14336,8114],{},[33,14337,8113],{},[14,14339,163],{"id":163},[53,14341,14342,14344],{},[56,14343,8121],{},[56,14345,8124],{},[14,14347,178],{"id":178},[139,14349,14350,14356],{},[56,14351,8131,14352,8135,14354,354],{},[33,14353,8134],{},[33,14355,8138],{},[56,14357,8141],{},[10,14359,196],{},[14,14361,199],{"id":199},[10,14363,8148],{},[204,14365,206],{},{"title":79,"searchDepth":92,"depth":92,"links":14367},[14368,14369,14370,14371,14372,14373,14374,14375],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":7978,"description":7983},[217,8168,8169],{"id":8172,"title":8173,"body":14380,"category":217,"cover":218,"description":8178,"extension":219,"meta":14543,"navigation":107,"path":8382,"pinned":222,"publishedAt":223,"seo":14544,"slug":8384,"stem":8385,"summary":8386,"tags":14545,"updatedAt":223,"visible":107,"__hash__":8390},{"type":7,"value":14381,"toc":14531},[14382,14384,14386,14388,14390,14394,14398,14400,14416,14418,14420,14464,14466,14471,14473,14475,14489,14491,14495,14499,14503,14505,14511,14513,14523,14525,14527,14529],[10,14383,8178],{},[14,14385,16],{"id":16},[10,14387,8183],{},[14,14389,22],{"id":22},[10,14391,14392],{},[26,14393],{"alt":8190,"src":8191},[10,14395,8194,14396,8198],{},[33,14397,8197],{},[14,14399,51],{"id":51},[53,14401,14402,14408,14414],{},[56,14403,14404,8208,14406,8212],{},[33,14405,8207],{},[33,14407,8211],{},[56,14409,8215,14410,8219,14412,8222],{},[33,14411,8218],{},[33,14413,4284],{},[56,14415,8225],{},[14,14417,69],{"id":69},[10,14419,72],{},[74,14421,14422],{"className":76,"code":8232,"language":78,"meta":79,"style":79},[33,14423,14424,14428,14432,14436,14440,14444,14448,14452,14456,14460],{"__ignoreMap":79},[83,14425,14426],{"class":85,"line":86},[83,14427,8239],{},[83,14429,14430],{"class":85,"line":92},[83,14431,8244],{},[83,14433,14434],{"class":85,"line":98},[83,14435,8249],{},[83,14437,14438],{"class":85,"line":104},[83,14439,8254],{},[83,14441,14442],{"class":85,"line":111},[83,14443,8259],{},[83,14445,14446],{"class":85,"line":117},[83,14447,108],{"emptyLinePlaceholder":107},[83,14449,14450],{"class":85,"line":2479},[83,14451,8268],{},[83,14453,14454],{"class":85,"line":2485},[83,14455,8273],{},[83,14457,14458],{"class":85,"line":3898},[83,14459,8273],{},[83,14461,14462],{"class":85,"line":4110},[83,14463,8273],{},[10,14465,123],{},[74,14467,14469],{"className":14468,"code":8287,"language":129,"meta":79},[127],[33,14470,8287],{"__ignoreMap":79},[10,14472,134],{},[14,14474,137],{"id":137},[139,14476,14477,14481],{},[56,14478,7878,14479,8301],{},[33,14480,8300],{},[56,14482,8304,14483,8307,14485,8310,14487,8314],{},[33,14484,8211],{},[33,14486,8197],{},[33,14488,8313],{},[320,14490,2689],{"id":2689},[10,14492,8319,14493,8322],{},[33,14494,8211],{},[10,14496,14497],{},[26,14498],{"alt":8327,"src":8328},[10,14500,8331,14501,8334],{},[33,14502,8197],{},[14,14504,163],{"id":163},[53,14506,14507,14509],{},[56,14508,8341],{},[56,14510,8344],{},[14,14512,178],{"id":178},[139,14514,14515,14517],{},[56,14516,8351],{},[56,14518,3956,14519,8356,14521,8359],{},[33,14520,4284],{},[33,14522,8211],{},[10,14524,196],{},[14,14526,199],{"id":199},[10,14528,8366],{},[204,14530,206],{},{"title":79,"searchDepth":92,"depth":92,"links":14532},[14533,14534,14535,14536,14537,14540,14541,14542],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":14538},[14539],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":8173,"description":8178},[217,8388,8389],{"id":8392,"title":8393,"body":14547,"category":217,"cover":218,"description":8398,"extension":219,"meta":14730,"navigation":107,"path":8623,"pinned":222,"publishedAt":223,"seo":14731,"slug":8625,"stem":8626,"summary":8627,"tags":14732,"updatedAt":223,"visible":107,"__hash__":8630},{"type":7,"value":14548,"toc":14718},[14549,14551,14553,14555,14557,14561,14563,14565,14579,14581,14583,14651,14653,14658,14660,14662,14676,14678,14680,14684,14690,14692,14700,14702,14710,14712,14714,14716],[10,14550,8398],{},[14,14552,16],{"id":16},[10,14554,8403],{},[14,14556,22],{"id":22},[10,14558,14559],{},[26,14560],{"alt":8410,"src":8411},[10,14562,8414],{},[14,14564,51],{"id":51},[53,14566,14567,14573,14575],{},[56,14568,14569,8424,14571,354],{},[33,14570,8423],{},[33,14572,8427],{},[56,14574,8430],{},[56,14576,14577,8436],{},[33,14578,8435],{},[14,14580,69],{"id":69},[10,14582,72],{},[74,14584,14585],{"className":76,"code":8443,"language":78,"meta":79,"style":79},[33,14586,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647],{"__ignoreMap":79},[83,14588,14589],{"class":85,"line":86},[83,14590,8450],{},[83,14592,14593],{"class":85,"line":92},[83,14594,108],{"emptyLinePlaceholder":107},[83,14596,14597],{"class":85,"line":98},[83,14598,8459],{},[83,14600,14601],{"class":85,"line":104},[83,14602,8464],{},[83,14604,14605],{"class":85,"line":111},[83,14606,8469],{},[83,14608,14609],{"class":85,"line":117},[83,14610,8474],{},[83,14612,14613],{"class":85,"line":2479},[83,14614,8479],{},[83,14616,14617],{"class":85,"line":2485},[83,14618,8484],{},[83,14620,14621],{"class":85,"line":3898},[83,14622,8489],{},[83,14624,14625],{"class":85,"line":4110},[83,14626,8494],{},[83,14628,14629],{"class":85,"line":5775},[83,14630,108],{"emptyLinePlaceholder":107},[83,14632,14633],{"class":85,"line":5780},[83,14634,8503],{},[83,14636,14637],{"class":85,"line":7385},[83,14638,6128],{},[83,14640,14641],{"class":85,"line":7391},[83,14642,6133],{},[83,14644,14645],{"class":85,"line":8514},[83,14646,108],{"emptyLinePlaceholder":107},[83,14648,14649],{"class":85,"line":8519},[83,14650,8522],{},[10,14652,123],{},[74,14654,14656],{"className":14655,"code":8528,"language":129,"meta":79},[127],[33,14657,8528],{"__ignoreMap":79},[10,14659,134],{},[14,14661,137],{"id":137},[139,14663,14664,14674],{},[56,14665,8539,14666,8543,14668,8547,14670,8551,14672,354],{},[33,14667,8542],{},[33,14669,8546],{},[33,14671,8550],{},[33,14673,8542],{},[56,14675,8556],{},[320,14677,2689],{"id":2689},[10,14679,8561],{},[10,14681,14682],{},[26,14683],{"alt":8566,"src":8567},[10,14685,14686,8572,14688,354],{},[33,14687,8423],{},[33,14689,8427],{},[14,14691,163],{"id":163},[53,14693,14694,14698],{},[56,14695,8581,14696,354],{},[33,14697,5326],{},[56,14699,8586],{},[14,14701,178],{"id":178},[139,14703,14704,14706],{},[56,14705,8593],{},[56,14707,8596,14708,8600],{},[33,14709,8599],{},[10,14711,196],{},[14,14713,199],{"id":199},[10,14715,8607],{},[204,14717,206],{},{"title":79,"searchDepth":92,"depth":92,"links":14719},[14720,14721,14722,14723,14724,14727,14728,14729],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":14725},[14726],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":8393,"description":8398},[217,8629,5277],{"id":8632,"title":8633,"body":14734,"category":217,"cover":218,"description":8638,"extension":219,"meta":14893,"navigation":107,"path":8826,"pinned":222,"publishedAt":223,"seo":14894,"slug":8828,"stem":8829,"summary":8830,"tags":14895,"updatedAt":223,"visible":107,"__hash__":8834},{"type":7,"value":14735,"toc":14881},[14736,14738,14740,14742,14744,14748,14750,14752,14760,14762,14764,14828,14830,14835,14837,14839,14847,14849,14851,14855,14857,14859,14865,14867,14873,14875,14877,14879],[10,14737,8638],{},[14,14739,16],{"id":16},[10,14741,8643],{},[14,14743,22],{"id":22},[10,14745,14746],{},[26,14747],{"alt":8650,"src":8651},[10,14749,8654],{},[14,14751,51],{"id":51},[53,14753,14754,14756,14758],{},[56,14755,8661],{},[56,14757,8664],{},[56,14759,8667],{},[14,14761,69],{"id":69},[10,14763,72],{},[74,14765,14766],{"className":76,"code":8674,"language":78,"meta":79,"style":79},[33,14767,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824],{"__ignoreMap":79},[83,14769,14770],{"class":85,"line":86},[83,14771,8681],{},[83,14773,14774],{"class":85,"line":92},[83,14775,8686],{},[83,14777,14778],{"class":85,"line":98},[83,14779,108],{"emptyLinePlaceholder":107},[83,14781,14782],{"class":85,"line":104},[83,14783,8695],{},[83,14785,14786],{"class":85,"line":111},[83,14787,108],{"emptyLinePlaceholder":107},[83,14789,14790],{"class":85,"line":117},[83,14791,8704],{},[83,14793,14794],{"class":85,"line":2479},[83,14795,8709],{},[83,14797,14798],{"class":85,"line":2485},[83,14799,8714],{},[83,14801,14802],{"class":85,"line":3898},[83,14803,108],{"emptyLinePlaceholder":107},[83,14805,14806],{"class":85,"line":4110},[83,14807,8723],{},[83,14809,14810],{"class":85,"line":5775},[83,14811,8728],{},[83,14813,14814],{"class":85,"line":5780},[83,14815,8733],{},[83,14817,14818],{"class":85,"line":7385},[83,14819,108],{"emptyLinePlaceholder":107},[83,14821,14822],{"class":85,"line":7391},[83,14823,6142],{},[83,14825,14826],{"class":85,"line":8514},[83,14827,8746],{},[10,14829,123],{},[74,14831,14833],{"className":14832,"code":8752,"language":129,"meta":79},[127],[33,14834,8752],{"__ignoreMap":79},[10,14836,134],{},[14,14838,137],{"id":137},[139,14840,14841,14845],{},[56,14842,14843,8766],{},[33,14844,8765],{},[56,14846,8769],{},[320,14848,2689],{"id":2689},[10,14850,8774],{},[10,14852,14853],{},[26,14854],{"alt":8779,"src":8780},[10,14856,8783],{},[14,14858,163],{"id":163},[53,14860,14861,14863],{},[56,14862,8790],{},[56,14864,8793],{},[14,14866,178],{"id":178},[139,14868,14869,14871],{},[56,14870,8800],{},[56,14872,8803],{},[10,14874,196],{},[14,14876,199],{"id":199},[10,14878,8810],{},[204,14880,206],{},{"title":79,"searchDepth":92,"depth":92,"links":14882},[14883,14884,14885,14886,14887,14890,14891,14892],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":14888},[14889],{"id":2689,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":8633,"description":8638},[217,8832,8833],{"id":8836,"title":8837,"body":14897,"category":217,"cover":218,"description":8842,"extension":219,"meta":15135,"navigation":107,"path":9143,"pinned":222,"publishedAt":223,"seo":15136,"slug":9145,"stem":9146,"summary":9147,"tags":15137,"updatedAt":223,"visible":107,"__hash__":9151},{"type":7,"value":14898,"toc":15122},[14899,14901,14903,14905,14907,14911,14913,14915,14925,14927,14929,15045,15047,15052,15054,15056,15066,15068,15070,15074,15076,15078,15080,15084,15088,15090,15098,15100,15114,15116,15118,15120],[10,14900,8842],{},[14,14902,16],{"id":16},[10,14904,8847],{},[14,14906,22],{"id":22},[10,14908,14909],{},[26,14910],{"alt":8854,"src":8855},[10,14912,8858],{},[14,14914,51],{"id":51},[53,14916,14917,14919,14921],{},[56,14918,8865],{},[56,14920,8868],{},[56,14922,8871,14923,8875],{},[33,14924,8874],{},[14,14926,69],{"id":69},[10,14928,72],{},[74,14930,14931],{"className":76,"code":8882,"language":78,"meta":79,"style":79},[33,14932,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041],{"__ignoreMap":79},[83,14934,14935],{"class":85,"line":86},[83,14936,6940],{},[83,14938,14939],{"class":85,"line":92},[83,14940,6549],{},[83,14942,14943],{"class":85,"line":98},[83,14944,108],{"emptyLinePlaceholder":107},[83,14946,14947],{"class":85,"line":104},[83,14948,8901],{},[83,14950,14951],{"class":85,"line":111},[83,14952,8906],{},[83,14954,14955],{"class":85,"line":117},[83,14956,8911],{},[83,14958,14959],{"class":85,"line":2479},[83,14960,8916],{},[83,14962,14963],{"class":85,"line":2485},[83,14964,108],{"emptyLinePlaceholder":107},[83,14966,14967],{"class":85,"line":3898},[83,14968,8925],{},[83,14970,14971],{"class":85,"line":4110},[83,14972,8930],{},[83,14974,14975],{"class":85,"line":5775},[83,14976,8935],{},[83,14978,14979],{"class":85,"line":5780},[83,14980,8940],{},[83,14982,14983],{"class":85,"line":7385},[83,14984,8945],{},[83,14986,14987],{"class":85,"line":7391},[83,14988,108],{"emptyLinePlaceholder":107},[83,14990,14991],{"class":85,"line":8514},[83,14992,8954],{},[83,14994,14995],{"class":85,"line":8519},[83,14996,8959],{},[83,14998,14999],{"class":85,"line":8962},[83,15000,8965],{},[83,15002,15003],{"class":85,"line":8968},[83,15004,108],{"emptyLinePlaceholder":107},[83,15006,15007],{"class":85,"line":8973},[83,15008,8976],{},[83,15010,15011],{"class":85,"line":8979},[83,15012,108],{"emptyLinePlaceholder":107},[83,15014,15015],{"class":85,"line":8984},[83,15016,7358],{},[83,15018,15019],{"class":85,"line":8989},[83,15020,8992],{},[83,15022,15023],{"class":85,"line":8995},[83,15024,8998],{},[83,15026,15027],{"class":85,"line":9001},[83,15028,9004],{},[83,15030,15031],{"class":85,"line":9007},[83,15032,7368],{},[83,15034,15035],{"class":85,"line":9012},[83,15036,9015],{},[83,15038,15039],{"class":85,"line":9018},[83,15040,1138],{},[83,15042,15043],{"class":85,"line":9023},[83,15044,9026],{},[10,15046,123],{},[74,15048,15050],{"className":15049,"code":9032,"language":129,"meta":79},[127],[33,15051,9032],{"__ignoreMap":79},[10,15053,134],{},[14,15055,137],{"id":137},[139,15057,15058,15062],{},[56,15059,9043,15060,9046],{},[33,15061,8874],{},[56,15063,15064,9051],{},[33,15065,8106],{},[320,15067,2689],{"id":2689},[10,15069,9056],{},[10,15071,15072],{},[26,15073],{"alt":9061,"src":9062},[10,15075,9065],{},[320,15077,2689],{"id":4165},[10,15079,9070],{},[10,15081,15082],{},[26,15083],{"alt":9075,"src":9076},[10,15085,9079,15086,9083],{},[33,15087,9082],{},[14,15089,163],{"id":163},[53,15091,15092,15094],{},[56,15093,9090],{},[56,15095,9093,15096,9096],{},[33,15097,9082],{},[14,15099,178],{"id":178},[139,15101,15102,15106,15108],{},[56,15103,9103,15104,9106],{},[33,15105,9082],{},[56,15107,9109],{},[56,15109,9112,15110,9116,15112,9119],{},[33,15111,9115],{},[33,15113,6084],{},[10,15115,196],{},[14,15117,199],{"id":199},[10,15119,9126],{},[204,15121,206],{},{"title":79,"searchDepth":92,"depth":92,"links":15123},[15124,15125,15126,15127,15128,15132,15133,15134],{"id":16,"depth":92,"text":16},{"id":22,"depth":92,"text":22},{"id":51,"depth":92,"text":51},{"id":69,"depth":92,"text":69},{"id":137,"depth":92,"text":137,"children":15129},[15130,15131],{"id":2689,"depth":98,"text":2689},{"id":4165,"depth":98,"text":2689},{"id":163,"depth":92,"text":163},{"id":178,"depth":92,"text":178},{"id":199,"depth":92,"text":199},{},{"title":8837,"description":8842},[217,9149,9150],{"id":1048,"title":1049,"body":15139,"category":217,"cover":1057,"description":79,"extension":219,"meta":15375,"navigation":107,"path":1374,"pinned":222,"publishedAt":1375,"seo":15376,"slug":1377,"stem":1378,"summary":1379,"tags":15377,"updatedAt":1375,"visible":107,"__hash__":1383},{"type":7,"value":15140,"toc":15360},[15141,15145,15147,15149,15151,15153,15173,15175,15180,15182,15184,15212,15218,15220,15224,15226,15246,15248,15258,15260,15262,15264,15266,15268,15270,15272,15274,15276,15296,15298,15300,15304,15306,15308,15310,15312,15316,15318,15336,15338,15340,15342,15344,15346,15348,15350,15352,15354,15356,15358],[10,15142,15143],{},[26,15144],{"alt":1056,"src":1057},[10,15146,1060],{},[10,15148,1063],{},[14,15150,1067],{"id":1066},[10,15152,1070],{},[74,15154,15155],{"className":76,"code":1073,"language":78,"meta":79,"style":79},[33,15156,15157,15161,15165,15169],{"__ignoreMap":79},[83,15158,15159],{"class":85,"line":86},[83,15160,1080],{},[83,15162,15163],{"class":85,"line":92},[83,15164,1085],{},[83,15166,15167],{"class":85,"line":98},[83,15168,108],{"emptyLinePlaceholder":107},[83,15170,15171],{"class":85,"line":104},[83,15172,1094],{},[10,15174,1097],{},[74,15176,15178],{"className":15177,"code":1101,"language":129,"meta":79},[127],[33,15179,1101],{"__ignoreMap":79},[10,15181,1106],{},[10,15183,1109],{},[74,15185,15186],{"className":76,"code":1112,"language":78,"meta":79,"style":79},[33,15187,15188,15192,15196,15200,15204,15208],{"__ignoreMap":79},[83,15189,15190],{"class":85,"line":86},[83,15191,1119],{},[83,15193,15194],{"class":85,"line":92},[83,15195,108],{"emptyLinePlaceholder":107},[83,15197,15198],{"class":85,"line":98},[83,15199,1128],{},[83,15201,15202],{"class":85,"line":104},[83,15203,1133],{},[83,15205,15206],{"class":85,"line":111},[83,15207,1138],{},[83,15209,15210],{"class":85,"line":117},[83,15211,1143],{},[10,15213,15214,1149,15216,1153],{},[33,15215,1148],{},[33,15217,1152],{},[14,15219,1157],{"id":1156},[10,15221,1160,15222,1164],{},[33,15223,1163],{},[10,15225,1167],{},[74,15227,15228],{"className":76,"code":1170,"language":78,"meta":79,"style":79},[33,15229,15230,15234,15238,15242],{"__ignoreMap":79},[83,15231,15232],{"class":85,"line":86},[83,15233,1177],{},[83,15235,15236],{"class":85,"line":92},[83,15237,1182],{},[83,15239,15240],{"class":85,"line":98},[83,15241,1187],{},[83,15243,15244],{"class":85,"line":104},[83,15245,1192],{},[10,15247,1195],{},[74,15249,15250],{"className":583,"code":1198,"language":585,"meta":79,"style":79},[33,15251,15252],{"__ignoreMap":79},[83,15253,15254,15256],{"class":85,"line":86},[83,15255,683],{"class":592},[83,15257,1207],{"class":628},[10,15259,1210],{},[14,15261,1214],{"id":1213},[320,15263,1217],{"id":1217},[10,15265,1220],{},[320,15267,1223],{"id":1223},[10,15269,1226],{},[320,15271,1229],{"id":1229},[10,15273,1232],{},[10,15275,1235],{},[74,15277,15278],{"className":76,"code":1238,"language":78,"meta":79,"style":79},[33,15279,15280,15284,15288,15292],{"__ignoreMap":79},[83,15281,15282],{"class":85,"line":86},[83,15283,1245],{},[83,15285,15286],{"class":85,"line":92},[83,15287,108],{"emptyLinePlaceholder":107},[83,15289,15290],{"class":85,"line":98},[83,15291,1254],{},[83,15293,15294],{"class":85,"line":104},[83,15295,1259],{},[10,15297,1262],{},[320,15299,1265],{"id":1265},[10,15301,1268,15302,1271],{},[33,15303,252],{},[10,15305,1274],{},[320,15307,1277],{"id":1277},[10,15309,1280],{},[14,15311,1284],{"id":1283},[10,15313,15314],{},[26,15315],{"alt":1289,"src":1290},[10,15317,1293],{},[53,15319,15320,15322,15324,15326,15328,15330,15332,15334],{},[56,15321,1298],{},[56,15323,1301],{},[56,15325,1304],{},[56,15327,1307],{},[56,15329,1310],{},[56,15331,1313],{},[56,15333,1316],{},[56,15335,1319],{},[10,15337,1322],{},[14,15339,1326],{"id":1325},[10,15341,1329],{},[10,15343,1332],{},[14,15345,1336],{"id":1335},[10,15347,1339],{},[10,15349,1342],{},[10,15351,1345],{},[14,15353,1348],{"id":1348},[10,15355,1351],{},[10,15357,1354],{},[204,15359,1357],{},{"title":79,"searchDepth":92,"depth":92,"links":15361},[15362,15363,15364,15371,15372,15373,15374],{"id":1066,"depth":92,"text":1067},{"id":1156,"depth":92,"text":1157},{"id":1213,"depth":92,"text":1214,"children":15365},[15366,15367,15368,15369,15370],{"id":1217,"depth":98,"text":1217},{"id":1223,"depth":98,"text":1223},{"id":1229,"depth":98,"text":1229},{"id":1265,"depth":98,"text":1265},{"id":1277,"depth":98,"text":1277},{"id":1283,"depth":92,"text":1284},{"id":1325,"depth":92,"text":1326},{"id":1335,"depth":92,"text":1336},{"id":1348,"depth":92,"text":1348},{},{"title":1049,"description":79},[217,1381,1382],{"id":234,"title":235,"body":15379,"category":217,"cover":218,"description":79,"extension":219,"meta":15958,"navigation":107,"path":1037,"pinned":222,"publishedAt":1038,"seo":15959,"slug":1040,"stem":1041,"summary":1042,"tags":15960,"updatedAt":1038,"visible":107,"__hash__":1046},{"type":7,"value":15380,"toc":15934},[15381,15383,15385,15387,15391,15393,15395,15419,15431,15433,15435,15440,15444,15448,15460,15464,15468,15472,15474,15508,15510,15514,15518,15520,15542,15572,15584,15594,15602,15604,15610,15620,15622,15627,15631,15633,15647,15653,15673,15675,15677,15679,15689,15693,15695,15704,15708,15710,15712,15732,15736,15738,15740,15742,15744,15764,15766,15768,15770,15796,15798,15814,15816,15832,15836,15838,15840,15860,15862,15864,15866,15870,15880,15882,15884,15886,15896,15904,15906,15908,15922,15932],[14,15382,240],{"id":240},[10,15384,243],{},[10,15386,246],{},[10,15388,249,15389,253],{},[33,15390,252],{},[14,15392,256],{"id":256},[10,15394,259],{},[261,15396,15397,15399],{},[10,15398,265],{},[261,15400,15401,15407,15409,15413,15415],{},[10,15402,270,15403,274,15405,278],{},[33,15404,273],{},[33,15406,277],{},[10,15408,281],{},[10,15410,284,15411,289],{},[286,15412,288],{},[10,15414,292],{},[10,15416,15417],{},[26,15418],{"alt":297,"src":298},[261,15420,15421,15423],{},[10,15422,303],{},[261,15424,15425,15427],{},[10,15426,308],{},[10,15428,15429],{},[26,15430],{"alt":313,"src":314},[14,15432,318],{"id":317},[320,15434,323],{"id":322},[10,15436,326,15437,334],{},[328,15438,333],{"href":330,"rel":15439},[332],[261,15441,15442],{},[10,15443,339],{},[10,15445,15446],{},[26,15447],{"alt":344,"src":345},[53,15449,15450,15454,15458],{},[56,15451,350,15452,354],{},[286,15453,353],{},[56,15455,357,15456,354],{},[286,15457,360],{},[56,15459,363],{},[10,15461,15462],{},[26,15463],{"alt":368,"src":369},[261,15465,15466],{},[10,15467,374],{},[10,15469,15470],{},[26,15471],{"alt":379,"src":380},[320,15473,384],{"id":383},[261,15475,15476,15480,15484,15504],{},[261,15477,15478],{},[10,15479,391],{},[10,15481,394,15482,398],{},[286,15483,397],{},[74,15485,15486],{"className":76,"code":401,"language":78,"meta":79,"style":79},[33,15487,15488,15492,15496,15500],{"__ignoreMap":79},[83,15489,15490],{"class":85,"line":86},[83,15491,408],{},[83,15493,15494],{"class":85,"line":92},[83,15495,413],{},[83,15497,15498],{"class":85,"line":98},[83,15499,418],{},[83,15501,15502],{"class":85,"line":104},[83,15503,423],{},[10,15505,426,15506,430],{},[286,15507,429],{},[10,15509,433],{},[10,15511,436,15512,439],{},[33,15513,78],{},[10,15515,15516],{},[26,15517],{"alt":444,"src":445},[10,15519,448],{},[261,15521,15522,15524,15528],{},[10,15523,453],{},[10,15525,15526],{},[286,15527,458],{},[261,15529,15530,15534,15538],{},[10,15531,463,15532,466],{},[33,15533,78],{},[10,15535,469,15536,472],{},[33,15537,78],{},[10,15539,475,15540,479],{},[286,15541,478],{},[261,15543,15544,15546,15550],{},[10,15545,484],{},[10,15547,15548],{},[286,15549,489],{},[261,15551,15552,15558,15566,15568],{},[10,15553,15554,497,15556,501],{},[33,15555,496],{},[33,15557,500],{},[10,15559,504,15560,507,15562,511,15564,515],{},[33,15561,496],{},[286,15563,510],{},[286,15565,514],{},[10,15567,518],{},[10,15569,15570,524],{},[286,15571,523],{},[261,15573,15574,15576],{},[10,15575,529],{},[261,15577,15578,15582],{},[10,15579,534,15580,538],{},[286,15581,537],{},[10,15583,541],{},[261,15585,15586,15590],{},[10,15587,546,15588],{},[286,15589,549],{},[10,15591,15592],{},[26,15593],{"alt":554,"src":555},[261,15595,15596,15598],{},[10,15597,560],{},[10,15599,15600],{},[26,15601],{"alt":554,"src":565},[320,15603,569],{"id":568},[10,15605,572,15606,576,15608,580],{},[33,15607,575],{},[33,15609,579],{},[74,15611,15612],{"className":583,"code":584,"language":585,"meta":79,"style":79},[33,15613,15614],{"__ignoreMap":79},[83,15615,15616,15618],{"class":85,"line":86},[83,15617,78],{"class":592},[83,15619,596],{"class":595},[10,15621,599],{},[74,15623,15625],{"className":15624,"code":603,"language":129,"meta":79},[127],[33,15626,603],{"__ignoreMap":79},[10,15628,15629],{},[26,15630],{"alt":554,"src":610},[10,15632,613],{},[74,15634,15635],{"className":583,"code":616,"language":585,"meta":79,"style":79},[33,15636,15637],{"__ignoreMap":79},[83,15638,15639,15641,15643,15645],{"class":85,"line":86},[83,15640,78],{"class":592},[83,15642,625],{"class":595},[83,15644,629],{"class":628},[83,15646,596],{"class":595},[10,15648,634,15649,637,15651,641],{},[33,15650,78],{},[33,15652,640],{},[74,15654,15655],{"className":583,"code":644,"language":585,"meta":79,"style":79},[33,15656,15657,15663],{"__ignoreMap":79},[83,15658,15659,15661],{"class":85,"line":86},[83,15660,500],{"class":592},[83,15662,596],{"class":595},[83,15664,15665,15667,15669,15671],{"class":85,"line":92},[83,15666,500],{"class":592},[83,15668,625],{"class":595},[83,15670,629],{"class":628},[83,15672,596],{"class":595},[14,15674,666],{"id":665},[320,15676,670],{"id":669},[10,15678,673],{},[74,15680,15681],{"className":583,"code":676,"language":585,"meta":79,"style":79},[33,15682,15683],{"__ignoreMap":79},[83,15684,15685,15687],{"class":85,"line":86},[83,15686,683],{"class":592},[83,15688,596],{"class":595},[10,15690,688,15691,692],{},[33,15692,691],{},[320,15694,696],{"id":695},[10,15696,326,15697,704,15700,354,15702,711],{},[328,15698,703],{"href":701,"rel":15699},[332],[286,15701,707],{},[33,15703,710],{},[10,15705,714,15706,718],{},[33,15707,717],{},[320,15709,722],{"id":721},[10,15711,725],{},[74,15713,15714],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,15715,15716,15722],{"__ignoreMap":79},[83,15717,15718,15720],{"class":85,"line":86},[83,15719,683],{"class":592},[83,15721,596],{"class":595},[83,15723,15724,15726,15728,15730],{"class":85,"line":92},[83,15725,683],{"class":592},[83,15727,625],{"class":595},[83,15729,629],{"class":628},[83,15731,596],{"class":595},[10,15733,749,15734,752],{},[33,15735,683],{},[14,15737,756],{"id":755},[10,15739,759],{},[320,15741,763],{"id":762},[10,15743,766],{},[74,15745,15746],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,15747,15748,15754],{"__ignoreMap":79},[83,15749,15750,15752],{"class":85,"line":86},[83,15751,683],{"class":592},[83,15753,596],{"class":595},[83,15755,15756,15758,15760,15762],{"class":85,"line":92},[83,15757,683],{"class":592},[83,15759,625],{"class":595},[83,15761,629],{"class":628},[83,15763,596],{"class":595},[10,15765,789],{},[320,15767,793],{"id":792},[10,15769,796],{},[74,15771,15772],{"className":583,"code":799,"language":585,"meta":79,"style":79},[33,15773,15774,15782],{"__ignoreMap":79},[83,15775,15776,15778,15780],{"class":85,"line":86},[83,15777,806],{"class":592},[83,15779,809],{"class":628},[83,15781,812],{"class":628},[83,15783,15784,15786,15788,15790,15792,15794],{"class":85,"line":92},[83,15785,806],{"class":592},[83,15787,809],{"class":628},[83,15789,821],{"class":628},[83,15791,824],{"class":628},[83,15793,827],{"class":628},[83,15795,830],{"class":628},[10,15797,833],{},[74,15799,15800],{"className":583,"code":836,"language":585,"meta":79,"style":79},[33,15801,15802],{"__ignoreMap":79},[83,15803,15804,15806,15808,15810,15812],{"class":85,"line":86},[83,15805,806],{"class":592},[83,15807,845],{"class":628},[83,15809,821],{"class":628},[83,15811,824],{"class":628},[83,15813,852],{"class":628},[10,15815,855],{},[74,15817,15818],{"className":583,"code":858,"language":585,"meta":79,"style":79},[33,15819,15820],{"__ignoreMap":79},[83,15821,15822,15824,15826,15828,15830],{"class":85,"line":86},[83,15823,806],{"class":592},[83,15825,867],{"class":628},[83,15827,870],{"class":595},[83,15829,873],{"class":628},[83,15831,876],{"class":628},[10,15833,15834,881],{},[33,15835,806],{},[320,15837,885],{"id":884},[10,15839,888],{},[74,15841,15842],{"className":583,"code":728,"language":585,"meta":79,"style":79},[33,15843,15844,15850],{"__ignoreMap":79},[83,15845,15846,15848],{"class":85,"line":86},[83,15847,683],{"class":592},[83,15849,596],{"class":595},[83,15851,15852,15854,15856,15858],{"class":85,"line":92},[83,15853,683],{"class":592},[83,15855,625],{"class":595},[83,15857,629],{"class":628},[83,15859,596],{"class":595},[10,15861,911],{},[14,15863,914],{"id":914},[320,15865,918],{"id":917},[10,15867,921,15868,925],{},[33,15869,924],{},[139,15871,15872,15876,15878],{},[56,15873,930,15874,933],{},[33,15875,640],{},[56,15877,936],{},[56,15879,939],{},[10,15881,942],{},[320,15883,946],{"id":945},[10,15885,949],{},[74,15887,15888],{"className":583,"code":676,"language":585,"meta":79,"style":79},[33,15889,15890],{"__ignoreMap":79},[83,15891,15892,15894],{"class":85,"line":86},[83,15893,683],{"class":592},[83,15895,596],{"class":595},[10,15897,962,15898,965,15900,968,15902,354],{},[33,15899,683],{},[33,15901,78],{},[33,15903,683],{},[320,15905,974],{"id":973},[10,15907,977],{},[74,15909,15910],{"className":583,"code":980,"language":585,"meta":79,"style":79},[33,15911,15912],{"__ignoreMap":79},[83,15913,15914,15916,15918,15920],{"class":85,"line":86},[83,15915,683],{"class":592},[83,15917,625],{"class":595},[83,15919,629],{"class":628},[83,15921,596],{"class":595},[10,15923,995,15924,998,15926,1001,15928,1004,15930,1008],{},[33,15925,683],{},[33,15927,78],{},[33,15929,500],{},[33,15931,1007],{},[204,15933,1011],{},{"title":79,"searchDepth":92,"depth":92,"links":15935},[15936,15937,15938,15943,15948,15953],{"id":240,"depth":92,"text":240},{"id":256,"depth":92,"text":256},{"id":317,"depth":92,"text":318,"children":15939},[15940,15941,15942],{"id":322,"depth":98,"text":323},{"id":383,"depth":98,"text":384},{"id":568,"depth":98,"text":569},{"id":665,"depth":92,"text":666,"children":15944},[15945,15946,15947],{"id":669,"depth":98,"text":670},{"id":695,"depth":98,"text":696},{"id":721,"depth":98,"text":722},{"id":755,"depth":92,"text":756,"children":15949},[15950,15951,15952],{"id":762,"depth":98,"text":763},{"id":792,"depth":98,"text":793},{"id":884,"depth":98,"text":885},{"id":914,"depth":92,"text":914,"children":15954},[15955,15956,15957],{"id":917,"depth":98,"text":918},{"id":945,"depth":98,"text":946},{"id":973,"depth":98,"text":974},{},{"title":235,"description":79},[217,1044,1045],1786973364544]